diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 690b00211f7..02d21453a3a 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -6,7 +6,7 @@ Bug reports and feature requests
*Note*: Issues are not a support forum. If you need help using the software, please use [the forums](http://www.dolibarr.org/forum).
-Issues are managed on [GitHub](https://github.com/Dolibarr/dolibarr/Issues).
+Issues are managed on [GitHub](https://github.com/Dolibarr/dolibarr/issues).
1. Please [use the search engine](https://help.github.com/articles/searching-issues) to check if nobody's already reported your problem.
2. [Create an issue](https://help.github.com/articles/creating-an-issue). Choose an appropriate title. Prepend appropriately with Bug or Feature Request.
diff --git a/.travis.yml b/.travis.yml
index 010f5c8ca18..27a7c64bf46 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -11,23 +11,29 @@ php:
- '5.3'
- '5.4'
- '5.5'
-- '5.6.29'
+- '5.6'
- '7.0'
- '7.1'
- nightly
addons:
mariadb: '10.0'
- # FIXME: find a way to import a MySQL dump into PostgreSQL
- #postgresql: '9.3'
+ postgresql: '9.3'
apt:
+ sources:
+ # To use the last version of pgloader, we add repo of postgresql
+ - postgresql
+ - sourceline: 'deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main'
+ - key_url: 'https://www.postgresql.org/media/keys/ACCC4CF8.asc'
packages:
# We need a webserver to test the webservices
# Let's install Apache with.
- apache2
# mod_php is not supported by Travis. Add fcgi. We install FPM later on.
- libapache2-mod-fastcgi
-
+ # We need pgloader for import mysql database into pgsql
+ - pgloader
+
# Start on every boot
services:
- memcached
@@ -40,8 +46,7 @@ env:
# MariaDB overrides MySQL installation so it's not possible to test both yet
#- DB=mysql
- DB=mariadb
- # FIXME: find a way to import a MySQL dump into PostgreSQL
- #- DB=postgresql
+ - DB=postgresql
# TODO
#- DB=sqlite
# See https://docs.travis-ci.com/user/languages/php/#Apache-%2B-PHP
@@ -54,7 +59,6 @@ matrix:
allow_failures:
- php: 7.1
- php: nightly
- # FIXME
#- env: DB=postgresql
# TODO
#- env: DB=sqlite
@@ -78,6 +82,13 @@ before_install:
phpenv config-rm xdebug.ini
echo
+- |
+ if [ "$DB" = 'postgresql' ]; then
+ echo "Check pgloader version"
+ pgloader --version
+ echo
+ fi
+
install:
- |
echo "Updating Composer"
@@ -133,10 +144,10 @@ before_script:
echo "Set timezone"
echo 'date.timezone = "Europe/Paris"' >> ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php.ini
if [ "$TRAVIS_PHP_VERSION" = '5.3' ] || [ "$TRAVIS_PHP_VERSION" = '5.4' ]; then
- echo
- echo "Enabling APC for PHP <= 5.4"
+ #echo
+ #echo "Enabling APC for PHP <= 5.4"
# Documentation says it should be available for PHP <= 5.6 but it's not for 5.5 and 5.6!
- echo 'extension = apc.so' >> ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php.ini
+ #echo 'extension = apc.so' >> ~/.phpenv/versions/$PHP_VERSION_NAME/etc/php.ini
echo
echo "Enabling Memcached for PHP <= 5.4"
# Documentation says it should be available for all PHP versions but it's not for 5.5 and 5.6, 7.0, 7.1 and nightly!
@@ -165,16 +176,19 @@ before_script:
- |
echo "Setting up database"
- if [ "$DB" = 'mysql' ] || [ "$DB" = 'mariadb' ]; then
+ if [ "$DB" = 'mysql' ] || [ "$DB" = 'mariadb' ] || [ "$DB" = 'postgresql' ]; then
echo "MySQL"
mysql -e 'DROP DATABASE IF EXISTS travis;'
mysql -e 'CREATE DATABASE IF NOT EXISTS travis;'
+ mysql -e 'GRANT ALL PRIVILEGES ON travis.* TO travis@127.0.0.1;'
+ mysql -e 'FLUSH PRIVILEGES;'
mysql -D travis < dev/initdemo/mysqldump_dolibarr_3.5.0.sql
fi
- # FIXME: find a way to import a MySQL dump into PostgreSQL
- #if [ "$DB" = 'postgresql' ]; then
- # pgsql travis < dev/initdemo/mysqldump_dolibarr_3.5.0.sql
- #fi
+ if [ "$DB" = 'postgresql' ]; then
+ #pgsql travis < dev/initdemo/mysqldump_dolibarr_3.5.0.sql
+ #pgloader mysql://root:pass@127.0.0.1/base postgresql://dolibarrowner@127.0.0.1/dolibarr
+ pgloader mysql://root@127.0.0.1/travis postgresql:///travis
+ fi
# TODO: SQLite
echo
@@ -191,10 +205,9 @@ before_script:
if [ "$DB" = 'mysql' ] || [ "$DB" = 'mariadb' ]; then
echo '$'dolibarr_main_db_type=\'mysqli\'';' >> $CONF_FILE
fi
- # FIXME
- #if [ "$DB" = 'postgresql' ]; then
- # echo '$'dolibarr_main_db_type=\'pgsql\'';' >> $CONF_FILE
- #fi
+ if [ "$DB" = 'postgresql' ]; then
+ echo '$'dolibarr_main_db_type=\'pgsql\'';' >> $CONF_FILE
+ fi
# TODO: SQLite
echo '$'dolibarr_main_authentication=\'dolibarr\'';' >> $CONF_FILE
cat $CONF_FILE
@@ -253,8 +266,6 @@ script:
set +e
echo
-# TODO: dev/* checks
-
- |
echo "Checking coding style"
# Ensure we catch errors
@@ -268,8 +279,6 @@ script:
# TODO: Check CSS (csslint?)
-# TODO: check SQL syntax (pgsanity?)
-
- |
echo "Upgrading Dolibarr"
# Ensure we catch errors
@@ -293,6 +302,12 @@ script:
php upgrade.php 4.0.0 5.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade400500.log
php upgrade2.php 4.0.0 5.0.0 MAIN_MODULE_API,MAIN_MODULE_SUPPLIERPROPOSAL > $TRAVIS_BUILD_DIR/upgrade400500-2.log
php step5.php 4.0.0 5.0.0 > $TRAVIS_BUILD_DIR/upgrade400500-3.log
+ php upgrade.php 5.0.0 6.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade500600.log
+ php upgrade2.php 5.0.0 6.0.0 MAIN_MODULE_API,MAIN_MODULE_SUPPLIERPROPOSAL > $TRAVIS_BUILD_DIR/upgrade500600-2.log
+ php step5.php 5.0.0 6.0.0 > $TRAVIS_BUILD_DIR/upgrade500600-3.log
+ php upgrade.php 6.0.0 7.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade600700.log
+ php upgrade2.php 6.0.0 7.0.0 MAIN_MODULE_API,MAIN_MODULE_SUPPLIERPROPOSAL > $TRAVIS_BUILD_DIR/upgrade600700-2.log
+ php step5.php 6.0.0 7.0.0 > $TRAVIS_BUILD_DIR/upgrade600700-3.log
cd -
set +e
echo
diff --git a/.tx/config b/.tx/config
index 010227f6e61..89d123b0362 100644
--- a/.tx/config
+++ b/.tx/config
@@ -224,6 +224,18 @@ source_file = htdocs/langs/en_US/members.lang
source_lang = en_US
type = MOZILLAPROPERTIES
+[dolibarr.modulebuilder]
+file_filter = htdocs/langs//modulebuilder.lang
+source_file = htdocs/langs/en_US/modulebuilder.lang
+source_lang = en_US
+type = MOZILLAPROPERTIES
+
+[dolibarr.multicurrency]
+file_filter = htdocs/langs//multicurrency.lang
+source_file = htdocs/langs/en_US/multicurrency.lang
+source_lang = en_US
+type = MOZILLAPROPERTIES
+
[dolibarr.oauth]
file_filter = htdocs/langs//oauth.lang
source_file = htdocs/langs/en_US/oauth.lang
@@ -326,6 +338,12 @@ source_file = htdocs/langs/en_US/stocks.lang
source_lang = en_US
type = MOZILLAPROPERTIES
+[dolibarr.stripe]
+file_filter = htdocs/langs//stripe.lang
+source_file = htdocs/langs/en_US/stripe.lang
+source_lang = en_US
+type = MOZILLAPROPERTIES
+
[dolibarr.suppliers]
file_filter = htdocs/langs//suppliers.lang
source_file = htdocs/langs/en_US/suppliers.lang
@@ -350,18 +368,18 @@ source_file = htdocs/langs/en_US/users.lang
source_lang = en_US
type = MOZILLAPROPERTIES
-[dolibarr.withdrawals]
-file_filter = htdocs/langs//withdrawals.lang
-source_file = htdocs/langs/en_US/withdrawals.lang
-source_lang = en_US
-type = MOZILLAPROPERTIES
-
[dolibarr.website]
file_filter = htdocs/langs//website.lang
source_file = htdocs/langs/en_US/website.lang
source_lang = en_US
type = MOZILLAPROPERTIES
+[dolibarr.withdrawals]
+file_filter = htdocs/langs//withdrawals.lang
+source_file = htdocs/langs/en_US/withdrawals.lang
+source_lang = en_US
+type = MOZILLAPROPERTIES
+
[dolibarr.workflow]
file_filter = htdocs/langs//workflow.lang
source_file = htdocs/langs/en_US/workflow.lang
diff --git a/COPYRIGHT b/COPYRIGHT
index 4fbff121147..427784a1552 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -14,23 +14,24 @@ Component Version License GPL Compatible
PHP libraries:
AdoDb-Date 0.36 Modified BSD License Yes Date convertion (not into rpm package)
ChromePHP 4.1.0 Apache Software License 2.0 Yes Return server log to chrome browser console
-CKEditor 4.5.8 LGPL-2.1+ Yes Editor WYSIWYG
+CKEditor 4.6.2 LGPL-2.1+ Yes Editor WYSIWYG
EvalMath 1.0 BSD Yes Safe math expressions evaluation
Escpos-php MIT License Yes Thermal receipt printer library, for use with ESC/POS compatible printers
-FPDI 1.5.2 Apache Software License 2.0 Yes PDF templates management
GeoIP 1.4 LGPL-2.1+ Yes Sample code to make geoip convert (not into deb package)
Mobiledetect 2.8.17 MIT License Yes Detect mobile devices browsers
NuSoap 0.9.5 LGPL 2.1+ Yes Library to develop SOAP Web services (not into rpm and deb package)
PEAR Mail_MIME 1.8.9 BSD Yes NuSoap dependency
-odtPHP 1.0.1 GPL-2+ b Yes Library to build/edit ODT files
+odtPHP 1.0.1 GPL-2+ Yes Library to build/edit ODT files
+ParseDown 1.6 MIT License Yes Markdown parser
PHPExcel 1.8.1 LGPL-2.1+ Yes Read/Write XLS files, read ODS files
php-iban 1.4.7 LGPL-3+ Yes Parse and validate IBAN (and IIBAN) bank account information in PHP
PHPoAuthLib 0.8.2 MIT License Yes Library to provide oauth1 and oauth2 to different service
PHPPrintIPP 1.3 GPL-2+ Yes Library to send print IPP requests
-Restler 3.0.0RC6 LGPL-3+ Yes Library to develop REST Web services
+Restler 3.0.0RC6 LGPL-3+ Yes Library to develop REST Web services (+ swagger-ui js lib into dir explorer)
TCPDF 6.2.12 LGPL-3+ Yes PDF generation
TCPDI 1.0.0 LGPL-3+ / Apache 2.0 Yes FPDI replacement
Swift Mailer 5.4.2-DEV MIT license Yes Comprehensive mailing tools for PHP
+Stripe 4.7.0 MIT licence Yes Library for Stripe module
JS libraries:
jQuery 1.11.3 MIT License Yes JS library
@@ -44,147 +45,21 @@ jQuery JCrop 0.9.8 GPL and MIT License Yes
jQuery Jeditable 1.7.1 GPL and MIT License Yes JS library plugin jeditable (to edit in place)
jQuery jNotify 1.1.00 Apache Software License 2.0 Yes JS library plugin jNotify (to use ajax popups)
jQuery jPicker 1.1.6 GPL and MIT License Yes JS library for color picker with not defined list of colors
-jQuery jqueryFileTree 1.0.1 GPL and MIT License Yes JS library for color picker with not defined list of colors
-jQuery jquerytreeview 1.4.1 MIT License Yes JS library for color picker with not defined list of colors
-jQuery Layout 1.4.3 GPL and MIT License Yes JS library plugin Layout
-jQuery Mobile 1.3.0 GPL and MIT License Yes JS library for smartphone (not used)
+jQuery jqueryFileTree 1.0.1 GPL and MIT License Yes JS library for filetree
+jQuery jquerytreeview 1.4.1 MIT License Yes JS library for filetree
jQuery TableDnD 0.6 GPL and MIT License Yes JS library plugin TableDnD (to reorder table rows)
jQuery Timepicker 1.1.0 GPL and MIT License Yes JS library Timepicker addon for Datepicker
jQuery Tiptip 1.3 GPL and MIT License Yes JS library for tooltips
jsGanttImproved 1.7.5.2 BSD License Yes JS library (to build Gantt reports)
JsTimezoneDetect 1.0.6 MIT License Yes JS library to detect user timezone
+SwaggerUI 2.0.24 GPL-2+ Yes JS library to offer the REST API explorer
+Ace 1.2.8 BSD Yes JS library to get code syntaxique coloration in a textarea.
For licenses compatibility informations:
http://www.gnu.org/licenses/licenses.en.html
-Copyright
----------
-
-Copyright (C) 2016
-
-Copyright (C) 2015
-- Laurent Destailleur
-- Marcos García
-- Alexandre Spangaro
-- Frederic France
-- Regis Houssin
-
-Copyright (C) 2014
-- Laurent Destailleur
-- Raphaël Doursenaud
-- Jean-François Ferry
-- Marcos García
-- Philippe Grand
-- Florian Henry
-- Regis Houssin
-- Maxime Kohlhaas
-- Juanjo Menent
-- Alexandre Spangaro
-- Frederic France
-
-Copyright (C) 2013
-- Christophe Battarel
-- Laurent Destailleur
-- Jean-François Ferry
-- Marcos García
-- Philippe Grand
-- Florian Henry
-- Regis Houssin
-- Maxime Kohlhaas
-- Juanjo Menent
-- Adolfo Segura
-- Alexandre Spangaro
-
-Copyright (C) 2012
-- Christophe Battarel
-- Laurent Destailleur
-- Jean-François Ferry
-- Marcos García
-- Philippe Grand
-- Jean Heimburger
-- Florian Henry
-- Regis Houssin
-- Maxime Kohlhaas
-- Juanjo Menent
-- Nicolas Péré
-- Alexandre Spangaro
-
-Copyright (C) 2011
-- Laurent Destailleur
-- Regis Houssin
-- Juanjo Menent
-- Philippe Grand
-- Jean Heimburger
-
-Copyright (C) 2010
-- Laurent Destailleur
-- Regis Houssin
-- Juanjo Menent
-- r2gnl
-- meos
-
-Copyright (C) 2009
-- Laurent Destailleur
-- Regis Houssin
-- Juanjo Menent
-
-Copyright (C) 2008
-- Laurent Destailleur
-- Regis Houssin
-- Rodolphe Quiedeville
-- Jeremie Ollivier
-
-Copyright (C) 2007
-- Rodolphe Quiedeville
-- Laurent Destailleur
-- Regis Houssin
-- Auguria SARL
-- Jean Heimburger
-- Jeremie Ollivier
-
-Copyright (C) 2006
-- Auguria SARL
-- Marc Barilley/Ocebo
-- Laurent Destailleur
-- Rodolphe Quiedeville
-- Regis Houssin
-- Andre Cianfarani
-- Yannick Warnier
-- Jean Heimburger
-
-Copyright (C) 2005
-- Brice Davoleau
-- Laurent Destailleur
-- Benoit Mortier
-- Rodolphe Quiedeville
-- Eric Seigne
-- Matthieu Valleton
-- Regis Houssin
-
-Copyright (C) 2004
-- Laurent Destailleur
-- Rodolphe Quiedeville
-- Eric Seigne
-- Benoit Mortier
-- Christophe Combelles
-- Sebastien Di Cintio
-
-Copyright (C) 2003
-- Jean-Louis Bergamo
-- Xavier Dutoit
-- Rodolphe Quiedeville
-- Emmanuel Raviart
-- Eric Seigne
-
-Copyright (C) 2002
-- Jean-Louis Bergamo
-- Rodolphe Quiedeville
-
-Copyright (C) 2001
-- Rodolphe Quiedeville
-
-
-
-
+Copyright / Authors
+-------------------
+See page https://github.com/Dolibarr/dolibarr/graphs/contributors
diff --git a/ChangeLog b/ChangeLog
index 228a2fd6291..d5bdaa43239 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,40 @@ English Dolibarr ChangeLog
--------------------------------------------------------------
+***** ChangeLog for 7.0.0 compared to 6.0.* *****
+
+
+
+***** ChangeLog for 6.0.0 compared to 5.0.* *****
+
+For developers:
+NEW: Add a lot of API REST: dictionaryevents, memberstypes, ...
+NEW: Big refactorization of multicompany transverse mode.
+NEW: getEntity function use true $shared value by default.
+
+WARNING:
+
+Following changes may create regression for some external modules, but were necessary to make Dolibarr better:
+* The hook getNodeList has been replaced by a normalized 'addreplace' hook getDirList.
+* The trigger USER_SETINGROUP and USER_REMOVEFROMGROUP has been replaced with trigger USER_MODIFY.
+* The page societe/soc.php was renamed into societe/card.php to match page naming conventions.
+* The page compta/facture.php was renamed into compta/facture/card.php to match page naming conventions.
+* The signature of method ->delete() of class Product and PriceExpression was changed from
+ ->delete(id, notrigger) to ->delete(User, notrigger) to match standard dev rules.
+* The signature of method ->delete() of class Adherent was changed from
+ ->delete(id) to ->delete(id, User, notrigger) to match standard dev rules.
+* Removed CommonObject::displayMarginInfos (was deprecated in 3.8). Use same method into
+ html.formmargin.class.php
+* Removed Societe::set_commnucation_level (was deprecated in 4.0). Was not used.
+* Removed the trigger file of PAYPAL module that stored data that was not used by Dolibarr. The trigger event still
+ exists, but if an external module need action on it, it must provides itself its trigger file.
+* Use $conf->global->MULTICOMPANY_TRANSVERSE_MODE instead $conf->multicompany->transverse_mode
+* Use getEntity('xxx') instead getEntity('xxx', 1) and use getEntity('xxx', 0) instead getEntity('xxx')
+* The hook formObjectOptions was not implemented correctly in previous version. Sometimes, you had to return output
+content by doing a print into function, sometimes by returning content into "resprint". This has been fixed to follow
+hook specifications so you must return output into "resprint".
+
+
***** ChangeLog for 5.0.4 compared to 5.0.3 *****
FIX: #5640 Prices of a predefined product/service were incorrect under certain circumstances
FIX: #6541 since 4.0.4 to 5.0.0 autofill zip/town not working
diff --git a/README-FR.md b/README-FR.md
index 1c097e7914e..8e6a2c5aac0 100644
--- a/README-FR.md
+++ b/README-FR.md
@@ -98,34 +98,58 @@ Voir fichier ChangeLog.
- Rapports
- Imports/Exports des données
- Connectivité LDAP
-- De nombreuses autres fonctionnalités issues de modules officiels ou non (AWStats, Bittorrent, Gravatar, Google, Webcalendar...)
+- Intégratn de ClickToDial
+- Intégration RSS
+- Intégation Skype
+- Intégration de système de paiements (Paypal, Strip, Paybox...)
- …
### Divers:
-- Application multi-utilisateurs avec différents niveaux de permissions par module.
+- Multi-langue.
+- Multi-utilisateurs avec différents niveaux de permissions par module.
+- Multi-devise.
- Peux être multi-société par ajout du module externe multi-société.
-- Peux-être multi-devise par ajout du module externe multi-devise.
-- Plusieurs gestionnaires de menus (possibilité de différencier les menus pour les utilisateurs internes ou externes comme les clients ou fournisseurs).
-- Application simple à utiliser.
- Plusieurs thèmes visuels.
-- Code simple et facilement personnalisable.
-- Requiert PHP et MariaDb, Mysql ou Postgresql (Voir versions exactes sur http://wiki.dolibarr.org/index.php/Prérequis).
+- Application simple à utiliser.
+- Requiert PHP et MariaDb, Mysql ou Postgresql (Voir versions exactes sur https://wiki.dolibarr.org/index.php/Prérequis).
- Compatible avec toutes les offres Cloud du marché respectant les prérequis de base de données et PHP.
-- Export PDF de tous les éléments (factures, propositions commerciales, commandes, bons expéditions, etc...)
+- Code simple et facilement personnalisable (pas de framework lourd; mécanisme de hook et triggers).
+- APIs.
+- Génération PDF et ODT des éléments (factures, propositions commerciales, commandes, bons expéditions, etc...)
+- …
+
+### Extension
+
+Dolibarr peut aussi être étendu à volonté avec l'ajout de module/applications externes développées par des développeus tiers, disponible sur [DoliStore](https://www.dolistore.com).
-## CE QUE DOLIBARR NE PEUT PAS FAIRE (TACHES A FAIRE)
+## CE QUE DOLIBARR NE PEUT PAS (ENCORE) FAIRE
Voici un liste de fonctionnalites pas encore gérées par Dolibarr:
-- Pas encore de compta analytique double-partie (uniquement gestion de trésorerie).
-- Dolibarr ne gère qu'une seule monnaie à la fois (mono-devise).
- Dolibarr ne contient pas de module de Gestion de la paie.
-- Les tâches du module de gestion de projets n'ont pas de dépendance entre elle.
-- Dolibarr ne contient pas de Webmail.
+- Les tâches du module de gestion de projets n'ont pas de dépendances entre elle.
+- Dolibarr n'embarque pas de Webmail intégré nativement.
- Dolibarr ne fait pas le café (pas encore).
+## DOCUMENTATION
+
+Les documentations utilisateur, développeur et traducteur sont disponible sous forme de ressources de la communautés via la site [Wiki](https://wiki.dolibarr.org).
+
+
+## CONTRIBUTING
+
+Voir le fichier [CONTRIBUTING](https://github.com/Dolibarr/dolibarr/blob/develop/.github/CONTRIBUTING.md)
+
+
+## CREDITS
+
+Dolibarr est le résultat du travail de nombreux contributeurs depuis des années et utilise des librairies d'autres contributeurs.
+
+Voir le fichier [COPYRIGHT](https://github.com/Dolibarr/dolibarr/blob/develop/COPYRIGHT)
+
+
## ACTUALITES ET RESEAUX SOCIAUX
Suivez le projet Dolibarr project sur les réseaux francophones
diff --git a/README.md b/README.md
index 64faedeb8b6..fbbbdddf665 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,7 @@ You can use it as a standalone application or as a web application to be able to

+
## LICENSE
Dolibarr is released under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version (GPL-3+).
@@ -20,12 +21,23 @@ See the [COPYING](https://github.com/Dolibarr/dolibarr/blob/develop/COPYING) fil
Other licenses apply for some included dependencies. See [COPYRIGHT](https://github.com/Dolibarr/dolibarr/blob/develop/COPYRIGHT) for a full list.
+
## INSTALLING
### Download
Releases can be downloaded from [official website](https://www.dolibarr.org/).
+### Install from composer
+If you do not already have Composer installed, you may do so by following the instructions at getcomposer.org. On Linux and Mac OS X, you'll run the following commands:
+
+curl -sS https://getcomposer.org/installer | php
+mv composer.phar /usr/local/bin/composer
+
+On Windows, you'll download and run https://getcomposer.org/Composer-Setup.exe
+
+composer create-project dolibarr/dolibarr erp
+
### Simple setup
If you have low technical skills and you're looking to install Dolibarr ERP/CRM in few clicks, you can use one of the packaged versions:
@@ -57,6 +69,7 @@ You can use a Web server and a supported database (MariaDb, MySql or Postgresql)
- Follow the installer instructions
+
## UPGRADING
- Overwrite all old files from 'dolibarr' directory with files provided into the new version's package.
@@ -65,13 +78,15 @@ You can use a Web server and a supported database (MariaDb, MySql or Postgresql)
*Note: migration process can safely be done multiple times by calling the page /install/index.php*
+
## WHAT'S NEW
See the [ChangeLog](https://github.com/Dolibarr/dolibarr/blob/develop/ChangeLog) file.
+
## FEATURES
-### Main modules (all optional)
+### Main application/modules (all optional)
- Customers, Prospects and/or Suppliers directory
- Products and/or Services catalog
@@ -97,7 +112,7 @@ See the [ChangeLog](https://github.com/Dolibarr/dolibarr/blob/develop/ChangeLog)
- Point of Sale
- …
-### Other modules
+### Other application/modules
- Bookmarks management
- Donations management
@@ -110,56 +125,63 @@ See the [ChangeLog](https://github.com/Dolibarr/dolibarr/blob/develop/ChangeLog)
- ClickToDial integration
- RSS integration
- Skype integration
-- Payment platforms integration (PayBox, PayPal)
+- Payment platforms integration (PayPal, Stripe, Paybox...)
- …
### Other general features
-- Multi-Users and groups with finely grained rights
-- Localization in most major languages
-- Can manage several companies by adding external module multi-company.
-- Can manage several currencies by adding external module multi-currency.
-- Very user friendly and easy to use
+
+- Localization in most major languages.
+- Multi-Users and groups with finely grained rights.
+- Multi-currency.
+- Multi-company by adding of an external module.
+- Very user friendly and easy to use.
- Highly customizable: enable only the modules you need, add user personalized fields, choose your skin, several menu managers (can be used by internal users as a back-office with a particular menu, or by external users as a front-office with another one)
-- Works with PHP 5.3+ and MariaDB 5.0.3+, MySQL 5.0.3+ or PostgreSQL 8.1.4+ (See requirements on the [Wiki](http://wiki.dolibarr.org/index.php/Prerequisite))
+- Works with PHP 5.3+ and MariaDB 5.0.3+, MySQL 5.0.3+ or PostgreSQL 8.1.4+ (See requirements on the [Wiki](https://wiki.dolibarr.org/index.php/Prerequisite))
- Compatible with all Cloud solutions that match MySQL, PHP or PostgreSQL prerequisites.
-- An easy to understand, maintain and code interfaces with your own information system (PHP with no heavy framework; trigger and hook architecture)
+- APIs.
+- An easy to understand, maintain and develop code (PHP with no heavy framework; trigger and hook architecture)
- Support for country specific features:
- Spanish Tax RE and ISPF
- French NPR VAT rate (VAT called "Non Perçue Récupérable" for DOM-TOM)
- Canadian double taxes (federal/province) and other countries using cumulative VAT
- Tunisian tax stamp
+ - Argentina invoice numbering using A,B,C...
- Compatible with [European directives](http://europa.eu/legislation_summaries/taxation/l31057_en.htm) (2006/112/CE ... 2010/45/UE)
- PDF or ODT generation for invoice, proposals, orders...
- …
### Extending
-Dolibarr can be extended with a lot of other external modules from third party developers available at the [DoliStore](https://www.dolistore.com).
+Dolibarr can be extended with a lot of other external application or modules from third party developers available at the [DoliStore](https://www.dolistore.com).
+
## FUTURE
These are features that Dolibarr does **not** yet fully support:
-- Double-entry bookkeeping yet (only bank and treasury management)
- Tasks dependencies in projects
- Payroll module
-- Webmail
+- No native embedded Webmail
- Dolibarr can't do coffee (yet)
+
## DOCUMENTATION
Administrator, user, developer and translator's documentations are available along with other community resources on the [Wiki](https://wiki.dolibarr.org).
+
## CONTRIBUTING
See file [CONTRIBUTING](https://github.com/Dolibarr/dolibarr/blob/develop/.github/CONTRIBUTING.md)
+
## CREDITS
Dolibarr is the work of many contributors over the years and uses some fine libraries.
See [COPYRIGHT](https://github.com/Dolibarr/dolibarr/blob/develop/COPYRIGHT) file.
+
## NEWS AND SOCIAL NETWORKS
Follow Dolibarr project on:
diff --git a/build/debian/README.howto b/build/debian/README.howto
index 1b64380cc26..52239176c60 100644
--- a/build/debian/README.howto
+++ b/build/debian/README.howto
@@ -152,7 +152,7 @@ tag 729538 -moreinfo
-##### Testing a package into unstable env
+##### Testing a package into a chroot environment
Check you have a mysql server available from another interface than "localhost".
Set line in /etc/mysql/my.cnf if required and restart mysql
@@ -160,9 +160,11 @@ Set line in /etc/mysql/my.cnf if required and restart mysql
[mysqld]
bind-address = *
-Create a chroot called "unstable-amd64-sbuild".
+Create a chroot called "jessie" or "unstable".
Chroot env is stored into /srv/chroot directory.
> sudo sbuild-createchroot --keyring=unstable /srv/chroot/unstable http://ftp.uk.debian.org/debian
+or
+> sudo sbuild-createchroot jessie /srv/chroot/jessie http://ftp.uk.debian.org/debian
Pour lister les env chroot
> schroot -l
@@ -170,8 +172,9 @@ or
> ls /srv/chroot
Puis pour se connecter et préparer l'environnement
-> schroot -c name_of_chroot
+> schroot -c name_of_chroot (exemple schroot -c unstable-amd64-sbuild)
> cat /etc/debian_chroot to check which debian branch we are into
+> apt-get install vim dialog
> vi /usr/sbin/policy-rc.d and replace return code 101 (not allowed) into 0 (ok)
> apt-get update
> apt-get upgrade
@@ -320,8 +323,8 @@ x.y.z+dfsgw
Note: If there was errors solved manually after get-orig-sources.sh, you may need to make a git commit
* Update/fix debian/* files used to build package.
-At least, add an entry into debian/changelog
-> dch -v x.y.z+dfsgw-v "My comment" will add entry.
+At least, add an entry into debian/changelog with command
+> dch -v x.y.z+dfsgw-1 "My comment"
For example: dch -v x.y.z+dfsgw-1 "New upstream release." for a new version (x.y.z = version, w start from 1 and increased for each new import)
Then check/modify changelog to replace "version" or "unstable" with "UNRELEASED".
Then check/modify also the user/date signature:
@@ -332,23 +335,27 @@ Then check/modify also the user/date signature:
To update dolibarr debian package when only files into debian has changed:
* Change files and commit.
-* Add a tag debian/x.y.z+dfsgw-2 (increase the last 1 into 2, 3...)
+* Add a line into changelog for version debian/x.y.z+dfsgw-v (increase the last v into 2, 3...)
+> dch -v x.y.z+dfsgw-v "My comment"
+* git tag will be added when package is pushed.
To update dolibarr debian package when only files not into debian has changed:
-* Manually, add patches into debian/patches and update file debian/series, or do the 2 steps with "quilt import filepatch.patch"
+* Checkout the branch you want to work on: master of debian/...
+* Manually, add patches into debian/patches and update the file debian/series, or do the 2 steps with "quilt import filepatch.patch"
* You can test patching of serie with "quilt push" (autant de fois que de patch). Avec "quilt pop -a", on revient a l'état du upstream sans les patch.
+* Update the debian/changelog to add entry of change.
Once files has been prepared, it's time to test:
* Try to build package
> rm -fr ../build-area;
-> git-buildpackage -us -uc --git-debian-branch=[master|jessie] --git-upstream-branch=[upstream|upstream-3.5.x|3.5.5]
+> git-buildpackage -us -uc --git-debian-branch=[master|jessie] --git-upstream-branch=[upstream|upstream-jessie|upstream-3.5.x|3.5.5]
ou
-> git-buildpackage -us -uc --git-ignore-branch --git-upstream-branch=[upstream|upstream-3.5.x|3.5.5]
+> git-buildpackage -us -uc --git-ignore-branch --git-upstream-branch=[upstream|upstream-jessie|upstream-3.5.x|3.5.5]
-Note: To build an old version, do: git checkout oldtagname -b newbranchname; git-buildpackage -us -uc --git-debian-branch=newbranchname --git-upstream-branch=[upstream|upstream-3.5.x]
+Note: To build an old version, do: git checkout oldtagname -b newbranchname; git-buildpackage -us -uc --git-debian-branch=newbranchname --git-upstream-branch=[upstream|upstream-jessie|upstream-3.5.x|3.5.5]
Note: You can use git-buildpackage -us -uc --git-ignore-new if you want to test build with uncommited file
Note: You can use git-buildpackage -us -uc -d if you want to test build when dependencies does not match
Note: Package is built into directory ../build-area
@@ -381,13 +388,14 @@ http://packages.qa.debian.org
* Package will be into release when test will be moved as stable.
-##### Send an unblock request
+
+##### Send an unblock request to make a full update of a stable package
Use this to move from unstable to testing.
reportbug -B debian --smtphost=smtp.gmail.com:587 --smtpuser=xxxx --smtppasswd=yyyy --tls
Choose package "release.debian.org"
-Then "unblock"
+Then usertag "unblock"
Then name of package "dolibarr"
Fill message, for example:
"Please unblock package dolibarr
@@ -397,11 +405,11 @@ so it is a better solution to validate this maintenance release than applying a
After discussion with ..., it appears that security holes are enough to request this unblock request."
-Use this to request an update of a stable package
+Use this to request an full update of a stable package
reportbug -B debian --smtphost=smtp.gmail.com:587 --smtpuser=xxxx --smtppasswd=yyyy --tls
Choose package "release.debian.org"
-Then "unblock"
+Then usertag "unblock"
Then name of package "dolibarr"
Fill message, for example:
"
@@ -413,11 +421,27 @@ Pro are:
- It fixes also stability bugs
- Patches were already tested because deployed and used by several thousands of users.
- It is easier for package maintener to include this official set of fixes than applying one patch after one patch for each debian report or backported each patch into a dedicated version.
-- Debian maintenance version matches with official project maintenance version (better when all fixes are not related to the way the software is packaged)
+- Debian maintenance version is inline with official project maintenance version (better when all fixes are not related to the way the software is packaged)
Cons are:
-- The patch include more than the only one security reported fxes
+- The patch include more than the only one security reported fixes
So I just need to know if it's ok to push such a version 3.5.7 (fixes for 3.5.* branch) instead of only one fix for only the few (the only) reported debian bugs,
since it provides more stability and is for me a more secured process.
"
+##### Send an request to ask a simple fix of a stable package
+
+Use this to ask to apply patches on a stable version.
+
+reportbug -B debian --smtphost=smtp.gmail.com:587 --smtpuser=xxxx --smtppasswd=yyyy --tls
+Choose package "release.debian.org"
+Then usertag "jessie-pu" (if tags is not available in list, choose another one, and change it later into email content text)
+Then name of package "dolibarr"
+Fill message, for example:
+"Please unblock package dolibarr
+A security error CVE-2015-3935 was reported and is fixed into package 3.5.7.
+Note that package 3.5.7 contains not only fixed for bugs reported to debian. It includes other fixes, but they are all related to stability or security,
+so it is a better solution to validate this maintenance release than applying a patch of the only CVE-2015-3935.
+After discussion with ..., it appears that security holes are enough to request this unblock request."
+
+Note: If there is a response to ask more information, don't forget to remove the tag during answer.
diff --git a/build/debian/source/lintian-overrides b/build/debian/source/lintian-overrides
index c878035b482..e64eae84887 100644
--- a/build/debian/source/lintian-overrides
+++ b/build/debian/source/lintian-overrides
@@ -10,6 +10,8 @@ source-is-missing htdocs/includes/ckeditor/ckeditor/lang/*.js
source-is-missing htdocs/includes/ckeditor/ckeditor/plugins/*/dialogs/*.js
source-is-missing htdocs/includes/ckeditor/ckeditor/plugins/*/filter/*.js
source-is-missing htdocs/includes/ckeditor/ckeditor/plugins/templates/templates/default.js
-source-is-missing htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.json
source-is-missing htdocs/includes/restler/framework/Luracast/Restler/explorer/lib/*.js
+# Those are false positives, the files are their own sources since
+# they are data files
+source-is-missing htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.json
diff --git a/build/generate_filelist_xml.php b/build/generate_filelist_xml.php
index 07e87dd86bb..94df2206579 100755
--- a/build/generate_filelist_xml.php
+++ b/build/generate_filelist_xml.php
@@ -1,6 +1,6 @@
#!/usr/bin/env php
+/* Copyright (C) 2015-2017 Laurent Destailleur
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -40,55 +40,117 @@ require_once(DOL_DOCUMENT_ROOT."/core/lib/files.lib.php");
* Main
*/
-if (empty($argv[1]))
-{
- print "Usage: ".$script_file." release=x.y.z\n";
- exit -1;
-}
-parse_str($argv[1]);
+$includecustom=0;
+$includeconstants=array();
-if ($release != DOL_VERSION)
+if (empty($argv[1]))
{
- print 'Error: release is not version declared into filefunc.in.php.'."\n";
+ print "Usage: ".$script_file." release=x.y.z[-...] [includecustom=1] [includeconstant=CC:MY_CONF_NAME:value]\n";
+ print "Example: ".$script_file." release=6.0.0 includecustom=1 includeconstant=FR:INVOICE_CAN_ALWAYS_BE_REMOVED:0 includeconstant=all:MAILING_NO_USING_PHPMAIL:1\n";
exit -1;
}
+$i=0;
+while ($i < $argc)
+{
+ if (! empty($argv[$i])) parse_str($argv[$i]);
+ if (preg_match('/includeconstant=/',$argv[$i]))
+ {
+ $tmp=explode(':', $includeconstant, 3);
+ if (count($tmp) != 3)
+ {
+ print "Error: Bad parameter includeconstant ".$includeconstant."\n";
+ exit -1;
+ }
+ $includeconstants[$tmp[0]][$tmp[1]] = $tmp[2];
+ }
+ $i++;
+}
+
+if (empty($includecustom))
+{
+ if (DOL_VERSION != $release)
+ {
+ print 'Error: When parameter "includecustom" is not set, version declared into filefunc.in.php ('.DOL_VERSION.') must be exact same value than "release" parameter ('.$release.')'."\n";
+ print "Usage: ".$script_file." release=x.y.z[-...] [includecustom=1]\n";
+ exit -1;
+ }
+}
+else
+{
+ if (! preg_match('/'.preg_quote(DOL_VERSION,'/').'-/',$release))
+ {
+ print 'Error: When parameter "includecustom" is set, version declared into filefunc.inc.php ('.DOL_VERSION.') must be used with a suffix into "release" parmater (ex: '.DOL_VERSION.'-mydistrib).'."\n";
+ print "Usage: ".$script_file." release=x.y.z[-...] [includecustom=1]\n";
+ exit -1;
+ }
+}
+
+print "Release : ".$release."\n";
+print "Include custom in signature : ".$includecustom."\n";
+print "Include constants in signature : ";
+foreach ($includeconstants as $countrycode => $tmp)
+{
+ foreach($tmp as $constname => $constvalue)
+ {
+ print $constname.'='.$constvalue." ";
+ }
+}
+print "\n";
//$outputfile=dirname(__FILE__).'/../htdocs/install/filelist-'.$release.'.xml';
$outputdir=dirname(__FILE__).'/../htdocs/install';
-print 'Delete current files '.$outputdir.'/filelist*.xml'."\n";
-dol_delete_file($outputdir.'/filelist*.xml',0,1,1);
+print 'Delete current files '.$outputdir.'/filelist-'.$release.'.xml'."\n";
+dol_delete_file($outputdir.'/filelist-'.$release.'.xml',0,1,1);
+
+$checksumconcat=array();
$outputfile=$outputdir.'/filelist-'.$release.'.xml';
$fp = fopen($outputfile,'w');
fputs($fp, ''."\n");
-fputs($fp, ''."\n");
+fputs($fp, ''."\n");
-fputs($fp, ''."\n");
+foreach ($includeconstants as $countrycode => $tmp)
+{
+ fputs($fp, ''."\n");
+ foreach($tmp as $constname => $constvalue)
+ {
+ $valueforchecksum=(empty($constvalue)?'0':$constvalue);
+ $checksumconcat[]=$valueforchecksum;
+ fputs($fp, ' '.$valueforchecksum.''."\n");
+ }
+ fputs($fp, ''."\n");
+}
-$checksumconcat=array();
+fputs($fp, ''."\n");
-$dir_iterator1 = new RecursiveDirectoryIterator(dirname(__FILE__).'/../htdocs/');
+/*$dir_iterator1 = new RecursiveDirectoryIterator(dirname(__FILE__).'/../htdocs/');
$iterator1 = new RecursiveIteratorIterator($dir_iterator1);
-// need to ignore document custom etc
-$files = new RegexIterator($iterator1, '#^(?:[A-Z]:)?(?:/(?!(?:custom|documents|conf|install|nltechno))[^/]+)+/[^/]+\.(?:php|css|html|js|json|tpl|jpg|png|gif|sql|lang)$#i');
+// Need to ignore document custom etc. Note: this also ignore natively symbolic links.
+$files = new RegexIterator($iterator1, '#^(?:[A-Z]:)?(?:/(?!(?:'.($includecustom?'':'custom\/|').'documents\/|conf\/|install\/))[^/]+)+/[^/]+\.(?:php|css|html|js|json|tpl|jpg|png|gif|sql|lang)$#i');
+*/
+$regextoinclude='\.(php|css|html|js|json|tpl|jpg|png|gif|sql|lang)$';
+$regextoexclude='('.($includecustom?'':'custom|').'documents|conf|install)$'; // Exclude dirs
+$files = dol_dir_list(DOL_DOCUMENT_ROOT, 'files', 1, $regextoinclude, $regextoexclude, 'fullname');
$dir='';
$needtoclose=0;
-foreach ($files as $file) {
- $newdir = str_replace(dirname(__FILE__).'/../htdocs', '', dirname($file));
- if ($newdir!=$dir) {
+foreach ($files as $filetmp) {
+ $file = $filetmp['fullname'];
+ //$newdir = str_replace(dirname(__FILE__).'/../htdocs', '', dirname($file));
+ $newdir = str_replace(DOL_DOCUMENT_ROOT, '', dirname($file));
+ if ($newdir!=$dir) {
if ($needtoclose)
- fputs($fp, ''."\n");
- fputs($fp, ''."\n");
+ fputs($fp, ' '."\n");
+ fputs($fp, ' '."\n");
$dir = $newdir;
$needtoclose=1;
}
if (filetype($file)=="file") {
$md5=md5_file($file);
$checksumconcat[]=$md5;
- fputs($fp, ''.$md5.''."\n");
+ fputs($fp, ' '.$md5.''."\n");
}
}
-fputs($fp, ''."\n");
+fputs($fp, ' '."\n");
fputs($fp, ''."\n");
asort($checksumconcat); // Sort list of checksum
@@ -102,28 +164,36 @@ $checksumconcat=array();
fputs($fp, ''."\n");
-$dir_iterator2 = new RecursiveDirectoryIterator(dirname(__FILE__).'/../scripts/');
+// TODO Replace RecursiveDirectoryIterator with dol_dir_list
+/*$dir_iterator2 = new RecursiveDirectoryIterator(dirname(__FILE__).'/../scripts/');
$iterator2 = new RecursiveIteratorIterator($dir_iterator2);
-// need to ignore document custom etc
-$files = new RegexIterator($iterator2, '#^(?:[A-Z]:)?(?:/(?!(?:custom|documents|conf|install|nltechno))[^/]+)+/[^/]+\.(?:php|css|html|js|json|tpl|jpg|png|gif|sql|lang)$#i');
+// Need to ignore document custom etc. Note: this also ignore natively symbolic links.
+$files = new RegexIterator($iterator2, '#^(?:[A-Z]:)?(?:/(?!(?:custom|documents|conf|install))[^/]+)+/[^/]+\.(?:php|css|html|js|json|tpl|jpg|png|gif|sql|lang)$#i');
+*/
+$regextoinclude='\.(php|css|html|js|json|tpl|jpg|png|gif|sql|lang)$';
+$regextoexclude='(custom|documents|conf|install)$'; // Exclude dirs
+$files = dol_dir_list(dirname(__FILE__).'/../scripts/', 'files', 1, $regextoinclude, $regextoexclude, 'fullname');
$dir='';
$needtoclose=0;
-foreach ($files as $file) {
- $newdir = str_replace(dirname(__FILE__).'/../scripts', '', dirname($file));
+foreach ($files as $filetmp) {
+ $file = $filetmp['fullname'];
+ //$newdir = str_replace(dirname(__FILE__).'/../scripts', '', dirname($file));
+ $newdir = str_replace(DOL_DOCUMENT_ROOT, '', dirname($file));
+ $newdir = str_replace(dirname(__FILE__).'/../scripts', '', dirname($file));
if ($newdir!=$dir) {
if ($needtoclose)
- fputs($fp, ''."\n");
- fputs($fp, ''."\n");
+ fputs($fp, ' '."\n");
+ fputs($fp, ' '."\n");
$dir = $newdir;
$needtoclose=1;
}
if (filetype($file)=="file") {
$md5=md5_file($file);
$checksumconcat[]=$md5;
- fputs($fp, ''.$md5.''."\n");
+ fputs($fp, ' '.$md5.''."\n");
}
}
-fputs($fp, ''."\n");
+fputs($fp, ' '."\n");
fputs($fp, ''."\n");
asort($checksumconcat); // Sort list of checksum
diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl
index fdd14fcf5a2..c2d983653cb 100755
--- a/build/makepack-dolibarr.pl
+++ b/build/makepack-dolibarr.pl
@@ -548,8 +548,6 @@ if ($nboftargetok) {
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/themes/oblyon*`;
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/themes/allscreen*`;
# Removed other test files
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/themes/eldy/*.new`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/public/api/explorer`; # This is a dev tool
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/public/test`;
$ret=`rm -fr $BUILDROOT/$PROJECT/test`;
$ret=`rm -fr $BUILDROOT/$PROJECT/Thumbs.db $BUILDROOT/$PROJECT/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/*/*/Thumbs.db`;
@@ -563,8 +561,6 @@ if ($nboftargetok) {
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/ckeditor/ckeditor/samples`; # Keep this removal in case we embed libraries
#$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/ckeditor/_source`; # _source must be kept into tarball
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/jquery/plugins/datatables/extensions/TableTools/swf`; # Source of this flash is not available
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/jquery/plugins/datatables/extras/TableTools/swf`; # Source of this flash is not available
$ret=`rm -f $BUILDROOT/$PROJECT/htdocs/includes/jquery/plugins/multiselect/MIT-LICENSE.txt`;
$ret=`rm -f $BUILDROOT/$PROJECT/htdocs/includes/jquery/plugins/select2/release.sh`;
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/mike42/escpos-php/doc`;
@@ -583,18 +579,19 @@ if ($nboftargetok) {
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/phpoffice/phpexcel/license.md`;
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tcpdf/fonts/dejavu-fonts-ttf-*`;
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tcpdf/fonts/freefont-*`;
+ $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tcpdf/fonts/ae_fonts_*`;
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tcpdf/fonts/utils`;
$ret=`rm -f $BUILDROOT/$PROJECT/htdocs/includes/tcpdf/LICENSE.TXT`;
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tecnickcom/tcpdf/fonts/dejavu-fonts-ttf-*`;
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tecnickcom/tcpdf/fonts/freefont-*`;
+ $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tecnickcom/tcpdf/fonts/ae_fonts_*`;
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tecnickcom/tcpdf/fonts/utils`;
$ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tecnickcom/tcpdf/tools`;
$ret=`rm -f $BUILDROOT/$PROJECT/htdocs/includes/tecnickcom/tcpdf/LICENSE.TXT`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/savant`;
print "Remove subdir of custom dir\n";
print "find $BUILDROOT/$PROJECT/htdocs/custom/* -type d -exec rm -fr {} \\;\n";
- $ret=`find $BUILDROOT/$PROJECT/htdocs/custom/* -type d -exec rm -fr {} \\; >/dev/null 2>&1`; # For custom we want to keep dir
+ $ret=`find $BUILDROOT/$PROJECT/htdocs/custom/* -type d -exec rm -fr {} \\; >/dev/null 2>&1`; # For custom we want to remove all subdirs but not files
}
# Build package for each target
@@ -913,9 +910,6 @@ if ($nboftargetok) {
$ret=`rm -fr $BUILDROOT/$PROJECT.tmp/htdocs/includes/mike42/escpos-php/LICENSE.md`;
$ret=`rm -fr $BUILDROOT/$PROJECT.tmp/htdocs/includes/mobiledetect/mobiledetectlib/LICENSE.txt`;
- $ret=`rm -fr $BUILDROOT/$PROJECT.tmp/htdocs/includes/tecnickcom/tcpdf/fonts/dejavu-fonts-ttf-2.34/LICENSE`;
- $ret=`rm -fr $BUILDROOT/$PROJECT.tmp/htdocs/includes/tecnickcom/tcpdf/fonts/freefont-20120503/COPYING`;
- $ret=`rm -fr $BUILDROOT/$PROJECT.tmp/htdocs/includes/tecnickcom/tcpdf/fonts/ae_fonts_2.0/COPYING`;
# Removed files we don't need
$ret=`rm -fr $BUILDROOT/$PROJECT.tmp/htdocs/includes/ckeditor/ckeditor/_source`;
@@ -978,13 +972,12 @@ if ($nboftargetok) {
$ret=`$cmd`;
$ret=`chmod 755 $BUILDROOT/$PROJECT.tmp/debian/rules`;
$ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/dev/translation/autotranslator.class.php`;
- $ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/dev/skeletons/modMyModule.class.php`;
- $ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/dev/skeletons/skeleton_api_class.class.php`;
- $ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/dev/skeletons/skeleton_card.php`;
- $ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/dev/skeletons/skeleton_class.class.php`;
- $ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/dev/skeletons/skeleton_list.php`;
- $ret=`chmod -R 755 $BUILDROOT/$PROJECT.tmp/dev/skeletons/skeleton_script.php`;
- $ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/dev/skeletons/skeleton_webservice_server.php`;
+ $ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/htdocs/modulebuilder/template/class/myobject.class.php`;
+ $ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/htdocs/modulebuilder/template/class/myobject_api_class.class.php`;
+ $ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/htdocs/modulebuilder/template/core/modules/modMyModule.class.php`;
+ $ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/htdocs/modulebuilder/template/myobject_card.php`;
+ $ret=`chmod -R 644 $BUILDROOT/$PROJECT.tmp/htdocs/modulebuilder/template/myobject_list.php`;
+ $ret=`chmod -R 755 $BUILDROOT/$PROJECT.tmp/htdocs/modulebuilder/template/scripts/myobject.php`;
$cmd="find $BUILDROOT/$PROJECT.tmp/scripts -name '*.php' -type f -exec chmod 755 {} \\; ";
$ret=`$cmd`;
$cmd="find $BUILDROOT/$PROJECT.tmp/scripts -name '*.sh' -type f -exec chmod 755 {} \\; ";
diff --git a/build/pad/pad_dolibarr.xml b/build/pad/pad_dolibarr.xml
index 0920a19311d..77318eeb2d2 100644
--- a/build/pad/pad_dolibarr.xml
+++ b/build/pad/pad_dolibarr.xml
@@ -7,20 +7,20 @@
Dolibarr team
- 11 rue raymond Queneau
+ 20 rue camponac
- Rueil Malmaison
+ Pessac
- 92500
+ 33600FRANCE
- http://www.dolibarr.org
+ https://www.dolibarr.orgDolibarr teamDolibarr team
- dolibarr-dev@nongnu.org
+ contact@dolibarr.orgDolibarr teamDolibarr team
- dolibarr-dev@nongnu.org
+ contact@dolibarr.orgdolibarr-dev@nongnu.org
@@ -34,10 +34,10 @@
Dolibarr
- 3.5
- 01
+ 5.0
+ 0201
- 2014
+ 2017
@@ -71,8 +71,8 @@
Dolibarr ERP & CRMDolibarr ERP & CRM, the easy to use open source software to manage your activityDolibarr ERP & CRM, the easy to use open source software to manage your activity (invoices, customers, suppliers, contracts, agenda, emailings...) and any other things a small or mid-sized business or a foundation needs to manage.
- Dolibarr ERP & CRM is a software built by modules addition (you enable only features you need), to manage small or medium companies, freelancers or foundations. We can say Dolibarr is an ERP or CRM. Dolibarr is also available with an auto-installer for Windows users with no technical knowledge to install Dolibarr and all its prerequisites (Apache, Mysql, PHP) with just one auto-exe file. See DoliWamp software for this.
- Dolibarr ERP & CRM is a software built by modules addition (you enable only features you need), to manage small or mid-sized businesses, freelancers or foundations. We can say Dolibarr is an ERP or CRM (or both depending on activated modules). It's an OpenSource project base on a WAMP, MAMP or LAMP server (Apache, Mysql, PHP for all Operating Systems). Dolibarr differs from other ERP or CRM softwares (like OpenAguila, OpenBravo, OpenERP, Neogia, Compiere, etc) because everything was made to be more simple:
+ Dolibarr ERP & CRM is a software package built by modules addition (you enable only features you need), to manage small or medium companies, freelancers or foundations. We can say Dolibarr is an ERP or CRM. Dolibarr is also available with an auto-installer for Windows users with no technical knowledge to install Dolibarr and all its prerequisites (Apache, Mysql, PHP) with just one auto-exe file. See DoliWamp software for this.
+ Dolibarr ERP & CRM is a software package built by modules addition (you enable only features you need), to manage small or mid-sized businesses, freelancers or foundations. We can say Dolibarr is an ERP or CRM (or both depending on activated modules). It's an OpenSource project base on a WAMP, MAMP or LAMP server (Apache, Mysql, PHP for all Operating Systems). Dolibarr differs from other ERP or CRM softwares (like OpenAguila, OpenBravo, Odoo, Neogia, Compiere, etc) because everything was made to be more simple:
Simple to install
Simple to use
Simple to develop
@@ -101,14 +101,14 @@ Dolibarr intègre en effet sa propre architecture (design patterns) permettant
- http://www.dolibarr.org
- http://www.dolibarr.org
- http://www.dolibarr.org/images/dolibarr_screenshot1.png
- http://www.dolibarr.org/images/dolibarr.gif
- http://www.dolibarr.org/files/pad_dolibarr.xml
+ https://www.dolibarr.org
+ https://www.dolibarr.org
+ https://www.dolibarr.org/images/dolibarr_screenshot1.png
+ https://www.dolibarr.org/images/dolibarr.gif
+ https://www.dolibarr.org/files/pad_dolibarr.xml
- http://www.dolibarr.org/files/dolibarr.tgz
+ https://www.dolibarr.org/files/dolibarr.tgzhttp://www.dolibarr.org/files/dolibarr.tgz
diff --git a/build/pad/pad_dolibarr_nos.xml b/build/pad/pad_dolibarr_nos.xml
new file mode 100644
index 00000000000..6d81793de79
--- /dev/null
+++ b/build/pad/pad_dolibarr_nos.xml
@@ -0,0 +1,232 @@
+
+
+
+ 3.11
+ PADGen 3.1.1.47 http://www.padgen.org
+ Portable Application Description, or PAD for short, is a data set that is used by shareware authors to disseminate information to anyone interested in their software products. To find out more go to http://pad.asp-software.org
+
+
+ Dolibarr team
+ 20 rue camponac
+
+ Pessac
+
+ 33600
+ FRANCE
+ https://www.dolibarr.org
+
+ Dolibarr team
+ Dolibarr team
+ contact@dolibarr.org
+ Dolibarr team
+ Dolibarr team
+ contact@dolibarr.org
+
+
+ dolibarr-dev@nongnu.org
+ dolibarr-dev@nongnu.org
+ dolibarr-dev@nongnu.org
+
+
+
+
+
+
+
+ Dolibarr
+ 5.0
+ 02
+ 01
+ 2017
+
+
+
+ Freeware
+ Major Update
+ No Install Support
+ Linux,Mac OS X,Mac Other,Unix,Win2000,Win7 x32,Win7 x64,Win98,WinOther,WinServer,WinVista,WinVista x64,WinXP,Other
+ English,Arabic,Catalan,Chinese,Danish,Dutch,Finnish,French,German,Greek,Icelandic,Italian,Norwegian,Polish,Portuguese,Romanian,Russian,Slovenian,Spanish,Swedish,Turkish
+ Increase performances, Setup process is easier, Reduce number of clicks required to use software
+ Business
+ Business::Accounting & Finance
+ None
+
+ 18037439
+ 18037
+ 18.03
+
+
+ N
+
+ Days
+
+
+
+
+
+
+
+
+ dolibarr, erp, crm, invoices, commercial proposals, orders, accounting, stock, products, agenda, bank, business, company, foundation, management, sme, doliwamp
+ Dolibarr ERP & CRM
+ Dolibarr ERP & CRM, the easy to use open source software to manage your activity
+ Dolibarr ERP & CRM, the easy to use open source software to manage your activity (invoices, customers, suppliers, contracts, agenda, emailings...) and any other things a small or mid-sized business or a foundation needs to manage.
+ Dolibarr ERP & CRM is a software package built by modules addition (you enable only features you need), to manage small or medium companies, freelancers or foundations. We can say Dolibarr is an ERP or CRM. Dolibarr is also available with an auto-installer for Windows users with no technical knowledge to install Dolibarr and all its prerequisites (Apache, Mysql, PHP) with just one auto-exe file. See DoliWamp software for this.
+ Dolibarr ERP & CRM is a software package built by modules addition (you enable only features you need), to manage small or mid-sized businesses, freelancers or foundations. We can say Dolibarr is an ERP or CRM (or both depending on activated modules). It's an OpenSource project base on a WAMP, MAMP or LAMP server (Apache, Mysql, PHP for all Operating Systems). Dolibarr differs from other ERP or CRM softwares (like OpenAguila, OpenBravo, OpenERP, Neogia, Compiere, etc) because everything was made to be more simple:
+Simple to install
+Simple to use
+Simple to develop
+Note that Dolibarr is also available with an auto-installer for Windows or Ubuntu users with no technical knowledge to install Dolibarr and all its prerequisites (Apache, Mysql, PHP) with just one auto-exe file. This version is called DoliWamp (for Windows) or DoliBuntu (for Ubuntu/Debian).
+
+
+ dolibarr, erp, crm, invoices, commercial proposals, orders, accounting, stock, products, agenda, bank, business, company, foundation, management, sme, doliwamp
+ Dolibarr ERP & CRM
+ Dolibarr ERP & CRM, le gestionnaire simple pour gérer votre activité
+ Dolibarr ERP & CRM, le logiciel simple et OpenSource pour gérer votre activité (factures, devis, facturation, commandes, compta, trésorerie, stocks, produits, agenda, comptes bancaires, associations)
+ Dolibarr ERP & CRM est un logiciel modulaire (on n'active que les fonctions que l'on désire) de gestions de TPE/PME, d'indépendants, d'entrepreneurs ou d'associations. En terme plus techniques, c'est un ERP et CRM. C'est un projet OpenSource qui s'exécute au sein d'un serveur Web et peut donc être accessible depuis n'importe quel lieu disposant d'une connexion Internet (Projet basé sur un serveur WAMP, MAMP ou LAMP: Apache, MySQL, PHP).
+ Dolibarr ERP & CRM est un logiciel modulaire (on n'active que les fonctions que l'on désire) de gestions de TPE/PME, d'indépendants, d'entrepreneurs ou d'associations. En terme plus techniques, c'est un ERP et CRM. C'est un projet OpenSource qui s'exécute au sein d'un serveur Web et peut donc être accessible depuis n'importe quel lieu disposant d'une connexion Internet (Projet basé sur un serveur WAMP, MAMP ou LAMP: Apache, MySQL, PHP). Dolibarr vient compléter les offres déjà nombreuses de logiciels de cette catégorie (comme OpenBravo, OpenERP, SugarCRM, Neogia, Compiere, etc.) mais se démarque par le fait qu'ici tout est fait pour offrir de la simplicité (règle des 3 S):
+Simple pour l'installation (avec au choix des installeurs clé en main pour ceux qui ignorent comment installer un serveur Web, ou une installation manuelle)
+Simple pour l'utilisation (fonctions modulaires pour ne pas surcharger les menus, informations claires à la saisie)
+Simple pour le développement (pas de frameworks lourds).
+Dolibarr intègre en effet sa propre architecture (design patterns) permettant à tout développeur d'être tout de suite opérationnel sans connaissances particulières autre que le PHP.
+
+
+ erp, crm, gestionale, medie imprese, fondazioni
+ Gestionale open source e gratuito
+ Gestionale open source e gratuito per piccole e medie imprese, fondazioni
+ Dolibarr è un a gestionale open source e gratuito per piccole e medie imprese, fondazioni e liberi professionisti. Include varie funzionalità per Enterprise Resource Planning e gestione dei clienti (CRM), ma anche ulteriori attività.
+ Dolibarr è un programma gestionale open source e gratuito per piccole e medie imprese, fondazioni e liberi professionisti. Include varie funzionalità per Enterprise Resource Planning e gestione dei clienti (CRM), ma anche ulteriori attività. Dolibar è progettato per poter fornire solo ciò di cui hai bisogno ed essere facile da usare.
+ Dolibarr è un programma gestionale open source e gratuito per piccole e medie imprese, fondazioni e liberi professionisti. Include varie funzionalità per Enterprise Resource Planning e gestione dei clienti (CRM), ma anche ulteriori attività. Dolibar è progettato per poter fornire solo ciò di cui hai bisogno ed essere facile da usare. Dolibar è completamente web-based, progettato per poter fornire solo ciò di cui hai bisogno ed essere facile da usare.
+
+
+
+
+ https://www.dolibarr.org
+ https://www.dolibarr.org
+ http://www.dolibarr.org/images/dolibarr_screenshot1.png
+ http://www.dolibarr.org/images/dolibarr.gif
+ https://www.dolibarr.org/files/pad_dolibarr.xml
+
+
+ https://www.dolibarr.org/files/dolibarr.zip
+ http://www.dolibarr.org/files/dolibarr.zip
+
+
+
+
+
+ GNU GPL
+ GNU GPL
+
+
+ Y
+ 1.4
+ http://pad.asp-software.org/extensions/Affiliates.htm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Y
+ N
+
+
+
diff --git a/build/pad/pad_doliwamp.xml b/build/pad/pad_doliwamp.xml
index 8abf126d5f7..842d746dbcc 100644
--- a/build/pad/pad_doliwamp.xml
+++ b/build/pad/pad_doliwamp.xml
@@ -7,13 +7,13 @@
NLTechno
- 11 Rue raymond Queneau
+ 20 Rue Camponac
- Rueil Malmaison
+ Pessac
- 92500
+ 33600FRANCE
- http://www.nltechno.com
+ https://www.dolibarr.orgNLTechnoNLTechno
@@ -34,10 +34,10 @@
DoliWamp
- 3.5
- 01
+ 5.0
+ 0201
- 2014
+ 2017
@@ -53,7 +53,7 @@
2604800425437
- 24.84
+ 45.84N
@@ -72,7 +72,7 @@
DoliWamp, the easy to use Dolibarr for Windows to manage your company,foundationDoliWamp is the Dolibarr ERP/CRM for Windows, the easy to use open source software to manage your activity (invoices, customers, suppliers, contracts, agenda, emailings...) and any other things a small or mid-sized business or a foundation needs.DoliWamp is the Dolibarr ERP/CRM autoinstaller for Windows users with no technical knowledge to install Dolibarr and all its prerequisites (Apache, Mysql, PHP) with just one auto-exe file. Dolibarr ERP/CRM is a software package built by modules addition (you enable only features you need), to manage small or mid-sized businesses, freelancers or foundations.
- DoliWamp is the Dolibarr ERP/CRM for Windows. Dolibarr ERP & CRM is a software built by modules addition (you enable only features you need), to manage small or mid-sized businesses, freelancers or foundations (You can manage or follow contacts, invoices, orders, commercial proposals, products, stock management, agenda, mass emailings, members of a foundation, bank accounts...). Based on a WAMP, MAMP or LAMP server (Apache, Mysql, PHP for all Operating Systems), you can install it as a standalone program or use it from anywhere with any web browser. Dolibarr is an OpenSource project. It differs from other ERP or CRM softwares (like OpenAguila, OpenBravo, OpenERP, Neogia, Compiere, etc) because everything was made to be more simple: Simple to install, Simple to use, Simple to develop.
+ DoliWamp is the Dolibarr ERP/CRM for Windows. Dolibarr ERP & CRM is a software package built by modules addition (you enable only features you need), to manage small or mid-sized businesses, freelancers or foundations (You can manage or follow contacts, invoices, orders, commercial proposals, products, stock management, agenda, mass emailings, members of a foundation, bank accounts...). Based on a WAMP, MAMP or LAMP server (Apache, Mysql, PHP for all Operating Systems), you can install it as a standalone program or use it from anywhere with any web browser. Dolibarr is an OpenSource project. It differs from other ERP or CRM softwares (like OpenAguila, OpenBravo, OpenERP, Neogia, Compiere, etc) because everything was made to be more simple: Simple to install, Simple to use, Simple to develop.
DoliWamp is the auto-installer for Windows users with no technical knowledge to install Dolibarr ERP/CRM and all its prerequisites (Apache, Mysql, PHP) with just one auto-exe file.
@@ -96,12 +96,12 @@ DoliWamp is the auto-installer for Windows users with no technical knowledge to
http://www.nltechno.com/doliwamp/http://www.nltechno.com/doliwamp/
- http://www.dolibarr.org/images/dolibarr_screenshot1.png
- http://www.dolibarr.org/images/dolibarr.gif
- http://www.dolibarr.org/files/pad_doliwamp.xml
+ https://www.dolibarr.org/images/dolibarr_screenshot1.png
+ https://www.dolibarr.org/images/dolibarr.gif
+ https://www.dolibarr.org/files/pad_doliwamp.xml
- http://www.dolibarr.org/files/doliwamp.exe
+ https://www.dolibarr.org/files/doliwamp.exehttp://www.dolibarr.org/files/doliwamp.exe
diff --git a/build/pad/pad_doliwamp_nos.xml b/build/pad/pad_doliwamp_nos.xml
new file mode 100644
index 00000000000..61c739daff0
--- /dev/null
+++ b/build/pad/pad_doliwamp_nos.xml
@@ -0,0 +1,225 @@
+
+
+
+ 3.11
+ PADGen 3.1.1.47 http://www.padgen.org
+ Portable Application Description, or PAD for short, is a data set that is used by shareware authors to disseminate information to anyone interested in their software products. To find out more go to http://pad.asp-software.org
+
+
+ NLTechno
+ 20 Rue Camponac
+
+ Pessac
+
+ 33600
+ FRANCE
+ https://www.dolibarr.org
+
+ NLTechno
+ NLTechno
+ contact@nltechno.com
+ NLTechno
+ NLTechno
+ contact@nltechno.com
+
+
+ support@nltechno.com
+ support@nltechno.com
+ support@nltechno.com
+
+
+
+
+
+
+
+ DoliWamp
+ 5.0
+ 02
+ 01
+ 2017
+
+
+
+ Freeware
+ Major Update
+ Install and Uninstall
+ Win2000,Win7 x32,Win7 x64,Win98,WinOther,WinServer,WinVista,WinVista x64,WinXP,Other
+ English,Arabic,Catalan,Chinese,Dutch,Finnish,French,German,Icelandic,Italian,Norwegian,Polish,Portuguese,Romanian,Russian,Slovenian,Spanish,Swedish,Turkish
+ Increase performances, Setup process is easier, Reduce number of clicks required to use software
+ Business
+ Business::Accounting & Finance
+ None
+
+ 26048004
+ 25437
+ 45.84
+
+
+ N
+
+ Days
+
+
+
+
+
+
+
+
+ doliwamp, dolibarr, erp, crm, invoices, commercial proposals, orders, accounting, stock, products, agenda, bank, business, company, foundation, management
+ DoliWamp, Dolibarr ERP/CRM for Windows
+ DoliWamp, the easy to use Dolibarr for Windows to manage your company,foundation
+ DoliWamp is the Dolibarr ERP/CRM for Windows, the easy to use open source software to manage your activity (invoices, customers, suppliers, contracts, agenda, emailings...) and any other things a small or mid-sized business or a foundation needs.
+ DoliWamp is the Dolibarr ERP/CRM autoinstaller for Windows users with no technical knowledge to install Dolibarr and all its prerequisites (Apache, Mysql, PHP) with just one auto-exe file. Dolibarr ERP/CRM is a software package built by modules addition (you enable only features you need), to manage small or mid-sized businesses, freelancers or foundations.
+ DoliWamp is the Dolibarr ERP/CRM for Windows. Dolibarr ERP & CRM is a software package built by modules addition (you enable only features you need), to manage small or mid-sized businesses, freelancers or foundations (You can manage or follow contacts, invoices, orders, commercial proposals, products, stock management, agenda, mass emailings, members of a foundation, bank accounts...). Based on a WAMP, MAMP or LAMP server (Apache, Mysql, PHP for all Operating Systems), you can install it as a standalone program or use it from anywhere with any web browser. Dolibarr is an OpenSource project. It differs from other ERP or CRM softwares (like OpenAguila, OpenBravo, OpenERP, Neogia, Compiere, etc) because everything was made to be more simple: Simple to install, Simple to use, Simple to develop.
+DoliWamp is the auto-installer for Windows users with no technical knowledge to install Dolibarr ERP/CRM and all its prerequisites (Apache, Mysql, PHP) with just one auto-exe file.
+
+
+ doliwamp, dolibarr, erp, crm, factures, devis, facturation, commandes, compta, trésorerie, stocks, produits, agenda, comptes bancaires, associations, entreprises, PME, TPE
+ DoliWamp, Dolibarr ERP/CRM pour Windows
+ DoliWamp, la distribution de Dolibarr pour gérer votre entreprise ou association
+ DoliWamp est la version spécialisée pour Windows de Dolibarr ERP-CRM, le logiciel simple et OpenSource pour gérer votre activité (factures, devis, facturation, commandes, compta, trésorerie, stocks, produits, agenda, comptes bancaires, associations)
+ DoliWamp est la version spécialisée pour Windows de Dolibarr ERP-CRM, le logiciel simple et OpenSource pour gérer votre activité (factures, devis, facturation, commandes, compta, trésorerie, stocks, produits, agenda, comptes bancaires, associations)
+ DoliWamp est la version spécialisée pour Windows de Dolibarr ERP-CRM, le logiciel simple et OpenSource pour gérer votre activité (factures, devis, facturation, commandes, compta, trésorerie, stocks, produits, agenda, comptes bancaires, associations)
+
+
+ doliwamp, dolibarr, erp, crm, gestionale, medie imprese, fondazioni
+ DoliWamp, Dolibarr ERP/CRM per Windows
+ Gestionale open source e gratuito per piccole e medie imprese, fondazioni
+ Dolibarr è un a gestionale open source e gratuito per piccole e medie imprese, fondazioni e liberi professionisti. Include varie funzionalità per Enterprise Resource Planning e gestione dei clienti (CRM), ma anche ulteriori attività.
+ Dolibarr è un programma gestionale open source e gratuito per piccole e medie imprese, fondazioni e liberi professionisti. Include varie funzionalità per Enterprise Resource Planning e gestione dei clienti (CRM), ma anche ulteriori attività. Dolibar è progettato per poter fornire solo ciò di cui hai bisogno ed essere facile da usare.
+ Dolibarr è un programma gestionale open source e gratuito per piccole e medie imprese, fondazioni e liberi professionisti. Include varie funzionalità per Enterprise Resource Planning e gestione dei clienti (CRM), ma anche ulteriori attività. Dolibar è progettato per poter fornire solo ciò di cui hai bisogno ed essere facile da usare. Dolibar è completamente web-based, progettato per poter fornire solo ciò di cui hai bisogno ed essere facile da usare.
+
+
+
+
+ http://www.nltechno.com/doliwamp/
+ http://www.nltechno.com/doliwamp/
+ http://www.dolibarr.org/images/dolibarr_screenshot1.png
+ http://www.dolibarr.org/images/dolibarr.gif
+ https://www.dolibarr.org/files/pad_doliwamp.xml
+
+
+ https://www.dolibarr.org/files/doliwamp.exe
+ http://www.dolibarr.org/files/doliwamp.exe
+
+
+
+
+
+ GNU GPL
+ GNU GPL
+
+
+ Y
+ 1.4
+ http://pad.asp-software.org/extensions/Affiliates.htm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Y
+ N
+
+
+
diff --git a/build/rpm/dolibarr_fedora.spec b/build/rpm/dolibarr_fedora.spec
index 083c4eb8f14..33dc951309d 100755
--- a/build/rpm/dolibarr_fedora.spec
+++ b/build/rpm/dolibarr_fedora.spec
@@ -18,8 +18,8 @@ License: GPLv3+
#Packager: Laurent Destailleur (Eldy)
Vendor: Dolibarr dev team
-URL: http://www.dolibarr.org
-Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_redhat-fedora/%{name}-%{version}.tgz
+URL: https://www.dolibarr.org
+Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_redhat-fedora/%{name}-%{version}.tgz
Patch0: %{name}-forrpm.patch
BuildArch: noarch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -165,6 +165,7 @@ done >>%{name}.lang
%_datadir/dolibarr/htdocs/bookmarks
%_datadir/dolibarr/htdocs/cashdesk
%_datadir/dolibarr/htdocs/categories
+%_datadir/dolibarr/htdocs/collab
%_datadir/dolibarr/htdocs/comm
%_datadir/dolibarr/htdocs/commande
%_datadir/dolibarr/htdocs/compta
@@ -193,6 +194,7 @@ done >>%{name}.lang
%_datadir/dolibarr/htdocs/loan
%_datadir/dolibarr/htdocs/mailmanspip
%_datadir/dolibarr/htdocs/margin
+%_datadir/dolibarr/htdocs/modulebuilder
%_datadir/dolibarr/htdocs/multicurrency
%_datadir/dolibarr/htdocs/opensurvey
%_datadir/dolibarr/htdocs/paybox
@@ -203,10 +205,12 @@ done >>%{name}.lang
%_datadir/dolibarr/htdocs/public
%_datadir/dolibarr/htdocs/resource
%_datadir/dolibarr/htdocs/societe
+%_datadir/dolibarr/htdocs/stripe
%_datadir/dolibarr/htdocs/supplier_proposal
%_datadir/dolibarr/htdocs/support
%_datadir/dolibarr/htdocs/theme
%_datadir/dolibarr/htdocs/user
+%_datadir/dolibarr/htdocs/variants
%_datadir/dolibarr/htdocs/webservices
%_datadir/dolibarr/htdocs/websites
%_datadir/dolibarr/htdocs/*.ico
diff --git a/build/rpm/dolibarr_generic.spec b/build/rpm/dolibarr_generic.spec
index b40a203a71f..42a89675abf 100755
--- a/build/rpm/dolibarr_generic.spec
+++ b/build/rpm/dolibarr_generic.spec
@@ -26,17 +26,17 @@ License: GPL-3.0+
#Packager: Laurent Destailleur (Eldy)
Vendor: Dolibarr dev team
-URL: http://www.dolibarr.org
+URL: https://www.dolibarr.org
%if 0%{?fedora} || 0%{?rhel_version} || 0%{?centos_version}
-Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_redhat-fedora/%{name}-%{version}.tgz
+Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_redhat-fedora/%{name}-%{version}.tgz
%else
%if 0%{?mdkversion}
-Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_mandriva/%{name}-%{version}.tgz
+Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_mandriva/%{name}-%{version}.tgz
%else
%if 0%{?suse_version}
-Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_opensuse/%{name}-%{version}.tgz
+Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_opensuse/%{name}-%{version}.tgz
%else
-Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_generic/%{name}-%{version}.tgz
+Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_generic/%{name}-%{version}.tgz
%endif
%endif
%endif
@@ -245,6 +245,7 @@ done >>%{name}.lang
%_datadir/dolibarr/htdocs/bookmarks
%_datadir/dolibarr/htdocs/cashdesk
%_datadir/dolibarr/htdocs/categories
+%_datadir/dolibarr/htdocs/collab
%_datadir/dolibarr/htdocs/comm
%_datadir/dolibarr/htdocs/commande
%_datadir/dolibarr/htdocs/compta
@@ -273,6 +274,7 @@ done >>%{name}.lang
%_datadir/dolibarr/htdocs/loan
%_datadir/dolibarr/htdocs/mailmanspip
%_datadir/dolibarr/htdocs/margin
+%_datadir/dolibarr/htdocs/modulebuilder
%_datadir/dolibarr/htdocs/multicurrency
%_datadir/dolibarr/htdocs/opensurvey
%_datadir/dolibarr/htdocs/paybox
@@ -283,10 +285,12 @@ done >>%{name}.lang
%_datadir/dolibarr/htdocs/public
%_datadir/dolibarr/htdocs/resource
%_datadir/dolibarr/htdocs/societe
+%_datadir/dolibarr/htdocs/stripe
%_datadir/dolibarr/htdocs/supplier_proposal
%_datadir/dolibarr/htdocs/support
%_datadir/dolibarr/htdocs/theme
%_datadir/dolibarr/htdocs/user
+%_datadir/dolibarr/htdocs/variants
%_datadir/dolibarr/htdocs/webservices
%_datadir/dolibarr/htdocs/websites
%_datadir/dolibarr/htdocs/*.ico
diff --git a/build/rpm/dolibarr_mandriva.spec b/build/rpm/dolibarr_mandriva.spec
index fa3e39f8693..9dd2100b02c 100755
--- a/build/rpm/dolibarr_mandriva.spec
+++ b/build/rpm/dolibarr_mandriva.spec
@@ -18,8 +18,8 @@ License: GPL-3.0+
#Packager: Laurent Destailleur (Eldy)
Vendor: Dolibarr dev team
-URL: http://www.dolibarr.org
-Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_mandriva/%{name}-%{version}.tgz
+URL: https://www.dolibarr.org
+Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_mandriva/%{name}-%{version}.tgz
Patch0: %{name}-forrpm.patch
BuildArch: noarch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -190,6 +190,7 @@ done >>%{name}.lang
%_datadir/dolibarr/htdocs/loan
%_datadir/dolibarr/htdocs/mailmanspip
%_datadir/dolibarr/htdocs/margin
+%_datadir/dolibarr/htdocs/modulebuilder
%_datadir/dolibarr/htdocs/multicurrency
%_datadir/dolibarr/htdocs/opensurvey
%_datadir/dolibarr/htdocs/paybox
@@ -200,10 +201,12 @@ done >>%{name}.lang
%_datadir/dolibarr/htdocs/public
%_datadir/dolibarr/htdocs/resource
%_datadir/dolibarr/htdocs/societe
+%_datadir/dolibarr/htdocs/stripe
%_datadir/dolibarr/htdocs/supplier_proposal
%_datadir/dolibarr/htdocs/support
%_datadir/dolibarr/htdocs/theme
%_datadir/dolibarr/htdocs/user
+%_datadir/dolibarr/htdocs/variants
%_datadir/dolibarr/htdocs/webservices
%_datadir/dolibarr/htdocs/websites
%_datadir/dolibarr/htdocs/*.ico
diff --git a/build/rpm/dolibarr_opensuse.spec b/build/rpm/dolibarr_opensuse.spec
index b2f8cf6ede1..d780c47da99 100755
--- a/build/rpm/dolibarr_opensuse.spec
+++ b/build/rpm/dolibarr_opensuse.spec
@@ -18,8 +18,8 @@ License: GPL-3.0+
#Packager: Laurent Destailleur (Eldy)
Vendor: Dolibarr dev team
-URL: http://www.dolibarr.org
-Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_opensuse/%{name}-%{version}.tgz
+URL: https://www.dolibarr.org
+Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_opensuse/%{name}-%{version}.tgz
Patch0: %{name}-forrpm.patch
BuildArch: noarch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -173,6 +173,7 @@ done >>%{name}.lang
%_datadir/dolibarr/htdocs/bookmarks
%_datadir/dolibarr/htdocs/cashdesk
%_datadir/dolibarr/htdocs/categories
+%_datadir/dolibarr/htdocs/collab
%_datadir/dolibarr/htdocs/comm
%_datadir/dolibarr/htdocs/commande
%_datadir/dolibarr/htdocs/compta
@@ -201,6 +202,7 @@ done >>%{name}.lang
%_datadir/dolibarr/htdocs/loan
%_datadir/dolibarr/htdocs/mailmanspip
%_datadir/dolibarr/htdocs/margin
+%_datadir/dolibarr/htdocs/modulebuilder
%_datadir/dolibarr/htdocs/multicurrency
%_datadir/dolibarr/htdocs/opensurvey
%_datadir/dolibarr/htdocs/paybox
@@ -211,10 +213,12 @@ done >>%{name}.lang
%_datadir/dolibarr/htdocs/public
%_datadir/dolibarr/htdocs/resource
%_datadir/dolibarr/htdocs/societe
+%_datadir/dolibarr/htdocs/stripe
%_datadir/dolibarr/htdocs/supplier_proposal
%_datadir/dolibarr/htdocs/support
%_datadir/dolibarr/htdocs/theme
%_datadir/dolibarr/htdocs/user
+%_datadir/dolibarr/htdocs/variants
%_datadir/dolibarr/htdocs/webservices
%_datadir/dolibarr/htdocs/websites
%_datadir/dolibarr/htdocs/*.ico
diff --git a/dev/dolibarr_changes.txt b/dev/dolibarr_changes.txt
index 82f364b0c1f..3b9ef4cc447 100644
--- a/dev/dolibarr_changes.txt
+++ b/dev/dolibarr_changes.txt
@@ -3,20 +3,18 @@ This file describe changes made on external library after beeing included
in Dolibarr root.
-
ALL:
----
-Replace "& new" by "new"
+Check "@CHANGE"
-
-CKEDITOR:
----------
+CKEDITOR (4.6.2):
+-----------------
* In ckeditor/ckeditor/contents.css
Replace:
- margin: 20px;
+ body { ... margin: 20px;
With
- margin: 5px;
+ body { ... margin: 5px;
@@ -33,21 +31,6 @@ Replace call to serialize_val with no bugged value
-FPDI:
------
-Replace:
- $this->_readXref($this->_xref, $this->_findXref());
-with:
- try {
- $this->_readXref($this->_xref, $this->_findXref());
- }
- catch(Exception $e)
- {
- print $e->getMessage();
- exit;
- }
-
-
TCPDF:
------
@@ -56,7 +39,7 @@ define('QR_FIND_FROM_RANDOM', 2);
with
define('QR_FIND_FROM_RANDOM', false);
-* Removed useless directories (examples, tools)
+* Removed useless directories ("examples", "tools")
* Fix
// initialize subsetchars
diff --git a/dev/examples/ldap/ldapsearch_sample1.txt b/dev/examples/ldap/ldapsearch_sample1.txt
index fb7c4f85543..7000723d92a 100644
--- a/dev/examples/ldap/ldapsearch_sample1.txt
+++ b/dev/examples/ldap/ldapsearch_sample1.txt
@@ -5,5 +5,5 @@
#
# ldapsearch -h hostname -x
# ldapsearch -h hostname -x -b "ou=people,dc=teclib,dc=infra"
-# ldapsearch -h hostname -x -z 0 -b "o=somecompany.com" -D "cn=manager,o=somecompany.com" -W "(objectclass=*)"
-# ldapsearch -h hostname -x -b "o=somecompany.com" -D "cn=manager,o=somecompany.com" -W "(objectclass=*)"
+# ldapsearch -h hostname -x -z 0 -b "o=somecompany.com" -D "cn=manager,o=somecompany.com" -w password "(objectclass=*)"
+# ldapsearch -h hostname -x -b "o=somecompany.com" -D "cn=manager,o=somecompany.com" -w password "(objectclass=*)"
diff --git a/dev/initdemo/initdemo.sh b/dev/initdemo/initdemo.sh
index 940f0b59467..ddba2ea6fd9 100755
--- a/dev/initdemo/initdemo.sh
+++ b/dev/initdemo/initdemo.sh
@@ -155,7 +155,7 @@ fi
#echo "mysql -P$port -u$admin $passwd $base < $mydir/$dumpfile"
#mysql -P$port -u$admin $passwd $base < $mydir/$dumpfile
#echo "drop old table"
-echo "drop table llx_accounting_account;" | mysql -P$port -u$admin $passwd $base
+echo "drop table if exists llx_accounting_account;" | mysql -P$port -u$admin $passwd $base
echo "mysql -P$port -u$admin -p***** $base < $mydir/$dumpfile"
mysql -P$port -u$admin $passwd $base < $mydir/$dumpfile
export res=$?
diff --git a/dev/initdemo/mysqldump_dolibarr_3.5.0.sql b/dev/initdemo/mysqldump_dolibarr_3.5.0.sql
index dba6263dde3..28b05e920d8 100644
--- a/dev/initdemo/mysqldump_dolibarr_3.5.0.sql
+++ b/dev/initdemo/mysqldump_dolibarr_3.5.0.sql
@@ -528,7 +528,7 @@ CREATE TABLE `llx_bank` (
LOCK TABLES `llx_bank` WRITE;
/*!40000 ALTER TABLE `llx_bank` DISABLE KEYS */;
-INSERT INTO `llx_bank` VALUES (1,'2010-07-08 23:56:14','2013-03-07 21:28:51','2010-07-08','2010-07-08',2000.00000000,'(Initial balance)',1,NULL,1,'SOLD','201210',NULL,1,NULL,0,NULL,NULL,NULL),(2,'2010-07-09 00:00:24','0000-00-00 00:00:00','2010-07-09','2010-07-09',500.00000000,'(Initial balance)',2,NULL,NULL,'SOLD',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(3,'2010-07-10 13:33:42','0000-00-00 00:00:00','2010-07-10','2010-07-10',0.00000000,'(Solde initial)',3,NULL,NULL,'SOLD',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(4,'2010-07-10 14:59:41','0000-00-00 00:00:00','2010-07-10','2010-07-10',0.02000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,'Client salon invidivdu',NULL),(5,'2011-07-18 20:50:24','0000-00-00 00:00:00','2011-07-08','2011-07-08',20.00000000,'(CustomerInvoicePayment)',1,1,NULL,'CB','201107',NULL,1,NULL,0,NULL,NULL,NULL),(6,'2011-07-18 20:50:47','0000-00-00 00:00:00','2011-07-08','2011-07-08',10.00000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(8,'2011-08-01 03:34:11','2013-03-07 21:28:51','2011-08-01','2011-08-01',5.63000000,'(CustomerInvoicePayment)',1,1,1,'CB','201210',NULL,1,NULL,0,NULL,NULL,NULL),(12,'2011-08-05 23:11:37','2013-03-07 21:33:57','2011-08-05','2011-08-05',-10.00000000,'(SocialContributionPayment)',1,1,1,'VIR','201210',NULL,1,NULL,0,NULL,NULL,NULL),(13,'2011-08-06 20:33:54','0000-00-00 00:00:00','2011-08-06','2011-08-06',5.98000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(14,'2011-08-08 02:53:40','0000-00-00 00:00:00','2011-08-08','2011-08-08',26.10000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(15,'2011-08-08 02:55:58','2013-03-07 21:39:20','2011-08-08','2011-08-08',26.96000000,'(CustomerInvoicePayment)',1,1,1,'TIP','201211',NULL,1,NULL,0,NULL,NULL,NULL),(16,'2012-12-09 15:28:44','2012-12-09 14:28:44','2012-12-09','2012-12-09',2.00000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(17,'2012-12-09 15:28:53','2012-12-09 14:33:07','2012-12-09','2012-12-09',-2.00000000,'(CustomerInvoicePaymentBack)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(18,'2012-12-09 17:35:55','2012-12-09 16:35:55','2012-12-09','2012-12-09',-2.00000000,'(CustomerInvoicePaymentBack)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(19,'2012-12-09 17:37:02','2012-12-09 16:37:02','2012-12-09','2012-12-09',2.00000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(20,'2012-12-09 18:35:07','2012-12-09 17:35:07','2012-12-09','2012-12-09',-2.00000000,'(CustomerInvoicePaymentBack)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(21,'2012-12-12 18:54:33','2013-03-07 21:28:51','2012-12-12','2012-12-12',1.00000000,'(CustomerInvoicePayment)',1,1,1,'TIP','201210',NULL,1,NULL,0,NULL,NULL,NULL),(22,'2013-03-06 16:48:16','2013-03-06 15:48:16','2013-03-06','2013-03-06',20.00000000,'(SubscriptionPayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(23,'2013-03-20 14:30:11','2013-03-20 13:30:11','2013-03-20','2013-03-20',10.00000000,'(SubscriptionPayment)',1,1,NULL,'VIR',NULL,NULL,0,NULL,0,NULL,NULL,NULL);
+INSERT INTO `llx_bank` VALUES (1,'2010-07-08 23:56:14','2013-03-07 21:28:51','2010-07-08','2010-07-08',2000.00000000,'(Initial balance)',1,NULL,1,'SOLD','201210',NULL,1,NULL,0,NULL,NULL,NULL),(2,'2010-07-09 00:00:24','2010-07-09 00:00:24','2010-07-09','2010-07-09',500.00000000,'(Initial balance)',2,NULL,NULL,'SOLD',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(3,'2010-07-10 13:33:42','2010-07-10 13:33:42','2010-07-10','2010-07-10',0.00000000,'(Solde initial)',3,NULL,NULL,'SOLD',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(4,'2010-07-10 14:59:41','2010-07-10 14:59:41','2010-07-10','2010-07-10',0.02000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,'Client salon invidivdu',NULL),(5,'2011-07-18 20:50:24','2011-07-18 20:50:24','2011-07-08','2011-07-08',20.00000000,'(CustomerInvoicePayment)',1,1,NULL,'CB','201107',NULL,1,NULL,0,NULL,NULL,NULL),(6,'2011-07-18 20:50:47','2011-07-18 20:50:47','2011-07-08','2011-07-08',10.00000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(8,'2011-08-01 03:34:11','2013-03-07 21:28:51','2011-08-01','2011-08-01',5.63000000,'(CustomerInvoicePayment)',1,1,1,'CB','201210',NULL,1,NULL,0,NULL,NULL,NULL),(12,'2011-08-05 23:11:37','2013-03-07 21:33:57','2011-08-05','2011-08-05',-10.00000000,'(SocialContributionPayment)',1,1,1,'VIR','201210',NULL,1,NULL,0,NULL,NULL,NULL),(13,'2011-08-06 20:33:54','2011-08-06 20:33:54','2011-08-06','2011-08-06',5.98000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(14,'2011-08-08 02:53:40','2011-08-08 02:53:40','2011-08-08','2011-08-08',26.10000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(15,'2011-08-08 02:55:58','2013-03-07 21:39:20','2011-08-08','2011-08-08',26.96000000,'(CustomerInvoicePayment)',1,1,1,'TIP','201211',NULL,1,NULL,0,NULL,NULL,NULL),(16,'2012-12-09 15:28:44','2012-12-09 14:28:44','2012-12-09','2012-12-09',2.00000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(17,'2012-12-09 15:28:53','2012-12-09 14:33:07','2012-12-09','2012-12-09',-2.00000000,'(CustomerInvoicePaymentBack)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(18,'2012-12-09 17:35:55','2012-12-09 16:35:55','2012-12-09','2012-12-09',-2.00000000,'(CustomerInvoicePaymentBack)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(19,'2012-12-09 17:37:02','2012-12-09 16:37:02','2012-12-09','2012-12-09',2.00000000,'(CustomerInvoicePayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(20,'2012-12-09 18:35:07','2012-12-09 17:35:07','2012-12-09','2012-12-09',-2.00000000,'(CustomerInvoicePaymentBack)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(21,'2012-12-12 18:54:33','2013-03-07 21:28:51','2012-12-12','2012-12-12',1.00000000,'(CustomerInvoicePayment)',1,1,1,'TIP','201210',NULL,1,NULL,0,NULL,NULL,NULL),(22,'2013-03-06 16:48:16','2013-03-06 15:48:16','2013-03-06','2013-03-06',20.00000000,'(SubscriptionPayment)',3,1,NULL,'LIQ',NULL,NULL,0,NULL,0,NULL,NULL,NULL),(23,'2013-03-20 14:30:11','2013-03-20 13:30:11','2013-03-20','2013-03-20',10.00000000,'(SubscriptionPayment)',1,1,NULL,'VIR',NULL,NULL,0,NULL,0,NULL,NULL,NULL);
/*!40000 ALTER TABLE `llx_bank` ENABLE KEYS */;
UNLOCK TABLES;
@@ -4844,7 +4844,7 @@ CREATE TABLE `llx_opensurvey_sondage` (
LOCK TABLES `llx_opensurvey_sondage` WRITE;
/*!40000 ALTER TABLE `llx_opensurvey_sondage` DISABLE KEYS */;
-INSERT INTO `llx_opensurvey_sondage` VALUES ('m4467s2mtk6khmxc','m4467s2mtk6khmxci2ysw682','fdffdshfghfj jhgjgh','aaa@aaa.com','fdfds','fdffds','2013-03-06 23:00:00','D+','1',1,'dolibarr','0000-00-00 00:00:00');
+INSERT INTO `llx_opensurvey_sondage` VALUES ('m4467s2mtk6khmxc','m4467s2mtk6khmxci2ysw682','fdffdshfghfj jhgjgh','aaa@aaa.com','fdfds','fdffds','2013-03-06 23:00:00','D+','1',1,'dolibarr','2000-01-01 00:00:00');
/*!40000 ALTER TABLE `llx_opensurvey_sondage` ENABLE KEYS */;
UNLOCK TABLES;
diff --git a/dev/resources/iso-normes/sample_FEC_file.txt b/dev/resources/iso-normes/sample_FEC_file.txt
new file mode 100644
index 00000000000..8ca50c92617
--- /dev/null
+++ b/dev/resources/iso-normes/sample_FEC_file.txt
@@ -0,0 +1,13 @@
+JOURNALCODE JOURNALLIB ECRITURENUM ECRITUREDATE COMPTENUM COMPTELIB COMPAUXNUM COMPAUXLIB PIECEREF PIECEDATE ECRITURELIB DEBIT CREDIT ECRITURELET DATELET VALIDDATE MONTANTDEVISE IDEVISE
+Banque Banque 17293 20170109 401PPRO PUBLI-PROV L08 20170109 PPRO domiciliation 1TR 187,20 0,00 20170109
+Banque Banque 17293 20170109 5121CRA CR AGRICOLE L08 20170109 PPRO domiciliation 1TR 0,00 187,20 20170109
+Banque Banque 17295 20170109 401ORPA ORANGE PARIS Report 20170109 ORPA adsl par 12 96,00 0,00 20170109
+Banque Banque 17295 20170109 5121CRA CR AGRICOLE Report 20170109 ORPA adsl par 12 0,00 96,00 20170109
+Banque Banque 17302 20170105 401ORVI ORANGE VEBRON INTERNET Report 20170105 ORVI adsl veb 12 26,00 0,00 20170109
+Banque Banque 17302 20170105 5121CRA CR AGRICOLE Report 20170105 ORVI adsl veb 12 0,00 26,00 20170109
+Fournisseurs Fournisseurs 17305 20170119 401ZDAV SANDRA DAVILA A01 20170119 ZDAV courtage s/ ventes 0,00 508,00 20170119
+Fournisseurs Fournisseurs 17305 20170119 622200 Courtages s/ ventes A01 20170119 ZDAV courtage s/ ventes 508,00 0,00 20170119
+Banque Banque 17306 20170119 5121CRA CR AGRICOLE A01 20170119 ZDAV courtage s/ ventes 0,00 508,00 20170119
+Banque Banque 17306 20170119 401ZDAV SANDRA DAVILA A01 20170119 ZDAV courtage s/ ventes 508,00 0,00 20170119
+Banque Banque 17307 20170119 401ZDAV SANDRA DAVILA A01 20170119 ZDAV courtage s/ ventes 508,00 0,00 20170131
+Banque Banque 17307 20170119 5121CRA CR AGRICOLE A01 20170119 ZDAV courtage s/ ventes 0,00 508,00 20170131
diff --git a/dev/resources/iso-normes/world_tax_rates.txt b/dev/resources/iso-normes/world_tax_rates.txt
index e5bb64a86f2..740062288dc 100644
--- a/dev/resources/iso-normes/world_tax_rates.txt
+++ b/dev/resources/iso-normes/world_tax_rates.txt
@@ -1 +1,4 @@
-http://www.taxrates.cc/index.html
\ No newline at end of file
+http://www.taxrates.cc/index.html
+
+For India: VAT=IGST/CGST=Localtax1/SGST=Localtax2: https://cleartax.in/s/what-is-sgst-cgst-igst
+
diff --git a/dev/skeletons/.gitignore b/dev/skeletons/.gitignore
deleted file mode 100644
index 2dda6229d24..00000000000
--- a/dev/skeletons/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-out.*
-socpeople*
diff --git a/dev/skeletons/README b/dev/skeletons/README
deleted file mode 100644
index 5b5b992d91e..00000000000
--- a/dev/skeletons/README
+++ /dev/null
@@ -1,34 +0,0 @@
-README (English)
---------------------------------
-This directory contains PHP script samples that can be used to start a development on Dolibarr.
-
-
-*** build_class_from_table.php:
-
-This is the script to use to generate PHP code of a PHP POJO class
-object, a PHP script that use this POJO. This script use the files
-skeleton_*.php to build its generated code.
-
-
-*** modMyModule.class.php:
-
-Is a sample of module descriptor that you can use if you want to build a new module/plugin for
-Dolibarr.
-
-
-*** skeleton_script.php:
-
-Is a sample you can use as an example if you need to build a script to run on command line
-
-
-*** skeleton_page.php:
-
-Is a sample you can use as an example if you need to build an HTML page to include in Dolibarr GUI.
-
-
-*** skeleton_class.class.php:
-
-Is a sample you can use as an example if you need to build a class file to access a new table required by a Dolibarr development.
-However it is better to run the build_class_from_table.php script that accepts a table name as a parameter and will uses the description table within database and the skeleton_class.class.php file to generate full code for your class file.
-After running this script, the class to access your table (insert a record, update, delete and select) is directly finished and can be used by your module's code.
-No more coding is needed to get access to table with this script because the file is completely generated once.
diff --git a/dev/skeletons/README.md b/dev/skeletons/README.md
new file mode 100644
index 00000000000..f7346350ac0
--- /dev/null
+++ b/dev/skeletons/README.md
@@ -0,0 +1 @@
+Files and tools were moved into htdocs/modulebuilder/template
\ No newline at end of file
diff --git a/dev/skeletons/build_api_class.php b/dev/skeletons/build_api_class.php
deleted file mode 100755
index 6263eabcd6e..00000000000
--- a/dev/skeletons/build_api_class.php
+++ /dev/null
@@ -1,123 +0,0 @@
-#!/usr/bin/env php
-
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/**
- * \file dev/skeletons/build_api_class.php
- * \ingroup core
- * \brief Create a complete API class file from existant class file
- */
-
-$sapi_type = php_sapi_name();
-$script_file = basename(__FILE__);
-$path=dirname(__FILE__).'/';
-
-// Test if batch mode
-if (substr($sapi_type, 0, 3) == 'cgi') {
- echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
- exit;
-}
-
-// Include Dolibarr environment
-require_once($path."../../htdocs/master.inc.php");
-// After this $db is a defined handler to database.
-
-// Main
-$version='1';
-@set_time_limit(0);
-$error=0;
-
-$langs->load("main");
-
-
-print "***** $script_file ($version) *****\n";
-
-
-// -------------------- START OF BUILD_API_FROM_CLASS --------------------
-
-// Check parameters
-if (! isset($argv[1]) && ! isset($argv[2]))
-{
- print "Usage: $script_file phpClassFile phpClassName\n";
- exit;
-}
-// Show parameters
-print 'Classfile='.$argv[1]."\n";
-print 'Classname='.$argv[2]."\n";
-
-$classfile=$argv[1];
-$classname=$argv[2];
-$classmin=strtolower($classname);
-$classnameApi = $classname.'Api';
-$property=array();
-$targetcontent='';
-
-// Load the class and read properties
-require_once($classfile);
-
-$property=array();
-$class = new $classname($db);
-$values=get_class_vars($classname);
-
-unset($values['db']);
-unset($values['error']);
-unset($values['errors']);
-unset($values['element']);
-unset($values['table_element']);
-unset($values['table_element_line']);
-unset($values['fk_element']);
-unset($values['ismultientitymanaged']);
-
-// Read skeleton_api_class.class.php file
-$skeletonfile=$path.'skeleton_api_class.class.php';
-$sourcecontent=file_get_contents($skeletonfile);
-if (! $sourcecontent)
-{
- print "\n";
- print "Error: Failed to read skeleton sample '".$skeletonfile."'\n";
- print "Try to run script from skeletons directory.\n";
- exit;
-}
-
-// Define output variables
-$outfile='out.api_'.$classmin.'.class.php';
-$targetcontent=$sourcecontent;
-
-// Substitute class name
-$targetcontent=preg_replace('/skeleton_api_class\.class\.php/', 'api_'.$classmin.'.class.php', $targetcontent);
-$targetcontent=preg_replace('/skeleton/', $classmin, $targetcontent);
-//$targetcontent=preg_replace('/\$table_element=\'skeleton\'/', '\$table_element=\''.$tablenoprefix.'\'', $targetcontent);
-$targetcontent=preg_replace('/SkeletonApi/', $classnameApi, $targetcontent);
-$targetcontent=preg_replace('/Skeleton/', $classname, $targetcontent);
-
-// Build file
-$fp=fopen($outfile,"w");
-if ($fp)
-{
- fputs($fp, $targetcontent);
- fclose($fp);
- print "\n";
- print "File '".$outfile."' has been built in current directory.\n";
-}
-else $error++;
-
-
-
-// -------------------- END OF BUILD_CLASS_FROM_TABLE SCRIPT --------------------
-
-print "You can now rename generated files by removing the 'out.' prefix in their name and store them into directory /module/class.\n";
-return $error;
diff --git a/dev/skeletons/build_class_from_table.php b/dev/skeletons/build_class_from_table.php
deleted file mode 100755
index 532da3131a6..00000000000
--- a/dev/skeletons/build_class_from_table.php
+++ /dev/null
@@ -1,678 +0,0 @@
-#!/usr/bin/env php
-
- * Copyright (C) 2017 Nicolas ZABOURI
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/**
- * \file dev/skeletons/build_class_from_table.php
- * \ingroup core
- * \brief Create a complete class file from a table in database
- */
-
-$sapi_type = php_sapi_name();
-$script_file = basename(__FILE__);
-$path=dirname(__FILE__).'/';
-
-// Test if batch mode
-if (substr($sapi_type, 0, 3) == 'cgi') {
- echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
- exit;
-}
-
-// Include Dolibarr environment
-require_once($path."../../htdocs/master.inc.php");
-// After this $db is a defined handler to database.
-
-// Main
-$version='3.2';
-@set_time_limit(0);
-$error=0;
-
-$langs->load("main");
-
-
-print "***** $script_file ($version) *****\n";
-
-
-// -------------------- START OF BUILD_CLASS_FROM_TABLE SCRIPT --------------------
-
-// Check parameters
-if (! isset($argv[1]) || ! isset($argv[2]) || (isset($argv[3]) && ! isset($argv[7])))
-{
- print "Usage: $script_file tablename modulename [server port databasename user pass]\n";
- exit;
-}
-
-if (isset($argv[3]) && isset($argv[4]) && isset($argv[5]) && isset($argv[6]) && isset($argv[7]))
-{
- print 'Use specific database ids'."\n";
- $db=getDoliDBInstance('mysqli',$argv[3],$argv[6],$argv[7],$argv[5],$argv[4]);
-}
-
-if ($db->type != 'mysql' && $db->type != 'mysqli')
-{
- print "Error: This script works with mysql or mysqli driver only\n";
- exit;
-}
-
-$table=$argv[1];
-$module=$argv[2];
-
-// Show parameters
-print 'Tablename: '.$table."\n";
-print 'Modulename: '.$module."\n";
-print "Current dir: ".getcwd()."\n";
-print "Database name: ".$db->database_name."\n";
-
-
-// Define array with list of properties
-$property=array();
-$foundprimary=0;
-$resql=$db->DDLDescTable($table);
-if ($resql)
-{
- $i=0;
- while($obj=$db->fetch_object($resql))
- {
- //var_dump($obj);
- $i++;
- $property[$i]['field']=$obj->Field;
- if ($obj->Key == 'PRI')
- {
- $property[$i]['primary']=1;
- $foundprimary=1;
- }
- else
- {
- $property[$i]['primary']=1;
- }
- $property[$i]['type'] =$obj->Type;
- $property[$i]['null'] =$obj->Null;
- $property[$i]['extra']=$obj->Extra;
- if ($property[$i]['type'] == 'date'
- || $property[$i]['type'] == 'datetime'
- || $property[$i]['type'] == 'timestamp')
- {
- $property[$i]['istime']=true;
- }
- else
- {
- $property[$i]['istime']=false;
- }
- if (preg_match('/varchar/i',$property[$i]['type'])
- || preg_match('/text/i',$property[$i]['type']))
- {
- $property[$i]['ischar']=true;
- }
- else
- {
- $property[$i]['ischar']=false;
- }
- if (preg_match('/int/i',$property[$i]['type']))
- {
- $property[$i]['isint']=true;
- }
- else
- {
- $property[$i]['isint']=false;
- }
- }
-}
-else
-{
- print "Error: Failed to get description for table '".$table."'.\n";
- return false;
-}
-//var_dump($property);
-
-// Define substitute fetch/select parameters
-$varpropselect="\n";
-$cleanparam='';
-$i=0;
-foreach($property as $key => $prop)
-{
- $i++;
- if ($prop['field'] != 'rowid')
- {
- $varpropselect.="\t\t\$sql .= \" ";
- $varpropselect.="t.".$prop['field'];
- if ($i < count($property)) $varpropselect.=",";
- $varpropselect.="\";";
- $varpropselect.="\n";
- }
-}
-
-
-
-//--------------------------------
-// Build skeleton_class.class.php
-//--------------------------------
-
-// Define working variables
-$table=strtolower($table);
-$tablenoprefix=preg_replace('/'.preg_quote(MAIN_DB_PREFIX,'/').'/i','',$table);
-$classname=preg_replace('/_/','',ucfirst($tablenoprefix));
-$classmin=preg_replace('/_/','',strtolower($classname));
-
-
-// Read skeleton_class.class.php file
-$skeletonfile=$path.'skeleton_class.class.php';
-$sourcecontent=file_get_contents($skeletonfile);
-if (! $sourcecontent)
-{
- print "\n";
- print "Error: Failed to read skeleton sample '".$skeletonfile."'\n";
- print "Try to run script from skeletons directory.\n";
- exit;
-}
-
-// Define output variables
-$outfile=$classmin.'.class.php';
-$targetcontent=$sourcecontent;
-
-// Substitute module name
-$targetcontent=preg_replace('/dev\/skeletons/', $module, $targetcontent);
-$targetcontent=preg_replace('/mymodule othermodule1 othermodule2/', $module, $targetcontent);
-$targetcontent=preg_replace('/mymodule/', $module, $targetcontent);
-
-// Substitute class name
-$targetcontent=preg_replace('/skeleton_class\.class\.php/', $classmin.'.class.php', $targetcontent);
-$targetcontent=preg_replace('/\$element = \'skeleton\'/', '\$element = \''.$classmin.'\'', $targetcontent);
-$targetcontent=preg_replace('/\$table_element = \'skeleton\'/', '\$table_element = \''.$tablenoprefix.'\'', $targetcontent);
-$targetcontent=preg_replace('/Skeleton_Class/', $classname, $targetcontent);
-$targetcontent=preg_replace('/skeletons/', $classmin, $targetcontent);
-$targetcontent=preg_replace('/skeleton/', $classmin, $targetcontent);
-
-// Substitute comments
-$targetcontent=preg_replace('/This file is an example to create a new class file/', 'Put here description of this class', $targetcontent);
-$targetcontent=preg_replace('/\s*\/\/\.\.\./', '', $targetcontent);
-$targetcontent=preg_replace('/Put here some comments/','Initialy built by build_class_from_table on '.strftime('%Y-%m-%d %H:%M',mktime()), $targetcontent);
-
-// Substitute table name
-$targetcontent=preg_replace('/MAIN_DB_PREFIX."mytable/', 'MAIN_DB_PREFIX."'.$tablenoprefix, $targetcontent);
-
-// Substitute declaration parameters
-$varprop="\n";
-$cleanparam='';
-foreach($property as $key => $prop)
-{
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id')
- {
- $varprop.="\tpublic \$".$prop['field'];
- if ($prop['istime']) $varprop.=" = ''";
- $varprop.=";";
- if ($prop['comment']) $varprop.="\t// ".$prop['extra'];
- $varprop.="\n";
- }
-}
-$targetcontent=preg_replace('/'.preg_quote('public $prop1;','/').'/', $varprop, $targetcontent);
-$targetcontent=preg_replace('/'.preg_quote('public $prop2;','/').'/', '', $targetcontent);
-
-$targetcontent=preg_replace('/\*((\s|\n|\r|\t)*)\@var mixed Sample property 1((\s|\n|\r|\t)*)/', '', $targetcontent);
-$targetcontent=preg_replace('/\*((\s|\n|\r|\t)*)\@var mixed Sample property 2((\s|\n|\r|\t)*)/', '', $targetcontent);
-
-// Substitute clean parameters
-$varprop="\n";
-$cleanparam='';
-foreach($property as $key => $prop)
-{
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- $varprop.="\t\tif (isset(\$this->".$prop['field'].")) {\n\t\t\t \$this->".$prop['field']." = trim(\$this->".$prop['field'].");\n\t\t}";
- $varprop.="\n";
- }
-}
-$targetcontent=preg_replace('/if \(isset\(\$this->prop1\)\) {((\n|\r|\t)*)\$this->prop1 = trim\(\$this->prop1\);((\n|\r|\t)*)}/', $varprop, $targetcontent);
-$targetcontent=preg_replace('/if \(isset\(\$this->prop2\)\) {((\n|\r|\t)*)\$this->prop2 = trim\(\$this->prop2\);((\n|\r|\t)*)}/', '', $targetcontent);
-
-
-$no_output_field=0;
-foreach($property as $key => $prop)
-{
- if ($prop['field'] == 'tms') $no_output_field++; // This is a field of type timestamp edited automatically
- if ($prop['extra'] == 'auto_increment') $no_output_field++;
-}
-// Substitute insert into parameters
-$varprop="\n";
-$cleanparam='';
-$i=0;
-foreach($property as $key => $prop)
-{
-
- $addfield=1;
- if ($prop['field'] == 'tms') $addfield=0; // This is a field of type timestamp edited automatically
- if ($prop['extra'] == 'auto_increment') $addfield=0;
-
- if ($addfield)
- {
- $varprop.="\t\t\$sql.= '".$prop['field'];
- if ($i < (count($property)-$no_output_field)) $varprop.=",";
- $varprop.="';";
- $varprop.="\n";
- }
- $i++;
-}
-$targetcontent=preg_replace('/\$sql \.= \' field1,\';/', $varprop, $targetcontent);
-$targetcontent=preg_replace('/\$sql \.= \' field2\';/', '', $targetcontent);
-
-// Substitute insert values parameters
-$varprop="\n";
-$cleanparam='';
-$i=0;
-
-//Count nb field to output to manage commat at end SQL instruction
-
-
-foreach($property as $key => $prop)
-{
-
- $addfield=1;
- if ($prop['field'] == 'tms') $addfield=0; // This is a field of type timestamp edited automatically
- if ($prop['extra'] == 'auto_increment') $addfield=0;
-
- if ($addfield)
- {
- $i++;
-
- $varprop.="\t\t\$sql .= ' ";
- if ($prop['field']=='datec')
- {
- $varprop.='\'."\'".$this->db->idate(dol_now())."\'"';
- }
- elseif ($prop['istime'])
- {
- $varprop.='\'.(! isset($this->'.$prop['field'].') || dol_strlen($this->'.$prop['field'].')==0?\'NULL\':"\'".$this->db->idate(';
- $varprop.="\$this->".$prop['field'];
- $varprop.=").\"'\")";
- }
- elseif ($prop['ischar'])
- {
- $varprop.="'.(! isset(\$this->".$prop['field'].")?'NULL':\"'\".";
- $varprop.="\$this->db->escape(\$this->".$prop['field'].")";
- $varprop.=".\"'\")";
- }
- elseif ($prop['field']=='fk_user_mod' || $prop['field']=='fk_user_author')
- {
- $varprop.="'.\$user->id";
- }
- elseif ($prop['isint'])
- {
- $varprop.='\'.(! isset($this->'.$prop['field'].')?\'NULL\':';
- $varprop.="\$this->".$prop['field'];
- $varprop.=')';
- }
- else
- {
- $varprop.='\'.(! isset($this->'.$prop['field'].')?\'NULL\':"\'".';
- $varprop.="\$this->".$prop['field'];
- $varprop.='."\'")';
- }
-
- if ($i < (count($property)-$no_output_field)) $varprop.=".','";
- $varprop.=';';
- $varprop.="\n";
- }
-}
-
-$patern1='/\$sql \.= \' (.*)\' \. \$this->prop1 \. \'(.*),\';/';
-$patern2='/\$sql \.= \' (.*)\' \. \$this->prop2 \. \'(.*)\';/';
-$targetcontent=preg_replace($patern1, $varprop, $targetcontent);
-$targetcontent=preg_replace($patern2, '', $targetcontent);
-
-// Substitute update values parameters
-
-//Count nb field to output to manage commat at end SQL instruction
-$no_output_field=0;
-foreach($property as $key => $prop)
-{
- if ($prop['extra'] == 'auto_increment') $no_output_field++;
-}
-
-$varprop="\n";
-$cleanparam='';
-$i=0;
-foreach($property as $key => $prop)
-{
-
- $addfield=1;
- if ($prop['extra'] == 'auto_increment') $addfield=0;
-
- if ($addfield)
- {
- $i++;
-
- $varprop.="\t\t\$sql .= ' ";
- $varprop.=$prop['field'].' = ';
- if ($prop['field']=='tms') {
- $varprop.='\'.(dol_strlen($this->'.$prop['field'].') != 0 ? "\'".$this->db->idate(';
- $varprop.='$this->'.$prop['field'];
- $varprop.=')."\'" : "\'".$this->db->idate(dol_now())."\'")';
- }
- elseif ($prop['istime'])
- {
- $varprop.='\'.(! isset($this->'.$prop['field'].') || dol_strlen($this->'.$prop['field'].') != 0 ? "\'".$this->db->idate(';
- $varprop.='$this->'.$prop['field'];
- $varprop.=')."\'" : \'null\')';
- }
-
- elseif ($prop['field']=='fk_user_mod') {
- $varprop.="'.\$user->id";
- }
- else
- {
- $varprop.="'.";
- if ($prop['ischar']) $varprop.='(isset($this->'.$prop['field'].')?"\'".$this->db->escape($this->'.$prop['field'].')."\'":"null")';
- elseif ($prop['isint']) $varprop.='(isset($this->'.$prop['field'].')?$this->'.$prop['field'].':"null")';
- else $varprop.='(isset($this->'.$prop['field'].')?$this->'.$prop['field'].':"null")';
- }
-
- if ($i < (count($property)-$no_output_field)) $varprop.=".','";
- $varprop.=';';
- $varprop.="\n";
- }
-}
-$targetcontent=preg_replace('/\$sql \.= " field1=".\(isset\(\$this->field1\)\?"\'".\$this->db->escape\(\$this->field1\)."\'":"null"\).",";/', $varprop, $targetcontent);
-$targetcontent=preg_replace('/\$sql \.= " field2=".\(isset\(\$this->field2\)\?"\'".\$this->db->escape\(\$this->field2\)."\'":"null"\)."";/', '', $targetcontent);
-
-// Substitute fetch/select parameters
-$targetcontent=preg_replace('/\$sql \.= \' t\.field1,\';/', $varpropselect, $targetcontent);
-$targetcontent=preg_replace('/\$sql \.= \' t\.field2\';/', '', $targetcontent);
-
-// Substitute select set parameters
-$varprop="\n";
-$varpropline="\n";
-$cleanparam='';
-$i=0;
-foreach($property as $key => $prop)
-{
- $i++;
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id')
- {
- $varprop.="\t\t\t\t\$this->".$prop['field']." = ";
- if ($prop['istime']) $varprop.='$this->db->jdate(';
- $varprop.='$obj->'.$prop['field'];
- if ($prop['istime']) $varprop.=')';
- $varprop.=";";
- $varprop.="\n";
-
- $varpropline.="\t\t\t\t\$line->".$prop['field']." = ";
- if ($prop['istime']) $varpropline.='$this->db->jdate(';
- $varpropline.='$obj->'.$prop['field'];
- if ($prop['istime']) $varpropline.=')';
- $varpropline.=";";
- $varpropline.="\n";
- }
-}
-$targetcontent=preg_replace('/\$this->prop1 = \$obj->field1;/', $varprop, $targetcontent);
-$targetcontent=preg_replace('/\$this->prop2 = \$obj->field2;/', '', $targetcontent);
-
-//Substirute fetchAll
-$targetcontent=preg_replace('/\$line->prop1 = \$obj->field1;/', $varpropline, $targetcontent);
-$targetcontent=preg_replace('/\$line->prop2 = \$obj->field2;/', '', $targetcontent);
-
-
-// Substitute initasspecimen parameters
-$varprop="\n";
-$cleanparam='';
-foreach($property as $key => $prop)
-{
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id')
- {
- $varprop.="\t\t\$this->".$prop['field']." = '';";
- $varprop.="\n";
- }
-}
-$targetcontent=preg_replace('/\$this->prop1 = \'prop1\';/', $varprop, $targetcontent);
-$targetcontent=preg_replace('/\$this->prop2 = \'prop2\';/', '', $targetcontent);
-
-// Build file
-$fp=fopen($outfile,"w");
-if ($fp)
-{
- fputs($fp, $targetcontent);
- fclose($fp);
- print "\n";
- print "File '".$outfile."' has been built in current directory.\n";
-}
-else $error++;
-
-
-
-//--------------------------------------------------------------------
-// Build skeleton_script.php, skeleton_list.php and skeleton_card.php
-//--------------------------------------------------------------------
-
-$skeletonfiles=array(
- $path.'skeleton_script.php' => $classmin.'_script.php',
- $path.'skeleton_list.php' => $classmin.'_list.php',
- $path.'skeleton_card.php' => $classmin.'_card.php'
- );
-
-foreach ($skeletonfiles as $skeletonfile => $outfile)
-{
- $sourcecontent=file_get_contents($skeletonfile);
- if (! $sourcecontent)
- {
- print "\n";
- print "Error: Failed to read skeleton sample '".$skeletonfile."'\n";
- print "Try to run script from skeletons directory.\n";
- exit;
- }
-
- // Define output variables
- $targetcontent=$sourcecontent;
-
- // Substitute module name
- $targetcontent=preg_replace('/dev\/skeletons/', $module, $targetcontent);
- $targetcontent=preg_replace('/mymodule othermodule1 othermodule2/', $module, $targetcontent);
- $targetcontent=preg_replace('/mymodule/', $module, $targetcontent);
-
- // Substitute class name
- $targetcontent=preg_replace('/skeleton_class\.class\.php/', $classmin.'.class.php', $targetcontent);
- $targetcontent=preg_replace('/skeleton_script\.php/', $classmin.'_script.php', $targetcontent);
- $targetcontent=preg_replace('/\$element = \'skeleton\'/', '\$element=\''.$classmin.'\'', $targetcontent);
- $targetcontent=preg_replace('/\$table_element = \'skeleton\'/', '\$table_element=\''.$classmin.'\'', $targetcontent);
- $targetcontent=preg_replace('/Skeleton_Class/', $classname, $targetcontent);
- $targetcontent=preg_replace('/skeletons/', $classmin, $targetcontent);
- $targetcontent=preg_replace('/skeleton/', $classmin, $targetcontent);
-
- // Substitute comments
- $targetcontent=preg_replace('/This file is an example to create a new class file/', 'Put here description of this class', $targetcontent);
- $targetcontent=preg_replace('/\s*\/\/\.\.\./', '', $targetcontent);
- $targetcontent=preg_replace('/Put here some comments/','Initialy built by build_class_from_table on '.strftime('%Y-%m-%d %H:%M',mktime()), $targetcontent);
-
- // Substitute table name
- $targetcontent=preg_replace('/MAIN_DB_PREFIX."mytable/', 'MAIN_DB_PREFIX."'.$tablenoprefix, $targetcontent);
-
- // Substitute GETPOST search_fieldx
- $varprop="\n";
- $cleanparam='';
- foreach($property as $key => $prop)
- {
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- if ($prop['isint']) $varprop.='$search_'.$prop['field']."=GETPOST('search_".$prop['field']."','int');\n";
- else $varprop.='$search_'.$prop['field']."=GETPOST('search_".$prop['field']."','alpha');\n";
- }
- }
- $targetcontent=preg_replace('/'.preg_quote('$search_field1=GETPOST("search_field1");','/').'/', $varprop, $targetcontent);
- $targetcontent=preg_replace('/'.preg_quote('$search_field2=GETPOST("search_field2");','/').'/', '', $targetcontent);
-
- // Substitute GETPOST fieldx
- $varprop="\n";
- $cleanparam='';
- foreach($property as $key => $prop)
- {
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- if ($prop['isint']) $varprop.="\t\$object->".$prop['field']."=GETPOST('".$prop['field']."','int');\n";
- else $varprop.="\t\$object->".$prop['field']."=GETPOST('".$prop['field']."','alpha');\n";
- }
- }
- $targetcontent=preg_replace('/'.preg_quote('$object->prop1=GETPOST("field1");','/').'/', $varprop, $targetcontent);
- $targetcontent=preg_replace('/'.preg_quote('$object->prop2=GETPOST("field2");','/').'/', '', $targetcontent);
-
- // Substitute reset search_field = '';
- $varprop="\n";
- $cleanparam='';
- foreach($property as $key => $prop)
- {
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- $varprop.='$search_'.$prop['field']."='';\n";
- }
- }
- $targetcontent=preg_replace('/'.preg_quote('$search_field1=\'\';','/').'/', $varprop, $targetcontent);
- $targetcontent=preg_replace('/'.preg_quote('$search_field2=\'\';','/').'/', '', $targetcontent);
-
- // Substitute fetch/select parameters
- $targetcontent=preg_replace('/\$sql\s*\.= " t\.field1,";/', $varpropselect, $targetcontent);
- $targetcontent=preg_replace('/\$sql\s*\.= " t\.field2";/', '', $targetcontent);
-
- // Substitute where for search
- $varprop="\n";
- $cleanparam='';
- foreach($property as $key => $prop)
- {
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- $varprop.='if ($search_'.$prop['field'].') $sql.= natural_search("'.$prop['field'].'",$search_'.$prop['field'].');'."\n";
- }
- }
- $targetcontent=preg_replace('/'.preg_quote('if ($search_field1) $sql.= natural_search("field1",$search_field1);','/').'/', $varprop, $targetcontent);
- $targetcontent=preg_replace('/'.preg_quote('if ($search_field2) $sql.= natural_search("field2",$search_field2);','/').'/', '', $targetcontent);
-
- // substitute $params.=
- $varprop="\n";
- $cleanparam='';
- foreach($property as $key => $prop)
- {
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- $varprop.="if (\$search_".$prop['field']." != '') \$params.= '&search_".$prop['field']."='.urlencode(\$search_".$prop['field'].");\n";
- }
- }
- $targetcontent=preg_replace('/'.preg_quote("if (\$search_field1 != '') \$params.= '&search_field1='.urlencode(\$search_field1);",'/').'/', $varprop, $targetcontent);
- $targetcontent=preg_replace('/'.preg_quote("if (\$search_field2 != '') \$params.= '&search_field2='.urlencode(\$search_field2);",'/').'/', '', $targetcontent);
-
- // Substitute arrayfields
- $varprop="\n";
- $cleanparam='';
- foreach($property as $key => $prop)
- {
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- $varprop.="'t.".$prop['field']."'=>array('label'=>\$langs->trans(\"Field".$prop['field']."\"), 'checked'=>1),\n";
- }
- }
- $targetcontent=preg_replace('/'.preg_quote("'t.field1'=>array('label'=>\$langs->trans(\"Field1\"), 'checked'=>1),",'/').'/', $varprop, $targetcontent);
- $targetcontent=preg_replace('/'.preg_quote("'t.field2'=>array('label'=>\$langs->trans(\"Field2\"), 'checked'=>1),",'/').'/', '', $targetcontent);
-
- // Substitute print_liste_field_titre
- $varprop="\n";
- $cleanparam='';
- foreach($property as $key => $prop)
- {
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- $varprop.="if (! empty(\$arrayfields['t.".$prop['field']."']['checked'])) print_liste_field_titre(\$arrayfields['t.".$prop['field']."']['label'],\$_SERVER['PHP_SELF'],'t.".$prop['field']."','',\$params,'',\$sortfield,\$sortorder);\n";
- }
- }
- $targetcontent=preg_replace('/LIST_OF_TD_TITLE_FIELDS/', $varprop, $targetcontent);
-
- // Substitute fields title search
- $varprop="\n";
- $cleanparam='';
- foreach($property as $key => $prop)
- {
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- $varprop.="if (! empty(\$arrayfields['t.".$prop['field']."']['checked'])) print '
';\n";
- }
- }
- $targetcontent=preg_replace('/LIST_OF_TD_TITLE_SEARCH/', $varprop, $targetcontent);
-
- // Substitute where for
';",'/').'/', '', $targetcontent);
-
- // LIST_OF_TD_LABEL_FIELDS_CREATE - List of td for card view
- $varprop="\n";
- $cleanparam='';
- foreach($property as $key => $prop)
- {
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- $varprop.="print '
'.\$langs->trans(\"Field".$prop['field']."\").'
';\n";
- }
- }
- $targetcontent=preg_replace('/LIST_OF_TD_LABEL_FIELDS_CREATE/', $varprop, $targetcontent);
-
- // LIST_OF_TD_LABEL_FIELDS_EDIT - List of td for card view
- $varprop="\n";
- $cleanparam='';
- foreach($property as $key => $prop)
- {
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- $varprop.="print '
'.\$langs->trans(\"Field".$prop['field']."\").'
".$prop['field'].".'\">
';\n";
- }
- }
- $targetcontent=preg_replace('/LIST_OF_TD_LABEL_FIELDS_EDIT/', $varprop, $targetcontent);
-
- // LIST_OF_TD_LABEL_FIELDS_VIEW - List of td for card view
- $varprop="\n";
- $cleanparam='';
- foreach($property as $key => $prop)
- {
- if ($prop['field'] != 'rowid' && $prop['field'] != 'id' && ! $prop['istime'])
- {
- $varprop.="print '
'.\$langs->trans(\"Field".$prop['field']."\").'
'.\$object->".$prop['field'].".'
';\n";
- }
- }
- $targetcontent=preg_replace('/LIST_OF_TD_LABEL_FIELDS_VIEW/', $varprop, $targetcontent);
-
-
- // LIST_OF_TD_FIELDS_LIST
-
-
-
- // Build file
- $fp=fopen($outfile,"w");
- if ($fp)
- {
- fputs($fp, $targetcontent);
- fclose($fp);
- print "File '".$outfile."' has been built in current directory.\n";
- }
- else $error++;
-}
-
-
-// -------------------- END OF BUILD_CLASS_FROM_TABLE SCRIPT --------------------
-
-print "You can now move generated files to store them into directory /yourmodule/class (for .class.php file) or /yourmodule.\n";
-return $error;
diff --git a/dev/skeletons/build_webservice_from_class.php b/dev/skeletons/build_webservice_from_class.php
deleted file mode 100755
index c91347a424d..00000000000
--- a/dev/skeletons/build_webservice_from_class.php
+++ /dev/null
@@ -1,179 +0,0 @@
-#!/usr/bin/env php
-
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/**
- * \file dev/skeletons/build_webservice_from_class.php
- * \ingroup core
- * \brief Create a complete webservice file from CRUD functions of a PHP class
- */
-
-$sapi_type = php_sapi_name();
-$script_file = basename(__FILE__);
-$path=dirname(__FILE__).'/';
-
-// Test if batch mode
-if (substr($sapi_type, 0, 3) == 'cgi') {
- echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
- exit;
-}
-
-// Include Dolibarr environment
-require_once($path."../../htdocs/master.inc.php");
-// After this $db is a defined handler to database.
-
-// Main
-$version='1.8';
-@set_time_limit(0);
-$error=0;
-
-$langs->load("main");
-
-
-print "***** $script_file ($version) *****\n";
-
-
-// -------------------- START OF BUILD_CLASS_FROM_TABLE SCRIPT --------------------
-
-// Check parameters
-if (! isset($argv[1]) && ! isset($argv[2]))
-{
- print "Usage: $script_file phpClassFile phpClassName\n";
- exit;
-}
-
-// Show parameters
-print 'Classfile='.$argv[1]."\n";
-print 'Classname='.$argv[2]."\n";
-
-$classfile=$argv[1];
-$classname=$argv[2];
-$classmin=strtolower($classname);
-$property=array();
-$targetcontent='';
-
-// Load the class and read properties
-require_once($classfile);
-
-$property=array();
-$class = new $classname($db);
-$values=get_class_vars($classname);
-
-unset($values['db']);
-unset($values['error']);
-unset($values['errors']);
-unset($values['element']);
-unset($values['table_element']);
-unset($values['table_element_line']);
-unset($values['fk_element']);
-unset($values['ismultientitymanaged']);
-
-$properties=array_keys($values);
-
-// Read skeleton_class.class.php file
-$skeletonfile='skeleton_webservice_server.php';
-$sourcecontent=file_get_contents($skeletonfile);
-if (! $sourcecontent)
-{
- print "\n";
- print "Error: Failed to read skeleton sample '".$skeletonfile."'\n";
- print "Try to run script from skeletons directory.\n";
- exit;
-}
-
-// Define output variables
-$outfile='out.server_'.$classmin.'.php';
-$targetcontent=$sourcecontent;
-
-
-
-// Substitute class name
-$targetcontent=preg_replace('/Skeleton/', $classname, $targetcontent);
-$targetcontent=preg_replace('/skeleton/', $classmin, $targetcontent);
-
-// Substitute declaration parameters
-$varprop="\n";
-$cleanparam='';
-$i=0;
-
-while($i array('name'=>'".$properties[$i]."','type'=>'xsd:string')";
- $i++;
-
- if ($i == count($properties))
- $varprop.="\n";
- else
- $varprop.=",\n";
-}
-
-$targetcontent=preg_replace('/\'prop1\'=>\'xxx\',/', $varprop, $targetcontent);
-$targetcontent=preg_replace('/\'prop2\'=>\'xxx\',/', '', $targetcontent);
-// Substitute get method parameters
-$varprop="\n";
-$cleanparam='';
-$i=0;
-
-while($i $".$classmin."->".$properties[$i];
-
- $i++;
- if ($i == count($properties))
- $varprop.="\n";
- else
- $varprop.=",\n";
-}
-
-$targetcontent=preg_replace('/\'prop1\'=>\$'.$classmin.'->prop1,/', $varprop, $targetcontent);
-$targetcontent=preg_replace('/\'prop2\'=>\$'.$classmin.'->prop2,/', '', $targetcontent);
-
-// Substitute get method parameters
-$varprop="\n\t\t";
-$cleanparam='';
-$i=0;
-
-while($i'.$properties[$i].'=$'.$classmin.'->'.$properties[$i].';';
-
- $i++;
- if ($i == count($properties))
- $varprop.="\n";
- else
- $varprop.="\n\t\t";
-}
-$targetcontent=preg_replace('/\$newobject->prop1=\$'.$classmin.'->prop1;/', $varprop, $targetcontent);
-$targetcontent=preg_replace('/\$newobject->prop2=\$'.$classmin.'->prop2;/', '', $targetcontent);
-
-
-
-// Build file
-$fp=fopen($outfile,"w");
-if ($fp)
-{
- fputs($fp, $targetcontent);
- fclose($fp);
- print "File '".$outfile."' has been built in current directory.\n";
-}
-else $error++;
-
-// -------------------- END OF BUILD_CLASS_FROM_TABLE SCRIPT --------------------
-
-print "You must rename files by removing the 'out.' prefix in their name.\n";
-return $error;
diff --git a/dev/skeletons/modMyModule.class.php b/dev/skeletons/modMyModule.class.php
deleted file mode 100644
index 4f994c7c654..00000000000
--- a/dev/skeletons/modMyModule.class.php
+++ /dev/null
@@ -1,291 +0,0 @@
-
- * Copyright (C) 2004-2015 Laurent Destailleur
- * Copyright (C) 2005-2016 Regis Houssin
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/**
- * \defgroup mymodule Module MyModule
- * \brief Example of a module descriptor.
- * Such a file must be copied into htdocs/mymodule/core/modules directory.
- * \file htdocs/mymodule/core/modules/modMyModule.class.php
- * \ingroup mymodule
- * \brief Description and activation file for module MyModule
- */
-include_once DOL_DOCUMENT_ROOT .'/core/modules/DolibarrModules.class.php';
-
-
-/**
- * Description and activation class for module MyModule
- */
-class modMyModule extends DolibarrModules
-{
- /**
- * Constructor. Define names, constants, directories, boxes, permissions
- *
- * @param DoliDB $db Database handler
- */
- public function __construct($db)
- {
- global $langs,$conf;
-
- $this->db = $db;
-
- // Id for module (must be unique).
- // Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id).
- $this->numero = 500000; // TODO Go on page http://wiki.dolibarr.org/index.php/List_of_modules_id to reserve id number for your module
- // Key text used to identify module (for permissions, menus, etc...)
- $this->rights_class = 'mymodule';
-
- // Family can be 'crm','financial','hr','projects','products','ecm','technic','interface','other'
- // It is used to group modules by family in module setup page
- $this->family = "other";
- // Module position in the family
- $this->module_position = 500;
- // Gives the possibility to the module, to provide his own family info and position of this family (Overwrite $this->family and $this->module_position. Avoid this)
- //$this->familyinfo = array('myownfamily' => array('position' => '001', 'label' => $langs->trans("MyOwnFamily")));
-
- // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module)
- $this->name = preg_replace('/^mod/i','',get_class($this));
- // Module description, used if translation string 'ModuleXXXDesc' not found (where XXX is value of numeric property 'numero' of module)
- $this->description = "Description of module MyModule";
- $this->descriptionlong = "A very long description. Can be a full HTML content";
- $this->editor_name = 'Editor name';
- $this->editor_url = 'https://www.dolibarr.org';
-
- // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z'
- $this->version = '1.0';
- // Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase)
- $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name);
- // Name of image file used for this module.
- // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue'
- // If file is in module/img directory under name object_pictovalue.png, use this->picto='pictovalue@module'
- $this->picto='generic';
-
- // Defined all module parts (triggers, login, substitutions, menus, css, etc...)
- // for default path (eg: /mymodule/core/xxxxx) (0=disable, 1=enable)
- // for specific path of parts (eg: /mymodule/core/modules/barcode)
- // for specific css file (eg: /mymodule/css/mymodule.css.php)
- //$this->module_parts = array(
- // 'triggers' => 0, // Set this to 1 if module has its own trigger directory (core/triggers)
- // 'login' => 0, // Set this to 1 if module has its own login method directory (core/login)
- // 'substitutions' => 0, // Set this to 1 if module has its own substitution function file (core/substitutions)
- // 'menus' => 0, // Set this to 1 if module has its own menus handler directory (core/menus)
- // 'theme' => 0, // Set this to 1 if module has its own theme directory (theme)
- // 'tpl' => 0, // Set this to 1 if module overwrite template dir (core/tpl)
- // 'barcode' => 0, // Set this to 1 if module has its own barcode directory (core/modules/barcode)
- // 'models' => 0, // Set this to 1 if module has its own models directory (core/modules/xxx)
- // 'css' => array('/mymodule/css/mymodule.css.php'), // Set this to relative path of css file if module has its own css file
- // 'js' => array('/mymodule/js/mymodule.js'), // Set this to relative path of js file if module must load a js on all pages
- // 'hooks' => array('hookcontext1','hookcontext2',...) // Set here all hooks context managed by module. You can also set hook context 'all'
- // 'dir' => array('output' => 'othermodulename'), // To force the default directories names
- // 'workflow' => array('WORKFLOW_MODULE1_YOURACTIONTYPE_MODULE2'=>array('enabled'=>'! empty($conf->module1->enabled) && ! empty($conf->module2->enabled)', 'picto'=>'yourpicto@mymodule')) // Set here all workflow context managed by module
- // );
- $this->module_parts = array();
-
- // Data directories to create when module is enabled.
- // Example: this->dirs = array("/mymodule/temp");
- $this->dirs = array();
-
- // Config pages. Put here list of php page, stored into mymodule/admin directory, to use to setup module.
- $this->config_page_url = array("mysetuppage.php@mymodule");
-
- // Dependencies
- $this->hidden = false; // A condition to hide module
- $this->depends = array(); // List of module class names as string that must be enabled if this module is enabled
- $this->requiredby = array(); // List of module ids to disable if this one is disabled
- $this->conflictwith = array(); // List of module class names as string this module is in conflict with
- $this->phpmin = array(5,0); // Minimum version of PHP required by module
- $this->need_dolibarr_version = array(3,0); // Minimum version of Dolibarr required by module
- $this->langfiles = array("mylangfile@mymodule");
-
- // Constants
- // List of particular constants to add when module is enabled (key, 'chaine', value, desc, visible, 'current' or 'allentities', deleteonunactive)
- // Example: $this->const=array(0=>array('MYMODULE_MYNEWCONST1','chaine','myvalue','This is a constant to add',1),
- // 1=>array('MYMODULE_MYNEWCONST2','chaine','myvalue','This is another constant to add',0, 'current', 1)
- // );
- $this->const = array();
-
- // Array to add new pages in new tabs
- // Example: $this->tabs = array('objecttype:+tabname1:Title1:mylangfile@mymodule:$user->rights->mymodule->read:/mymodule/mynewtab1.php?id=__ID__', // To add a new tab identified by code tabname1
- // 'objecttype:+tabname2:SUBSTITUTION_Title2:mylangfile@mymodule:$user->rights->othermodule->read:/mymodule/mynewtab2.php?id=__ID__', // To add another new tab identified by code tabname2. Label will be result of calling all substitution functions on 'Title2' key.
- // 'objecttype:-tabname:NU:conditiontoremove'); // To remove an existing tab identified by code tabname
- // where objecttype can be
- // 'categories_x' to add a tab in category view (replace 'x' by type of category (0=product, 1=supplier, 2=customer, 3=member)
- // 'contact' to add a tab in contact view
- // 'contract' to add a tab in contract view
- // 'group' to add a tab in group view
- // 'intervention' to add a tab in intervention view
- // 'invoice' to add a tab in customer invoice view
- // 'invoice_supplier' to add a tab in supplier invoice view
- // 'member' to add a tab in fundation member view
- // 'opensurveypoll' to add a tab in opensurvey poll view
- // 'order' to add a tab in customer order view
- // 'order_supplier' to add a tab in supplier order view
- // 'payment' to add a tab in payment view
- // 'payment_supplier' to add a tab in supplier payment view
- // 'product' to add a tab in product view
- // 'propal' to add a tab in propal view
- // 'project' to add a tab in project view
- // 'stock' to add a tab in stock view
- // 'thirdparty' to add a tab in third party view
- // 'user' to add a tab in user view
- $this->tabs = array();
-
- if (! isset($conf->mymodule) || ! isset($conf->mymodule->enabled))
- {
- $conf->mymodule=new stdClass();
- $conf->mymodule->enabled=0;
- }
-
- // Dictionaries
- $this->dictionaries=array();
- /* Example:
- $this->dictionaries=array(
- 'langs'=>'mylangfile@mymodule',
- 'tabname'=>array(MAIN_DB_PREFIX."table1",MAIN_DB_PREFIX."table2",MAIN_DB_PREFIX."table3"), // List of tables we want to see into dictonnary editor
- 'tablib'=>array("Table1","Table2","Table3"), // Label of tables
- 'tabsql'=>array('SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table1 as f','SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table2 as f','SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table3 as f'), // Request to select fields
- 'tabsqlsort'=>array("label ASC","label ASC","label ASC"), // Sort order
- 'tabfield'=>array("code,label","code,label","code,label"), // List of fields (result of select to show dictionary)
- 'tabfieldvalue'=>array("code,label","code,label","code,label"), // List of fields (list of fields to edit a record)
- 'tabfieldinsert'=>array("code,label","code,label","code,label"), // List of fields (list of fields for insert)
- 'tabrowid'=>array("rowid","rowid","rowid"), // Name of columns with primary key (try to always name it 'rowid')
- 'tabcond'=>array($conf->mymodule->enabled,$conf->mymodule->enabled,$conf->mymodule->enabled) // Condition to show each dictionary
- );
- */
-
- // Boxes
- // Add here list of php file(s) stored in core/boxes that contains class to show a box.
- $this->boxes = array(); // List of boxes
- // Example:
- //$this->boxes=array(
- // 0=>array('file'=>'myboxa.php@mymodule','note'=>'','enabledbydefaulton'=>'Home'),
- // 1=>array('file'=>'myboxb.php@mymodule','note'=>''),
- // 2=>array('file'=>'myboxc.php@mymodule','note'=>'')
- //);
-
- // Cronjobs
- $this->cronjobs = array(); // List of cron jobs entries to add
- // Example: $this->cronjobs=array(0=>array('label'=>'My label', 'jobtype'=>'method', 'class'=>'/dir/class/file.class.php', 'objectname'=>'MyClass', 'method'=>'myMethod', 'parameters'=>'', 'comment'=>'Comment', 'frequency'=>2, 'unitfrequency'=>3600, 'test'=>true),
- // 1=>array('label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24, 'test'=>true)
- // );
-
- // Permissions
- $this->rights = array(); // Permission array used by this module
- $r=0;
-
- // Add here list of permission defined by an id, a label, a boolean and two constant strings.
- // Example:
- // $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used)
- // $this->rights[$r][1] = 'Permision label'; // Permission label
- // $this->rights[$r][3] = 1; // Permission by default for new user (0/1)
- // $this->rights[$r][4] = 'level1'; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
- // $this->rights[$r][5] = 'level2'; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
- // $r++;
-
- // Main menu entries
- $this->menu = array(); // List of menus to add
- $r=0;
-
- // Add here entries to declare new menus
- //
- // Example to declare a new Top Menu entry and its Left menu entry:
- // $this->menu[$r]=array( 'fk_menu'=>'', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode
- // 'type'=>'top', // This is a Top menu entry
- // 'titre'=>'MyModule top menu',
- // 'mainmenu'=>'mymodule',
- // 'leftmenu'=>'mymodule',
- // 'url'=>'/mymodule/pagetop.php',
- // 'langs'=>'mylangfile@mymodule', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
- // 'position'=>100,
- // 'enabled'=>'$conf->mymodule->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled.
- // 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules
- // 'target'=>'',
- // 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both
- // $r++;
- //
- // Example to declare a Left Menu entry into an existing Top menu entry:
- // $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=xxx', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode
- // 'type'=>'left', // This is a Left menu entry
- // 'titre'=>'MyModule left menu',
- // 'mainmenu'=>'xxx',
- // 'leftmenu'=>'mymodule',
- // 'url'=>'/mymodule/pagelevel2.php',
- // 'langs'=>'mylangfile@mymodule', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
- // 'position'=>100,
- // 'enabled'=>'$conf->mymodule->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected.
- // 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules
- // 'target'=>'',
- // 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both
- // $r++;
-
-
- // Exports
- $r=1;
-
- // Example:
- // $this->export_code[$r]=$this->rights_class.'_'.$r;
- // $this->export_label[$r]='MyModule'; // Translation key (used only if key ExportDataset_xxx_z not found)
- // $this->export_enabled[$r]='1'; // Condition to show export in list (ie: '$user->id==3'). Set to 1 to always show when module is enabled.
- // $this->export_icon[$r]='generic:MyModule'; // Put here code of icon then string for translation key of module name
- // $this->export_permission[$r]=array(array("mymodule","level1","level2"));
- // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef');
- // $this->export_TypeFields_array[$r]=array('t.date'=>'Date', 't.qte'=>'Numeric', 't.poids'=>'Numeric', 't.fad'=>'Numeric', 't.paq'=>'Numeric', 't.stockage'=>'Numeric', 't.fadparliv'=>'Numeric', 't.livau100'=>'Numeric', 't.forfait'=>'Numeric', 's.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Numeric",'f.total_ttc'=>"Numeric",'f.tva'=>"Numeric",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_private'=>"Text",'f.note_public'=>"Text",'fd.description'=>"Text",'fd.subprice'=>"Numeric",'fd.tva_tx'=>"Numeric",'fd.qty'=>"Numeric",'fd.total_ht'=>"Numeric",'fd.total_tva'=>"Numeric",'fd.total_ttc'=>"Numeric",'fd.date_start'=>"Date",'fd.date_end'=>"Date",'fd.special_code'=>'Numeric','fd.product_type'=>"Numeric",'fd.fk_product'=>'List:product:label','p.ref'=>'Text','p.label'=>'Text','p.accountancy_code_sell'=>'Text');
- // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product');
- // $this->export_dependencies_array[$r]=array('invoice_line'=>'fd.rowid','product'=>'fd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them
- // $this->export_sql_start[$r]='SELECT DISTINCT ';
- // $this->export_sql_end[$r] =' FROM ('.MAIN_DB_PREFIX.'facture as f, '.MAIN_DB_PREFIX.'facturedet as fd, '.MAIN_DB_PREFIX.'societe as s)';
- // $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)';
- // $this->export_sql_end[$r] .=' WHERE f.fk_soc = s.rowid AND f.rowid = fd.fk_facture';
- // $this->export_sql_order[$r] .=' ORDER BY s.nom';
- // $r++;
- }
-
- /**
- * Function called when module is enabled.
- * The init function add constants, boxes, permissions and menus (defined in constructor) into Dolibarr database.
- * It also creates data directories
- *
- * @param string $options Options when enabling module ('', 'noboxes')
- * @return int 1 if OK, 0 if KO
- */
- public function init($options='')
- {
- $sql = array();
-
- //$this->_load_tables('/mymodule/sql/');
-
- return $this->_init($sql, $options);
- }
-
- /**
- * Function called when module is disabled.
- * Remove from database constants, boxes and permissions from Dolibarr database.
- * Data directories are not deleted
- *
- * @param string $options Options when enabling module ('', 'noboxes')
- * @return int 1 if OK, 0 if KO
- */
- public function remove($options = '')
- {
- $sql = array();
-
- return $this->_remove($sql, $options);
- }
-
-}
-
diff --git a/dev/skeletons/skeleton_card.php b/dev/skeletons/skeleton_card.php
deleted file mode 100644
index 8c487dee776..00000000000
--- a/dev/skeletons/skeleton_card.php
+++ /dev/null
@@ -1,349 +0,0 @@
-
- * Copyright (C) ---Put here your own copyright and developer email---
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/**
- * \file dev/skeletons/skeleton_card.php
- * \ingroup mymodule othermodule1 othermodule2
- * \brief This file is an example of a php page
- * Put here some comments
- */
-
-//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1');
-//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1');
-//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1');
-//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1');
-//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); // Do not check anti CSRF attack test
-//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK','1'); // Do not check style html tag into posted data
-//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); // Do not check anti POST attack test
-//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); // If there is no need to load and show top and left menu
-//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); // If we don't need to load the html.form.class.php
-//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1');
-//if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session)
-
-// Change this following line to use the correct relative path (../, ../../, etc)
-$res=0;
-if (! $res && file_exists("../main.inc.php")) $res=@include '../main.inc.php'; // to work if your module directory is into dolibarr root htdocs directory
-if (! $res && file_exists("../../main.inc.php")) $res=@include '../../main.inc.php'; // to work if your module directory is into a subdir of root htdocs directory
-if (! $res && file_exists("../../../dolibarr/htdocs/main.inc.php")) $res=@include '../../../dolibarr/htdocs/main.inc.php'; // Used on dev env only
-if (! $res && file_exists("../../../../dolibarr/htdocs/main.inc.php")) $res=@include '../../../../dolibarr/htdocs/main.inc.php'; // Used on dev env only
-if (! $res) die("Include of main fails");
-// Change this following line to use the correct relative path from htdocs
-include_once(DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php');
-dol_include_once('/mymodule/class/skeleton_class.class.php');
-
-// Load traductions files requiredby by page
-$langs->load("mymodule");
-$langs->load("other");
-
-// Get parameters
-$id = GETPOST('id','int');
-$action = GETPOST('action','alpha');
-$cancel = GETPOST('cancel');
-$backtopage = GETPOST('backtopage');
-$myparam = GETPOST('myparam','alpha');
-
-$search_field1=GETPOST("search_field1");
-$search_field2=GETPOST("search_field2");
-
-if (empty($action) && empty($id) && empty($ref)) $action='view';
-
-// Protection if external user
-if ($user->societe_id > 0)
-{
- //accessforbidden();
-}
-//$result = restrictedArea($user, 'mymodule', $id);
-
-
-$object = new Skeleton_Class($db);
-$extrafields = new ExtraFields($db);
-
-// fetch optionals attributes and labels
-$extralabels = $extrafields->fetch_name_optionals_label($object->table_element);
-
-// Load object
-include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
-
-// Initialize technical object to manage hooks of modules. Note that conf->hooks_modules contains array array
-$hookmanager->initHooks(array('skeleton'));
-
-
-
-/*******************************************************************
-* ACTIONS
-*
-* Put here all code to do according to value of "action" parameter
-********************************************************************/
-
-$parameters=array();
-$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
-if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
-
-if (empty($reshook))
-{
- if ($cancel)
- {
- if ($action != 'addlink')
- {
- $urltogo=$backtopage?$backtopage:dol_buildpath('/mymodule/list.php',1);
- header("Location: ".$urltogo);
- exit;
- }
- if ($id > 0 || ! empty($ref)) $ret = $object->fetch($id,$ref);
- $action='';
- }
-
- // Action to add record
- if ($action == 'add')
- {
- if (GETPOST('cancel'))
- {
- $urltogo=$backtopage?$backtopage:dol_buildpath('/mymodule/list.php',1);
- header("Location: ".$urltogo);
- exit;
- }
-
- $error=0;
-
- /* object_prop_getpost_prop */
- $object->prop1=GETPOST("field1");
- $object->prop2=GETPOST("field2");
-
- if (empty($object->ref))
- {
- $error++;
- setEventMessages($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Ref")), null, 'errors');
- }
-
- if (! $error)
- {
- $result=$object->create($user);
- if ($result > 0)
- {
- // Creation OK
- $urltogo=$backtopage?$backtopage:dol_buildpath('/mymodule/list.php',1);
- header("Location: ".$urltogo);
- exit;
- }
- {
- // Creation KO
- if (! empty($object->errors)) setEventMessages(null, $object->errors, 'errors');
- else setEventMessages($object->error, null, 'errors');
- $action='create';
- }
- }
- else
- {
- $action='create';
- }
- }
-
- // Action to update record
- if ($action == 'update')
- {
- $error=0;
-
- $object->prop1=GETPOST("field1");
- $object->prop2=GETPOST("field2");
-
- if (empty($object->ref))
- {
- $error++;
- setEventMessages($langs->transnoentitiesnoconv("ErrorFieldRequired",$langs->transnoentitiesnoconv("Ref")), null, 'errors');
- }
-
- if (! $error)
- {
- $result=$object->update($user);
- if ($result > 0)
- {
- $action='view';
- }
- else
- {
- // Creation KO
- if (! empty($object->errors)) setEventMessages(null, $object->errors, 'errors');
- else setEventMessages($object->error, null, 'errors');
- $action='edit';
- }
- }
- else
- {
- $action='edit';
- }
- }
-
- // Action to delete
- if ($action == 'confirm_delete')
- {
- $result=$object->delete($user);
- if ($result > 0)
- {
- // Delete OK
- setEventMessages("RecordDeleted", null, 'mesgs');
- header("Location: ".dol_buildpath('/mymodule/list.php',1));
- exit;
- }
- else
- {
- if (! empty($object->errors)) setEventMessages(null, $object->errors, 'errors');
- else setEventMessages($object->error, null, 'errors');
- }
- }
-}
-
-
-
-
-/***************************************************
-* VIEW
-*
-* Put here all code to build page
-****************************************************/
-
-llxHeader('','MyPageName','');
-
-$form=new Form($db);
-
-
-// Put here content of your page
-
-// Example : Adding jquery code
-print '';
-
-
-// Part to create
-if ($action == 'create')
-{
- print load_fiche_titre($langs->trans("NewMyModule"));
-
- print '';
-}
-
-
-
-// Part to edit record
-if (($id || $ref) && $action == 'edit')
-{
- print load_fiche_titre($langs->trans("MyModule"));
-
- print '';
-}
-
-
-
-// Part to show record
-if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create')))
-{
- $res = $object->fetch_optionals($object->id, $extralabels);
-
-
- print load_fiche_titre($langs->trans("MyModule"));
-
- dol_fiche_head();
-
- if ($action == 'delete') {
- $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('DeleteMyOjbect'), $langs->trans('ConfirmDeleteMyObject'), 'confirm_delete', '', 0, 1);
- print $formconfirm;
- }
-
- print '
'."\n";
- $parameters=array();
- $reshook=$hookmanager->executeHooks('addMoreActionsButtons',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
- if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
-
- if (empty($reshook))
- {
- if ($user->rights->mymodule->write)
- {
- print '
'."\n";
-
-
- // Example 2 : Adding links to objects
- // Show links to link elements
- //$linktoelem = $form->showLinkToObjectBlock($object, null, array('skeleton'));
- //$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
-
-}
-
-
-// End of page
-llxFooter();
-$db->close();
diff --git a/dev/skeletons/skeleton_list.php b/dev/skeletons/skeleton_list.php
deleted file mode 100644
index 7053486234f..00000000000
--- a/dev/skeletons/skeleton_list.php
+++ /dev/null
@@ -1,567 +0,0 @@
-
- * Copyright (C) 2014-2016 Juanjo Menent
- * Copyright (C) 2016 Jean-François Ferry
- * Copyright (C) 2017 Nicolas ZABOURI
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/**
- * \file dev/skeletons/skeleton_list.php
- * \ingroup mymodule othermodule1 othermodule2
- * \brief This file is an example of a php page
- * Put here some comments
- */
-
-//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1');
-//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1');
-//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1');
-//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1');
-//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); // Do not check anti CSRF attack test
-//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK','1'); // Do not check style html tag into posted data
-//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); // Do not check anti POST attack test
-//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); // If there is no need to load and show top and left menu
-//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); // If we don't need to load the html.form.class.php
-//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1');
-//if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session)
-
-// Change this following line to use the correct relative path (../, ../../, etc)
-$res=0;
-if (! $res && file_exists("../main.inc.php")) $res=@include '../main.inc.php'; // to work if your module directory is into dolibarr root htdocs directory
-if (! $res && file_exists("../../main.inc.php")) $res=@include '../../main.inc.php'; // to work if your module directory is into a subdir of root htdocs directory
-if (! $res && file_exists("../../../dolibarr/htdocs/main.inc.php")) $res=@include '../../../dolibarr/htdocs/main.inc.php'; // Used on dev env only
-if (! $res && file_exists("../../../../dolibarr/htdocs/main.inc.php")) $res=@include '../../../../dolibarr/htdocs/main.inc.php'; // Used on dev env only
-if (! $res) die("Include of main fails");
-// Change this following line to use the correct relative path from htdocs
-require_once(DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php');
-require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
-require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
-dol_include_once('/mymodule/class/skeleton_class.class.php');
-
-// Load traductions files requiredby by page
-$langs->load("mymodule");
-$langs->load("other");
-
-$action=GETPOST('action','alpha');
-$massaction=GETPOST('massaction','alpha');
-$show_files=GETPOST('show_files','int');
-$confirm=GETPOST('confirm','alpha');
-$toselect = GETPOST('toselect', 'array');
-
-$id = GETPOST('id','int');
-$backtopage = GETPOST('backtopage');
-$myparam = GETPOST('myparam','alpha');
-
-$search_all=trim(GETPOST("sall"));
-$search_field1=GETPOST("search_field1");
-$search_field2=GETPOST("search_field2");
-$search_myfield=GETPOST('search_myfield');
-$optioncss = GETPOST('optioncss','alpha');
-
-// Load variable for pagination
-$limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
-$sortfield = GETPOST('sortfield','alpha');
-$sortorder = GETPOST('sortorder','alpha');
-$page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
-$offset = $limit * $page;
-$pageprev = $page - 1;
-$pagenext = $page + 1;
-if (! $sortfield) $sortfield="t.rowid"; // Set here default search field
-if (! $sortorder) $sortorder="ASC";
-
-// Protection if external user
-$socid=0;
-if ($user->societe_id > 0)
-{
- $socid = $user->societe_id;
- //accessforbidden();
-}
-
-// Initialize technical object to manage context to save list fields
-$contextpage=GETPOST('contextpage','aZ')?GETPOST('contextpage','aZ'):'mymodulelist';
-
-// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array
-$hookmanager->initHooks(array('mymodulelist'));
-$extrafields = new ExtraFields($db);
-
-// fetch optionals attributes and labels
-$extralabels = $extrafields->fetch_name_optionals_label('mymodule');
-$search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_');
-
-// List of fields to search into when doing a "search in all"
-$fieldstosearchall = array(
- 't.ref'=>'Ref',
- 't.note_public'=>'NotePublic',
-);
-if (empty($user->socid)) $fieldstosearchall["t.note_private"]="NotePrivate";
-
-// Definition of fields for list
-$arrayfields=array(
- 't.field1'=>array('label'=>$langs->trans("Field1"), 'checked'=>1),
- 't.field2'=>array('label'=>$langs->trans("Field2"), 'checked'=>1),
- //'t.entity'=>array('label'=>$langs->trans("Entity"), 'checked'=>1, 'enabled'=>(! empty($conf->multicompany->enabled) && empty($conf->multicompany->transverse_mode))),
- 't.datec'=>array('label'=>$langs->trans("DateCreationShort"), 'checked'=>0, 'position'=>500),
- 't.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500),
- //'t.statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000),
-);
-// Extra fields
-if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label))
-{
- foreach($extrafields->attribute_label as $key => $val)
- {
- $arrayfields["ef.".$key]=array('label'=>$extrafields->attribute_label[$key], 'checked'=>$extrafields->attribute_list[$key], 'position'=>$extrafields->attribute_pos[$key], 'enabled'=>$extrafields->attribute_perms[$key]);
- }
-}
-
-
-// Load object if id or ref is provided as parameter
-$object=new Skeleton_Class($db);
-if (($id > 0 || ! empty($ref)) && $action != 'add')
-{
- $result=$object->fetch($id,$ref);
- if ($result < 0) dol_print_error($db);
-}
-
-
-
-
-/*******************************************************************
-* ACTIONS
-*
-* Put here all code to do according to value of "action" parameter
-********************************************************************/
-
-if (GETPOST('cancel')) { $action='list'; $massaction=''; }
-if (! GETPOST('confirmmassaction') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction=''; }
-
-$parameters=array();
-$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
-if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
-
-if (empty($reshook))
-{
- // Selection of new fields
- include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
-
- // Purge search criteria
- if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPOST("button_removefilter")) // All tests are required to be compatible with all browsers
- {
- $search_field1='';
- $search_field2='';
- $search_date_creation='';
- $search_date_update='';
- $toselect='';
- $search_array_options=array();
- }
-
- // Mass actions
- $objectclass='Skeleton';
- $objectlabel='Skeleton';
- $permtoread = $user->rights->skeleton->read;
- $permtodelete = $user->rights->skeleton->delete;
- $uploaddir = $conf->skeleton->dir_output;
- include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
-}
-
-
-
-/***************************************************
-* VIEW
-*
-* Put here all code to build page
-****************************************************/
-
-$now=dol_now();
-
-$form=new Form($db);
-
-//$help_url="EN:Module_Customers_Orders|FR:Module_Commandes_Clients|ES:Módulo_Pedidos_de_clientes";
-$help_url='';
-$title = $langs->trans('MyModuleListTitle');
-
-// Put here content of your page
-
-// Example : Adding jquery code
-print '';
-
-
-$sql = "SELECT";
-$sql.= " t.rowid,";
-$sql.= " t.field1,";
-$sql.= " t.field2";
-// Add fields from extrafields
-foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : '');
-// Add fields from hooks
-$parameters=array();
-$reshook=$hookmanager->executeHooks('printFieldListSelect',$parameters); // Note that $action and $object may have been modified by hook
-$sql.=$hookmanager->resPrint;
-$sql.= " FROM ".MAIN_DB_PREFIX."mytable as t";
-if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."mytable_extrafields as ef on (t.rowid = ef.fk_object)";
-$sql.= " WHERE 1 = 1";
-//$sql.= " WHERE u.entity IN (".getEntity('mytable',1).")";
-if ($search_field1) $sql.= natural_search("field1",$search_field1);
-if ($search_field2) $sql.= natural_search("field2",$search_field2);
-if ($sall) $sql.= natural_search(array_keys($fieldstosearchall), $sall);
-// Add where from extra fields
-foreach ($search_array_options as $key => $val)
-{
- $crit=$val;
- $tmpkey=preg_replace('/search_options_/','',$key);
- $typ=$extrafields->attribute_type[$tmpkey];
- $mode=0;
- if (in_array($typ, array('int','double'))) $mode=1; // Search on a numeric
- if ($val && ( ($crit != '' && ! in_array($typ, array('select'))) || ! empty($crit)))
- {
- $sql .= natural_search('ef.'.$tmpkey, $crit, $mode);
- }
-}
-// Add where from hooks
-$parameters=array();
-$reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters); // Note that $action and $object may have been modified by hook
-$sql.=$hookmanager->resPrint;
-$sql.=$db->order($sortfield,$sortorder);
-//$sql.= $db->plimit($conf->liste_limit+1, $offset);
-
-// Count total nb of records
-$nbtotalofrecords = '';
-if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
-{
- $result = $db->query($sql);
- $nbtotalofrecords = $db->num_rows($result);
-}
-
-$sql.= $db->plimit($limit+1, $offset);
-
-dol_syslog($script_file, LOG_DEBUG);
-$resql=$db->query($sql);
-if (! $resql)
-{
- dol_print_error($db);
- exit;
-}
-
-$num = $db->num_rows($resql);
-
-// Direct jump if only one record found
-if ($num == 1 && ! empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all)
-{
- $obj = $db->fetch_object($resql);
- $id = $obj->rowid;
- header("Location: ".DOL_URL_ROOT.'/skeleton/card.php?id='.$id);
- exit;
-}
-
-llxHeader('', $title, $help_url);
-
-$arrayofselected=is_array($toselect)?$toselect:array();
-
-$param='';
-if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
-if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit;
-if ($search_field1 != '') $param.= '&search_field1='.urlencode($search_field1);
-if ($search_field2 != '') $param.= '&search_field2='.urlencode($search_field2);
-if ($optioncss != '') $param.='&optioncss='.$optioncss;
-// Add $param from extra fields
-foreach ($search_array_options as $key => $val)
-{
- $crit=$val;
- $tmpkey=preg_replace('/search_options_/','',$key);
- if ($val != '') $param.='&search_options_'.$tmpkey.'='.urlencode($val);
-}
-
-$arrayofmassactions = array(
- 'presend'=>$langs->trans("SendByMail"),
- 'builddoc'=>$langs->trans("PDFMerge"),
-);
-if ($user->rights->mymodule->supprimer) $arrayofmassactions['delete']=$langs->trans("Delete");
-if ($massaction == 'presend') $arrayofmassactions=array();
-$massactionbutton=$form->selectMassAction('', $arrayofmassactions);
-
-print ''."\n";
-
-
-if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files)
-{
- // Show list of available documents
- $urlsource=$_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
- $urlsource.=str_replace('&','&',$param);
-
- $filedir=$diroutputmassaction;
- $genallowed=$user->rights->facture->lire;
- $delallowed=$user->rights->facture->lire;
-
- print $formfile->showdocuments('massfilesarea_mymodule','',$filedir,$urlsource,0,$delallowed,'',1,1,0,48,1,$param,$title,'');
-}
-else
-{
- print ' '.$langs->trans("ShowTempMassFilesArea").'';
-}
-
-
-// End of page
-llxFooter();
-$db->close();
diff --git a/dev/skeletons/skeleton_webservice_server.php b/dev/skeletons/skeleton_webservice_server.php
deleted file mode 100644
index 54a050ff9da..00000000000
--- a/dev/skeletons/skeleton_webservice_server.php
+++ /dev/null
@@ -1,272 +0,0 @@
-
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/**
- * \file htdocs/webservices/server_skeleton.php
- * \brief File that is entry point to call Dolibarr WebServices
- * \version $Id: server_skeleton.php,v 1.7 2010/12/19 11:49:37 eldy Exp $
- */
-
-// This is to make Dolibarr working with Plesk
-set_include_path($_SERVER['DOCUMENT_ROOT'].'/htdocs');
-
-require_once("../master.inc.php");
-require_once(NUSOAP_PATH.'/nusoap.php'); // Include SOAP
-require_once(DOL_DOCUMENT_ROOT."/core/lib/ws.lib.php");
-require_once(DOL_DOCUMENT_ROOT."/skeleton/class/skeleton.class.php");
-
-
-dol_syslog("Call Skeleton webservices interfaces");
-
-// Enable and test if module web services is enabled
-if (empty($conf->global->MAIN_MODULE_WEBSERVICES))
-{
- $langs->load("admin");
- dol_syslog("Call Dolibarr webservices interfaces with module webservices disabled");
- print $langs->trans("WarningModuleNotActive",'WebServices').'.
';
- print $langs->trans("ToActivateModule");
- exit;
-}
-
-// Create the soap Object
-$server = new nusoap_server();
-$server->soap_defencoding='UTF-8';
-$server->decode_utf8=false;
-$ns='http://www.dolibarr.org/ns/';
-$server->configureWSDL('WebServicesDolibarrSkeleton',$ns);
-$server->wsdl->schemaTargetNamespace=$ns;
-
-
-// Define WSDL Authentication object
-$server->wsdl->addComplexType(
- 'authentication',
- 'complexType',
- 'struct',
- 'all',
- '',
- array(
- 'dolibarrkey' => array('name'=>'dolibarrkey','type'=>'xsd:string'),
- 'sourceapplication' => array('name'=>'sourceapplication','type'=>'xsd:string'),
- 'login' => array('name'=>'login','type'=>'xsd:string'),
- 'password' => array('name'=>'password','type'=>'xsd:string'),
- 'entity' => array('name'=>'entity','type'=>'xsd:string'),
- )
-);
-
-// Define WSDL Return object
-$server->wsdl->addComplexType(
- 'result',
- 'complexType',
- 'struct',
- 'all',
- '',
- array(
- 'result_code' => array('name'=>'result_code','type'=>'xsd:string'),
- 'result_label' => array('name'=>'result_label','type'=>'xsd:string'),
- )
-);
-
-// Define other specific objects
-$server->wsdl->addComplexType(
- 'skeleton',
- 'complexType',
- 'struct',
- 'all',
- '',
- array(
- 'prop1'=>'xxx',
- 'prop2'=>'xxx',
- //...
- )
-);
-
-
-
-// 5 styles: RPC/encoded, RPC/literal, Document/encoded (not WS-I compliant), Document/literal, Document/literal wrapped
-// Style merely dictates how to translate a WSDL binding to a SOAP message. Nothing more. You can use either style with any programming model.
-// http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/
-$styledoc='rpc'; // rpc/document (document is an extend into SOAP 1.0 to support unstructured messages)
-$styleuse='encoded'; // encoded/literal/literal wrapped
-// Better choice is document/literal wrapped but literal wrapped not supported by nusoap.
-
-
-// Register WSDL
-$server->register(
- 'getSkeleton',
- // Entry values
- array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string','ref_ext'=>'xsd:string'),
- // Exit values
- array('result'=>'tns:result','skeleton'=>'tns:skeleton'),
- $ns,
- $ns.'#getSkeleton',
- $styledoc,
- $styleuse,
- 'WS to get skeleton'
-);
-
-// Register WSDL
-$server->register(
- 'createSkeleton',
- // Entry values
- array('authentication'=>'tns:authentication','skeleton'=>'tns:skeleton'),
- // Exit values
- array('result'=>'tns:result','id'=>'xsd:string'),
- $ns,
- $ns.'#createSkeleton',
- $styledoc,
- $styleuse,
- 'WS to create a skeleton'
-);
-
-
-
-
-/**
- * Get Skeleton
- *
- * @param array $authentication Array of authentication information
- * @param int $id Id of object
- * @param string $ref Ref of object
- * @param string $ref_ext Ref external of object
- * @return mixed
- */
-function getSkeleton($authentication,$id,$ref='',$ref_ext='')
-{
- global $db,$conf,$langs;
-
- dol_syslog("Function: getSkeleton login=".$authentication['login']." id=".$id." ref=".$ref." ref_ext=".$ref_ext);
-
- if ($authentication['entity']) $conf->entity=$authentication['entity'];
-
- // Init and check authentication
- $objectresp=array();
- $errorcode='';$errorlabel='';
- $error=0;
- $fuser=check_authentication($authentication,$error,$errorcode,$errorlabel);
- // Check parameters
- if (! $error && (($id && $ref) || ($id && $ref_ext) || ($ref && $ref_ext)))
- {
- $error++;
- $errorcode='BAD_PARAMETERS'; $errorlabel="Parameter id, ref and ref_ext can't be both provided. You must choose one or other but not both.";
- }
-
- if (! $error)
- {
- $fuser->getrights();
-
- if ($fuser->rights->skeleton->read)
- {
- $skeleton=new Skeleton($db);
- $result=$skeleton->fetch($id,$ref,$ref_ext);
- if ($result > 0)
- {
- // Create
- $objectresp = array(
- 'result'=>array('result_code'=>'OK', 'result_label'=>''),
- 'skeleton'=>array(
- 'prop1'=>$skeleton->prop1,
- 'prop2'=>$skeleton->prop2,
- //...
- )
- );
- }
- else
- {
- $error++;
- $errorcode='NOT_FOUND'; $errorlabel='Object not found for id='.$id.' nor ref='.$ref.' nor ref_ext='.$ref_ext;
- }
- }
- else
- {
- $error++;
- $errorcode='PERMISSION_DENIED'; $errorlabel='User does not have permission for this request';
- }
- }
-
- if ($error)
- {
- $objectresp = array('result'=>array('result_code' => $errorcode, 'result_label' => $errorlabel));
- }
-
- return $objectresp;
-}
-
-
-/**
- * Create Skeleton
- *
- * @param array $authentication Array of authentication information
- * @param Skeleton $skeleton $skeleton
- * @return array Array result
- */
-function createSkeleton($authentication,$skeleton)
-{
- global $db,$conf,$langs;
-
- $now=dol_now();
-
- dol_syslog("Function: createSkeleton login=".$authentication['login']);
-
- if ($authentication['entity']) $conf->entity=$authentication['entity'];
-
- // Init and check authentication
- $objectresp=array();
- $errorcode='';$errorlabel='';
- $error=0;
- $fuser=check_authentication($authentication,$error,$errorcode,$errorlabel);
- // Check parameters
-
-
- if (! $error)
- {
- $newobject=new Skeleton($db);
- $newobject->prop1=$skeleton->prop1;
- $newobject->prop2=$skeleton->prop2;
- //...
-
- $db->begin();
-
- $result=$newobject->create($fuser);
- if ($result <= 0)
- {
- $error++;
- }
-
- if (! $error)
- {
- $db->commit();
- $objectresp=array('result'=>array('result_code'=>'OK', 'result_label'=>''),'id'=>$newobject->id,'ref'=>$newobject->ref);
- }
- else
- {
- $db->rollback();
- $error++;
- $errorcode='KO';
- $errorlabel=$newobject->error;
- }
- }
-
- if ($error)
- {
- $objectresp = array('result'=>array('result_code' => $errorcode, 'result_label' => $errorlabel));
- }
-
- return $objectresp;
-}
-
-// Return the results.
-$server->service(file_get_contents("php://input"));
diff --git a/dev/tools/github_authors_peryear.sh b/dev/tools/github_authors_peryear.sh
new file mode 100755
index 00000000000..99b28d4d417
--- /dev/null
+++ b/dev/tools/github_authors_peryear.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+FROM=2016-01-01
+TO=2016-12-31
+
+echo "git log --since $FROM --before $TO | grep ^Author | sort -u -f -i -b | wc -l"
+git log --since $FROM --before $TO | grep ^Author | sort -u -f -i -b | wc -l
+
diff --git a/dev/tools/github_commits_perversion.sh b/dev/tools/github_commits_perversion.sh
new file mode 100755
index 00000000000..40ddafee617
--- /dev/null
+++ b/dev/tools/github_commits_perversion.sh
@@ -0,0 +1,15 @@
+#/bin/bash
+Releases=("3.8" "3.9" "4.0" "5.0", "develop")
+Dates=("2010-01-01", "2011-01-01", "2012-01-01", "2013-01-01", "2014-01-01", "2015-01-01", "2016-07-01")
+let "counter = 1"
+
+for i in "${Releases[@]}"
+do
+ git shortlog -s -n --after=${Dates[counter-1]} --before=${Dates[counter]}
+ echo -n "Total $i: "
+ git log --pretty=oneline --after=${Dates[counter-1]} --before=${Dates[counter]} | wc -l
+ echo "======================="
+ echo
+ let "counter +=1"
+done
+
diff --git a/dev/tools/rmphpclosingtag.sh b/dev/tools/rmphpclosingtag.sh
deleted file mode 100755
index ec755bc399b..00000000000
--- a/dev/tools/rmphpclosingtag.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-# vim:ft=sh:ts=3:sts=3:sw=3:et:
-
-###
-# Strips the closing php tag `?>` and any following blank lines from the
-# end of any PHP file in the current working directory and sub-directories. Files
-# with non-whitespace characters following the closing tag will not be affected.
-#
-# Author: Bryan C. Geraghty
-# Date: 2009-10-28
-# Source: http://bryan.ravensight.org/2010/07/remove-php-closing-tag/
-##
-
-FILES=$(pcregrep -rnM --include='^.*\.php$' '^\?\>(?=([\s\n]+)?$(?!\n))' .);
-
-for MATCH in $FILES;
-do
- FILE=`echo $MATCH | awk -F ':' '{print $1}'`;
- TARGET=`echo $MATCH | awk -F ':' '{print $2}'`;
- LINE_COUNT=`wc -l $FILE | awk -F " " '{print $1}'`;
- echo "Removing lines ${TARGET} through ${LINE_COUNT} from file $FILE...";
- sed -i "${TARGET},${LINE_COUNT}d" $FILE;
-done;
diff --git a/dev/translation/erp_comparison_translation.txt b/dev/translation/erp_comparison_translation.txt
new file mode 100644
index 00000000000..c99a5f4cc1c
--- /dev/null
+++ b/dev/translation/erp_comparison_translation.txt
@@ -0,0 +1,17 @@
+
+
+Term Dolibarr SAP Odoo ...
+----------------------------------------------------------------------------
+Thirdparty Contact partner Partner/Contact (company)
+Contact/address Contact person Partner/Contact (individual)
+
+Financial ?? Invoicing
+
+Income / Expense ?? Profit / Loss
+Balance ?? Net profit
+Subledger account Subledger account ??
+
+
+Proposal ?? Quotation Proposal is ok but proposition looks better (proposal is for a detailed proposition). We can say also "business proposition or business proposal".
+ Indian are using "Quotation".
+
diff --git a/dev/translation/sanity_check_en_langfiles.php b/dev/translation/sanity_check_en_langfiles.php
index bb3430eb22c..9136c192739 100755
--- a/dev/translation/sanity_check_en_langfiles.php
+++ b/dev/translation/sanity_check_en_langfiles.php
@@ -310,6 +310,8 @@ if ((! empty($_REQUEST['unused']) && $_REQUEST['unused'] == 'true') || (isset($a
if (preg_match('/^.*Bytes$/', $value)) $qualifiedforclean=0;
if (preg_match('/^NoteSomeFeaturesAreDisabled/', $value)) $qualifiedforclean=0;
if (preg_match('/^(DoTest|Under|Limits|Cards|CurrentValue|DateLimit|DateAndHour|NbOfLines|NbOfObjects|NbOfReferes|TotalTTCShort|VATs)/', $value)) $qualifiedforclean=0;
+ // modulebuilder
+ if (preg_match('/^ModuleBuilderDesc/', $value)) $qualifiedforclean=0;
// orders
if (preg_match('/^OrderSource/', $value)) $qualifiedforclean=0;
if (preg_match('/^TypeContact_/', $value)) $qualifiedforclean=0;
diff --git a/dev/translation/strip_language_file.php b/dev/translation/strip_language_file.php
index 647b571c788..92233d71b98 100755
--- a/dev/translation/strip_language_file.php
+++ b/dev/translation/strip_language_file.php
@@ -303,6 +303,8 @@ foreach($filesToProcess as $fileToProcess)
// ----- Process output now -----
+ //print "Found primary key = ".$key."\n";
+
// Key not in other file
if (in_array($key, $arrayofkeytoalwayskeep) || preg_match('/^FormatDate/',$key) || preg_match('/^FormatHour/',$key))
{
@@ -321,7 +323,7 @@ foreach($filesToProcess as $fileToProcess)
|| in_array($key, $arrayofkeytoalwayskeep) || preg_match('/^FormatDate/',$key) || preg_match('/^FormatHour/',$key)
)
{
- //print "Key $key differs so we add it into new secondary language (line: $cnt).\n";
+ //print "Key $key differs (aSecondary=".$aSecondary[$key].", aPrimary=".$aPrimary[$key].", aEnglish=".$aEnglish[$key].") so we add it into new secondary language (line: $cnt).\n";
fwrite($oh, $key."=".(empty($aSecondary[$key])?$aPrimary[$key]:$aSecondary[$key])."\n");
}
}
diff --git a/doc/images/README b/doc/images/README.md
similarity index 66%
rename from doc/images/README
rename to doc/images/README.md
index 7b6a051aada..798cf599b4c 100644
--- a/doc/images/README
+++ b/doc/images/README.md
@@ -1,8 +1,16 @@
-README (English)
+# README (English)
--------------------------------
-* Most screen captures and icons are Dolibarr contributions, however,
-some icons are from http://led24.de/iconset/. This is original README file for this source:
+
+* Screen captures and icons are Dolibarr contributions
+
+
+* Most logos were created by Dolibarr developers. You may find sources of them on:
+
+https://github.com/Dolibarr/foundation
+
+
+* Few icons are from http://led24.de/iconset/. This is original README file for this source:
-------------------------------------------------------
You can do whatever you want with these icons (use on web or in desktop applications) as long as you don’t pass them off as your own and remove this readme file. A credit statement and a link back to
http://led24.de/iconset/ or http://led24.de/ would be appreciated.
diff --git a/doc/images/dolibarr_logo.jpg b/doc/images/dolibarr_logo.jpg
index 6025ca9d201..69de0129523 100644
Binary files a/doc/images/dolibarr_logo.jpg and b/doc/images/dolibarr_logo.jpg differ
diff --git a/doc/images/dolibarr_logo.png b/doc/images/dolibarr_logo.png
old mode 100644
new mode 100755
index f2614471f7e..8edd0660e60
Binary files a/doc/images/dolibarr_logo.png and b/doc/images/dolibarr_logo.png differ
diff --git a/doc/images/dolibarr_screenshot11_1280x800.png b/doc/images/dolibarr_screenshot11_1280x800.png
new file mode 100644
index 00000000000..1f19a884a37
Binary files /dev/null and b/doc/images/dolibarr_screenshot11_1280x800.png differ
diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php
index 60812cc61f4..905fd8b97ef 100644
--- a/htdocs/accountancy/admin/account.php
+++ b/htdocs/accountancy/admin/account.php
@@ -1,6 +1,6 @@
- * Copyright (C) 2013-2016 Alexandre Spangaro
+ * Copyright (C) 2013-2017 Alexandre Spangaro
* Copyright (C) 2016 Laurent Destailleur
*
* This program is free software; you can redistribute it and/or modify
@@ -27,7 +27,6 @@ require '../../main.inc.php';
require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php';
require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php';
require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php';
-require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php';
// Langs
$langs->load("compta");
@@ -37,10 +36,11 @@ $langs->load("accountancy");
$langs->load("salaries");
$mesg = '';
-$action = GETPOST('action');
+$action = GETPOST('action','aZ09');
$cancel = GETPOST('cancel');
$id = GETPOST('id', 'int');
$rowid = GETPOST('rowid', 'int');
+
$search_account = GETPOST("search_account");
$search_label = GETPOST("search_label");
$search_accountparent = GETPOST("search_accountparent");
@@ -52,10 +52,9 @@ if ($user->societe_id > 0) accessforbidden();
if (! $user->rights->accounting->chartofaccount) accessforbidden();
// Load variable for pagination
-$limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
+$limit = GETPOST('limit','int')?GETPOST('limit','int'):$conf->liste_limit;
$sortfield = GETPOST("sortfield", 'alpha');
$sortorder = GETPOST("sortorder", 'sortorder');
-$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
$page = GETPOST("page", 'int');
if ($page == - 1) {
$page = 0;
@@ -63,13 +62,23 @@ if ($page == - 1) {
$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
-if (! $sortfield)
- $sortfield = "aa.account_number";
-if (! $sortorder)
- $sortorder = "ASC";
+if (! $sortfield) $sortfield = "aa.account_number";
+if (! $sortorder) $sortorder = "ASC";
+
+$arrayfields=array(
+ 'aa.account_number'=>array('label'=>$langs->trans("AccountNumber"), 'checked'=>1),
+ 'aa.label'=>array('label'=>$langs->trans("Label"), 'checked'=>1),
+ 'aa.account_parent'=>array('label'=>$langs->trans("Accountparent"), 'checked'=>0),
+ 'aa.pcg_type'=>array('label'=>$langs->trans("Pcgtype"), 'checked'=>0),
+ 'aa.pcg_subtype'=>array('label'=>$langs->trans("Pcgsubtype"), 'checked'=>0),
+ 'aa.active'=>array('label'=>$langs->trans("Activated"), 'checked'=>1)
+);
$accounting = new AccountingAccount($db);
+// Initialize technical object to manage context to save list fields
+$contextpage=GETPOST('contextpage','aZ')?GETPOST('contextpage','aZ'):'accountingaccountlist';
+
/*
* Actions
@@ -88,13 +97,14 @@ if (empty($reshook))
include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
- if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPOST("button_removefilter")) // All test are required to be compatible with all browsers
+ if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x','alpha') ||GETPOST('button_removefilter','alpha')) // All test are required to be compatible with all browsers
{
$search_account = "";
$search_label = "";
$search_accountparent = "";
$search_pcgtype = "";
$search_pcgsubtype = "";
+ $search_array_options=array();
}
if (GETPOST('change_chart'))
@@ -136,6 +146,8 @@ if (empty($reshook))
* View
*/
+$form=new Form($db);
+
llxHeader('', $langs->trans("ListAccounts"));
if ($action == 'delete') {
@@ -154,21 +166,11 @@ if ($db->type == 'pgsql') $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_accou
else $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as a2 ON a2.rowid = CAST(aa.account_parent AS UNSIGNED)";
$sql .= " WHERE asy.rowid = " . $pcgver;
-if (strlen(trim($search_account))) {
- $sql .= natural_search("aa.account_number", $search_account);
-}
-if (strlen(trim($search_label))) {
- $sql .= natural_search("aa.label", $search_label);
-}
-if (strlen(trim($search_accountparent))) {
- $sql .= natural_search("aa.account_parent", $search_accountparent);
-}
-if (strlen(trim($search_pcgtype))) {
- $sql .= natural_search("aa.pcg_type", $search_pcgtype);
-}
-if (strlen(trim($search_pcgsubtype))) {
- $sql .= natural_search("aa.pcg_subtype", $search_pcgsubtype);
-}
+if (strlen(trim($search_account))) $sql .= natural_search("aa.account_number", $search_account);
+if (strlen(trim($search_label))) $sql .= natural_search("aa.label", $search_label);
+if (strlen(trim($search_accountparent))) $sql .= natural_search("aa.account_parent", $search_accountparent);
+if (strlen(trim($search_pcgtype))) $sql .= natural_search("aa.pcg_type", $search_pcgtype);
+if (strlen(trim($search_pcgsubtype))) $sql .= natural_search("aa.pcg_subtype", $search_pcgsubtype);
$sql .= $db->order($sortfield, $sortorder);
// Count total nb of records
@@ -184,39 +186,46 @@ $sql .= $db->plimit($limit + 1, $offset);
dol_syslog('accountancy/admin/account.php:: $sql=' . $sql);
$resql = $db->query($sql);
-if ($resql) {
-
+if ($resql)
+{
$num = $db->num_rows($resql);
-
+
$params='';
- if ($search_account != "") $params.= '&search_account='.urlencode($search_account);
- if ($search_label != "") $params.= '&search_label='.urlencode($search_label);
- if ($search_accountparent != "") $params.= '&search_accountparent='.urlencode($search_accountparent);
- if ($search_pcgtype != "") $params.= '&search_pcgtype='.urlencode($search_pcgtype);
- if ($search_pcgsubtype != "") $params.= '&search_pcgsubtype='.urlencode($search_pcgsubtype);
+ if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
+ if ($search_account) $params.= '&search_account='.urlencode($search_account);
+ if ($search_label) $params.= '&search_label='.urlencode($search_label);
+ if ($search_accountparent) $params.= '&search_accountparent='.urlencode($search_accountparent);
+ if ($search_pcgtype) $params.= '&search_pcgtype='.urlencode($search_pcgtype);
+ if ($search_pcgsubtype) $params.= '&search_pcgsubtype='.urlencode($search_pcgsubtype);
if ($optioncss != '') $param.='&optioncss='.$optioncss;
-
- print '