Merge branch 'develop' of github.com:Dolibarr/dolibarr into New_Supplier_Packaging
10
.github/ISSUE_TEMPLATE/custom.md
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
name: Custom issue template
|
||||||
|
about: Describe this issue template's purpose here.
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
89
.travis.yml
@ -2,8 +2,8 @@
|
|||||||
# from Dolibarr GitHub repository.
|
# from Dolibarr GitHub repository.
|
||||||
# For syntax, see http://about.travis-ci.org/docs/user/languages/php/
|
# For syntax, see http://about.travis-ci.org/docs/user/languages/php/
|
||||||
|
|
||||||
# We use dist: trusty to have php 5.4+ available
|
# We use dist: xenial to have php 5.6+ available
|
||||||
dist: trusty
|
dist: xenial
|
||||||
sudo: required
|
sudo: required
|
||||||
|
|
||||||
language: php
|
language: php
|
||||||
@ -11,14 +11,16 @@ language: php
|
|||||||
# Start on every boot
|
# Start on every boot
|
||||||
services:
|
services:
|
||||||
- memcached
|
- memcached
|
||||||
|
- mysql
|
||||||
|
- postgresql
|
||||||
|
|
||||||
addons:
|
addons:
|
||||||
mariadb: '10.0'
|
# Force postgresql to 9.4 (the oldest availablable on xenial)
|
||||||
postgresql: '9.3'
|
postgresql: '9.4'
|
||||||
apt:
|
apt:
|
||||||
sources:
|
sources:
|
||||||
# To use the last version of pgloader, we add repo of postgresql
|
# To use the last version of pgloader, we add repo of postgresql with a name available in http://apt.postgresql.org/pub/repos/apt/
|
||||||
- pgdg-trusty
|
- pgdg-xenial
|
||||||
packages:
|
packages:
|
||||||
# We need a webserver to test the webservices
|
# We need a webserver to test the webservices
|
||||||
# Let's install Apache with.
|
# Let's install Apache with.
|
||||||
@ -29,12 +31,12 @@ addons:
|
|||||||
- pgloader
|
- pgloader
|
||||||
|
|
||||||
php:
|
php:
|
||||||
- '5.5'
|
|
||||||
- '5.6'
|
- '5.6'
|
||||||
- '7.0'
|
- '7.0'
|
||||||
- '7.1'
|
- '7.1'
|
||||||
- '7.2'
|
- '7.2'
|
||||||
- '7.3'
|
- '7.3'
|
||||||
|
- '7.4'
|
||||||
- nightly
|
- nightly
|
||||||
|
|
||||||
env:
|
env:
|
||||||
@ -43,11 +45,9 @@ env:
|
|||||||
- DEBUG=false
|
- DEBUG=false
|
||||||
matrix:
|
matrix:
|
||||||
# MariaDB overrides MySQL installation so it's not possible to test both yet
|
# MariaDB overrides MySQL installation so it's not possible to test both yet
|
||||||
#- DB=mysql
|
#- DB=mariadb
|
||||||
- DB=mariadb
|
- DB=mysql
|
||||||
- DB=postgresql
|
- DB=postgresql
|
||||||
# TODO
|
|
||||||
#- DB=sqlite
|
|
||||||
# See https://docs.travis-ci.com/user/languages/php/#Apache-%2B-PHP
|
# See https://docs.travis-ci.com/user/languages/php/#Apache-%2B-PHP
|
||||||
#- WS=apache
|
#- WS=apache
|
||||||
# See https://github.com/DracoBlue/travis-ci-nginx-php-fpm-test
|
# See https://github.com/DracoBlue/travis-ci-nginx-php-fpm-test
|
||||||
@ -59,22 +59,22 @@ matrix:
|
|||||||
- php: nightly
|
- php: nightly
|
||||||
# We exclude some combinations not usefull to save Travis CPU
|
# We exclude some combinations not usefull to save Travis CPU
|
||||||
exclude:
|
exclude:
|
||||||
- php: '5.6'
|
|
||||||
env: DB=mariadb
|
|
||||||
- php: '7.0'
|
- php: '7.0'
|
||||||
env: DB=mariadb
|
env: DB=mysql
|
||||||
- php: '7.1'
|
- php: '7.1'
|
||||||
env: DB=mariadb
|
env: DB=mysql
|
||||||
- php: '7.2'
|
- php: '7.2'
|
||||||
env: DB=mariadb
|
env: DB=mysql
|
||||||
- php: '5.6'
|
- php: '7.3'
|
||||||
env: DB=postgresql
|
env: DB=mysql
|
||||||
- php: '7.0'
|
- php: '7.0'
|
||||||
env: DB=postgresql
|
env: DB=postgresql
|
||||||
- php: '7.1'
|
- php: '7.1'
|
||||||
env: DB=postgresql
|
env: DB=postgresql
|
||||||
- php: '7.2'
|
- php: '7.2'
|
||||||
env: DB=postgresql
|
env: DB=postgresql
|
||||||
|
- php: '7.3'
|
||||||
|
env: DB=postgresql
|
||||||
- php: nightly
|
- php: nightly
|
||||||
env: DB=postgresql
|
env: DB=postgresql
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ install:
|
|||||||
squizlabs/php_codesniffer ^3
|
squizlabs/php_codesniffer ^3
|
||||||
fi
|
fi
|
||||||
if [ "$TRAVIS_PHP_VERSION" = '5.6' ] || [ "$TRAVIS_PHP_VERSION" = '7.0' ] || [ "$TRAVIS_PHP_VERSION" = '7.1' ] \
|
if [ "$TRAVIS_PHP_VERSION" = '5.6' ] || [ "$TRAVIS_PHP_VERSION" = '7.0' ] || [ "$TRAVIS_PHP_VERSION" = '7.1' ] \
|
||||||
[ "$TRAVIS_PHP_VERSION" = '7.2' ] || [ "$TRAVIS_PHP_VERSION" = '7.3' ]; then
|
[ "$TRAVIS_PHP_VERSION" = '7.2' ] || [ "$TRAVIS_PHP_VERSION" = '7.3' ] || [ "$TRAVIS_PHP_VERSION" = '7.4' ]; then
|
||||||
composer -n require phpunit/phpunit ^5 \
|
composer -n require phpunit/phpunit ^5 \
|
||||||
jakub-onderka/php-parallel-lint ^0 \
|
jakub-onderka/php-parallel-lint ^0 \
|
||||||
jakub-onderka/php-console-highlighter ^0 \
|
jakub-onderka/php-console-highlighter ^0 \
|
||||||
@ -183,32 +183,31 @@ before_script:
|
|||||||
# Check Apache version
|
# Check Apache version
|
||||||
echo "Apache version"
|
echo "Apache version"
|
||||||
apache2 -v | head -
|
apache2 -v | head -
|
||||||
# Check MariaDb
|
# Check Database
|
||||||
echo "MariaDb version"
|
echo "Database version"
|
||||||
mysql --version | head -
|
mysql --version | head -
|
||||||
mysql -e "SELECT VERSION();" | head -
|
mysql -e "SELECT VERSION();" | head -
|
||||||
|
psql --version
|
||||||
echo
|
echo
|
||||||
|
|
||||||
- |
|
- |
|
||||||
echo "Setting up database"
|
echo "Setting up database"
|
||||||
if [ "$DB" = 'mysql' ] || [ "$DB" = 'mariadb' ] || [ "$DB" = 'postgresql' ]; then
|
if [ "$DB" = 'mysql' ] || [ "$DB" = 'mariadb' ] || [ "$DB" = 'postgresql' ]; then
|
||||||
echo "MySQL"
|
echo "MySQL"
|
||||||
mysql -e 'DROP DATABASE IF EXISTS travis;'
|
mysql -u root -e 'DROP DATABASE IF EXISTS travis;'
|
||||||
mysql -e 'CREATE DATABASE IF NOT EXISTS travis;'
|
mysql -u root -e 'CREATE DATABASE IF NOT EXISTS travis;'
|
||||||
mysql -e 'GRANT ALL PRIVILEGES ON travis.* TO travis@127.0.0.1;'
|
mysql -u root -e 'GRANT ALL PRIVILEGES ON travis.* TO travis@127.0.0.1;'
|
||||||
mysql -e 'FLUSH PRIVILEGES;'
|
mysql -u root -e 'FLUSH PRIVILEGES;'
|
||||||
mysql -D travis < dev/initdemo/mysqldump_dolibarr_3.5.0.sql
|
mysql -u root -D travis < dev/initdemo/mysqldump_dolibarr_3.5.0.sql
|
||||||
fi
|
fi
|
||||||
if [ "$DB" = 'postgresql' ]; then
|
if [ "$DB" = 'postgresql' ]; then
|
||||||
#pgsql travis < dev/initdemo/mysqldump_dolibarr_3.5.0.sql
|
#psql -c 'create database travis;' -U postgres
|
||||||
#pgloader mysql://root:pass@127.0.0.1/dolibarr_9 postgresql://dolibarrowner:dolibarrownerpass@127.0.0.1/dolibarr_dev
|
#psql travis < dev/initdemo/mysqldump_dolibarr_3.5.0.sql
|
||||||
echo pgloader mysql://root@127.0.0.1/travis postgresql:///travis
|
#pgloader mysql://root:pass@127.0.0.1/dolibarr_src postgresql://dolibarrowner:dolibarrownerpass@127.0.0.1/dolibarr_dest
|
||||||
pgloader mysql://root@127.0.0.1/travis postgresql:///travis
|
echo pgloader mysql://root@127.0.0.1/travis postgresql://postgres@/travis
|
||||||
echo 'ALTER SEQUENCE llx_accountingaccount_rowid_seq RENAME TO llx_accounting_account_rowid_seq' | psql travis
|
pgloader mysql://root@127.0.0.1/travis postgresql://postgres@/travis
|
||||||
echo 'ALTER SEQUENCE llx_accounting_account_rowid_seq RESTART WITH 1000001;' | psql travis
|
echo 'ALTER SEQUENCE llx_accountingaccount_rowid_seq RENAME TO llx_accounting_account_rowid_seq' | psql -U postgres travis
|
||||||
#echo 'select * from INFORMATION_SCHEMA.COLUMNS where table_name = 'llx_accountingaccount' | psql travis
|
echo 'ALTER SEQUENCE llx_accounting_account_rowid_seq RESTART WITH 1000001;' | psql -U postgres travis
|
||||||
#echo 'select * from information_schema.table_constraints;' | psql travis
|
|
||||||
#echo 'ALTER TABLE "llx_accounting_account" DROP CONSTRAINT "idx_16390_primary"' | psql travis
|
|
||||||
fi
|
fi
|
||||||
echo
|
echo
|
||||||
|
|
||||||
@ -248,7 +247,7 @@ before_script:
|
|||||||
# enable php-fpm
|
# enable php-fpm
|
||||||
- sudo cp ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.conf.default ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.conf
|
- sudo cp ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.conf.default ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.conf
|
||||||
- |
|
- |
|
||||||
if [ "$TRAVIS_PHP_VERSION" = '7.0' ] || [ "$TRAVIS_PHP_VERSION" = '7.1' ] || [ "$TRAVIS_PHP_VERSION" = '7.2' ] || [ "$TRAVIS_PHP_VERSION" = '7.3' ] || [ "$TRAVIS_PHP_VERSION" = 'nightly' ]; then
|
if [ "$TRAVIS_PHP_VERSION" = '7.0' ] || [ "$TRAVIS_PHP_VERSION" = '7.1' ] || [ "$TRAVIS_PHP_VERSION" = '7.2' ] || [ "$TRAVIS_PHP_VERSION" = '7.3' ] || [ "$TRAVIS_PHP_VERSION" = '7.4' ] || [ "$TRAVIS_PHP_VERSION" = 'nightly' ]; then
|
||||||
# Copy the included pool
|
# Copy the included pool
|
||||||
sudo cp ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.d/www.conf.default ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.d/www.conf
|
sudo cp ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.d/www.conf.default ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.d/www.conf
|
||||||
fi
|
fi
|
||||||
@ -257,10 +256,7 @@ before_script:
|
|||||||
- sudo sed -i -e "s,www-data,travis,g" /etc/apache2/envvars
|
- sudo sed -i -e "s,www-data,travis,g" /etc/apache2/envvars
|
||||||
- sudo chown -R travis:travis /var/lib/apache2/fastcgi
|
- sudo chown -R travis:travis /var/lib/apache2/fastcgi
|
||||||
- ~/.phpenv/versions/$(phpenv version-name)/sbin/php-fpm
|
- ~/.phpenv/versions/$(phpenv version-name)/sbin/php-fpm
|
||||||
# configure apache virtual hosts for precise
|
# configure apache virtual hosts
|
||||||
#- sudo sed -e "s?%TRAVIS_BUILD_DIR%?$(pwd)?g" --in-place /etc/apache2/sites-available/default
|
|
||||||
#- sudo cat /etc/apache2/sites-available/default
|
|
||||||
# configure apache virtual hosts for trusty
|
|
||||||
- sudo cp -f build/travis-ci/apache.conf /etc/apache2/sites-available/000-default.conf
|
- sudo cp -f build/travis-ci/apache.conf /etc/apache2/sites-available/000-default.conf
|
||||||
- sudo sed -e "s?%TRAVIS_BUILD_DIR%?$(pwd)?g" --in-place /etc/apache2/sites-available/000-default.conf
|
- sudo sed -e "s?%TRAVIS_BUILD_DIR%?$(pwd)?g" --in-place /etc/apache2/sites-available/000-default.conf
|
||||||
- sudo cat /etc/apache2/sites-available/000-default.conf
|
- sudo cat /etc/apache2/sites-available/000-default.conf
|
||||||
@ -285,7 +281,7 @@ script:
|
|||||||
# Ensure we catch errors
|
# Ensure we catch errors
|
||||||
set -e
|
set -e
|
||||||
#parallel-lint --exclude htdocs/includes --blame .
|
#parallel-lint --exclude htdocs/includes --blame .
|
||||||
parallel-lint --exclude dev/namespacemig --exclude htdocs/includes/sabre --exclude htdocs/includes/phpoffice/phpexcel/Classes/PHPExcel/Shared --exclude htdocs/includes/phpoffice/PhpSpreadsheet --exclude htdocs/includes/sebastian --exclude htdocs/includes/squizlabs/php_codesniffer/tests --exclude htdocs/includes/jakub-onderka/php-parallel-lint/tests --exclude htdocs/includes/mike42/escpos-php/example --exclude htdocs/includes/phpunit/php-token-stream/tests --exclude htdocs/includes/composer/autoload_static.php --blame .
|
parallel-lint --exclude dev/namespacemig --exclude dev/initdata/dbf/includes --exclude htdocs/includes/sabre --exclude htdocs/includes/phpoffice/phpexcel/Classes/PHPExcel/Shared --exclude htdocs/includes/phpoffice/PhpSpreadsheet --exclude htdocs/includes/sebastian --exclude htdocs/includes/squizlabs/php_codesniffer --exclude htdocs/includes/jakub-onderka --exclude htdocs/includes/mike42/escpos-php/example --exclude htdocs/includes/phpunit/ --exclude htdocs/includes/composer/autoload_static.php --blame .
|
||||||
set +e
|
set +e
|
||||||
echo
|
echo
|
||||||
|
|
||||||
@ -401,9 +397,12 @@ script:
|
|||||||
php upgrade.php 9.0.0 10.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade9001000.log
|
php upgrade.php 9.0.0 10.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade9001000.log
|
||||||
php upgrade2.php 9.0.0 10.0.0 > $TRAVIS_BUILD_DIR/upgrade9001000-2.log
|
php upgrade2.php 9.0.0 10.0.0 > $TRAVIS_BUILD_DIR/upgrade9001000-2.log
|
||||||
php step5.php 9.0.0 10.0.0 > $TRAVIS_BUILD_DIR/upgrade9001000-3.log
|
php step5.php 9.0.0 10.0.0 > $TRAVIS_BUILD_DIR/upgrade9001000-3.log
|
||||||
php upgrade.php 10.0.0 11.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade9001000.log
|
php upgrade.php 10.0.0 11.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade10001100.log
|
||||||
php upgrade2.php 10.0.0 11.0.0 > $TRAVIS_BUILD_DIR/upgrade9001000-2.log
|
php upgrade2.php 10.0.0 11.0.0 > $TRAVIS_BUILD_DIR/upgrade10001100-2.log
|
||||||
php step5.php 10.0.0 11.0.0 > $TRAVIS_BUILD_DIR/upgrade9001000-3.log
|
php step5.php 10.0.0 11.0.0 > $TRAVIS_BUILD_DIR/upgrade10001100-3.log
|
||||||
|
php upgrade.php 11.0.0 12.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade11001200.log
|
||||||
|
php upgrade2.php 11.0.0 12.0.0 > $TRAVIS_BUILD_DIR/upgrade11001200-2.log
|
||||||
|
php step5.php 11.0.0 12.0.0 > $TRAVIS_BUILD_DIR/upgrade11001200-3.log
|
||||||
# Enable modules not enabled into original dump
|
# Enable modules not enabled into original dump
|
||||||
php upgrade2.php 0.0.0 0.0.0 MAIN_MODULE_API,MAIN_MODULE_SUPPLIERPROPOSAL,MAIN_MODULE_WEBSITE,MAIN_MODULE_TICKETSUP,MAIN_MODULE_ACCOUNTING > $TRAVIS_BUILD_DIR/enablemodule.log
|
php upgrade2.php 0.0.0 0.0.0 MAIN_MODULE_API,MAIN_MODULE_SUPPLIERPROPOSAL,MAIN_MODULE_WEBSITE,MAIN_MODULE_TICKETSUP,MAIN_MODULE_ACCOUNTING > $TRAVIS_BUILD_DIR/enablemodule.log
|
||||||
echo $?
|
echo $?
|
||||||
@ -450,7 +449,7 @@ after_failure:
|
|||||||
# Dolibarr log file
|
# Dolibarr log file
|
||||||
echo "Debugging informations for file dolibarr.log (latest 50 lines)"
|
echo "Debugging informations for file dolibarr.log (latest 50 lines)"
|
||||||
tail -n 50 $TRAVIS_BUILD_DIR/documents/dolibarr.log
|
tail -n 50 $TRAVIS_BUILD_DIR/documents/dolibarr.log
|
||||||
# MariaDB log file
|
# Database log file
|
||||||
echo "Debugging informations for file mysql error.log"
|
echo "Debugging informations for file mysql error.log"
|
||||||
sudo tail -n 50 /var/log/mysql/error.log
|
sudo tail -n 50 /var/log/mysql/error.log
|
||||||
# TODO: PostgreSQL log file
|
# TODO: PostgreSQL log file
|
||||||
|
|||||||
274
ChangeLog
@ -3,13 +3,210 @@ English Dolibarr ChangeLog
|
|||||||
--------------------------------------------------------------
|
--------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
***** ChangeLog for 11.0.0 compared to 10.0.0 *****
|
***** ChangeLog for 12.0.0 compared to 11.0.0 *****
|
||||||
For Users:
|
For Users:
|
||||||
|
|
||||||
|
|
||||||
For Developers:
|
For Developers or integrators:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
WARNING:
|
||||||
|
|
||||||
|
Following changes may create regressions for some external modules, but were necessary to make Dolibarr better:
|
||||||
|
* PHP 5.5 is no more supported. Minimum PHP is now 5.6+.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
***** ChangeLog for 11.0.0 compared to 10.0.0 *****
|
||||||
|
For Users:
|
||||||
|
|
||||||
|
NEW: Module BOM is now stable.
|
||||||
|
NEW: Module MO (Manufacturing Order) is available with experimental status.
|
||||||
|
NEW: Can set the Address/Contact by default on third parties.
|
||||||
|
NEW: Add a dictionary to edit list of Social networks.
|
||||||
|
NEW: A nicer dashboard for open elements on Home page.
|
||||||
|
NEW: Add task widget and add task progress bar
|
||||||
|
NEW: Support of deployment of metapackages
|
||||||
|
NEW: Menu "Export accounting document" to generate a zip with all documents requested by a bookkeeper is now stable.
|
||||||
|
NEW: Add button "Save and Stay" in website editor of pages.
|
||||||
|
NEW: Accountancy - Can add specific widget in this accountancy area.
|
||||||
|
NEW: Accountancy - Add export model LDCompta V9 & higher
|
||||||
|
NEW: Accountancy - Add permission on export, delete operations in ledger
|
||||||
|
NEW: Can defined alternative profiles (email and signatures) for users.
|
||||||
|
NEW: add ability to edit price without tax before adding a line of a predefined product.
|
||||||
|
NEW: Add a tab to setup "Opening hours" of company (information only).
|
||||||
|
NEW: Add attendee to ical export + cleanup.
|
||||||
|
NEW: Add bank data of users into the expense report exports.
|
||||||
|
NEW: add clone customers prices in clone product or service.
|
||||||
|
NEW: Add column of module source and POS terminal in the invoice list.
|
||||||
|
NEW: Add column last modification date into the table of targets for emailing.
|
||||||
|
NEW: Add column VAT rate in product list
|
||||||
|
NEW: add constant DISPATCH_FORCE_QTY_INPUT
|
||||||
|
NEW: Add constant MAIN_DISABLE_GLOBAL_WORKBOARD to disable workboard in home page
|
||||||
|
NEW: add country code in import product model
|
||||||
|
NEW: Add 'Direct Cash Payment' button in TakePOS
|
||||||
|
NEW: Add odt support to supplier orders
|
||||||
|
NEW: Add feature to search a string into website containers
|
||||||
|
NEW: Add GET and POST /supplierinvoices/payments REST API endpoints.
|
||||||
|
NEW: Show progress bar for declared progression of tasks.
|
||||||
|
NEW: Add last change date in page "Other setup". Can sort page on name/date.
|
||||||
|
NEW: Add link to export targets of an emailings into a CSV file.
|
||||||
|
NEW: Add link to the public interface on the ticket card.
|
||||||
|
NEW: Add location into event tooltip. Use full day for fullday events
|
||||||
|
NEW: add MAIN_LANGUAGES_ALLOWED constant to limit languages displayed.
|
||||||
|
NEW: add MAIN_SHOW_COMPANY_NAME_IN_BANNER_ADDRESS constant.
|
||||||
|
NEW: add mass actions in shipment list.
|
||||||
|
NEW: add minimum stock filter in load warehoues for product form.
|
||||||
|
NEW: add name_alias in fields used for quick search.
|
||||||
|
NEW: add new rule fetchidfromcodeandlabel for categories import.
|
||||||
|
NEW: add office phone for salespresentatives
|
||||||
|
NEW: add office phone & job on user tooltips
|
||||||
|
NEW: Add option MAIN_PDF_FORCE_FONT_SIZE
|
||||||
|
NEW: Add option MEMBER_CAN_CONVERT_CUSTOMERS_TO_MEMBERS
|
||||||
|
NEW: Add option WORKFLOW_CAN_CREATE_PURCHASE_ORDER_FROM_PROPOSAL
|
||||||
|
NEW: Add pagination on list of object of a category
|
||||||
|
NEW: add parent category id or label in import category module
|
||||||
|
NEW: add parent id or ref column in warehouse import
|
||||||
|
NEW: Add search into template
|
||||||
|
NEW: Add shipment widget
|
||||||
|
NEW: Add statistics on product into contracts
|
||||||
|
NEW: Add status of warehouse in the tooltip of a warehouse.
|
||||||
|
NEW: add supplier's product list
|
||||||
|
NEW: add units fields in buying price tab of product card
|
||||||
|
NEW: Add units in select products lines
|
||||||
|
NEW: Add upload document on account statement
|
||||||
|
NEW: Add widgets for BOMs and MOs.
|
||||||
|
NEW: Amount invoiced column in proposal list
|
||||||
|
NEW: Ask the new label and new dates in confirm popup when cloning tax
|
||||||
|
NEW: auto set closing date and user on invoice
|
||||||
|
NEW: Avoid wrap between picto and text on getNomUrl
|
||||||
|
NEW: Balance Stripe connect account for supplier
|
||||||
|
NEW: Bank Add an option for colorize background color of debit or credit movement
|
||||||
|
NEW: Beautify the select box of warehouses
|
||||||
|
NEW: Add birthday widget for members
|
||||||
|
NEW: Widgets uses fiscal year.
|
||||||
|
NEW: Can change supplier when cloning a Purchase Order.
|
||||||
|
NEW: can choose lines to keep while creating order from origin
|
||||||
|
NEW: Can crop/resize image attached on a bank record
|
||||||
|
NEW: Can edit date or RUM mandate.
|
||||||
|
NEW: Can edit link to the translation page in website module
|
||||||
|
NEW: Can edit the price of predefined product during adding in documents
|
||||||
|
NEW: Can enter price tax incl on vendor proposal and purchase orders
|
||||||
|
NEW: Can filter on description on bank account transaction lists.
|
||||||
|
NEW: Can filter on label on invoice in accounting vendor binding pages
|
||||||
|
NEW: Can load multilang translation in same step than fetch_lines
|
||||||
|
NEW: Can restrict access using DAV module to some host IPs only
|
||||||
|
NEW: Can restrict API usage to some IP only
|
||||||
|
NEW: Can select website templates from available default templates with a preview.
|
||||||
|
NEW: Can set a squarred icon on your company setup
|
||||||
|
NEW: can specify hour start end for selectDate and step for minutes
|
||||||
|
NEW: Categories/Tags are also available on warehouses
|
||||||
|
NEW: Check if a resource is in use in an event
|
||||||
|
NEW: Compute column value from others columns in import module
|
||||||
|
NEW: Copy linked categories on product clone process.
|
||||||
|
NEW: Default mode for Stripe is STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION
|
||||||
|
NEW: Digitaria model for numbering accountancy thirdparty
|
||||||
|
NEW: Display membership in takepos if member linked to the thirdparty
|
||||||
|
NEW: Display supplier in objectline if defined
|
||||||
|
NEW: Add default duration of subscriptions on members type
|
||||||
|
NEW: Email template for Takepos (to send invoice)
|
||||||
|
NEW: Expense request and holiday validator fields
|
||||||
|
NEW: Export ledger table in Charlemagne format
|
||||||
|
NEW: Extend option ORDER_ADD_ORDERS_WITH_PARENT_PROD_IF_INCDEC for all virtual product stats (renamed into PRODUCT_STATS_WITH_PARENT_PROD_IF_INCDEC)
|
||||||
|
NEW: Value "None" to unbind an invoice line and its accounting account is more visible
|
||||||
|
NEW: FCKeditor setup for tickets
|
||||||
|
NEW: The default theme of TakePOS work better on smartphones.
|
||||||
|
NEW: GeoIP v2 support is natively provided -> So IPv6 is supported
|
||||||
|
NEW: List by closing date on order list and proposal list
|
||||||
|
NEW: Look and feel v11: Some setup pages are by default direclty in edit mode.
|
||||||
|
NEW: Management of retained warranty on situation invoices
|
||||||
|
NEW: Mass email action on invoice list use billing contact if exists
|
||||||
|
NEW: more living colors for charts and option for "color bind" people
|
||||||
|
NEW: Supports multiple payments in a TakePOS sale
|
||||||
|
NEW: multiselect with checkbox in categories/tags search for product list
|
||||||
|
NEW: Option to allow to create members from third-party
|
||||||
|
NEW: Platform compliance with Stripe Connect
|
||||||
|
NEW: print / send email form in TakePOS
|
||||||
|
NEW: Public holidays are now in a dictionary table (no more hard coded per country)
|
||||||
|
NEW: Better performance by reducing the $companystatic calls on some pages.
|
||||||
|
NEW: Replace the "info" tab on contract with the more complete "agenda" tab.
|
||||||
|
NEW: Save user of last modification in donation record.
|
||||||
|
NEW: Show html combo list instead input text for extrafields typed as list.
|
||||||
|
NEW: Show POS application and the terminal used on invoice card.
|
||||||
|
NEW: Add categories/tags for stocks.
|
||||||
|
NEW: Support Net Measure in product's card.php
|
||||||
|
NEW: Extrafields separator can be collapsed or not
|
||||||
|
NEW: Extrafields support on Leave requests.
|
||||||
|
NEW: Extrafields support on Salaries.
|
||||||
|
NEW: Extrafields support in Product supplier prices.
|
||||||
|
NEW: Add extrafields for warehouses
|
||||||
|
NEW: Add extrafields in export of expense report (and holiday)
|
||||||
|
NEW: The integrity checker now show also the expected size of files.
|
||||||
|
NEW: The order method in purchase order is now mandatory when recording an order.
|
||||||
|
NEW: update / delete stripe account for supplier
|
||||||
|
NEW: Use the gender of member for picto in member lists.
|
||||||
|
NEW: Use the squarre logo as favicon of pages
|
||||||
|
NEW: VAT list - Add date start & date end in filters
|
||||||
|
NEW: widget box for supplier orders awaiting reception
|
||||||
|
NEW: Update translations
|
||||||
|
NEW: #4301
|
||||||
|
|
||||||
|
For Developers or integrators:
|
||||||
|
|
||||||
|
NEW: Compatible with PHP 7.4
|
||||||
|
NEW: Code for extrafields uses the new array $extrafields->attributes
|
||||||
|
NEW: Can set a filter on object linked in modulebuilder.
|
||||||
|
NEW: Can defined a position of numbering submodules for thirdparties
|
||||||
|
NEW: Add option multiselect for developers on the selector of language.
|
||||||
|
NEW: Add a manifest.json.php file for web app.
|
||||||
|
NEW: Support of deployement of metapackages
|
||||||
|
NEW: Removed deprecated code that create linked object from ->origin
|
||||||
|
NEW: experimental zapier for dolibarr
|
||||||
|
NEW: Accountancy - Add hook bookkeepinglist on general ledger
|
||||||
|
NEW: Can update product type with the update method.
|
||||||
|
NEW: add API shipment mode dictionnary
|
||||||
|
NEW: Add API to get Country by code and iso
|
||||||
|
NEW: Add API to get objects by ref, ref_ext, ...
|
||||||
|
NEW: Add anonymous telemetry
|
||||||
|
NEW: Add a category to a contact in API
|
||||||
|
NEW: Add fk projet on stock movement
|
||||||
|
NEW: Add hidden option to set fields for the quick search on products.
|
||||||
|
NEW: add hook on commongeneratedocument
|
||||||
|
NEW: Add hook on fileupload.class.php to enable modules to override…
|
||||||
|
NEW: Add hooks on index pages
|
||||||
|
NEW: adding 'formObjectOptions' hooks loading at card.php of adherents module
|
||||||
|
NEW: Add method getStructuredData for website
|
||||||
|
NEW: Add payments GET and POST REST API endpoints for supplierinvoices.
|
||||||
|
NEW: Add POST /bankaccounts/transfer REST API endpoint.
|
||||||
|
NEW: add "printBucktrackInfo" hook, an external module can add info
|
||||||
|
NEW: Add trigger DIRECT_DEBIT_ORDER_CREATE on widthdraw is missing
|
||||||
|
NEW: API to post documents for "product" and Delete document
|
||||||
|
NEW: add new function "setEntity()" and better compatibility with Multicompany
|
||||||
|
NEW: Can add a button "Create" after combo of object with modulebuilder.
|
||||||
|
NEW: contacts type dictionnary in api_setup.class.php
|
||||||
|
NEW: Look and feel v11: Introduce CSS "trforbreak"
|
||||||
|
NEW: list of measuring units API
|
||||||
|
NEW: get social networks dictionary by API
|
||||||
|
NEW: Get thirdparty's salesrepresentatives by API
|
||||||
|
NEW: get user connected informations in REST API
|
||||||
|
NEW: mode for list thirdparty API (add easy filter for supplier only)
|
||||||
|
NEW: purchase_prices API
|
||||||
|
NEW: Provides more complete demo data
|
||||||
|
NEW: Module builder can generate CSS of JS file.
|
||||||
|
NEW: Use a dedicated css for the pencil to edit a field.
|
||||||
|
NEW: multilangs in fetch_lines
|
||||||
|
NEW: Add more complete info for triggers actioncom
|
||||||
|
NEW: add multicurrency rate at currency list API
|
||||||
|
NEW: Add 2 hidden options to set the default sorting (sort and order) on document page.
|
||||||
|
NEW: Add hidden option to update supplier buying price during receptions.
|
||||||
|
NEW: Add hidden option PROPOSAL_SHOW_INVOICED_AMOUNT (not reliable if one invoice is done on several order or several proposal)
|
||||||
|
NEW: Add hidden option SUPPLIER_ORDER_CAN_UPDATE_BUYINGPRICE_DURING_RECEIPT for add possibility to update supplier buying price in the reception on a supplier order
|
||||||
|
NEW: Add hidden option THIRDPARTY_PROPAGATE_EXTRAFIELDS_TO_ORDER to copy extrafields from third party to order.
|
||||||
|
NEW: Add hidden options to send by email even for object with draft status.
|
||||||
|
NEW: Update jquery library to 3.4.1
|
||||||
|
NEW: Upgrade ACE editor to v1.4.6
|
||||||
|
|
||||||
WARNING:
|
WARNING:
|
||||||
|
|
||||||
Following changes may create regressions for some external modules, but were necessary to make Dolibarr better:
|
Following changes may create regressions for some external modules, but were necessary to make Dolibarr better:
|
||||||
@ -29,6 +226,79 @@ Following changes may create regressions for some external modules, but were nec
|
|||||||
* All properties 'labelstatusshort' and 'labelstatut_short' were renamed into 'labelStatusShort'.
|
* All properties 'labelstatusshort' and 'labelstatut_short' were renamed into 'labelStatusShort'.
|
||||||
* All properties 'type_libelle' were renamed into 'type_label'.
|
* All properties 'type_libelle' were renamed into 'type_label'.
|
||||||
* Renamed property of thirdparty "statut_commercial" into "status_prospect_label"
|
* Renamed property of thirdparty "statut_commercial" into "status_prospect_label"
|
||||||
|
* The jquery plugin/dependency multiselect has been removed. It was not used by Dolibarr core.
|
||||||
|
|
||||||
|
|
||||||
|
***** ChangeLog for 10.0.6 compared to 10.0.5 *****
|
||||||
|
FIX Regression of 10.0.5 to create/edit proposals and orders.
|
||||||
|
FIX: #12760 #12763 #12755 #12765 #12751
|
||||||
|
FIX: add product qty in shipment already sent (fix for option STOCK_CALCULATE_ON_SHIPMENT_NEW)
|
||||||
|
FIX: an issue that shows all entities stock
|
||||||
|
FIX: class Facture undefined in displaying margin information
|
||||||
|
FIX: error 500 when getting margin info for objects other than invoices
|
||||||
|
FIX: Loan card - Wrong language key used
|
||||||
|
FIX: Missing language key for MAIN_MAXTABS_IN_CARD
|
||||||
|
FIX: product with empty stock were not visible
|
||||||
|
FIX: remove backward compatibility projectid and uses object id instead
|
||||||
|
FIX: Some issues on salary payment
|
||||||
|
FIX: Some problems on conciliation with others modules
|
||||||
|
FIX: typo on language key
|
||||||
|
FIX: url new for task time spent in project element tab
|
||||||
|
FIX: uses GETPOSTISSET instead of GETPOST for projectfield
|
||||||
|
FIX: var transkey not defined in input hidden
|
||||||
|
FIX: wrong var name and avoid warning
|
||||||
|
|
||||||
|
***** ChangeLog for 10.0.5 compared to 10.0.4 *****
|
||||||
|
FIX: 10.0: add URL param "restore_last_search_values=1" to all backlinks pointing to lists
|
||||||
|
FIX: 10.0: do not display single-letter values (indicating duration unit without value) in product list
|
||||||
|
FIX: #12473
|
||||||
|
FIX: #12481 : fix ticket creation from thirdparty, mission $socid var
|
||||||
|
FIX: #12482
|
||||||
|
FIX: #12644
|
||||||
|
FIX: #12665 Mass invoice validation with stock management
|
||||||
|
FIX: #12688
|
||||||
|
FIX: #12745
|
||||||
|
FIX: add and modify category translate form with posted values on errors
|
||||||
|
FIX: add URL param "restore_last_search_values=1" to all backlinks that point to a list
|
||||||
|
FIX: CommandeFournisseurLigne update function must not be able to return other value than 1 if success
|
||||||
|
FIX: contact card state address selected after filling address
|
||||||
|
FIX: dol_string_nohtmltag when there is html with windows EOL "<br>\r\n"
|
||||||
|
FIX: filter language is an array
|
||||||
|
FIX: first col at wrong position in Export 2007 (new)
|
||||||
|
FIX: getrights() request
|
||||||
|
FIX: Invoice Situation integration into Margin
|
||||||
|
FIX: missing nl2br conversion
|
||||||
|
FIX: not fee in payout list
|
||||||
|
FIX: product_fourn_price_id was assigned too late for logPrice() function
|
||||||
|
FIX: Reduce number of request for list of products
|
||||||
|
FIX: set due date in object in create invoice
|
||||||
|
FIX: units traductions for selectUnits() function
|
||||||
|
FIX: when we need to bill several orders, order lines unit is not on bill lines
|
||||||
|
NEW: 9.0: allow users to use the mysqldump '--quick' option
|
||||||
|
|
||||||
|
***** ChangeLog for 10.0.4 compared to 10.0.3 *****
|
||||||
|
FIX: The pdf templates were using the large logo making PDF too large (and edition of proposal, order, invoice VERY slow)
|
||||||
|
FIX: #12258
|
||||||
|
FIX: #12319 Restore feature ACCOUNTANCY_AUTOFILL_ACCOUNT_WITH_GENERIC.
|
||||||
|
FIX: #12356
|
||||||
|
FIX: #12372
|
||||||
|
FIX: #12385
|
||||||
|
FIX: Advisory ID: usd20190053
|
||||||
|
FIX: Advisory ID: usd20190067
|
||||||
|
FIX: Avoid fatal error when creating thumb from PDF
|
||||||
|
FIX: compatibility with Multicompany
|
||||||
|
FIX: display job of contact list
|
||||||
|
FIX: Extrafields missing in export of expense report
|
||||||
|
FIX: Hook getAccessForbiddenMessage was missing parameters
|
||||||
|
FIX: limit 20 prevent to see all products/services
|
||||||
|
FIX: Search on leave request ref
|
||||||
|
FIX: security check. A user can see holiday with link without permissions
|
||||||
|
FIX: Set unpaid of expense report
|
||||||
|
FIX: shipping extrafields line
|
||||||
|
FIX: the SELECT examine more than MAX_JOIN_SIZE rows #12305
|
||||||
|
FIX: triggers: directories read with opendir() never closed
|
||||||
|
FIX: we need to be able to recalculate tva only if invoice not in accountancy
|
||||||
|
FIX: wrong invoice id for fetchObjetctLinked
|
||||||
|
|
||||||
***** ChangeLog for 10.0.3 compared to 10.0.2 *****
|
***** ChangeLog for 10.0.3 compared to 10.0.2 *****
|
||||||
IMPORTANT : This version fixes a serious bug in saving the units of weight, size, surface and volume on product card.
|
IMPORTANT : This version fixes a serious bug in saving the units of weight, size, surface and volume on product card.
|
||||||
|
|||||||
60
README-FR.md
@ -1,18 +1,17 @@
|
|||||||
# DOLIBARR ERP & CRM
|
# DOLIBARR ERP & CRM
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
Dolibarr ERP & CRM est un logiciel moderne pour gérer votre activité (société, association, auto-entrepreneurs, artisans).
|
Dolibarr ERP & CRM est un logiciel moderne pour gérer votre activité (société, association, auto-entrepreneurs, artisans).
|
||||||
Il est simple d'utilisation et modulaire, vous permettant de n'activez que les fonctions dont vous avez besoin (contacts, fournisseurs, factures, commandes, stocks, agenda, ...).
|
Il est simple d'utilisation et modulaire, vous permettant de n'activez que les fonctions dont vous avez besoin (contacts, fournisseurs, factures, commandes, stocks, agenda, ...).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## LICENCE
|
## LICENCE
|
||||||
|
|
||||||
Dolibarr est distribué sous les termes de la licence GNU General Public License v3+ ou supérieure.
|
Dolibarr est distribué sous les termes de la licence GNU General Public License v3+ ou supérieure.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## INSTALLER DOLIBARR
|
## INSTALLER DOLIBARR
|
||||||
|
|
||||||
### Configuration simple
|
### Configuration simple
|
||||||
@ -23,7 +22,7 @@ Si vous avez peu de compétences techniques et que vous souhaitez installer Doli
|
|||||||
- DoliDeb pour Debian ou Ubuntu
|
- DoliDeb pour Debian ou Ubuntu
|
||||||
- DoliRpm pour Redhat, Fedora, OpenSuse, Mandriva ou Mageia
|
- DoliRpm pour Redhat, Fedora, OpenSuse, Mandriva ou Mageia
|
||||||
|
|
||||||
Les packages peuvent être téléchargés à partir de [site web officiel] (https://www.dolibarr.org/).
|
Les packages peuvent être téléchargés à partir de [site web officiel](https://www.dolibarr.org/).
|
||||||
|
|
||||||
### Configuration avancée
|
### Configuration avancée
|
||||||
|
|
||||||
@ -31,32 +30,32 @@ Vous pouvez aussi utiliser un serveur Web et une base de données prise en charg
|
|||||||
|
|
||||||
- Décompressez l'archive .zip téléchargée pour copier le répertoire "dolibarr/htdocs" et tous ses fichiers à la racine du serveur Web ou récupérez-les directement à partir de GitHub (recommandé si vous connaissez git):
|
- Décompressez l'archive .zip téléchargée pour copier le répertoire "dolibarr/htdocs" et tous ses fichiers à la racine du serveur Web ou récupérez-les directement à partir de GitHub (recommandé si vous connaissez git):
|
||||||
|
|
||||||
git clone https://github.com/dolibarr/dolibarr -b x.y (où x.y est la version principale comme 3.6, 9.0, ...)
|
`git clone https://github.com/dolibarr/dolibarr -b x.y` (où x.y est la version principale comme 3.6, 9.0, ...)
|
||||||
|
|
||||||
- Configurez votre serveur Web pour qu'il utilise "*dolibarr/htdocs*" en tant que racine si votre serveur Web ne possède pas déjà de répertoire défini vers lequel pointer.
|
- Configurez votre serveur Web pour qu'il utilise "*dolibarr/htdocs*" en tant que racine si votre serveur Web ne possède pas déjà de répertoire défini vers lequel pointer.
|
||||||
|
|
||||||
- Créez un fichier `htdocs/conf/conf.php` vide et définissez les autorisations d'*écrire* pour l'utilisateur de votre serveur Web (l'autorisation *écrire* sera supprimée une fois l'installation terminée)
|
- Créez un fichier `htdocs/conf/conf.php` vide et définissez les autorisations d'*écrire* pour l'utilisateur de votre serveur Web (l'autorisation *écrire* sera supprimée une fois l'installation terminée)
|
||||||
|
|
||||||
- Depuis votre navigateur, allez à la page "install/" de dolibarr
|
- Depuis votre navigateur, allez à la page "install/" de dolibarr
|
||||||
|
|
||||||
L’URL dépendra de la façon dont votre configuration Web a été configurée pour pointer vers votre installation de dolibarr. Cela peut ressembler à:
|
L’URL dépendra de la façon dont votre configuration Web a été configurée pour pointer vers votre installation de dolibarr. Cela peut ressembler à:
|
||||||
|
|
||||||
|
`http://localhost/dolibarr/htdocs/install/`
|
||||||
|
|
||||||
|
ou
|
||||||
|
|
||||||
|
`http://localhost/dolibarr/install/`
|
||||||
|
|
||||||
|
ou
|
||||||
|
|
||||||
|
`http://yourdolibarrvirtualhost/install/`
|
||||||
|
|
||||||
http://localhost/dolibarr/htdocs/install/
|
|
||||||
|
|
||||||
ou
|
|
||||||
|
|
||||||
http://localhost/dolibarr/install/
|
|
||||||
|
|
||||||
ou
|
|
||||||
|
|
||||||
http://yourdolibarrvirtualhost/install/
|
|
||||||
|
|
||||||
- Suivez les instructions de l'installateur
|
- Suivez les instructions de l'installateur
|
||||||
|
|
||||||
|
|
||||||
## METTRE A JOUR DOLIBARR
|
## METTRE A JOUR DOLIBARR
|
||||||
|
|
||||||
Pour mettre à jour Dolibarr depuis une vieille version vers celle ci:
|
Pour mettre à jour Dolibarr depuis une vieille version vers celle ci:
|
||||||
|
|
||||||
- Ecrasez les vieux fichiers dans le vieux répertoire 'dolibarr' par les fichiers
|
- Ecrasez les vieux fichiers dans le vieux répertoire 'dolibarr' par les fichiers
|
||||||
fournis dans ce nouveau package.
|
fournis dans ce nouveau package.
|
||||||
|
|
||||||
@ -65,16 +64,13 @@ Pour mettre à jour Dolibarr depuis une vieille version vers celle ci:
|
|||||||
|
|
||||||
*Note: Le processus de migration peut être lancé manuellement et plusieurs fois, sans risque, en appelant la page /install/*
|
*Note: Le processus de migration peut être lancé manuellement et plusieurs fois, sans risque, en appelant la page /install/*
|
||||||
|
|
||||||
|
|
||||||
## CE QUI EST NOUVEAU
|
## CE QUI EST NOUVEAU
|
||||||
|
|
||||||
Voir fichier ChangeLog.
|
Voir fichier ChangeLog.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## CE QUE DOLIBARR PEUT FAIRE
|
## CE QUE DOLIBARR PEUT FAIRE
|
||||||
|
|
||||||
### Modules principaux (tous optionnels):
|
### Modules principaux (tous optionnels)
|
||||||
|
|
||||||
- Annuaires des prospects et/ou client et/ou fournisseurs
|
- Annuaires des prospects et/ou client et/ou fournisseurs
|
||||||
- Gestion de catalogue de produits et services
|
- Gestion de catalogue de produits et services
|
||||||
@ -96,7 +92,7 @@ Voir fichier ChangeLog.
|
|||||||
- Point de vente/Caisse enregistreuse
|
- Point de vente/Caisse enregistreuse
|
||||||
- …
|
- …
|
||||||
|
|
||||||
### Autres modules:
|
### Autres modules
|
||||||
|
|
||||||
- Gestion de marque-pages
|
- Gestion de marque-pages
|
||||||
- Gestion des promesses de dons
|
- Gestion des promesses de dons
|
||||||
@ -111,7 +107,7 @@ Voir fichier ChangeLog.
|
|||||||
- Intégration de système de paiements (Paypal, Stripe, Paybox...)
|
- Intégration de système de paiements (Paypal, Stripe, Paybox...)
|
||||||
- …
|
- …
|
||||||
|
|
||||||
### Divers:
|
### Divers
|
||||||
|
|
||||||
- Multi-langue.
|
- Multi-langue.
|
||||||
- Multi-utilisateurs avec différents niveaux de permissions par module.
|
- Multi-utilisateurs avec différents niveaux de permissions par module.
|
||||||
@ -139,46 +135,40 @@ Voir fichier ChangeLog.
|
|||||||
|
|
||||||
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).
|
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 (ENCORE) FAIRE
|
## CE QUE DOLIBARR NE PEUT PAS (ENCORE) FAIRE
|
||||||
|
|
||||||
Voici un liste de fonctionnalités pas encore gérées par Dolibarr:
|
Voici un liste de fonctionnalités pas encore gérées par Dolibarr:
|
||||||
|
|
||||||
- Dolibarr ne contient pas de module de Gestion de la paie.
|
- 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épendances entre elle.
|
- 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 n'embarque pas de Webmail intégré nativement.
|
||||||
- Dolibarr ne fait pas le café (pas encore).
|
- Dolibarr ne fait pas le café (pas encore).
|
||||||
|
|
||||||
|
|
||||||
## DOCUMENTATION
|
## DOCUMENTATION
|
||||||
|
|
||||||
La documentation utilisateur, développeur et traducteur est disponible sous forme de ressources de la communauté via le site [Wiki](https://wiki.dolibarr.org).
|
La documentation utilisateur, développeur et traducteur est disponible sous forme de ressources de la communauté via le site [Wiki](https://wiki.dolibarr.org).
|
||||||
|
|
||||||
|
|
||||||
## CONTRIBUER
|
## CONTRIBUER
|
||||||
|
|
||||||
Ce projet existe grâce à ses nombreux contributeurs [[Contribuer](https://github.com/Dolibarr/dolibarr/blob/develop/.github/CONTRIBUTING.md)].
|
Ce projet existe grâce à ses nombreux contributeurs [[Contribuer](https://github.com/Dolibarr/dolibarr/blob/develop/.github/CONTRIBUTING.md)].
|
||||||
<a href="https://github.com/Dolibarr/dolibarr/graphs/contributors"><img src="https://opencollective.com/dolibarr/contributors.svg?width=890&button=false" /></a>
|
<a href="https://github.com/Dolibarr/dolibarr/graphs/contributors"><img src="https://opencollective.com/dolibarr/contributors.svg?width=890&button=false" /></a>
|
||||||
|
|
||||||
|
|
||||||
## CREDITS
|
## CREDITS
|
||||||
|
|
||||||
Dolibarr est le résultat du travail de nombreux contributeurs depuis des années et utilise des librairies d'autres contributeurs.
|
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)
|
Voir le fichier [COPYRIGHT](https://github.com/Dolibarr/dolibarr/blob/develop/COPYRIGHT)
|
||||||
|
|
||||||
|
|
||||||
## ACTUALITES ET RESEAUX SOCIAUX
|
## ACTUALITES ET RESEAUX SOCIAUX
|
||||||
|
|
||||||
Suivez le projet Dolibarr project sur les réseaux francophones
|
Suivez le projet Dolibarr project sur les réseaux francophones
|
||||||
|
|
||||||
- Facebook: <https://www.facebook.com/dolibarr.fr>
|
- [Facebook](https://www.facebook.com/dolibarr.fr)
|
||||||
- Google+: <https://plus.google.com/+DolibarrFrance>
|
- [Twitter](https://www.twitter.com/dolibarr_france)
|
||||||
- Twitter: <https://www.twitter.com/dolibarr_france>
|
|
||||||
|
|
||||||
ou sur les réseaux anglophones
|
ou sur les réseaux anglophones
|
||||||
|
|
||||||
- [Facebook](https://www.facebook.com/dolibarr)
|
- [Facebook](https://www.facebook.com/dolibarr)
|
||||||
- [Google+](https://plus.google.com/+DolibarrOrg)
|
|
||||||
- [Twitter](https://www.twitter.com/dolibarr)
|
- [Twitter](https://www.twitter.com/dolibarr)
|
||||||
- [LinkedIn](https://www.linkedin.com/company/association-dolibarr)
|
- [LinkedIn](https://www.linkedin.com/company/association-dolibarr)
|
||||||
- [YouTube](https://www.youtube.com/user/DolibarrERPCRM)
|
- [YouTube](https://www.youtube.com/user/DolibarrERPCRM)
|
||||||
|
|||||||
29
README.md
@ -1,10 +1,7 @@
|
|||||||
# DOLIBARR ERP & CRM
|
# DOLIBARR ERP & CRM
|
||||||
|
|
||||||

|

|
||||||
|

|
||||||
|7|8|9|10|develop|
|
|
||||||
|----------|----------|----------|----------|----------|
|
|
||||||
||||||
|
|
||||||
|
|
||||||
Dolibarr ERP & CRM is a modern software package to manage your organization's activity (contacts, suppliers, invoices, orders, stocks, agenda…).
|
Dolibarr ERP & CRM is a modern software package to manage your organization's activity (contacts, suppliers, invoices, orders, stocks, agenda…).
|
||||||
|
|
||||||
@ -14,8 +11,7 @@ You can freely use, study, modify or distribute it according to its Free Softwar
|
|||||||
|
|
||||||
You can use it as a standalone application or as a web application to be able to access it from the Internet or a LAN.
|
You can use it as a standalone application or as a web application to be able to access it from the Internet or a LAN.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
## LICENSE
|
## LICENSE
|
||||||
|
|
||||||
@ -25,7 +21,6 @@ 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.
|
Other licenses apply for some included dependencies. See [COPYRIGHT](https://github.com/Dolibarr/dolibarr/blob/develop/COPYRIGHT) for a full list.
|
||||||
|
|
||||||
|
|
||||||
## INSTALLING
|
## INSTALLING
|
||||||
|
|
||||||
### Simple setup
|
### Simple setup
|
||||||
@ -44,7 +39,7 @@ You can use a Web server and a supported database (MariaDB, MySQL or PostgreSQL)
|
|||||||
|
|
||||||
- Uncompress the downloaded .zip archive to copy the "dolibarr/htdocs" directory and all its files inside your web server root or get the files directly from GitHub (recommanded if you known git):
|
- Uncompress the downloaded .zip archive to copy the "dolibarr/htdocs" directory and all its files inside your web server root or get the files directly from GitHub (recommanded if you known git):
|
||||||
|
|
||||||
git clone https://github.com/dolibarr/dolibarr -b x.y (where x.y is main version like 3.6, 9.0, ...)
|
`git clone https://github.com/dolibarr/dolibarr -b x.y` (where x.y is main version like 3.6, 9.0, ...)
|
||||||
|
|
||||||
- Set up your web server to use "*dolibarr/htdocs*" as root if your web server does not have an already defined directory to point to.
|
- Set up your web server to use "*dolibarr/htdocs*" as root if your web server does not have an already defined directory to point to.
|
||||||
|
|
||||||
@ -54,15 +49,15 @@ You can use a Web server and a supported database (MariaDB, MySQL or PostgreSQL)
|
|||||||
|
|
||||||
The URL will depends on how you web setup was setup to point to your dolibarr installation. It may looks like:
|
The URL will depends on how you web setup was setup to point to your dolibarr installation. It may looks like:
|
||||||
|
|
||||||
http://localhost/dolibarr/htdocs/install/
|
`http://localhost/dolibarr/htdocs/install/`
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
http://localhost/dolibarr/install/
|
`http://localhost/dolibarr/install/`
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
http://yourdolibarrvirtualhost/install/
|
`http://yourdolibarrvirtualhost/install/`
|
||||||
|
|
||||||
- Follow the installer instructions
|
- Follow the installer instructions
|
||||||
|
|
||||||
@ -70,8 +65,6 @@ You can use a Web server and a supported database (MariaDB, MySQL or PostgreSQL)
|
|||||||
|
|
||||||
If you don't have time to install it yourself, you can try some commercial 'ready to use' Cloud offers (See https://saas.dolibarr.org). However, this third solution is not free.
|
If you don't have time to install it yourself, you can try some commercial 'ready to use' Cloud offers (See https://saas.dolibarr.org). However, this third solution is not free.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## UPGRADING
|
## UPGRADING
|
||||||
|
|
||||||
- At first make a backup of your Dolibarr files & than see https://wiki.dolibarr.org/index.php/Installation_-_Upgrade#Upgrade_Dolibarr
|
- At first make a backup of your Dolibarr files & than see https://wiki.dolibarr.org/index.php/Installation_-_Upgrade#Upgrade_Dolibarr
|
||||||
@ -81,12 +74,10 @@ If you don't have time to install it yourself, you can try some commercial 'read
|
|||||||
|
|
||||||
*Note: migration process can be safely done multiple times by calling the `/install/index.php` page*
|
*Note: migration process can be safely done multiple times by calling the `/install/index.php` page*
|
||||||
|
|
||||||
|
|
||||||
## WHAT'S NEW
|
## WHAT'S NEW
|
||||||
|
|
||||||
See the [ChangeLog](https://github.com/Dolibarr/dolibarr/blob/develop/ChangeLog) file.
|
See the [ChangeLog](https://github.com/Dolibarr/dolibarr/blob/develop/ChangeLog) file.
|
||||||
|
|
||||||
|
|
||||||
## FEATURES
|
## FEATURES
|
||||||
|
|
||||||
### Main application/modules (all optional)
|
### Main application/modules (all optional)
|
||||||
@ -160,12 +151,10 @@ See the [ChangeLog](https://github.com/Dolibarr/dolibarr/blob/develop/ChangeLog)
|
|||||||
- Works with PHP 5.5+ 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))
|
- Works with PHP 5.5+ 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.
|
- Compatible with all Cloud solutions that match MySQL, PHP or PostgreSQL prerequisites.
|
||||||
|
|
||||||
|
|
||||||
### Extending
|
### Extending
|
||||||
|
|
||||||
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).
|
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).
|
||||||
|
|
||||||
|
|
||||||
## WHAT DOLIBARR CAN'T DO YET
|
## WHAT DOLIBARR CAN'T DO YET
|
||||||
|
|
||||||
These are features that Dolibarr does **not** yet fully support:
|
These are features that Dolibarr does **not** yet fully support:
|
||||||
@ -175,37 +164,31 @@ These are features that Dolibarr does **not** yet fully support:
|
|||||||
- No native embedded Webmail
|
- No native embedded Webmail
|
||||||
- Dolibarr can't do coffee (yet)
|
- Dolibarr can't do coffee (yet)
|
||||||
|
|
||||||
|
|
||||||
## DOCUMENTATION
|
## DOCUMENTATION
|
||||||
|
|
||||||
Administrator, user, developer and translator's documentations are available along with other community resources on the [Wiki](https://wiki.dolibarr.org).
|
Administrator, user, developer and translator's documentations are available along with other community resources on the [Wiki](https://wiki.dolibarr.org).
|
||||||
|
|
||||||
|
|
||||||
## CONTRIBUTING
|
## CONTRIBUTING
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/Dolibarr/dolibarr/blob/develop/.github/CONTRIBUTING.md)].
|
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/Dolibarr/dolibarr/blob/develop/.github/CONTRIBUTING.md)].
|
||||||
<a href="https://github.com/Dolibarr/dolibarr/graphs/contributors"><img src="https://opencollective.com/dolibarr/contributors.svg?width=890&button=false" /></a>
|
<a href="https://github.com/Dolibarr/dolibarr/graphs/contributors"><img src="https://opencollective.com/dolibarr/contributors.svg?width=890&button=false" /></a>
|
||||||
|
|
||||||
|
|
||||||
## CREDITS
|
## CREDITS
|
||||||
|
|
||||||
Dolibarr is the work of many contributors over the years and uses some fine libraries.
|
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.
|
See [COPYRIGHT](https://github.com/Dolibarr/dolibarr/blob/develop/COPYRIGHT) file.
|
||||||
|
|
||||||
|
|
||||||
## NEWS AND SOCIAL NETWORKS
|
## NEWS AND SOCIAL NETWORKS
|
||||||
|
|
||||||
Follow Dolibarr project on:
|
Follow Dolibarr project on:
|
||||||
|
|
||||||
- [Facebook](https://www.facebook.com/dolibarr)
|
- [Facebook](https://www.facebook.com/dolibarr)
|
||||||
- [Google+](https://plus.google.com/+DolibarrOrg)
|
|
||||||
- [Twitter](https://www.twitter.com/dolibarr)
|
- [Twitter](https://www.twitter.com/dolibarr)
|
||||||
- [LinkedIn](https://www.linkedin.com/company/association-dolibarr)
|
- [LinkedIn](https://www.linkedin.com/company/association-dolibarr)
|
||||||
- [YouTube](https://www.youtube.com/user/DolibarrERPCRM)
|
- [YouTube](https://www.youtube.com/user/DolibarrERPCRM)
|
||||||
- [GitHub](https://github.com/Dolibarr/dolibarr)
|
- [GitHub](https://github.com/Dolibarr/dolibarr)
|
||||||
|
|
||||||
|
|
||||||
### Sponsors
|
### Sponsors
|
||||||
|
|
||||||
Support this project by becoming a sponsor. Your logo will show up here. 🙏 [[Become a sponsor/backer](https://opencollective.com/dolibarr#backer)]
|
Support this project by becoming a sponsor. Your logo will show up here. 🙏 [[Become a sponsor/backer](https://opencollective.com/dolibarr#backer)]
|
||||||
|
|||||||
@ -36,7 +36,7 @@ Note: Prerequisites to build autoexe DoliWamp package:
|
|||||||
> perl makepack-dolibarrmodule.pl
|
> perl makepack-dolibarrmodule.pl
|
||||||
|
|
||||||
- To build developper documentation, launch the script
|
- To build developper documentation, launch the script
|
||||||
> perl dolybarr-doxygen-build.pl
|
> perl dolibarr-doxygen-build.pl
|
||||||
|
|
||||||
|
|
||||||
Note:
|
Note:
|
||||||
|
|||||||
@ -231,3 +231,8 @@ $dolibarr_main_prod='0';
|
|||||||
# Default value: 0 (use database value if exist)
|
# Default value: 0 (use database value if exist)
|
||||||
# Examples:
|
# Examples:
|
||||||
# $dolibarr_mailing_limit_sendbycli='0';
|
# $dolibarr_mailing_limit_sendbycli='0';
|
||||||
|
|
||||||
|
# dolibarr_distrib
|
||||||
|
# A key to identify the distribution used for first installation
|
||||||
|
$dolibarr_distrib = 'deb';
|
||||||
|
|
||||||
|
|||||||
@ -1 +1,2 @@
|
|||||||
htdocs/install/doctemplates/websites/website_template-corporate.zip
|
htdocs/install/doctemplates/websites/website_template-corporate.zip
|
||||||
|
htdocs/install/doctemplates/websites/website_template-stellar.zip
|
||||||
@ -1,31 +1,38 @@
|
|||||||
FROM php:7.0-apache
|
FROM php:7.2-apache
|
||||||
|
|
||||||
ENV HOST_USER_ID 33
|
ENV HOST_USER_ID 33
|
||||||
ENV PHP_INI_DATE_TIMEZONE 'UTC'
|
ENV PHP_INI_DATE_TIMEZONE 'UTC'
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev libldap2-dev \
|
RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev libldap2-dev libzip-dev zlib1g-dev libicu-dev g++\
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
&& docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
|
&& docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
|
||||||
&& docker-php-ext-install gd \
|
&& docker-php-ext-install gd \
|
||||||
|
&& docker-php-ext-install zip \
|
||||||
&& docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/ \
|
&& docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/ \
|
||||||
&& docker-php-ext-install ldap \
|
&& docker-php-ext-install ldap \
|
||||||
&& docker-php-ext-install mysqli \
|
&& docker-php-ext-install mysqli \
|
||||||
&& apt-get purge -y libjpeg-dev libldap2-dev
|
&& docker-php-ext-install calendar \
|
||||||
|
&& docker-php-ext-configure intl \
|
||||||
|
&& docker-php-ext-install intl \
|
||||||
|
&& apt-get autoremove --purge -y libjpeg-dev libldap2-dev zlib1g-dev libicu-dev g++
|
||||||
|
|
||||||
|
RUN mkdir /var/documents
|
||||||
|
RUN chown www-data /var/documents
|
||||||
|
|
||||||
COPY docker-run.sh /usr/local/bin/
|
COPY docker-run.sh /usr/local/bin/
|
||||||
RUN chmod +x /usr/local/bin/docker-run.sh
|
RUN chmod +x /usr/local/bin/docker-run.sh
|
||||||
|
|
||||||
RUN pecl install xdebug-2.5.5 && docker-php-ext-enable xdebug
|
RUN pecl install xdebug && docker-php-ext-enable xdebug
|
||||||
RUN echo 'zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so"' >> /usr/local/etc/php/php.ini
|
RUN echo 'zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so"' >> /usr/local/etc/php/php.ini
|
||||||
RUN echo 'xdebug.remote_autostart=0' >> /usr/local/etc/php/php.ini
|
RUN echo 'xdebug.remote_autostart=0' >> /usr/local/etc/php/php.ini
|
||||||
RUN echo 'xdebug.remote_enable=1' >> /usr/local/etc/php/php.ini
|
RUN echo 'xdebug.remote_enable=1' >> /usr/local/etc/php/php.ini
|
||||||
RUN echo 'xdebug.default_enable=0' >> /usr/local/etc/php/php.ini
|
RUN echo 'xdebug.default_enable=0' >> /usr/local/etc/php/php.ini
|
||||||
RUN echo 'xdebug.remote_host=docker.for.mac.host.internal' >> /usr/local/etc/php/php.ini
|
RUN echo 'xdebug.remote_host=docker.host' >> /usr/local/etc/php/php.ini
|
||||||
RUN echo 'xdebug.remote_port=9000' >> /usr/local/etc/php/php.ini
|
RUN echo 'xdebug.remote_port=9000' >> /usr/local/etc/php/php.ini
|
||||||
RUN echo 'xdebug.remote_connect_back=0' >> /usr/local/etc/php/php.ini
|
RUN echo 'xdebug.remote_connect_back=0' >> /usr/local/etc/php/php.ini
|
||||||
RUN echo 'xdebug.profiler_enable=0' >> /usr/local/etc/php/php.ini
|
RUN echo 'xdebug.profiler_enable=0' >> /usr/local/etc/php/php.ini
|
||||||
RUN echo 'xdebug.remote_log="/tmp/xdebug.log"' >> /usr/local/etc/php/php.ini
|
RUN echo 'xdebug.remote_log="/tmp/xdebug.log"' >> /usr/local/etc/php/php.ini
|
||||||
|
RUN echo '172.17.0.1 docker.host' >> /etc/hosts
|
||||||
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
mariadb:
|
mariadb:
|
||||||
image: mariadb:latest
|
build: mariadb
|
||||||
environment:
|
environment:
|
||||||
MYSQL_ROOT_PASSWORD: root
|
MYSQL_ROOT_PASSWORD: root
|
||||||
MYSQL_DATABASE: dolibarr
|
MYSQL_DATABASE: dolibarr
|
||||||
|
|||||||
@ -3,7 +3,8 @@
|
|||||||
usermod -u $HOST_USER_ID www-data
|
usermod -u $HOST_USER_ID www-data
|
||||||
groupmod -g $HOST_USER_ID www-data
|
groupmod -g $HOST_USER_ID www-data
|
||||||
|
|
||||||
chown -hR www-data:www-data /var/www
|
chgrp -hR www-data /var/www/html
|
||||||
|
chmod g+rwx /var/www/html/conf
|
||||||
|
|
||||||
if [ ! -f /usr/local/etc/php/php.ini ]; then
|
if [ ! -f /usr/local/etc/php/php.ini ]; then
|
||||||
cat <<EOF > /usr/local/etc/php/php.ini
|
cat <<EOF > /usr/local/etc/php/php.ini
|
||||||
|
|||||||
3
build/docker/mariadb/Dockerfile
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
FROM mariadb:latest
|
||||||
|
# Enable comented out UTF8 charset/collation options
|
||||||
|
RUN sed '/utf8/ s/^#//' /etc/mysql/mariadb.cnf >/tmp/t && mv /tmp/t /etc/mysql/mariadb.cnf
|
||||||
@ -36,7 +36,7 @@ $SOURCE="../..";
|
|||||||
$result = open( IN, "< " . $SOURCE . "/htdocs/filefunc.inc.php" );
|
$result = open( IN, "< " . $SOURCE . "/htdocs/filefunc.inc.php" );
|
||||||
if ( !$result ) { die "Error: Can't open descriptor file " . $SOURCE . "/htdocs/filefunc.inc.php\n"; }
|
if ( !$result ) { die "Error: Can't open descriptor file " . $SOURCE . "/htdocs/filefunc.inc.php\n"; }
|
||||||
while (<IN>) {
|
while (<IN>) {
|
||||||
if ( $_ =~ /define\('DOL_VERSION','([\d\.a-z\-]+)'\)/ ) { $PROJVERSION = $1; break; }
|
if ( $_ =~ /define\('DOL_VERSION', '([\d\.a-z\-]+)'\)/ ) { $PROJVERSION = $1; break; }
|
||||||
}
|
}
|
||||||
close IN;
|
close IN;
|
||||||
($MAJOR,$MINOR,$BUILD)=split(/\./,$PROJVERSION,3);
|
($MAJOR,$MINOR,$BUILD)=split(/\./,$PROJVERSION,3);
|
||||||
|
|||||||
@ -110,7 +110,7 @@ Source: "C:\Program Files\Wamp\bin\mysql\mysql5.0.45\*.*"; DestDir: "{app}\bin\m
|
|||||||
; Mysql data files (does not overwrite if exists)
|
; Mysql data files (does not overwrite if exists)
|
||||||
Source: "build\exe\doliwamp\mysql\*.*"; DestDir: "{app}\bin\mysql\data\mysql"; Flags: onlyifdoesntexist ignoreversion recursesubdirs; Excludes: ".gitignore,.project,CVS\*,Thumbs.db"
|
Source: "build\exe\doliwamp\mysql\*.*"; DestDir: "{app}\bin\mysql\data\mysql"; Flags: onlyifdoesntexist ignoreversion recursesubdirs; Excludes: ".gitignore,.project,CVS\*,Thumbs.db"
|
||||||
; Dolibarr
|
; Dolibarr
|
||||||
Source: "htdocs\*.*"; DestDir: "{app}\www\dolibarr\htdocs"; Flags: ignoreversion recursesubdirs; Excludes: ".gitignore,.project,CVS\*,Thumbs.db,custom\*,custom2\*,documents\*,includes\ckeditor\_source\*,includes\savant\*,includes\phpmailer\*,jquery\plugins\template\*,nltechno*\*,PHPExcel\Shared\PDF\*,PHPExcel\Shared\PCLZip\*,tcpdf\fonts\dejavu-fonts-ttf-2.33\*,tcpdf\fonts\freefont-20100919\*,tcpdf\fonts\utils\*,*\conf.php,*\conf.php.mysql,*\conf.php.old,*\conf.php.postgres,*\conf.php.sav,*\install.forced.php"
|
Source: "htdocs\*.*"; DestDir: "{app}\www\dolibarr\htdocs"; Flags: ignoreversion recursesubdirs; Excludes: ".gitignore,.project,CVS\*,Thumbs.db,custom\*,custom2\*,documents\*,includes\ckeditor\_source\*,includes\savant\*,includes\phpmailer\*,jquery\plugins\template\*,nltechno*\*,sabre\sabre\*\tests,PHPExcel\Shared\PDF\*,PHPExcel\Shared\PCLZip\*,tcpdf\fonts\dejavu-fonts-ttf-2.33\*,tcpdf\fonts\freefont-20100919\*,tcpdf\fonts\utils\*,*\conf.php,*\conf.php.mysql,*\conf.php.old,*\conf.php.postgres,*\conf.php.sav,*\install.forced.php"
|
||||||
Source: "dev\*.*"; DestDir: "{app}\www\dolibarr\dev"; Flags: ignoreversion recursesubdirs; Excludes: ".gitignore,.project,CVS\*,Thumbs.db,dbmodel\*,fpdf\*,initdata\*,initdemo\*,iso-normes\*,licence\*,phpcheckstyle\*,phpunit\*,samples\*,test\*,uml\*,vagrant\*,xdebug\*"
|
Source: "dev\*.*"; DestDir: "{app}\www\dolibarr\dev"; Flags: ignoreversion recursesubdirs; Excludes: ".gitignore,.project,CVS\*,Thumbs.db,dbmodel\*,fpdf\*,initdata\*,initdemo\*,iso-normes\*,licence\*,phpcheckstyle\*,phpunit\*,samples\*,test\*,uml\*,vagrant\*,xdebug\*"
|
||||||
Source: "doc\*.*"; DestDir: "{app}\www\dolibarr\doc"; Flags: ignoreversion recursesubdirs; Excludes: ".gitignore,.project,CVS\*,Thumbs.db,wiki\*,plaquette\*,dev\*,images\dolibarr_screenshot2.png,images\dolibarr_screenshot3.png,images\dolibarr_screenshot4.png,images\dolibarr_screenshot5.png,images\dolibarr_screenshot6.png,images\dolibarr_screenshot7.png,images\dolibarr_screenshot8.png,images\dolibarr_screenshot9.png,images\dolibarr_screenshot10.png,images\dolibarr_screenshot11.png,images\dolibarr_screenshot12.png"
|
Source: "doc\*.*"; DestDir: "{app}\www\dolibarr\doc"; Flags: ignoreversion recursesubdirs; Excludes: ".gitignore,.project,CVS\*,Thumbs.db,wiki\*,plaquette\*,dev\*,images\dolibarr_screenshot2.png,images\dolibarr_screenshot3.png,images\dolibarr_screenshot4.png,images\dolibarr_screenshot5.png,images\dolibarr_screenshot6.png,images\dolibarr_screenshot7.png,images\dolibarr_screenshot8.png,images\dolibarr_screenshot9.png,images\dolibarr_screenshot10.png,images\dolibarr_screenshot11.png,images\dolibarr_screenshot12.png"
|
||||||
Source: "scripts\*.*"; DestDir: "{app}\www\dolibarr\scripts"; Flags: ignoreversion recursesubdirs; Excludes: ".gitignore,.project,CVS\*,Thumbs.db,product\materiel.net.php,product\import-product.php"
|
Source: "scripts\*.*"; DestDir: "{app}\www\dolibarr\scripts"; Flags: ignoreversion recursesubdirs; Excludes: ".gitignore,.project,CVS\*,Thumbs.db,product\materiel.net.php,product\import-product.php"
|
||||||
|
|||||||
@ -145,8 +145,8 @@ $iterator1 = new RecursiveIteratorIterator($dir_iterator1);
|
|||||||
// Need to ignore document custom etc. Note: this also ignore natively symbolic links.
|
// 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');
|
$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)$';
|
$regextoinclude='\.(php|php3|php4|php5|phtml|phps|phar|inc|css|scss|html|xml|js|json|tpl|jpg|jpeg|png|gif|ico|sql|lang|txt|yml|md|mp3|mp4|wav|mkv|z|gz|zip|rar|tar|less|svg|eot|woff|woff2|ttf|manifest)$';
|
||||||
$regextoexclude='('.($includecustom?'':'custom|').'documents|conf|install|public\/test|Shared\/PCLZip|nusoap\/lib\/Mail|php\/example|php\/test|geoip\/sample.*\.php|ckeditor\/samples|ckeditor\/adapters)$'; // Exclude dirs
|
$regextoexclude='('.($includecustom?'':'custom|').'documents|conf|install|public\/test|sabre\/sabre\/.*\/tests|Shared\/PCLZip|nusoap\/lib\/Mail|php\/example|php\/test|geoip\/sample.*\.php|ckeditor\/samples|ckeditor\/adapters)$'; // Exclude dirs
|
||||||
$files = dol_dir_list(DOL_DOCUMENT_ROOT, 'files', 1, $regextoinclude, $regextoexclude, 'fullname');
|
$files = dol_dir_list(DOL_DOCUMENT_ROOT, 'files', 1, $regextoinclude, $regextoexclude, 'fullname');
|
||||||
$dir='';
|
$dir='';
|
||||||
$needtoclose=0;
|
$needtoclose=0;
|
||||||
|
|||||||
@ -213,6 +213,7 @@ done >>%{name}.lang
|
|||||||
%_datadir/dolibarr/htdocs/public
|
%_datadir/dolibarr/htdocs/public
|
||||||
%_datadir/dolibarr/htdocs/reception
|
%_datadir/dolibarr/htdocs/reception
|
||||||
%_datadir/dolibarr/htdocs/resource
|
%_datadir/dolibarr/htdocs/resource
|
||||||
|
%_datadir/dolibarr/htdocs/salaries
|
||||||
%_datadir/dolibarr/htdocs/societe
|
%_datadir/dolibarr/htdocs/societe
|
||||||
%_datadir/dolibarr/htdocs/stripe
|
%_datadir/dolibarr/htdocs/stripe
|
||||||
%_datadir/dolibarr/htdocs/supplier_proposal
|
%_datadir/dolibarr/htdocs/supplier_proposal
|
||||||
@ -224,6 +225,7 @@ done >>%{name}.lang
|
|||||||
%_datadir/dolibarr/htdocs/variants
|
%_datadir/dolibarr/htdocs/variants
|
||||||
%_datadir/dolibarr/htdocs/webservices
|
%_datadir/dolibarr/htdocs/webservices
|
||||||
%_datadir/dolibarr/htdocs/website
|
%_datadir/dolibarr/htdocs/website
|
||||||
|
%_datadir/dolibarr/htdocs/zapier
|
||||||
%_datadir/dolibarr/htdocs/*.ico
|
%_datadir/dolibarr/htdocs/*.ico
|
||||||
%_datadir/dolibarr/htdocs/*.patch
|
%_datadir/dolibarr/htdocs/*.patch
|
||||||
%_datadir/dolibarr/htdocs/*.php
|
%_datadir/dolibarr/htdocs/*.php
|
||||||
|
|||||||
@ -293,6 +293,7 @@ done >>%{name}.lang
|
|||||||
%_datadir/dolibarr/htdocs/public
|
%_datadir/dolibarr/htdocs/public
|
||||||
%_datadir/dolibarr/htdocs/reception
|
%_datadir/dolibarr/htdocs/reception
|
||||||
%_datadir/dolibarr/htdocs/resource
|
%_datadir/dolibarr/htdocs/resource
|
||||||
|
%_datadir/dolibarr/htdocs/salaries
|
||||||
%_datadir/dolibarr/htdocs/societe
|
%_datadir/dolibarr/htdocs/societe
|
||||||
%_datadir/dolibarr/htdocs/stripe
|
%_datadir/dolibarr/htdocs/stripe
|
||||||
%_datadir/dolibarr/htdocs/supplier_proposal
|
%_datadir/dolibarr/htdocs/supplier_proposal
|
||||||
@ -304,6 +305,7 @@ done >>%{name}.lang
|
|||||||
%_datadir/dolibarr/htdocs/variants
|
%_datadir/dolibarr/htdocs/variants
|
||||||
%_datadir/dolibarr/htdocs/webservices
|
%_datadir/dolibarr/htdocs/webservices
|
||||||
%_datadir/dolibarr/htdocs/website
|
%_datadir/dolibarr/htdocs/website
|
||||||
|
%_datadir/dolibarr/htdocs/zapier
|
||||||
%_datadir/dolibarr/htdocs/*.ico
|
%_datadir/dolibarr/htdocs/*.ico
|
||||||
%_datadir/dolibarr/htdocs/*.patch
|
%_datadir/dolibarr/htdocs/*.patch
|
||||||
%_datadir/dolibarr/htdocs/*.php
|
%_datadir/dolibarr/htdocs/*.php
|
||||||
|
|||||||
@ -210,6 +210,7 @@ done >>%{name}.lang
|
|||||||
%_datadir/dolibarr/htdocs/public
|
%_datadir/dolibarr/htdocs/public
|
||||||
%_datadir/dolibarr/htdocs/reception
|
%_datadir/dolibarr/htdocs/reception
|
||||||
%_datadir/dolibarr/htdocs/resource
|
%_datadir/dolibarr/htdocs/resource
|
||||||
|
%_datadir/dolibarr/htdocs/salaries
|
||||||
%_datadir/dolibarr/htdocs/societe
|
%_datadir/dolibarr/htdocs/societe
|
||||||
%_datadir/dolibarr/htdocs/stripe
|
%_datadir/dolibarr/htdocs/stripe
|
||||||
%_datadir/dolibarr/htdocs/supplier_proposal
|
%_datadir/dolibarr/htdocs/supplier_proposal
|
||||||
@ -221,6 +222,7 @@ done >>%{name}.lang
|
|||||||
%_datadir/dolibarr/htdocs/variants
|
%_datadir/dolibarr/htdocs/variants
|
||||||
%_datadir/dolibarr/htdocs/webservices
|
%_datadir/dolibarr/htdocs/webservices
|
||||||
%_datadir/dolibarr/htdocs/website
|
%_datadir/dolibarr/htdocs/website
|
||||||
|
%_datadir/dolibarr/htdocs/zapier
|
||||||
%_datadir/dolibarr/htdocs/*.ico
|
%_datadir/dolibarr/htdocs/*.ico
|
||||||
%_datadir/dolibarr/htdocs/*.patch
|
%_datadir/dolibarr/htdocs/*.patch
|
||||||
%_datadir/dolibarr/htdocs/*.php
|
%_datadir/dolibarr/htdocs/*.php
|
||||||
|
|||||||
@ -221,6 +221,7 @@ done >>%{name}.lang
|
|||||||
%_datadir/dolibarr/htdocs/public
|
%_datadir/dolibarr/htdocs/public
|
||||||
%_datadir/dolibarr/htdocs/reception
|
%_datadir/dolibarr/htdocs/reception
|
||||||
%_datadir/dolibarr/htdocs/resource
|
%_datadir/dolibarr/htdocs/resource
|
||||||
|
%_datadir/dolibarr/htdocs/salaries
|
||||||
%_datadir/dolibarr/htdocs/societe
|
%_datadir/dolibarr/htdocs/societe
|
||||||
%_datadir/dolibarr/htdocs/stripe
|
%_datadir/dolibarr/htdocs/stripe
|
||||||
%_datadir/dolibarr/htdocs/supplier_proposal
|
%_datadir/dolibarr/htdocs/supplier_proposal
|
||||||
@ -232,6 +233,7 @@ done >>%{name}.lang
|
|||||||
%_datadir/dolibarr/htdocs/variants
|
%_datadir/dolibarr/htdocs/variants
|
||||||
%_datadir/dolibarr/htdocs/webservices
|
%_datadir/dolibarr/htdocs/webservices
|
||||||
%_datadir/dolibarr/htdocs/website
|
%_datadir/dolibarr/htdocs/website
|
||||||
|
%_datadir/dolibarr/htdocs/zapier
|
||||||
%_datadir/dolibarr/htdocs/*.ico
|
%_datadir/dolibarr/htdocs/*.ico
|
||||||
%_datadir/dolibarr/htdocs/*.patch
|
%_datadir/dolibarr/htdocs/*.patch
|
||||||
%_datadir/dolibarr/htdocs/*.php
|
%_datadir/dolibarr/htdocs/*.php
|
||||||
|
|||||||
@ -52,6 +52,75 @@ Replace call to serialize_val with no bugged value
|
|||||||
|
|
||||||
TCPDF:
|
TCPDF:
|
||||||
------
|
------
|
||||||
|
* Replace in tcpdf.php:
|
||||||
|
|
||||||
|
if (isset($this->imagekeys)) {
|
||||||
|
foreach($this->imagekeys as $file) {
|
||||||
|
unlink($file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
with
|
||||||
|
|
||||||
|
if (isset($this->imagekeys)) {
|
||||||
|
foreach($this->imagekeys as $file) {
|
||||||
|
// DOL CHANGE If we keep this, source image files are physically destroyed
|
||||||
|
// unlink($file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* Replace in tcpdf.php
|
||||||
|
|
||||||
|
$preserve = array(
|
||||||
|
'file_id',
|
||||||
|
'internal_encoding',
|
||||||
|
'state',
|
||||||
|
'bufferlen',
|
||||||
|
'buffer',
|
||||||
|
'cached_files',
|
||||||
|
|
||||||
|
with
|
||||||
|
|
||||||
|
$preserve = array(
|
||||||
|
'file_id',
|
||||||
|
'internal_encoding',
|
||||||
|
'state',
|
||||||
|
'bufferlen',
|
||||||
|
'buffer',
|
||||||
|
'cached_files',
|
||||||
|
// @CHANGE DOL
|
||||||
|
'imagekeys',
|
||||||
|
|
||||||
|
* Replace in tcpdf.php
|
||||||
|
|
||||||
|
if (!@TCPDF_STATIC::file_exists($file)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
with
|
||||||
|
|
||||||
|
if (!@TCPDF_STATIC::file_exists($file)) {
|
||||||
|
// DOL CHANGE If we keep this, the image is not visible on pages after the first one.
|
||||||
|
//var_dump($file.' '.(!@TCPDF_STATIC::file_exists($file)));
|
||||||
|
//return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* In tecnickcom/tcpdf/include/tcpdf_static, in function fopenLocal, replace
|
||||||
|
|
||||||
|
if (strpos($filename, '://') === false) {
|
||||||
|
|
||||||
|
with
|
||||||
|
|
||||||
|
if (strpos($filename, '//') === 0)
|
||||||
|
{
|
||||||
|
// Share folder on a (windows) server
|
||||||
|
// e.g.: "//[MyServerName]/[MySharedFolder]/"
|
||||||
|
//
|
||||||
|
// nothing to change
|
||||||
|
}
|
||||||
|
elseif (strpos($filename, '://') === false)
|
||||||
|
|
||||||
* To avoid to have QRcode changed because generated with a random mask, replace
|
* To avoid to have QRcode changed because generated with a random mask, replace
|
||||||
define('QR_FIND_FROM_RANDOM', 2);
|
define('QR_FIND_FROM_RANDOM', 2);
|
||||||
with
|
with
|
||||||
|
|||||||
231
dev/initdata/dbf/import-dbf.php
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
/* Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||||
|
* Copyright (C) 2016 Juanjo Menent <jmenent@2byte.es>
|
||||||
|
*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* WARNING, THIS WILL LOAD MASS DATA ON YOUR INSTANCE
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file dev/initdata/import-dbf.php
|
||||||
|
* \brief Script example to create a table from a large DBF file (openoffice)
|
||||||
|
* To purge data, you can have a look at purge-data.php
|
||||||
|
*/
|
||||||
|
// Test si mode batch
|
||||||
|
$sapi_type = php_sapi_name();
|
||||||
|
$script_file = basename(__FILE__);
|
||||||
|
|
||||||
|
$path = dirname(__FILE__) . '/';
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recupere root dolibarr
|
||||||
|
$path = dirname($_SERVER["PHP_SELF"]);
|
||||||
|
require $path . "./../htdocs/master.inc.php";
|
||||||
|
require $path . "/includes/dbase.class.php";
|
||||||
|
|
||||||
|
// Global variables
|
||||||
|
$version = DOL_VERSION;
|
||||||
|
$confirmed = 1;
|
||||||
|
$error = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Main
|
||||||
|
*/
|
||||||
|
|
||||||
|
@set_time_limit(0);
|
||||||
|
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
|
||||||
|
dol_syslog($script_file . " launched with arg " . implode(',', $argv));
|
||||||
|
|
||||||
|
|
||||||
|
$filepath = $argv[1];
|
||||||
|
$filepatherr = $filepath . '.err';
|
||||||
|
$startchar = empty($argv[2]) ? 0 : (int) $argv[2];
|
||||||
|
$deleteTable = empty($argv[3]) ? 1 : 0;
|
||||||
|
$startlinenb = empty($argv[3]) ? 1 : (int) $argv[3];
|
||||||
|
$endlinenb = empty($argv[4]) ? 0 : (int) $argv[4];
|
||||||
|
|
||||||
|
if (empty($filepath)) {
|
||||||
|
print "Usage: php $script_file myfilepath.dbf [removeChatColumnName] [startlinenb] [endlinenb]\n";
|
||||||
|
print "Example: php $script_file myfilepath.dbf 0 2 1002\n";
|
||||||
|
print "\n";
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
if (!file_exists($filepath)) {
|
||||||
|
print "Error: File " . $filepath . " not found.\n";
|
||||||
|
print "\n";
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret = $user->fetch('', 'admin');
|
||||||
|
if (!$ret > 0) {
|
||||||
|
print 'A user with login "admin" and all permissions must be created to use this script.' . "\n";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
$user->getrights();
|
||||||
|
|
||||||
|
// Ask confirmation
|
||||||
|
if (!$confirmed) {
|
||||||
|
print "Hit Enter to continue or CTRL+C to stop...\n";
|
||||||
|
$input = trim(fgets(STDIN));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open input and output files
|
||||||
|
$fhandle = dbase_open($filepath, 0);
|
||||||
|
if (!$fhandle) {
|
||||||
|
print 'Error: Failed to open file ' . $filepath . "\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
$fhandleerr = fopen($filepatherr, 'w');
|
||||||
|
if (!$fhandleerr) {
|
||||||
|
print 'Error: Failed to open file ' . $filepatherr . "\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$langs->setDefaultLang($defaultlang);
|
||||||
|
|
||||||
|
$record_numbers = dbase_numrecords($fhandle);
|
||||||
|
$table_name = substr(basename($filepath), 0, strpos(basename($filepath), '.'));
|
||||||
|
print 'Info: ' . $record_numbers . " lines in file \n";
|
||||||
|
$header = dbase_get_header_info($fhandle);
|
||||||
|
if ($deleteTable) {
|
||||||
|
$db->query("DROP TABLE IF EXISTS `$table_name`");
|
||||||
|
}
|
||||||
|
$sqlCreate = "CREATE TABLE IF NOT EXISTS `$table_name` ( `id` INT(11) NOT NULL AUTO_INCREMENT ";
|
||||||
|
$fieldArray = array("`id`");
|
||||||
|
foreach ($header as $value) {
|
||||||
|
$fieldName = substr(str_replace('_', '', $value['name']), $startchar);
|
||||||
|
$fieldArray[] = "`$fieldName`";
|
||||||
|
$sqlCreate .= ", `" . $fieldName . "` VARCHAR({$value['length']}) NULL DEFAULT NULL ";
|
||||||
|
}
|
||||||
|
$sqlCreate .= ", PRIMARY KEY (`id`)) ENGINE = InnoDB";
|
||||||
|
$resql = $db->query($sqlCreate);
|
||||||
|
if ($resql !== false) {
|
||||||
|
print "Table $table_name created\n";
|
||||||
|
} else {
|
||||||
|
var_dump($db->errno());
|
||||||
|
print "Impossible : " . $sqlCreate . "\n";
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
$nboflines++;
|
||||||
|
|
||||||
|
$fields = implode(',', $fieldArray);
|
||||||
|
//var_dump($fieldArray);die();
|
||||||
|
$maxLength = 0;
|
||||||
|
for ($i = 1; $i <= $record_numbers; $i++) {
|
||||||
|
if ($startlinenb && $i < $startlinenb)
|
||||||
|
continue;
|
||||||
|
if ($endlinenb && $i > $endlinenb)
|
||||||
|
continue;
|
||||||
|
$row = dbase_get_record_with_names($fhandle, $i);
|
||||||
|
if ($row === false || (isset($row["deleted"]) && $row["deleted"] == '1'))
|
||||||
|
continue;
|
||||||
|
$sqlInsert = "INSERT INTO `$table_name`($fields) VALUES (null,";
|
||||||
|
array_shift($row); // remove delete column
|
||||||
|
foreach ($row as $value) {
|
||||||
|
$sqlInsert .= "'" . $db->escape(utf8_encode($value)) . "', ";
|
||||||
|
}
|
||||||
|
replaceable_echo(implode("\t", $row));
|
||||||
|
$sqlInsert = rtrim($sqlInsert, ', ');
|
||||||
|
$sqlInsert .= ")";
|
||||||
|
$resql = $db->query($sqlInsert);
|
||||||
|
if ($resql === false) {
|
||||||
|
print "Impossible : " . $sqlInsert . "\n";
|
||||||
|
var_dump($row, $db->errno());
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
// $fields = (object) $row;
|
||||||
|
// var_dump($fields);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
die();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// commit or rollback
|
||||||
|
print "Nb of lines qualified: " . $nboflines . "\n";
|
||||||
|
print "Nb of errors: " . $error . "\n";
|
||||||
|
if ($mode != 'confirmforced' && ($error || $mode != 'confirm')) {
|
||||||
|
print "Rollback any changes.\n";
|
||||||
|
$db->rollback();
|
||||||
|
} else {
|
||||||
|
print "Commit all changes.\n";
|
||||||
|
$db->commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
$db->close();
|
||||||
|
fclose($fhandle);
|
||||||
|
fclose($fhandleerr);
|
||||||
|
|
||||||
|
exit($error);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* replaceable_echo
|
||||||
|
*
|
||||||
|
* @param string $message Message
|
||||||
|
* @param int $force_clear_lines Force clear messages
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function replaceable_echo($message, $force_clear_lines = null)
|
||||||
|
{
|
||||||
|
static $last_lines = 0;
|
||||||
|
|
||||||
|
if (!is_null($force_clear_lines)) {
|
||||||
|
$last_lines = $force_clear_lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
$toss = array();
|
||||||
|
$status = 0;
|
||||||
|
$term_width = exec('tput cols', $toss, $status);
|
||||||
|
if ($status) {
|
||||||
|
$term_width = 64; // Arbitrary fall-back term width.
|
||||||
|
}
|
||||||
|
|
||||||
|
$line_count = 0;
|
||||||
|
foreach (explode("\n", $message) as $line) {
|
||||||
|
$line_count += count(str_split($line, $term_width));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Erasure MAGIC: Clear as many lines as the last output had.
|
||||||
|
for ($i = 0; $i < $last_lines; $i++) {
|
||||||
|
// Return to the beginning of the line
|
||||||
|
echo "\r";
|
||||||
|
// Erase to the end of the line
|
||||||
|
echo "\033[K";
|
||||||
|
// Move cursor Up a line
|
||||||
|
echo "\033[1A";
|
||||||
|
// Return to the beginning of the line
|
||||||
|
echo "\r";
|
||||||
|
// Erase to the end of the line
|
||||||
|
echo "\033[K";
|
||||||
|
// Return to the beginning of the line
|
||||||
|
echo "\r";
|
||||||
|
// Can be consolodated into
|
||||||
|
// echo "\r\033[K\033[1A\r\033[K\r";
|
||||||
|
}
|
||||||
|
|
||||||
|
$last_lines = $line_count;
|
||||||
|
|
||||||
|
echo $message . "\n";
|
||||||
|
}
|
||||||
241
dev/initdata/dbf/importdb-products.php
Normal file
@ -0,0 +1,241 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
/* Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||||
|
* Copyright (C) 2016 Juanjo Menent <jmenent@2byte.es>
|
||||||
|
*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* WARNING, THIS WILL LOAD MASS DATA ON YOUR INSTANCE
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file dev/initdata/import-product.php
|
||||||
|
* \brief Script example to insert products from a csv file.
|
||||||
|
* To purge data, you can have a look at purge-data.php
|
||||||
|
*/
|
||||||
|
// Test si mode batch
|
||||||
|
$sapi_type = php_sapi_name();
|
||||||
|
$script_file = basename(__FILE__);
|
||||||
|
$path = dirname(__FILE__) . '/';
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recupere root dolibarr
|
||||||
|
$path = preg_replace('/importdb-products.php/i', '', $_SERVER["PHP_SELF"]);
|
||||||
|
require $path . "../../htdocs/master.inc.php";
|
||||||
|
require $path . "includes/dbase.class.php";
|
||||||
|
include_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
|
||||||
|
include_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
|
||||||
|
|
||||||
|
//$delimiter = ',';
|
||||||
|
//$enclosure = '"';
|
||||||
|
//$linelength = 10000;
|
||||||
|
//$escape = '/';
|
||||||
|
// Global variables
|
||||||
|
$version = DOL_VERSION;
|
||||||
|
$confirmed = 1;
|
||||||
|
$error = 0;
|
||||||
|
|
||||||
|
$tvas = [
|
||||||
|
'1' => "20.00",
|
||||||
|
'2' => "5.50",
|
||||||
|
'3' => "0.00",
|
||||||
|
'4' => "20.60",
|
||||||
|
'5' => "19.60",
|
||||||
|
];
|
||||||
|
$tvasD = [
|
||||||
|
'1' => "20",
|
||||||
|
'2' => "5.5",
|
||||||
|
'3' => "0",
|
||||||
|
'4' => "20",
|
||||||
|
'5' => "20",
|
||||||
|
];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Main
|
||||||
|
*/
|
||||||
|
|
||||||
|
@set_time_limit(0);
|
||||||
|
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
|
||||||
|
dol_syslog($script_file . " launched with arg " . implode(',', $argv));
|
||||||
|
|
||||||
|
$table = $argv[1];
|
||||||
|
|
||||||
|
if (empty($argv[1])) {
|
||||||
|
print "Error: Which table ?\n";
|
||||||
|
print "\n";
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret = $user->fetch('', 'admin');
|
||||||
|
if (!$ret > 0) {
|
||||||
|
print 'A user with login "admin" and all permissions must be created to use this script.' . "\n";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = "SELECT * FROM `$table` WHERE 1";
|
||||||
|
$resql = $db->query($sql);
|
||||||
|
if ($resql)
|
||||||
|
while ($fields = $db->fetch_array($resql)) {
|
||||||
|
$errorrecord = 0;
|
||||||
|
if ($fields === false)
|
||||||
|
continue;
|
||||||
|
$nboflines++;
|
||||||
|
|
||||||
|
$produit = new Product($db);
|
||||||
|
$produit->type = 0;
|
||||||
|
$produit->status = 1;
|
||||||
|
$produit->ref = trim($fields['REF']);
|
||||||
|
if ($produit->ref == '')
|
||||||
|
continue;
|
||||||
|
print "Process line nb " . $j . ", ref " . $produit->ref;
|
||||||
|
$produit->label = trim($fields['LIBELLE']);
|
||||||
|
if ($produit->label == '')
|
||||||
|
$produit->label = $produit->ref;
|
||||||
|
if (empty($produit->label))
|
||||||
|
continue;
|
||||||
|
//$produit->description = trim($fields[4] . "\n" . ($fields[5] ? $fields[5] . ' x ' . $fields[6] . ' x ' . $fields[7] : ''));
|
||||||
|
// $produit->volume = price2num($fields[8]);
|
||||||
|
// $produit->volume_unit = 0;
|
||||||
|
$produit->weight = price2num($fields['MASSE']);
|
||||||
|
$produit->weight_units = 0; // -3 = g
|
||||||
|
//$produit->customcode = $fields[10];
|
||||||
|
$produit->barcode = str_pad($fields['CODE'], 12, "0", STR_PAD_LEFT);
|
||||||
|
$produit->barcode_type = '2';
|
||||||
|
$produit->import_key = $fields['CODE'];
|
||||||
|
|
||||||
|
$produit->status = 1;
|
||||||
|
$produit->status_buy = 1;
|
||||||
|
|
||||||
|
$produit->finished = 1;
|
||||||
|
|
||||||
|
// $produit->multiprices[0] = price2num($fields['TARIF0']);
|
||||||
|
// $produit->multiprices[1] = price2num($fields['TARIF1']);
|
||||||
|
// $produit->multiprices[2] = price2num($fields['TARIF2']);
|
||||||
|
// $produit->multiprices[3] = price2num($fields['TARIF3']);
|
||||||
|
// $produit->multiprices[4] = price2num($fields['TARIF4']);
|
||||||
|
// $produit->multiprices[5] = price2num($fields['TARIF5']);
|
||||||
|
// $produit->multiprices[6] = price2num($fields['TARIF6']);
|
||||||
|
// $produit->multiprices[7] = price2num($fields['TARIF7']);
|
||||||
|
// $produit->multiprices[8] = price2num($fields['TARIF8']);
|
||||||
|
// $produit->multiprices[9] = price2num($fields['TARIF9']);
|
||||||
|
// $produit->price_min = null;
|
||||||
|
// $produit->price_min_ttc = null;
|
||||||
|
// $produit->price = price2num($fields[11]);
|
||||||
|
// $produit->price_ttc = price2num($fields[12]);
|
||||||
|
// $produit->price_base_type = 'TTC';
|
||||||
|
// $produit->tva_tx = price2num($fields[13]);
|
||||||
|
$produit->tva_tx = (int) ($tvas[$fields['CODTVA']]);
|
||||||
|
$produit->tva_npr = 0;
|
||||||
|
// $produit->cost_price = price2num($fields[16]);
|
||||||
|
//compta
|
||||||
|
|
||||||
|
$produit->accountancy_code_buy = trim($fields['COMACH']);
|
||||||
|
$produit->accountancy_code_sell = trim($fields['COMVEN']);
|
||||||
|
// $produit->accountancy_code_sell_intra=trim($fields['COMVEN']);
|
||||||
|
// $produit->accountancy_code_sell_export=trim($fields['COMVEN']);
|
||||||
|
// Extrafields
|
||||||
|
// $produit->array_options['options_ecotaxdeee'] = price2num($fields[17]);
|
||||||
|
|
||||||
|
$produit->seuil_stock_alerte = $fields['STALERTE'];
|
||||||
|
$ret = $produit->create($user, 0);
|
||||||
|
if ($ret < 0) {
|
||||||
|
print " - Error in create result code = " . $ret . " - " . $produit->errorsToString();
|
||||||
|
$errorrecord++;
|
||||||
|
} else {
|
||||||
|
print " - Creation OK with ref " . $produit->ref . " - id = " . $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
dol_syslog("Add prices");
|
||||||
|
|
||||||
|
// If we use price level, insert price for each level
|
||||||
|
if (!$errorrecord && 1) {
|
||||||
|
//$ret1 = $produit->updatePrice($produit->price_ttc, $produit->price_base_type, $user, $produit->tva_tx, $produit->price_min, 1, $produit->tva_npr, 0, 0, array());
|
||||||
|
$ret1 = false;
|
||||||
|
for ($i = 0; $i < 10; $i++) {
|
||||||
|
if ($fields['TARIF' . ($i)] == 0)
|
||||||
|
continue;
|
||||||
|
$ret1 = $ret1 || $produit->updatePrice(price2num($fields['TARIF' . ($i)]), 'HT', $user, $produit->tva_tx, $produit->price_min, $i + 1, $produit->tva_npr, 0, 0, array()) < 0;
|
||||||
|
}
|
||||||
|
if ($ret1) {
|
||||||
|
print " - Error in updatePrice result " . $produit->errorsToString();
|
||||||
|
$errorrecord++;
|
||||||
|
} else {
|
||||||
|
print " - updatePrice OK";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// dol_syslog("Add multilangs");
|
||||||
|
// Add alternative languages
|
||||||
|
// if (!$errorrecord && 1) {
|
||||||
|
// $produit->multilangs['fr_FR'] = array('label' => $produit->label, 'description' => $produit->description, 'note' => $produit->note_private);
|
||||||
|
// $produit->multilangs['en_US'] = array('label' => $fields[3], 'description' => $produit->description, 'note' => $produit->note_private);
|
||||||
|
//
|
||||||
|
// $ret = $produit->setMultiLangs($user);
|
||||||
|
// if ($ret < 0) {
|
||||||
|
// print " - Error in setMultiLangs result code = " . $ret . " - " . $produit->errorsToString();
|
||||||
|
// $errorrecord++;
|
||||||
|
// } else {
|
||||||
|
// print " - setMultiLangs OK";
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
dol_syslog("Add stocks");
|
||||||
|
// stocks
|
||||||
|
if (!$errorrecord && $fields['STOCK'] != 0) {
|
||||||
|
$rets = $produit->correct_stock($user, 1, $fields['STOCK'], 0, 'Stock importé');
|
||||||
|
if ($rets < 0) {
|
||||||
|
print " - Error in correct_stock result " . $produit->errorsToString();
|
||||||
|
$errorrecord++;
|
||||||
|
} else {
|
||||||
|
print " - correct_stock OK";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//update date créa
|
||||||
|
if (!$errorrecord) {
|
||||||
|
$date = substr($fields['DATCREA'], 0, 4) . '-' . substr($fields['DATCREA'], 4, 2) . '-' . substr($fields['DATCREA'], 6, 2);
|
||||||
|
$retd = $db->query("UPDATE `llx_product` SET `datec` = '$date 00:00:00' WHERE `llx_product`.`rowid` = $produit->id");
|
||||||
|
if ($retd < 1) {
|
||||||
|
print " - Error in update date créa result " . $produit->errorsToString();
|
||||||
|
$errorrecord++;
|
||||||
|
} else {
|
||||||
|
print " - update date créa OK";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
if ($errorrecord) {
|
||||||
|
print( 'Error on record nb ' . $i . " - " . $produit->errorsToString() . "\n");
|
||||||
|
var_dump($db);
|
||||||
|
die();
|
||||||
|
$error++; // $errorrecord will be reset
|
||||||
|
}
|
||||||
|
$j++;
|
||||||
|
} else
|
||||||
|
die("error : $sql");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// commit or rollback
|
||||||
|
print "Nb of lines qualified: " . $nboflines . "\n";
|
||||||
|
print "Nb of errors: " . $error . "\n";
|
||||||
|
$db->close();
|
||||||
|
|
||||||
|
exit($error);
|
||||||
355
dev/initdata/dbf/importdb-thirdparties.php
Normal file
@ -0,0 +1,355 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
/* Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||||
|
* Copyright (C) 2016 Juanjo Menent <jmenent@2byte.es>
|
||||||
|
*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* WARNING, THIS WILL LOAD MASS DATA ON YOUR INSTANCE
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file dev/initdata/import-product.php
|
||||||
|
* \brief Script example to insert products from a csv file.
|
||||||
|
* To purge data, you can have a look at purge-data.php
|
||||||
|
*/
|
||||||
|
// Test si mode batch
|
||||||
|
$sapi_type = php_sapi_name();
|
||||||
|
$script_file = basename(__FILE__);
|
||||||
|
$path = dirname(__FILE__) . '/';
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recupere root dolibarr
|
||||||
|
$path = preg_replace('/importdb-thirdparties.php/i', '', $_SERVER["PHP_SELF"]);
|
||||||
|
require $path . "../../htdocs/master.inc.php";
|
||||||
|
require $path . "includes/dbase.class.php";
|
||||||
|
include_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
|
||||||
|
include_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
|
||||||
|
|
||||||
|
//$delimiter = ',';
|
||||||
|
//$enclosure = '"';
|
||||||
|
//$linelength = 10000;
|
||||||
|
//$escape = '/';
|
||||||
|
// Global variables
|
||||||
|
$version = DOL_VERSION;
|
||||||
|
$confirmed = 1;
|
||||||
|
$error = 0;
|
||||||
|
|
||||||
|
$civilPrivate = array("MLLE",
|
||||||
|
"MM",
|
||||||
|
"MM/MADAME",
|
||||||
|
"MME",
|
||||||
|
"MME.",
|
||||||
|
"MME²",
|
||||||
|
"MMONSIEUR",
|
||||||
|
"MMR",
|
||||||
|
"MOBNSIEUR",
|
||||||
|
"MOMSIEUR",
|
||||||
|
"MON SIEUR",
|
||||||
|
"MONDIAL",
|
||||||
|
"MONIEUR",
|
||||||
|
"MONJSIEUR",
|
||||||
|
"MONNSIEUR",
|
||||||
|
"MONRIEUR",
|
||||||
|
"MONS",
|
||||||
|
"MONSIEÕR",
|
||||||
|
"MONSIER",
|
||||||
|
"MONSIERU",
|
||||||
|
"MONSIEU",
|
||||||
|
"monsieue",
|
||||||
|
"MONSIEUR",
|
||||||
|
"Monsieur \"",
|
||||||
|
"MONSIEUR \"",
|
||||||
|
"MONSIEUR E",
|
||||||
|
"MONSIEUR DENIS",
|
||||||
|
"MONSIEUR ET MME",
|
||||||
|
"MONSIEUR!",
|
||||||
|
"MONSIEUR.",
|
||||||
|
"MONSIEUR.MADAME",
|
||||||
|
"MONSIEUR3",
|
||||||
|
"MONSIEURN",
|
||||||
|
"MONSIEURT",
|
||||||
|
"MONSIEUR£",
|
||||||
|
"MONSIEYR",
|
||||||
|
"Monsigur",
|
||||||
|
"MONSIIEUR",
|
||||||
|
"MONSIUER",
|
||||||
|
"MONSIZEUR",
|
||||||
|
"MOPNSIEUR",
|
||||||
|
"MOSIEUR",
|
||||||
|
"MR",
|
||||||
|
"Mr Mme",
|
||||||
|
"Mr - MME",
|
||||||
|
"MR BLANC",
|
||||||
|
"MR ET MME",
|
||||||
|
"mr mm",
|
||||||
|
"MR OU MME",
|
||||||
|
"Mr.",
|
||||||
|
"MR/MME",
|
||||||
|
"MRME",
|
||||||
|
"MRR",
|
||||||
|
"Mrs",
|
||||||
|
"Mademoiselle",
|
||||||
|
"MADAOME",
|
||||||
|
"madamme",
|
||||||
|
"MADAME",
|
||||||
|
"M0NSIEUR",
|
||||||
|
"M.et Madame",
|
||||||
|
"M. ET MR",
|
||||||
|
"M.",
|
||||||
|
"M%",
|
||||||
|
"M MME",
|
||||||
|
"M ET MME",
|
||||||
|
"M",
|
||||||
|
"M CROCE",
|
||||||
|
"M DIEVART",
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Main
|
||||||
|
*/
|
||||||
|
|
||||||
|
@set_time_limit(0);
|
||||||
|
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
|
||||||
|
dol_syslog($script_file . " launched with arg " . implode(',', $argv));
|
||||||
|
|
||||||
|
$table = $argv[1];
|
||||||
|
|
||||||
|
if (empty($argv[1])) {
|
||||||
|
print "Error: Quelle table ?\n";
|
||||||
|
print "\n";
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret = $user->fetch('', 'admin');
|
||||||
|
if (!$ret > 0) {
|
||||||
|
print 'A user with login "admin" and all permissions must be created to use this script.' . "\n";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = "SELECT * FROM `$table` WHERE 1 "; //ORDER BY REMISE DESC,`LCIVIL` DESC";
|
||||||
|
$resql = $db->query($sql);
|
||||||
|
//$db->begin();
|
||||||
|
if ($resql)
|
||||||
|
while ($fields = $db->fetch_array($resql)) {
|
||||||
|
$i++;
|
||||||
|
$errorrecord = 0;
|
||||||
|
|
||||||
|
if ($startlinenb && $i < $startlinenb)
|
||||||
|
continue;
|
||||||
|
if ($endlinenb && $i > $endlinenb)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
$nboflines++;
|
||||||
|
|
||||||
|
$object = new Societe($db);
|
||||||
|
$object->import_key = $fields['CODE'];
|
||||||
|
$object->state = 1;
|
||||||
|
$object->client = 3;
|
||||||
|
$object->fournisseur = 0;
|
||||||
|
|
||||||
|
$object->name = $fields['FCIVIL'] . ' ' . $fields['FNOM'];
|
||||||
|
//$object->name_alias = $fields[0] != $fields[13] ? trim($fields[0]) : '';
|
||||||
|
|
||||||
|
$date = $fields['DATCREA'] ? $fields['DATCREA'] : ($fields['DATMOD'] ? $fields['DATMOD'] : '20200101');
|
||||||
|
$object->code_client = 'CU' . substr($date, 2, 2) . substr($date, 4, 2) . '-' . str_pad(substr($fields['CODE'], 0, 5), 5, "0", STR_PAD_LEFT);
|
||||||
|
|
||||||
|
|
||||||
|
$object->address = trim($fields['FADR1']);
|
||||||
|
if ($fields['FADR2'])
|
||||||
|
$object->address .= "\n" . trim($fields['FADR2']);
|
||||||
|
if ($fields['FADR3'])
|
||||||
|
$object->address .= "\n" . trim($fields['FADR3']);
|
||||||
|
|
||||||
|
$object->zip = trim($fields['FPOSTE']);
|
||||||
|
$object->town = trim($fields['FVILLE']);
|
||||||
|
if ($fields['FPAYS'])
|
||||||
|
$object->country_id = dol_getIdFromCode($db, trim(ucwords(strtolower($fields['FPAYS']))), 'c_country', 'label', 'rowid');
|
||||||
|
else
|
||||||
|
$object->country_id = 1;
|
||||||
|
$object->phone = trim($fields['FTEL']) ? trim($fields['FTEL']) : trim($fields['FCONTACT']);
|
||||||
|
$object->phone = substr($object->phone, 0, 20);
|
||||||
|
$object->fax = trim($fields['FFAX']) ? trim($fields['FFAX']) : trim($fields['FCONTACT']);
|
||||||
|
$object->fax = substr($object->fax, 0, 20);
|
||||||
|
$object->email = trim($fields['FMAIL']);
|
||||||
|
// $object->idprof2 = trim($fields[29]);
|
||||||
|
$object->tva_intra = str_replace(['.', ' '], '', $fields['TVAINTRA']);
|
||||||
|
$object->tva_intra = substr($object->tva_intra, 0, 20);
|
||||||
|
$object->default_lang = 'fr_FR';
|
||||||
|
|
||||||
|
$object->cond_reglement_id = dol_getIdFromCode($db, 'PT_ORDER', 'c_payment_term', 'code', 'rowid', 1);
|
||||||
|
$object->multicurrency_code = 'EUR';
|
||||||
|
|
||||||
|
if ($fields['REMISE'] != '0.00') {
|
||||||
|
$object->remise_percent = abs($fields['REMISE']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// $object->code_client = $fields[9];
|
||||||
|
// $object->code_fournisseur = $fields[10];
|
||||||
|
|
||||||
|
|
||||||
|
if ($fields['FCIVIL']) {
|
||||||
|
$labeltype = in_array($fields['FCIVIL'], $civilPrivate) ? 'TE_PRIVATE' : 'TE_SMALL';
|
||||||
|
$object->typent_id = dol_getIdFromCode($db, $labeltype, 'c_typent', 'code');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set price level
|
||||||
|
$object->price_level = $fields['TARIF'] + 1;
|
||||||
|
// if ($labeltype == 'Revendeur')
|
||||||
|
// $object->price_level = 2;
|
||||||
|
|
||||||
|
print "Process line nb " . $i . ", code " . $fields['CODE'] . ", name " . $object->name;
|
||||||
|
|
||||||
|
|
||||||
|
// Extrafields
|
||||||
|
$object->array_options['options_banque'] = $fields['BANQUE'];
|
||||||
|
$object->array_options['options_banque2'] = $fields['BANQUE2'];
|
||||||
|
$object->array_options['options_banquevalid'] = $fields['VALID'];
|
||||||
|
|
||||||
|
if (!$errorrecord) {
|
||||||
|
$ret = $object->create($user);
|
||||||
|
if ($ret < 0) {
|
||||||
|
print " - Error in create result code = " . $ret . " - " . $object->errorsToString();
|
||||||
|
$errorrecord++;
|
||||||
|
var_dump($object->code_client, $db);
|
||||||
|
die();
|
||||||
|
} else {
|
||||||
|
print " - Creation OK with name " . $object->name . " - id = " . $ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$errorrecord) {
|
||||||
|
dol_syslog("Set price level");
|
||||||
|
$object->set_price_level($object->price_level, $user);
|
||||||
|
}
|
||||||
|
if (!$errorrecord && @$object->remise_percent) {
|
||||||
|
dol_syslog("Set remise client");
|
||||||
|
$object->set_remise_client($object->remise_percent, 'Importé', $user);
|
||||||
|
}
|
||||||
|
|
||||||
|
dol_syslog("Add contact");
|
||||||
|
// Insert an invoice contact if there is an invoice email != standard email
|
||||||
|
if (!$errorrecord && ($fields['LCIVIL'] || $fields['LNOM'])) {
|
||||||
|
$madame = array("MADAME",
|
||||||
|
"MADEMOISELLE",
|
||||||
|
"MELLE",
|
||||||
|
"MLLE",
|
||||||
|
"MM",
|
||||||
|
"Mme",
|
||||||
|
"MNE",
|
||||||
|
);
|
||||||
|
$monsieur = array("M",
|
||||||
|
"M ET MME",
|
||||||
|
"M MME",
|
||||||
|
"M.",
|
||||||
|
"M. MME",
|
||||||
|
"M. OU Mme",
|
||||||
|
"M.ou Madame",
|
||||||
|
"MONSEUR",
|
||||||
|
"MONSIER",
|
||||||
|
"MONSIEU",
|
||||||
|
"MONSIEUR",
|
||||||
|
"monsieur:mme",
|
||||||
|
"MONSIEUR¨",
|
||||||
|
"MONSIEZUR",
|
||||||
|
"MONSIUER",
|
||||||
|
"MONSKIEUR",
|
||||||
|
"MR",
|
||||||
|
);
|
||||||
|
$ret1 = $ret2 = 0;
|
||||||
|
|
||||||
|
$contact = new Contact($db);
|
||||||
|
if (in_array($fields['LCIVIL'], $madame)) {
|
||||||
|
// une dame
|
||||||
|
$contact->civility_id = 'MME';
|
||||||
|
$contact->lastname = $fields['LNOM'];
|
||||||
|
} elseif (in_array($fields['LCIVIL'], $monsieur)) {
|
||||||
|
// un monsieur
|
||||||
|
$contact->civility_id = 'MR';
|
||||||
|
$contact->lastname = $fields['LNOM'];
|
||||||
|
} elseif (in_array($fields['LCIVIL'], ['DOCTEUR'])) {
|
||||||
|
// un monsieur
|
||||||
|
$contact->civility_id = 'DR';
|
||||||
|
$contact->lastname = $fields['LNOM'];
|
||||||
|
} else {
|
||||||
|
// un a rattraper
|
||||||
|
$contact->lastname = $fields['LCIVIL'] . " " . $fields['LNOM'];
|
||||||
|
}
|
||||||
|
$contact->address = trim($fields['LADR1']);
|
||||||
|
if ($fields['LADR2'])
|
||||||
|
$contact->address .= "\n" . trim($fields['LADR2']);
|
||||||
|
if ($fields['LADR3'])
|
||||||
|
$contact->address .= "\n" . trim($fields['LADR3']);
|
||||||
|
|
||||||
|
$contact->zip = trim($fields['LPOSTE']);
|
||||||
|
$contact->town = trim($fields['LVILLE']);
|
||||||
|
if ($fields['FPAYS'])
|
||||||
|
$contact->country_id = dol_getIdFromCode($db, trim(ucwords(strtolower($fields['LPAYS']))), 'c_country', 'label', 'rowid');
|
||||||
|
else
|
||||||
|
$contact->country_id = 1;
|
||||||
|
$contact->email = $fields['LMAIL'];
|
||||||
|
$contact->phone = trim($fields['LTEL']) ? trim($fields['LTEL']) : trim($fields['LCONTACT']);
|
||||||
|
$contact->fax = trim($fields['LFAX']) ? trim($fields['LFAX']) : trim($fields['LCONTACT']);
|
||||||
|
$contact->socid = $object->id;
|
||||||
|
|
||||||
|
$ret1 = $contact->create($user);
|
||||||
|
if ($ret1 > 0) {
|
||||||
|
//$ret2=$contact->add_contact($object->id, 'BILLING');
|
||||||
|
}
|
||||||
|
if ($ret1 < 0 || $ret2 < 0) {
|
||||||
|
print " - Error in create contact result code = " . $ret1 . " " . $ret2 . " - " . $contact->errorsToString();
|
||||||
|
$errorrecord++;
|
||||||
|
} else {
|
||||||
|
print " - create contact OK";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//update date créa
|
||||||
|
if (!$errorrecord) {
|
||||||
|
$datec = substr($date, 0, 4) . '-' . substr($date, 4, 2) . '-' . substr($date, 6, 2);
|
||||||
|
$retd = $db->query("UPDATE `llx_societe` SET `datec` = '$datec 00:00:00' WHERE `rowid` = $object->id");
|
||||||
|
if ($retd < 1) {
|
||||||
|
print " - Error in update date créa result " . $object->errorsToString();
|
||||||
|
$errorrecord++;
|
||||||
|
} else {
|
||||||
|
print " - update date créa OK";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
if ($errorrecord) {
|
||||||
|
print( 'Error on record nb ' . $i . " - " . $object->errorsToString() . "\n");
|
||||||
|
var_dump($db, $object, $contact);
|
||||||
|
// $db->rollback();
|
||||||
|
die();
|
||||||
|
$error++; // $errorrecord will be reset
|
||||||
|
}
|
||||||
|
$j++;
|
||||||
|
} else
|
||||||
|
die("error : $sql");
|
||||||
|
|
||||||
|
$db->commit();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// commit or rollback
|
||||||
|
print "Nb of lines qualified: " . $nboflines . "\n";
|
||||||
|
print "Nb of errors: " . $error . "\n";
|
||||||
|
$db->close();
|
||||||
|
|
||||||
|
exit($error);
|
||||||
402
dev/initdata/dbf/includes/dbase.class.php
Normal file
@ -0,0 +1,402 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* \file dev/initdata/dbf/includes/dbase.class.php
|
||||||
|
* \ingroup dev
|
||||||
|
* \brief Class to manage DBF databases
|
||||||
|
*/
|
||||||
|
|
||||||
|
// source : https://github.com/donfbecker/php-dbase
|
||||||
|
|
||||||
|
define('DBASE_RDONLY', 0);
|
||||||
|
define('DBASE_WRONLY', 1);
|
||||||
|
define('DBASE_RDWR', 2);
|
||||||
|
define('DBASE_TYPE_DBASE', 0);
|
||||||
|
define('DBASE_TYPE_FOXPRO', 1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for DBase
|
||||||
|
*/
|
||||||
|
class DBase
|
||||||
|
{
|
||||||
|
private $fd;
|
||||||
|
private $headerLength = 0;
|
||||||
|
private $fields = array();
|
||||||
|
private $fieldCount = 0;
|
||||||
|
private $recordLength = 0;
|
||||||
|
private $recordCount = 0;
|
||||||
|
|
||||||
|
//resource dbase_open ( string $filename , int $mode )
|
||||||
|
public static function open($filename, $mode)
|
||||||
|
{
|
||||||
|
if (!file_exists($filename))
|
||||||
|
return false;
|
||||||
|
$modes = array('r', 'w', 'r+');
|
||||||
|
$mode = $modes[$mode];
|
||||||
|
$fd = fopen($filename, $mode);
|
||||||
|
if (!$fd)
|
||||||
|
return false;
|
||||||
|
return new DBase($fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
//resource dbase_create ( string $filename , array $fields [, int $type = DBASE_TYPE_DBASE ] )
|
||||||
|
public static function create($filename, $fields, $type = DBASE_TYPE_DBASE)
|
||||||
|
{
|
||||||
|
if (file_exists($filename))
|
||||||
|
return false;
|
||||||
|
$fd = fopen($filename, 'c+');
|
||||||
|
if (!$fd)
|
||||||
|
return false;
|
||||||
|
// Byte 0 (1 byte): Valid dBASE for DOS file; bits 0-2 indicate version number, bit 3
|
||||||
|
// indicates the presence of a dBASE for DOS memo file, bits 4-6 indicate the
|
||||||
|
// presence of a SQL table, bit 7 indicates the presence of any memo file
|
||||||
|
// (either dBASE m PLUS or dBASE for DOS)
|
||||||
|
self::putChar8($fd, 5);
|
||||||
|
// Byte 1-3 (3 bytes): Date of last update; formatted as YYMMDD
|
||||||
|
self::putChar8($fd, date('Y') - 1900);
|
||||||
|
self::putChar8($fd, date('m'));
|
||||||
|
self::putChar8($fd, date('d'));
|
||||||
|
// Byte 4-7 (32-bit number): Number of records in the database file. Currently 0
|
||||||
|
self::putInt32($fd, 0);
|
||||||
|
// Byte 8-9 (16-bit number): Number of bytes in the header.
|
||||||
|
self::putInt16($fd, 32 + (32 * count($fields)) + 1);
|
||||||
|
// Byte 10-11 (16-bit number): Number of bytes in record.
|
||||||
|
// Make sure the include the byte for deleted flag
|
||||||
|
$len = 1;
|
||||||
|
foreach ($fields as &$field)
|
||||||
|
$len += self::length($field);
|
||||||
|
self::putInt16($fd, $len);
|
||||||
|
// Byte 12-13 (2 bytes): Reserved, 0 filled.
|
||||||
|
self::putInt16($fd, 0);
|
||||||
|
// Byte 14 (1 byte): Flag indicating incomplete transaction
|
||||||
|
// The ISMARKEDO function checks this flag. BEGIN TRANSACTION sets it to 1, END TRANSACTION and ROLLBACK reset it to 0.
|
||||||
|
self::putChar8($fd, 0);
|
||||||
|
// Byte 15 (1 byte): Encryption flag. If this flag is set to 1, the message Database encrypted appears. Changing this flag to 0 removes the message, but does not decrypt the file.
|
||||||
|
self::putChar8($fd, 0);
|
||||||
|
// Byte 16-27 (12 bytes): Reserved for dBASE for DOS in a multi-user environment
|
||||||
|
self::putInt32($fd, 0);
|
||||||
|
self::putInt32($fd, 0);
|
||||||
|
self::putInt32($fd, 0);
|
||||||
|
// Byte 28 (1 byte): Production .mdx file flag; 0x01 if there is a production .mdx file, 0x00 if not
|
||||||
|
self::putChar8($fd, 0);
|
||||||
|
// Byte 29 (1 byte): Language driver ID
|
||||||
|
// (no clue what this is)
|
||||||
|
self::putChar8($fd, 0);
|
||||||
|
// Byte 30-31 (2 bytes): Reserved, 0 filled.
|
||||||
|
self::putInt16($fd, 0);
|
||||||
|
// Byte 32 - n (32 bytes each): Field descriptor array
|
||||||
|
foreach ($fields as &$field) {
|
||||||
|
self::putString($fd, $field[0], 11); // Byte 0 - 10 (11 bytes): Field name in ASCII (zero-filled)
|
||||||
|
self::putString($fd, $field[1], 1); // Byte 11 (1 byte): Field type in ASCII (C, D, F, L, M, or N)
|
||||||
|
self::putInt32($fd, 0); // Byte 12 - 15 (4 bytes): Reserved
|
||||||
|
self::putChar8($fd, self::length($field)); // Byte 16 (1 byte): Field length in binary. The maximum length of a field is 254 (0xFE).
|
||||||
|
self::putChar8($fd, $field[3]); // Byte 17 (1 byte): Field decimal count in binary
|
||||||
|
self::putInt16($fd, 0); // Byte 18 - 19 (2 bytes): Work area ID
|
||||||
|
self::putChar8($fd, 0); // Byte 20 (1 byte): Example (??)
|
||||||
|
self::putInt32($fd, 0); // Byte 21 - 30 (10 bytes): Reserved
|
||||||
|
self::putInt32($fd, 0);
|
||||||
|
self::putInt16($fd, 0);
|
||||||
|
self::putChar8($fd, 0); // Byte 31 (1 byte): Production MDX field flag; 1 if field has an index tag in the production MDX file, 0 if not
|
||||||
|
}
|
||||||
|
// Byte n + 1 (1 byte): 0x0D as the field descriptor array terminator
|
||||||
|
self::putChar8($fd, 0x0D);
|
||||||
|
return new DBase($fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create DBase instance
|
||||||
|
private function __construct($fd)
|
||||||
|
{
|
||||||
|
$this->fd = $fd;
|
||||||
|
// Byte 4-7 (32-bit number): Number of records in the database file. Currently 0
|
||||||
|
fseek($this->fd, 4, SEEK_SET);
|
||||||
|
$this->recordCount = self::getInt32($fd);
|
||||||
|
// Byte 8-9 (16-bit number): Number of bytes in the header.
|
||||||
|
fseek($this->fd, 8, SEEK_SET);
|
||||||
|
$this->headerLength = self::getInt16($fd);
|
||||||
|
// Number of fields is (headerLength - 33) / 32)
|
||||||
|
$this->fieldCount = ($this->headerLength - 33) / 32;
|
||||||
|
// Byte 10-11 (16-bit number): Number of bytes in record.
|
||||||
|
fseek($this->fd, 10, SEEK_SET);
|
||||||
|
$this->recordLength = self::getInt16($fd);
|
||||||
|
// Byte 32 - n (32 bytes each): Field descriptor array
|
||||||
|
fseek($fd, 32, SEEK_SET);
|
||||||
|
for ($i = 0; $i < $this->fieldCount; $i++) {
|
||||||
|
$data = fread($this->fd, 32);
|
||||||
|
$field = array_map('trim', unpack('a11name/a1type/c4/c1length/c1precision/s1workid/c1example/c10/c1production', $data));
|
||||||
|
$this->fields[] = $field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//bool dbase_close ( resource $dbase_identifier )
|
||||||
|
public function close()
|
||||||
|
{
|
||||||
|
fclose($this->fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
//array dbase_get_header_info ( resource $dbase_identifier )
|
||||||
|
public function get_header_info()
|
||||||
|
{
|
||||||
|
return $this->fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
//int dbase_numfields ( resource $dbase_identifier )
|
||||||
|
public function numfields()
|
||||||
|
{
|
||||||
|
return $this->fieldCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
//int dbase_numrecords ( resource $dbase_identifier )
|
||||||
|
public function numrecords()
|
||||||
|
{
|
||||||
|
return $this->recordCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
//bool dbase_add_record ( resource $dbase_identifier , array $record )
|
||||||
|
public function add_record($record)
|
||||||
|
{
|
||||||
|
if (count($record) != $this->fieldCount)
|
||||||
|
return false;
|
||||||
|
// Seek to end of file, minus the end of file marker
|
||||||
|
fseek($this->fd, 0, SEEK_END);
|
||||||
|
// Put the deleted flag
|
||||||
|
self::putChar8($this->fd, 0x20);
|
||||||
|
// Put the record
|
||||||
|
if (!$this->putRecord($record))
|
||||||
|
return false;
|
||||||
|
// Update the record count
|
||||||
|
fseek($this->fd, 4);
|
||||||
|
self::putInt32($this->fd, ++$this->recordCount);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//bool dbase_replace_record ( resource $dbase_identifier , array $record , int $record_number )
|
||||||
|
public function replace_record($record, $record_number)
|
||||||
|
{
|
||||||
|
if (count($record) != $this->fieldCount)
|
||||||
|
return false;
|
||||||
|
if ($record_number < 1 || $record_number > $this->recordCount)
|
||||||
|
return false;
|
||||||
|
// Skip to the record location, plus the 1 byte for the deleted flag
|
||||||
|
fseek($this->fd, $this->headerLength + ($this->recordLength * ($record_number - 1)) + 1);
|
||||||
|
return $this->putRecord($record);
|
||||||
|
}
|
||||||
|
|
||||||
|
//bool dbase_delete_record ( resource $dbase_identifier , int $record_number )
|
||||||
|
public function delete_record($record_number)
|
||||||
|
{
|
||||||
|
if ($record_number < 1 || $record_number > $this->recordCount)
|
||||||
|
return false;
|
||||||
|
fseek($this->fd, $this->headerLength + ($this->recordLength * ($record_number - 1)));
|
||||||
|
self::putChar8($this->fd, 0x2A);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//array dbase_get_record ( resource $dbase_identifier , int $record_number )
|
||||||
|
public function get_record($record_number)
|
||||||
|
{
|
||||||
|
if ($record_number < 1 || $record_number > $this->recordCount)
|
||||||
|
return false;
|
||||||
|
fseek($this->fd, $this->headerLength + ($this->recordLength * ($record_number - 1)));
|
||||||
|
$record = array(
|
||||||
|
'deleted' => self::getChar8($this->fd) == 0x2A ? 1 : 0
|
||||||
|
);
|
||||||
|
foreach ($this->fields as $i => &$field) {
|
||||||
|
$value = trim(fread($this->fd, $field['length']));
|
||||||
|
if ($field['type'] == 'L') {
|
||||||
|
$value = strtolower($value);
|
||||||
|
if ($value == 't' || $value == 'y')
|
||||||
|
$value = true;
|
||||||
|
elseif ($value == 'f' || $value == 'n')
|
||||||
|
$value = false;
|
||||||
|
else
|
||||||
|
$value = null;
|
||||||
|
}
|
||||||
|
$record[$i] = $value;
|
||||||
|
}
|
||||||
|
return $record;
|
||||||
|
}
|
||||||
|
|
||||||
|
//array dbase_get_record_with_names ( resource $dbase_identifier , int $record_number )
|
||||||
|
public function get_record_with_names($record_number)
|
||||||
|
{
|
||||||
|
if ($record_number < 1 || $record_number > $this->recordCount)
|
||||||
|
return false;
|
||||||
|
$record = $this->get_record($record_number);
|
||||||
|
foreach ($this->fields as $i => &$field) {
|
||||||
|
$record[$field['name']] = $record[$i];
|
||||||
|
unset($record[$i]);
|
||||||
|
}
|
||||||
|
return $record;
|
||||||
|
}
|
||||||
|
|
||||||
|
//bool dbase_pack ( resource $dbase_identifier )
|
||||||
|
public function pack()
|
||||||
|
{
|
||||||
|
$in_offset = $out_offset = $this->headerLength;
|
||||||
|
$new_count = 0;
|
||||||
|
$rec_count = $this->recordCount;
|
||||||
|
while ($rec_count > 0) {
|
||||||
|
fseek($this->fd, $in_offset, SEEK_SET);
|
||||||
|
$record = fread($this->fd, $this->recordLength);
|
||||||
|
$deleted = substr($record, 0, 1);
|
||||||
|
if ($deleted != '*') {
|
||||||
|
fseek($this->fd, $out_offset, SEEK_SET);
|
||||||
|
fwrite($this->fd, $record);
|
||||||
|
$out_offset += $this->recordLength;
|
||||||
|
$new_count++;
|
||||||
|
}
|
||||||
|
$in_offset += $this->recordLength;
|
||||||
|
$rec_count--;
|
||||||
|
}
|
||||||
|
ftruncate($this->fd, $out_offset);
|
||||||
|
// Update the record count
|
||||||
|
fseek($this->fd, 4);
|
||||||
|
self::putInt32($this->fd, $new_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A few utilitiy functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static function length($field)
|
||||||
|
{
|
||||||
|
switch ($field[1]) {
|
||||||
|
case 'D': // Date: Numbers and a character to separate month, day, and year (stored internally as 8 digits in YYYYMMDD format)
|
||||||
|
return 8;
|
||||||
|
case 'T': // DateTime (YYYYMMDDhhmmss.uuu) (FoxPro)
|
||||||
|
return 18;
|
||||||
|
case 'M': // Memo (ignored): All ASCII characters (stored internally as 10 digits representing a .dbt block number, right justified, padded with whitespaces)
|
||||||
|
case 'N': // Number: -.0123456789 (right justified, padded with whitespaces)
|
||||||
|
case 'F': // Float: -.0123456789 (right justified, padded with whitespaces)
|
||||||
|
case 'C': // String: All ASCII characters (padded with whitespaces up to the field's length)
|
||||||
|
return $field[2];
|
||||||
|
case 'L': // Boolean: YyNnTtFf? (? when not initialized)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Functions for reading and writing bytes
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static function getChar8($fd)
|
||||||
|
{
|
||||||
|
return ord(fread($fd, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function putChar8($fd, $value)
|
||||||
|
{
|
||||||
|
return fwrite($fd, chr($value));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getInt16($fd, $n = 1)
|
||||||
|
{
|
||||||
|
$data = fread($fd, 2 * $n);
|
||||||
|
$i = unpack("S$n", $data);
|
||||||
|
if ($n == 1)
|
||||||
|
return (int) $i[1];
|
||||||
|
else
|
||||||
|
return array_merge($i);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function putInt16($fd, $value)
|
||||||
|
{
|
||||||
|
return fwrite($fd, pack('S', $value));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getInt32($fd, $n = 1)
|
||||||
|
{
|
||||||
|
$data = fread($fd, 4 * $n);
|
||||||
|
$i = unpack("L$n", $data);
|
||||||
|
if ($n == 1)
|
||||||
|
return (int) $i[1];
|
||||||
|
else
|
||||||
|
return array_merge($i);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function putInt32($fd, $value)
|
||||||
|
{
|
||||||
|
return fwrite($fd, pack('L', $value));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function putString($fd, $value, $length = 254)
|
||||||
|
{
|
||||||
|
$ret = fwrite($fd, pack('A' . $length, $value));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function putRecord($record)
|
||||||
|
{
|
||||||
|
foreach ($this->fields as $i => &$field) {
|
||||||
|
$value = $record[$i];
|
||||||
|
// Number types are right aligned with spaces
|
||||||
|
if ($field['type'] == 'N' || $field['type'] == 'F' && strlen($value) < $field['length']) {
|
||||||
|
$value = str_repeat(' ', $field['length'] - strlen($value)) . $value;
|
||||||
|
}
|
||||||
|
self::putString($this->fd, $value, $field['length']);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('dbase_open')) {
|
||||||
|
|
||||||
|
function dbase_open($filename, $mode)
|
||||||
|
{
|
||||||
|
return DBase::open($filename, $mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
function dbase_create($filename, $fields, $type = DBASE_TYPE_DBASE)
|
||||||
|
{
|
||||||
|
return DBase::create($filename, $fields, $type);
|
||||||
|
}
|
||||||
|
|
||||||
|
function dbase_close($dbase_identifier)
|
||||||
|
{
|
||||||
|
return $dbase_identifier->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
function dbase_get_header_info($dbase_identifier)
|
||||||
|
{
|
||||||
|
return $dbase_identifier->get_header_info();
|
||||||
|
}
|
||||||
|
|
||||||
|
function dbase_numfields($dbase_identifier)
|
||||||
|
{
|
||||||
|
$dbase_identifier->numfields();
|
||||||
|
}
|
||||||
|
|
||||||
|
function dbase_numrecords($dbase_identifier)
|
||||||
|
{
|
||||||
|
return $dbase_identifier->numrecords();
|
||||||
|
}
|
||||||
|
|
||||||
|
function dbase_add_record($dbase_identifier, $record)
|
||||||
|
{
|
||||||
|
return $dbase_identifier->add_record($record);
|
||||||
|
}
|
||||||
|
|
||||||
|
function dbase_delete_record($dbase_identifier, $record_number)
|
||||||
|
{
|
||||||
|
return $dbase_identifier->delete_record($record_number);
|
||||||
|
}
|
||||||
|
|
||||||
|
function dbase_replace_record($dbase_identifier, $record, $record_number)
|
||||||
|
{
|
||||||
|
return $dbase_identifier->replace_record($record, $record_number);
|
||||||
|
}
|
||||||
|
|
||||||
|
function dbase_get_record($dbase_identifier, $record_number)
|
||||||
|
{
|
||||||
|
return $dbase_identifier->get_record($record_number);
|
||||||
|
}
|
||||||
|
|
||||||
|
function dbase_get_record_with_names($dbase_identifier, $record_number)
|
||||||
|
{
|
||||||
|
return $dbase_identifier->get_record_with_names($record_number);
|
||||||
|
}
|
||||||
|
|
||||||
|
function dbase_pack($dbase_identifier)
|
||||||
|
{
|
||||||
|
return $dbase_identifier->pack();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -26,7 +26,7 @@
|
|||||||
// Test si mode batch
|
// Test si mode batch
|
||||||
$sapi_type = php_sapi_name();
|
$sapi_type = php_sapi_name();
|
||||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||||
echo "Erreur: Vous utilisez l'interpreteur PHP pour le mode CGI. Pour executer mailing-send.php en ligne de commande, vous devez utiliser l'interpreteur PHP pour le mode CLI.\n";
|
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
// Test si mode batch
|
// Test si mode batch
|
||||||
$sapi_type = php_sapi_name();
|
$sapi_type = php_sapi_name();
|
||||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||||
echo "Erreur: Vous utilisez l'interpreteur PHP pour le mode CGI. Pour executer mailing-send.php en ligne de commande, vous devez utiliser l'interpreteur PHP pour le mode CLI.\n";
|
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
// Test si mode batch
|
// Test si mode batch
|
||||||
$sapi_type = php_sapi_name();
|
$sapi_type = php_sapi_name();
|
||||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||||
echo "Erreur: Vous utilisez l'interpreteur PHP pour le mode CGI. Pour executer mailing-send.php en ligne de commande, vous devez utiliser l'interpreteur PHP pour le mode CLI.\n";
|
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
// Test si mode batch
|
// Test si mode batch
|
||||||
$sapi_type = php_sapi_name();
|
$sapi_type = php_sapi_name();
|
||||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||||
echo "Erreur: Vous utilisez l'interpreteur PHP pour le mode CGI. Pour executer mailing-send.php en ligne de commande, vous devez utiliser l'interpreteur PHP pour le mode CLI.\n";
|
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
// Test si mode batch
|
// Test si mode batch
|
||||||
$sapi_type = php_sapi_name();
|
$sapi_type = php_sapi_name();
|
||||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||||
echo "Erreur: Vous utilisez l'interpreteur PHP pour le mode CGI. Pour executer mailing-send.php en ligne de commande, vous devez utiliser l'interpreteur PHP pour le mode CLI.\n";
|
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,7 @@ $sapi_type = php_sapi_name();
|
|||||||
$script_file = basename(__FILE__);
|
$script_file = basename(__FILE__);
|
||||||
$path=dirname(__FILE__).'/';
|
$path=dirname(__FILE__).'/';
|
||||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||||
echo "Erreur: Vous utilisez l'interpreteur PHP pour le mode CGI. Pour executer mailing-send.php en ligne de commande, vous devez utiliser l'interpreteur PHP pour le mode CLI.\n";
|
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,7 @@ $sapi_type = php_sapi_name();
|
|||||||
$script_file = basename(__FILE__);
|
$script_file = basename(__FILE__);
|
||||||
$path=dirname(__FILE__).'/';
|
$path=dirname(__FILE__).'/';
|
||||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||||
echo "Erreur: Vous utilisez l'interpreteur PHP pour le mode CGI. Pour executer mailing-send.php en ligne de commande, vous devez utiliser l'interpreteur PHP pour le mode CLI.\n";
|
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,7 @@ $sapi_type = php_sapi_name();
|
|||||||
$script_file = basename(__FILE__);
|
$script_file = basename(__FILE__);
|
||||||
$path=dirname(__FILE__).'/';
|
$path=dirname(__FILE__).'/';
|
||||||
if (substr($sapi_type, 0, 3) == 'cgi') {
|
if (substr($sapi_type, 0, 3) == 'cgi') {
|
||||||
echo "Erreur: Vous utilisez l'interpreteur PHP pour le mode CGI. Pour executer mailing-send.php en ligne de commande, vous devez utiliser l'interpreteur PHP pour le mode CLI.\n";
|
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -64,6 +64,10 @@ $sqls=array(
|
|||||||
"DELETE FROM ".MAIN_DB_PREFIX."paiement_facture where fk_facture IN (select rowid FROM ".MAIN_DB_PREFIX."facture where datec < '__DATE__')",
|
"DELETE FROM ".MAIN_DB_PREFIX."paiement_facture where fk_facture IN (select rowid FROM ".MAIN_DB_PREFIX."facture where datec < '__DATE__')",
|
||||||
"DELETE FROM ".MAIN_DB_PREFIX."paiement where rowid NOT IN (SELECT fk_paiement FROM ".MAIN_DB_PREFIX."paiement_facture)",
|
"DELETE FROM ".MAIN_DB_PREFIX."paiement where rowid NOT IN (SELECT fk_paiement FROM ".MAIN_DB_PREFIX."paiement_facture)",
|
||||||
),
|
),
|
||||||
|
'supplier_payment'=>array(
|
||||||
|
"DELETE FROM ".MAIN_DB_PREFIX."paiementfourn_facturefourn where fk_facturefourn IN (select rowid FROM ".MAIN_DB_PREFIX."facture_fourn where datec < '__DATE__')",
|
||||||
|
"DELETE FROM ".MAIN_DB_PREFIX."paiementfourn where rowid NOT IN (SELECT fk_paiementfourn FROM ".MAIN_DB_PREFIX."paiementfourn_facturefourn)",
|
||||||
|
),
|
||||||
'bank'=>array(
|
'bank'=>array(
|
||||||
"DELETE FROM ".MAIN_DB_PREFIX."bank_class WHERE lineid IN (SELECT rowid FROM ".MAIN_DB_PREFIX."bank WHERE datec < '__DATE__')",
|
"DELETE FROM ".MAIN_DB_PREFIX."bank_class WHERE lineid IN (SELECT rowid FROM ".MAIN_DB_PREFIX."bank WHERE datec < '__DATE__')",
|
||||||
"DELETE FROM ".MAIN_DB_PREFIX."bank_url WHERE fk_bank IN (SELECT rowid FROM ".MAIN_DB_PREFIX."bank WHERE datec < '__DATE__')",
|
"DELETE FROM ".MAIN_DB_PREFIX."bank_url WHERE fk_bank IN (SELECT rowid FROM ".MAIN_DB_PREFIX."bank WHERE datec < '__DATE__')",
|
||||||
@ -103,6 +107,7 @@ $sqls=array(
|
|||||||
"DELETE FROM ".MAIN_DB_PREFIX."commande_fournisseur where date_creation < '__DATE__'",
|
"DELETE FROM ".MAIN_DB_PREFIX."commande_fournisseur where date_creation < '__DATE__'",
|
||||||
),
|
),
|
||||||
'supplier_invoice'=>array(
|
'supplier_invoice'=>array(
|
||||||
|
'@supplier_payment',
|
||||||
"DELETE FROM ".MAIN_DB_PREFIX."facture_fourn_det WHERE fk_facture_fourn IN (select rowid FROM ".MAIN_DB_PREFIX."facture_fourn where datec < '__DATE__')",
|
"DELETE FROM ".MAIN_DB_PREFIX."facture_fourn_det WHERE fk_facture_fourn IN (select rowid FROM ".MAIN_DB_PREFIX."facture_fourn where datec < '__DATE__')",
|
||||||
"DELETE FROM ".MAIN_DB_PREFIX."facture_fourn where datec < '__DATE__'",
|
"DELETE FROM ".MAIN_DB_PREFIX."facture_fourn where datec < '__DATE__'",
|
||||||
),
|
),
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 113 KiB |
BIN
dev/initdemo/documents_demo/categorie/2/3/32/photos/Fruits.jpg
Normal file
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
BIN
dev/initdemo/documents_demo/categorie/4/3/34/photos/Pies.jpg
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
BIN
dev/initdemo/documents_demo/categorie/5/3/35/photos/Other.jpg
Normal file
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
BIN
dev/initdemo/documents_demo/produit/POS-CARROT/FR-CAR-Carrot.jpg
Normal file
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
BIN
dev/initdemo/documents_demo/produit/POS-Eggs/POS-Eggs-Eggs.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
BIN
dev/initdemo/documents_demo/produit/POS-KIWI/POS-KIWI-Kiwi.jpg
Normal file
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
BIN
dev/initdemo/documents_demo/societe/12/courrier_consult.odt
Normal file
BIN
dev/initdemo/documents_demo/societe/12/logos/person8.jpeg
Normal file
|
After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
BIN
dev/initdemo/documents_demo/societe/12/radiography1.jpg
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
dev/initdemo/documents_demo/societe/12/radiography2-knee.jpg
Normal file
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 3.8 KiB |