diff --git a/dev/resources/iso-normes/barcode_EAN13.txt b/dev/resources/iso-normes/barcode_EAN13.txt
index f4496327ee4..f6b3c5f5ebb 100644
--- a/dev/resources/iso-normes/barcode_EAN13.txt
+++ b/dev/resources/iso-normes/barcode_EAN13.txt
@@ -16,57 +16,57 @@ Voici la liste des codes pays ou systeme :
EN
==
-Meaning of the numbers.
+Meaning of the numbers:
-- 2 digits for the country code or system code
+- first 2-3 digits for the country code or system code
- 5 digits for the company identifier
- 5 digits for item identifier
- 1 digit for checksum
This rule has been twisted many times to improve the use of the available numbers.
-Here is the list of country codes or system:
+Here is the list of country codes or system:
List
====
-00 � 13 UCC (Etats-Unis et Canada)
-20 � 29 Codification interne en magasin
-30 � 37 GENCOD-EAN France
-380 BCCI (Bulgarie)
-383 SANA (Slovenie)
-385 CRO-EAN (Croatie)
-387 EAN-BIH (Bosnie-Herzegovine)
-400 � 440 CCG (Allemagne)
-45 + 49 Distribution Code Center � DCC (Japon)
-460 � 469 UNISCAN - EAN Russie (Federation de Russie)
-471 CAN (Taiwan)
-474 EAN Estonie
-475 EAN Lettonie
-476 EAN Azerba� djan
-477 EAN Lituanie
-478 EAN Ouzbekistan
-479 EAN Sri Lanka
-480 PANC (Philippines)
-481 EAN Bielorussie
-482 EAN Ukraine
-484 EAN Moldavie
-485 EAN Armenie
-486 EAN Georgie
-487 EAN Kazakhstan
-489 HKANA (Hong Kong)
-50 E Centre UK
+00 - 13 UCC (U.S.A / États-Unis & Canada)
+20 - 29 Flag for internal numbering / Codification interne en magasin
+30 - 37 GENCOD-EAN France
+380 BCCI (Bulgaria)
+383 SANA (Slovenia)
+385 CRO-EAN (Croatia)
+387 EAN-BIH (Bosnia-Herzegovina)
+400-440 CCG (Allemagne/Germany)
+45 + 49 Distribution Code Center - DCC (Japan)
+460-469 UNISCAN - EAN Russia (Federation de Russie)
+471 CAN Taiwan
+474 EAN Estonia
+475 EAN Latvia
+476 EAN Azerbaijan
+477 EAN Lithuania
+478 EAN Uzbekistan
+479 EAN Sri Lanka
+480 PANC Philippines
+481 EAN Belarus
+482 EAN Ukraine
+484 EAN Moldova
+485 EAN Armenia
+486 EAN Georgia
+487 EAN Kazakhstan
+489 HKANA Hong Kong
+50 E Centre UK - United Kingdom
520 HELLCAN-EAN HELLAS (Grece)
528 EAN Liban
529 EAN Chypre
-531 EAN-MAC (FYR Mac�donie)
+531 EAN-MAC (FYR Macedonie)
535 EAN Malte
539 EAN Irlande
-54 ICODIF/EAN Belgique. Luxembourg
+54 ICODIF/EAN Belgique. Luxembourg
560 CODIPOR (Portugal)
569 EAN Islande
-57 EAN Danemark
+57 EAN Danemark
590 EAN Pologne
594 EAN Roumanie
599 H.A.P.M.H. (Hongrie)
diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php
index e58def3f481..1936d855a7e 100644
--- a/htdocs/adherents/list.php
+++ b/htdocs/adherents/list.php
@@ -482,7 +482,7 @@ if (GETPOSTISSET("search_status")) {
$titre = $langs->trans("MembersListToValid");
}
if ($search_status == Adherent::STATUS_VALIDATED && $filter == '') {
- $titre = $langs->trans("MembersValidated");
+ $titre = $langs->trans("MenuMembersValidated");
}
if ($search_status == Adherent::STATUS_VALIDATED && $filter == 'withoutsubscription') {
$titre = $langs->trans("MembersWithSubscriptionToReceive");
diff --git a/htdocs/admin/pdf.php b/htdocs/admin/pdf.php
index fd8377b0a27..1e015d69f9c 100644
--- a/htdocs/admin/pdf.php
+++ b/htdocs/admin/pdf.php
@@ -309,7 +309,7 @@ print '
'.$langs->trans("Par
// Show sender name
-/* Set option as hidden because no need of this for 99.99% of users.
+/* Set option as hidden because no need of this for 99.99% of users. Having it as hidden feature is enough.
print '
';
foreach ($fieldstarget as $code => $label) {
print '
';
@@ -1058,7 +1051,7 @@ if ($step == 4 && $datatoimport) {
$tablealias = preg_replace('/(\..*)$/i', '', $code);
$tablename = $objimport->array_import_tables[0][$tablealias];
- $entityicon = !empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity; // $entityicon must string name of picto of the field like 'project', 'company', 'contact', 'modulename', ...
+ $entityicon = $entitytoicon[$entity] ? $entitytoicon[$entity] : $entity; // $entityicon must string name of picto of the field like 'project', 'company', 'contact', 'modulename', ...
$entitylang = $entitytolang[$entity] ? $entitytolang[$entity] : $objimport->array_import_label[0]; // $entitylang must be a translation key to describe object the field is related to, like 'Company', 'Contact', 'MyModyle', ...
print '
';
- }
} else {
// Print field of source file
print '
';
print '
';
// The image must have the class 'boxhandle' beause it's value used in DOM draggable objects to define the area used to catch the full object
- //print img_picto($langs->trans("MoveField", $pos), 'grip_title', 'class="boxhandle" style="cursor:move;"');
+ print img_picto($langs->trans("MoveField", $pos), 'grip_title', 'class="boxhandle" style="cursor:move;"');
print '
';
}
diff --git a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql
index ba4ee14bbf2..4b34d3a72ac 100644
--- a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql
+++ b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql
@@ -539,5 +539,5 @@ INSERT INTO llx_c_forme_juridique (fk_pays, code, libelle, active) VALUES (154,
-- Add column to help to fix a very critical bug when transferring into accounting bank record of a bank account into another currency.
-- Idea is to update this column manually in v15 with value in currency of company for bank that are not into the main currency and the transfer
--- into accounting will use it in priority if value is not null.
+-- into accounting will use it in priority if value is not null. The script repair.sql contains the sequence to fix datas in llx_bank.
ALTER TABLE llx_bank ADD COLUMN amount_main_currency double(24,8) NULL;
diff --git a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
index e38b2f8ea41..2d9f9af1608 100644
--- a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
+++ b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
@@ -302,6 +302,9 @@ ALTER TABLE llx_propal ADD last_main_doc VARCHAR(255) NULL AFTER model_pdf;
UPDATE llx_c_country SET eec=0 WHERE eec IS NULL;
ALTER TABLE llx_c_country MODIFY COLUMN eec tinyint DEFAULT 0 NOT NULL;
+ALTER TABLE llx_inventorydet ADD COLUMN pmp_real double DEFAULT NULL;
+ALTER TABLE llx_inventorydet ADD COLUMN pmp_expected double DEFAULT NULL;
+
ALTER TABLE llx_chargesociales ADD COLUMN note_private text;
@@ -325,4 +328,5 @@ ALTER TABLE llx_actioncomm MODIFY COLUMN note mediumtext;
DELETE FROM llx_boxes WHERE box_id IN (select rowid FROM llx_boxes_def WHERE file IN ('box_bom.php@bom', 'box_bom.php'));
DELETE FROM llx_boxes_def WHERE file IN ('box_bom.php@bom', 'box_bom.php');
+ALTER TABLE llx_takepos_floor_tables ADD UNIQUE(entity,label);
ALTER TABLE llx_inventory ADD COLUMN fk_categories_product VARCHAR(255) DEFAULT NULL AFTER fk_product;
diff --git a/htdocs/install/mysql/tables/llx_inventorydet-stock.sql b/htdocs/install/mysql/tables/llx_inventorydet-stock.sql
index 8b75f68460d..8999b0e298b 100644
--- a/htdocs/install/mysql/tables/llx_inventorydet-stock.sql
+++ b/htdocs/install/mysql/tables/llx_inventorydet-stock.sql
@@ -29,6 +29,8 @@ CREATE TABLE llx_inventorydet
qty_stock double DEFAULT NULL, -- Value or real stock we have, when we start the inventory (may be updated during intermediary steps).
qty_view double DEFAULT NULL, -- Quantity found during inventory. It is the targeted value, filled during edition of inventory.
qty_regulated double DEFAULT NULL, -- Never used. Deprecated because we already have the fk_movement now.
+ pmp_real double DEFAULT NULL,
+ pmp_expected double DEFAULT NULL,
fk_movement integer NULL -- can contain the id of stock movement we recorded to make the inventory regulation of this line
)
ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_takepos_floor_tables.key.sql b/htdocs/install/mysql/tables/llx_takepos_floor_tables.key.sql
new file mode 100644
index 00000000000..e90cd67e889
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_takepos_floor_tables.key.sql
@@ -0,0 +1,16 @@
+-- Copyright (C) 2018 SuperAdmin
+--
+-- 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/.
+
+ALTER TABLE llx_takepos_floor_tables ADD UNIQUE(entity,label);
\ No newline at end of file
diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang
index 093fb47189d..b1438691cd9 100644
--- a/htdocs/langs/en_US/companies.lang
+++ b/htdocs/langs/en_US/companies.lang
@@ -19,6 +19,7 @@ ProspectionArea=Prospection area
IdThirdParty=Id third party
IdCompany=Company Id
IdContact=Contact Id
+ThirdPartyAddress=Third-party address
ThirdPartyContacts=Third-party contacts
ThirdPartyContact=Third-party contact/address
Company=Company
diff --git a/htdocs/langs/en_US/exports.lang b/htdocs/langs/en_US/exports.lang
index 8bbc6f1ad98..f2f2d2cf587 100644
--- a/htdocs/langs/en_US/exports.lang
+++ b/htdocs/langs/en_US/exports.lang
@@ -8,7 +8,7 @@ ImportableDatas=Importable dataset
SelectExportDataSet=Choose dataset you want to export...
SelectImportDataSet=Choose dataset you want to import...
SelectExportFields=Choose the fields you want to export, or select a predefined export profile
-SelectImportFields=Choose the source file fields you want to import and their target field in database by choosing the fields with the select box, or select a predefined import profile:
+SelectImportFields=Choose the source file fields you want to import and their target field in database by moving them up and down with anchor %s, or select a predefined import profile:
NotImportedFields=Fields of source file not imported
SaveExportModel=Save your selections as an export profile/template (for reuse).
SaveImportModel=Save this import profile (for reuse) ...
@@ -135,5 +135,3 @@ NbInsert=Number of inserted lines: %s
NbUpdate=Number of updated lines: %s
MultipleRecordFoundWithTheseFilters=Multiple records have been found with these filters: %s
StocksWithBatch=Stocks and location (warehouse) of products with batch/serial number
-WarningFirstImportedLine=The first line(s) will not be imported with the current selection
-EmptyField=Empty field
\ No newline at end of file
diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang
index c66895e58a4..b39124c7c53 100644
--- a/htdocs/langs/en_US/main.lang
+++ b/htdocs/langs/en_US/main.lang
@@ -1169,3 +1169,7 @@ CanceledShown=Canceled shown
Terminate=Terminate
Terminated=Terminated
AddLineOnPosition=Add line on position (at the end if empty)
+ConfirmAllocateCommercial=Assign sales representative confirmation
+ConfirmAllocateCommercialQuestion=Are you sure you want to assign the %s selected record(s)?
+CommercialsAffected=Sales representatives affected
+CommercialAffected=Sales representative affected
\ No newline at end of file
diff --git a/htdocs/langs/en_US/modulebuilder.lang b/htdocs/langs/en_US/modulebuilder.lang
index 5466900bbe0..df0a834e04f 100644
--- a/htdocs/langs/en_US/modulebuilder.lang
+++ b/htdocs/langs/en_US/modulebuilder.lang
@@ -146,4 +146,7 @@ ModuleBuilderNotAllowed=The module builder is available but not allowed to your
ImportExportProfiles=Import and export profiles
ValidateModBuilderDesc=Set this to 1 if you want to have the method $this->validateField() of object being called to validate the content of the field during insert or upadate. Set 0 if there is no validation required.
WarningDatabaseIsNotUpdated=Warning: The database is not updated automatically, you must destroy tables and disable-enable the module to have tables recreated
-LinkToParentMenu=Parent menu (fk_xxxxmenu)
\ No newline at end of file
+LinkToParentMenu=Parent menu (fk_xxxxmenu)
+ListOfTabsEntries=List of tab entries
+TabsDefDesc=Define here the tabs provided by your module
+TabsDefDescTooltip=The tabs provided by your module/application are defined into the array $this->tabs into the module descriptor file. You can edit manually this file or use the embedded editor.
diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang
index be9918a7f7c..2d8ef240ef1 100644
--- a/htdocs/langs/en_US/products.lang
+++ b/htdocs/langs/en_US/products.lang
@@ -420,3 +420,7 @@ StockMouvementExtraFields= Extra Fields (stock mouvement)
InventoryExtraFields= Extra Fields (inventory)
ScanOrTypeOrCopyPasteYourBarCodes=Scan or type or copy/paste your barcodes
PuttingPricesUpToDate=Update prices with current known prices
+PMPExpected=Expected PMP
+ExpectedValuation=Expected Valuation
+PMPReal=Real PMP
+RealValuation=Real Valuation
diff --git a/htdocs/langs/fr_FR/exports.lang b/htdocs/langs/fr_FR/exports.lang
index 4f4490ef4a5..5c87e8f186f 100644
--- a/htdocs/langs/fr_FR/exports.lang
+++ b/htdocs/langs/fr_FR/exports.lang
@@ -8,7 +8,7 @@ ImportableDatas=Lot de données importables
SelectExportDataSet=Choisissez un lot prédéfini de données que vous désirez exporter…
SelectImportDataSet=Choisissez un lot prédéfini de données que vous désirez importer…
SelectExportFields=Choisissez les champs à exporter, ou choisissez un profil d'export prédéfini
-SelectImportFields=Choisissez les champs du fichier source à importer et leur destination dans la base en utilisant les boîtes de sélection, ou choisissez un profil d'import prédéfini:
+SelectImportFields=Choisissez les champs du fichier source à importer et leur destination dans la base en les déplaçant vers le haut ou vers le bas via l'ancre %s, ou choisissez un profil d'import prédéfini:
NotImportedFields=Champs du fichier source non importés
SaveExportModel=Enregistrer ce profil d'export (si vous désirez le réutiliser ultérieurement) …
SaveImportModel=Enregistrer ce profil d'import (si vous désirez le réutiliser ultérieurement) …
@@ -135,5 +135,3 @@ NbInsert=Nombre de lignes insérées: %s
NbUpdate=Nombre de lignes mises à jour: %s
MultipleRecordFoundWithTheseFilters=Plusieurs enregistrements ont été trouvés avec ces filtres: %s
StocksWithBatch=Stocks et entrepôts des produits avec numéro de lot/série
-WarningFirstImportedLine=Les première(s) ligne(s) ne seront pas importée(s) avec cette selection
-EmptyField=Champ vide
diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php
index a85bb23775c..59a43daac65 100644
--- a/htdocs/main.inc.php
+++ b/htdocs/main.inc.php
@@ -280,7 +280,20 @@ if (!empty($_POST["DOL_AUTOSET_COOKIE"])) {
$cookiename = $tmpautoset[0];
$cookievalue = json_encode($cookiearrayvalue);
//var_dump('setcookie cookiename='.$cookiename.' cookievalue='.$cookievalue);
- setcookie($cookiename, empty($cookievalue) ? '' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)), '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // keep cookie 1 year and add tag httponly
+ if (PHP_VERSION_ID < 70300) {
+ setcookie($cookiename, empty($cookievalue) ? '' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)), '/', null, ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? false : true), true); // keep cookie 1 year and add tag httponly
+ } else {
+ // Only available for php >= 7.3
+ $cookieparams = array(
+ 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)),
+ 'path' => '/',
+ //'domain' => '.mywebsite.com', // the dot at the beginning allows compatibility with subdomains
+ 'secure' => ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? false : true),
+ 'httponly' => true,
+ 'samesite' => 'Lax' // None || Lax || Strict
+ );
+ setcookie($cookiename, empty($cookievalue) ? '' : $cookievalue, $cookieparams);
+ }
if (empty($cookievalue)) {
unset($_COOKIE[$cookiename]);
}
@@ -305,7 +318,20 @@ if (!empty($_COOKIE[$sessiontimeout])) {
// This create lock, released by session_write_close() or end of page.
// We need this lock as long as we read/write $_SESSION ['vars']. We can remove lock when finished.
if (!defined('NOSESSION')) {
- session_set_cookie_params(0, '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // Add tag secure and httponly on session cookie (same as setting session.cookie_httponly into php.ini). Must be called before the session_start.
+ if (PHP_VERSION_ID < 70300) {
+ session_set_cookie_params(0, '/', null, ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? false : true), true); // Add tag secure and httponly on session cookie (same as setting session.cookie_httponly into php.ini). Must be called before the session_start.
+ } else {
+ // Only available for php >= 7.3
+ $sessioncookieparams = array(
+ 'lifetime' => 0,
+ 'path' => '/',
+ //'domain' => '.mywebsite.com', // the dot at the beginning allows compatibility with subdomains
+ 'secure' => ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? false : true),
+ 'httponly' => true,
+ 'samesite' => 'Lax' // None || Lax || Strict
+ );
+ session_set_cookie_params($sessioncookieparams);
+ }
session_name($sessionname);
session_start(); // This call the open and read of session handler
//exit; // this exist generates a call to write and close
diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php
index 7389e2ea7a5..5616cceed8e 100644
--- a/htdocs/modulebuilder/index.php
+++ b/htdocs/modulebuilder/index.php
@@ -2015,6 +2015,11 @@ if ($module == 'initmodule') {
$head2[$h][2] = 'permissions';
$h++;
+ $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=tabs&module='.$module.($forceddirread ? '@'.$dirread : '');
+ $head2[$h][1] = $langs->trans("Tabs");
+ $head2[$h][2] = 'tabs';
+ $h++;
+
$head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=menus&module='.$module.($forceddirread ? '@'.$dirread : '');
$head2[$h][1] = $langs->trans("Menus");
$head2[$h][2] = 'menus';
@@ -3299,7 +3304,7 @@ if ($module == 'initmodule') {
print '';
print '