47 require
'../main.inc.php';
48 require_once DOL_DOCUMENT_ROOT.
'/core/class/canvas.class.php';
49 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
50 require_once DOL_DOCUMENT_ROOT.
'/core/class/genericobject.class.php';
51 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
52 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
53 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
54 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
55 require_once DOL_DOCUMENT_ROOT.
'/core/modules/product/modules_product.class.php';
56 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
57 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
58 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
62 require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
65 require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
68 require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
71 require_once DOL_DOCUMENT_ROOT.
'/core/lib/accounting.lib.php';
72 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formaccounting.class.php';
73 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
76 require_once DOL_DOCUMENT_ROOT.
'/bom/class/bom.class.php';
79 require_once DOL_DOCUMENT_ROOT.
'/workstation/class/workstation.class.php';
83 $langs->loadLangs(array(
'products',
'other'));
85 $langs->load(
"stocks");
88 $langs->load(
"bills");
91 $langs->load(
"productbatch");
98 $refalreadyexists = 0;
108 $action = (
GETPOST(
'action',
'alpha') ?
GETPOST(
'action',
'alpha') :
'view');
109 $cancel =
GETPOST(
'cancel',
'alpha');
110 $backtopage =
GETPOST(
'backtopage',
'alpha');
111 $confirm =
GETPOST(
'confirm',
'alpha');
113 $duration_value =
GETPOSTINT(
'duration_value');
114 $duration_unit =
GETPOST(
'duration_unit',
'alpha');
116 $accountancy_code_sell =
GETPOST(
'accountancy_code_sell',
'alpha');
117 $accountancy_code_sell_intra =
GETPOST(
'accountancy_code_sell_intra',
'alpha');
118 $accountancy_code_sell_export =
GETPOST(
'accountancy_code_sell_export',
'alpha');
119 $accountancy_code_buy =
GETPOST(
'accountancy_code_buy',
'alpha');
120 $accountancy_code_buy_intra =
GETPOST(
'accountancy_code_buy_intra',
'alpha');
121 $accountancy_code_buy_export =
GETPOST(
'accountancy_code_buy_export',
'alpha');
123 $checkmandatory =
GETPOST(
'accountancy_code_buy_export',
'alpha');
127 $label_security_check =
'nohtml';
129 $label_security_check = !
getDolGlobalString(
'MAIN_SECURITY_ALLOW_UNSECURED_LABELS_WITH_HTML') ?
'alphanohtml' :
'restricthtml';
132 if (!empty($user->socid)) {
133 $socid = $user->socid;
137 $module = (
getDolGlobalString(
'PRODUCT_CODEPRODUCT_ADDON') ? $conf->global->PRODUCT_CODEPRODUCT_ADDON :
'mod_codeproduct_leopard');
138 if (substr($module, 0, 16) ==
'mod_codeproduct_' && substr($module, -3) ==
'php') {
139 $module = substr($module, 0,
dol_strlen($module) - 4);
143 $modCodeProduct =
new $module();
151 $extrafields->fetch_name_optionals_label(
$object->table_element);
153 if ($id > 0 || !empty($ref)) {
154 $result =
$object->fetch($id, $ref);
158 $entity = (empty(
$object->entity) ? $conf->entity :
$object->entity);
160 $upload_dir = $conf->product->multidir_output[$entity].
'/'.
get_exdir(0, 0, 0, 0,
$object,
'product').dol_sanitizeFileName(
$object->ref);
162 $upload_dir = $conf->service->multidir_output[$entity].
'/'.
get_exdir(0, 0, 0, 0,
$object,
'product').dol_sanitizeFileName(
$object->ref);
167 $upload_dirold = $conf->product->multidir_output[$entity].
'/'.substr(substr(
"000".
$object->id, -2), 1, 1).
'/'.substr(substr(
"000".
$object->id, -2), 0, 1).
'/'.
$object->id.
"/photos";
169 $upload_dirold = $conf->service->multidir_output[$entity].
'/'.substr(substr(
"000".
$object->id, -2), 1, 1).
'/'.substr(substr(
"000".
$object->id, -2), 0, 1).
'/'.
$object->id.
"/photos";
174 $modulepart =
'product';
179 if (!empty($canvas)) {
180 require_once DOL_DOCUMENT_ROOT.
'/core/class/canvas.class.php';
181 $objcanvas =
new Canvas($db, $action);
182 $objcanvas->getCanvas(
'product',
'card', $canvas);
186 $fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref :
''));
187 $fieldtype = (!empty($id) ?
'rowid' :
'ref');
190 if (
$object->type == $object::TYPE_PRODUCT) {
193 if (
$object->type == $object::TYPE_SERVICE) {
197 restrictedArea($user,
'produit|service', 0,
'product&product',
'',
'', $fieldtype);
201 $hookmanager->initHooks(array(
'productcard',
'globalcard'));
218 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'creer_advance')) {
222 $parameters = array(
'id' => $id,
'ref' => $ref,
'objcanvas' => $objcanvas);
228 if (empty($reshook)) {
229 $backurlforlist = DOL_URL_ROOT.
'/product/list.php?type='.$type;
231 if (empty($backtopage) || ($cancel && empty($id))) {
232 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
233 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
234 $backtopage = $backurlforlist;
236 $backtopage = DOL_URL_ROOT.
'/product/card.php?id='.((!empty($id) && $id > 0) ? $id :
'__ID__');
242 if (!empty($backtopageforcancel)) {
243 header(
"Location: ".$backtopageforcancel);
245 } elseif (!empty($backtopage)) {
246 header(
"Location: ".$backtopage);
252 if ($action ==
'confirm_merge' && $confirm ==
'yes' && $user->hasRight(
'societe',
'creer')) {
254 $productOriginId =
GETPOSTINT(
'product_origin');
255 $productOrigin =
new Product($db);
257 if ($productOriginId <= 0) {
258 $langs->load(
'errors');
259 setEventMessages($langs->trans(
'ErrorProductIdIsMandatory', $langs->transnoentitiesnoconv(
'MergeOriginProduct')),
null,
'errors');
261 if (!$error && $productOrigin->fetch($productOriginId) < 1) {
271 $listofproperties = array(
281 'accountancy_code_buy',
282 'accountancy_code_buy_intra',
283 'accountancy_code_buy_export',
284 'accountancy_code_sell',
285 'accountancy_code_sell_intra',
286 'accountancy_code_sell_export'
288 foreach ($listofproperties as $property) {
289 if (empty(
$object->$property)) {
290 $object->$property = $productOrigin->$property;
294 $listofproperties = array(
295 'note_public',
'note_private'
297 foreach ($listofproperties as $property) {
302 if (is_array($productOrigin->array_options)) {
303 foreach ($productOrigin->array_options as $key => $val) {
304 if (empty(
$object->array_options[$key])) {
305 $object->array_options[$key] = $val;
312 $custcats_ori = $static_cat->containing($productOrigin->id,
'product',
'id');
313 $custcats = $static_cat->containing(
$object->id,
'product',
'id');
314 $custcats = array_merge($custcats, $custcats_ori);
315 $object->setCategories($custcats);
318 if ($productOrigin->barcode ==
$object->barcode) {
319 dol_syslog(
"We clean customer and supplier code so we will be able to make the update of target");
320 $productOrigin->barcode =
'';
336 'ActionComm' =>
'/comm/action/class/actioncomm.class.php',
337 'Bom' =>
'/bom/class/bom.class.php',
340 'Commande' =>
'/commande/class/commande.class.php',
341 'CommandeFournisseur' =>
'/fourn/class/fournisseur.commande.class.php',
342 'Contrat' =>
'/contrat/class/contrat.class.php',
343 'Delivery' =>
'/delivery/class/delivery.class.php',
344 'Facture' =>
'/compta/facture/class/facture.class.php',
345 'FactureFournisseur' =>
'/fourn/class/fournisseur.facture.class.php',
346 'FactureRec' =>
'/compta/facture/class/facture-rec.class.php',
347 'FichinterRec' =>
'/fichinter/class/fichinterrec.class.php',
348 'ProductFournisseur' =>
'/fourn/class/fournisseur.product.class.php',
349 'Propal' =>
'/comm/propal/class/propal.class.php',
350 'Reception' =>
'/reception/class/reception.class.php',
351 'SupplierProposal' =>
'/supplier_proposal/class/supplier_proposal.class.php',
355 foreach ($objects as $object_name => $object_file) {
356 require_once DOL_DOCUMENT_ROOT.$object_file;
358 if (!$error && !$object_name::replaceProduct($db, $productOrigin->id,
$object->id)) {
369 $reshook = $hookmanager->executeHooks(
386 'mergefromid' => $productOrigin->id,
390 $result =
$object->call_trigger(
'PRODUCT_MODIFY', $user);
401 if ($productOrigin->delete($user) < 1) {
410 $langs->load(
"errors");
419 if ($action ==
'setfk_product_type' && $usercancreate) {
420 $result =
$object->setValueFrom(
'fk_product_type',
GETPOST(
'fk_product_type'),
'',
null,
'text',
'', $user,
'PRODUCT_MODIFY');
421 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
426 $upload_dir = $conf->product->dir_output;
427 $permissiontoadd = $usercancreate;
428 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
430 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
433 if ($action ==
'setfk_barcode_type' && $createbarcode) {
434 $result =
$object->setValueFrom(
'fk_barcode_type',
GETPOST(
'fk_barcode_type'),
'',
null,
'text',
'', $user,
'PRODUCT_MODIFY');
435 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
440 if ($action ==
'setbarcode' && $createbarcode) {
444 $result =
$object->setValueFrom(
'barcode',
GETPOST(
'barcode'),
'',
null,
'text',
'', $user,
'PRODUCT_MODIFY');
445 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
448 $langs->load(
"errors");
450 $errors[] =
'ErrorBadBarCodeSyntax';
451 } elseif ($result == -2) {
452 $errors[] =
'ErrorBarCodeRequired';
453 } elseif ($result == -3) {
454 $errors[] =
'ErrorBarCodeAlreadyUsed';
456 $errors[] =
'FailedToValidateBarCode';
465 if ($action ==
'update_extras') {
469 $ret = $extrafields->setOptionalsFromPost(
null,
$object,
GETPOST(
'attribute',
'restricthtml'));
476 $result =
$object->insertExtraFields(
'PRODUCT_MODIFY');
484 $action =
'edit_extras';
489 if ($action ==
'add' && $usercancreate) {
492 if (!
GETPOST(
'label', $label_security_check)) {
493 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentities(
'Label')),
null,
'errors');
499 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentities(
'ProductRef')),
null,
'errors');
504 if (!empty($duration_value) && empty($duration_unit)) {
505 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentities(
'Unit')),
null,
'errors');
513 $object->entity = $conf->entity;
517 $object->mandatory_period = !empty(
GETPOST(
"mandatoryperiod",
'alpha')) ? 1 : 0;
518 if (
$object->price_base_type ==
'TTC') {
523 if (
$object->price_base_type ==
'TTC') {
529 $tva_tx_txt =
GETPOST(
'tva_tx',
'alpha');
533 $tva_tx = preg_replace(
'/[^0-9\.].*$/',
'', $tva_tx_txt);
534 $npr = preg_match(
'/\*/', $tva_tx_txt) ? 1 : 0;
537 $localtax1_type =
'0';
538 $localtax2_type =
'0';
541 if (preg_match(
'/\((.*)\)/', $tva_tx_txt, $reg)) {
543 $vatratecode = $reg[1];
545 $sql =
"SELECT t.rowid, t.code, t.recuperableonly, t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
546 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
547 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($mysoc->country_code).
"'";
548 $sql .=
" AND t.taux = ".((float) $tva_tx).
" AND t.active = 1";
549 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
550 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
551 $resql = $db->query(
$sql);
553 $obj = $db->fetch_object($resql);
554 $npr = $obj->recuperableonly;
555 $localtax1 = $obj->localtax1;
556 $localtax2 = $obj->localtax2;
557 $localtax1_type = $obj->localtax1_type;
558 $localtax2_type = $obj->localtax2_type;
562 $object->default_vat_code = $vatratecode;
565 $object->localtax1_tx = $localtax1;
566 $object->localtax2_tx = $localtax2;
567 $object->localtax1_type = $localtax1_type;
568 $object->localtax2_type = $localtax2_type;
581 $stdobject->element =
'product';
582 $stdobject->barcode_type =
GETPOSTINT(
'fk_barcode_type');
583 $result = $stdobject->fetch_barcode();
586 $mesg =
'Failed to get bar code type information ';
589 $object->barcode_type_code = $stdobject->barcode_type_code;
590 $object->barcode_type_coder = $stdobject->barcode_type_coder;
591 $object->barcode_type_label = $stdobject->barcode_type_label;
602 $object->duration_value = $duration_value;
603 $object->duration_unit = $duration_unit;
622 if ($finished >= 0) {
635 $accountancy_code_sell =
GETPOST(
'accountancy_code_sell',
'alpha');
636 $accountancy_code_sell_intra =
GETPOST(
'accountancy_code_sell_intra',
'alpha');
637 $accountancy_code_sell_export =
GETPOST(
'accountancy_code_sell_export',
'alpha');
638 $accountancy_code_buy =
GETPOST(
'accountancy_code_buy',
'alpha');
639 $accountancy_code_buy_intra =
GETPOST(
'accountancy_code_buy_intra',
'alpha');
640 $accountancy_code_buy_export =
GETPOST(
'accountancy_code_buy_export',
'alpha');
642 if (empty($accountancy_code_sell) || $accountancy_code_sell ==
'-1') {
643 $object->accountancy_code_sell =
'';
645 $object->accountancy_code_sell = $accountancy_code_sell;
647 if (empty($accountancy_code_sell_intra) || $accountancy_code_sell_intra ==
'-1') {
648 $object->accountancy_code_sell_intra =
'';
650 $object->accountancy_code_sell_intra = $accountancy_code_sell_intra;
652 if (empty($accountancy_code_sell_export) || $accountancy_code_sell_export ==
'-1') {
653 $object->accountancy_code_sell_export =
'';
655 $object->accountancy_code_sell_export = $accountancy_code_sell_export;
657 if (empty($accountancy_code_buy) || $accountancy_code_buy ==
'-1') {
658 $object->accountancy_code_buy =
'';
660 $object->accountancy_code_buy = $accountancy_code_buy;
662 if (empty($accountancy_code_buy_intra) || $accountancy_code_buy_intra ==
'-1') {
663 $object->accountancy_code_buy_intra =
'';
665 $object->accountancy_code_buy_intra = $accountancy_code_buy_intra;
667 if (empty($accountancy_code_buy_export) || $accountancy_code_buy_export ==
'-1') {
668 $object->accountancy_code_buy_export =
'';
670 $object->accountancy_code_buy_export = $accountancy_code_buy_export;
675 for ($i = 2; $i <= $conf->global->PRODUIT_MULTIPRICES_LIMIT; $i++) {
678 $object->multiprices_base_type[
"$i"] =
GETPOST(
"multiprices_base_type_".$i);
680 $object->multiprices[
"$i"] =
"";
686 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
693 $ref = $modCodeProduct->getNextValue(
$object, $type);
702 $categories =
GETPOST(
'categories',
'array');
703 $object->setCategories($categories);
705 if (!empty($backtopage)) {
706 $backtopage = preg_replace(
'/__ID__/', (
string)
$object->id, $backtopage);
707 $backtopage = preg_replace(
'/--IDFORBACKTOPAGE--/', (
string)
$object->id, $backtopage);
708 if (preg_match(
'/\?/', $backtopage)) {
709 $backtopage .=
'&productid='.$object->id;
712 header(
"Location: ".$backtopage);
715 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
722 if (
$object->error ==
'ErrorProductAlreadyExists') {
724 $reshook = $hookmanager->executeHooks(
'onProductAlreadyExists',
$parameters,
$object, $action);
743 if ($action ==
'update' && $usercancreate) {
744 if (
GETPOST(
'cancel',
'alpha')) {
800 if ($finished >= 0) {
806 $fk_default_bom =
GETPOSTINT(
'fk_default_bom');
807 if ($fk_default_bom >= 0) {
808 $object->fk_default_bom = $fk_default_bom;
824 $stdobject->element =
'product';
825 $stdobject->barcode_type =
GETPOSTINT(
'fk_barcode_type');
826 $result = $stdobject->fetch_barcode();
829 $mesg =
'Failed to get bar code type information ';
832 $object->barcode_type_code = $stdobject->barcode_type_code;
833 $object->barcode_type_coder = $stdobject->barcode_type_coder;
834 $object->barcode_type_label = $stdobject->barcode_type_label;
836 $accountancy_code_sell =
GETPOST(
'accountancy_code_sell',
'alpha');
837 $accountancy_code_sell_intra =
GETPOST(
'accountancy_code_sell_intra',
'alpha');
838 $accountancy_code_sell_export =
GETPOST(
'accountancy_code_sell_export',
'alpha');
839 $accountancy_code_buy =
GETPOST(
'accountancy_code_buy',
'alpha');
840 $accountancy_code_buy_intra =
GETPOST(
'accountancy_code_buy_intra',
'alpha');
841 $accountancy_code_buy_export =
GETPOST(
'accountancy_code_buy_export',
'alpha');
842 $checkmandatory =
GETPOST(
'mandatoryperiod',
'alpha');
843 if (empty($accountancy_code_sell) || $accountancy_code_sell ==
'-1') {
844 $object->accountancy_code_sell =
'';
846 $object->accountancy_code_sell = $accountancy_code_sell;
848 if (empty($accountancy_code_sell_intra) || $accountancy_code_sell_intra ==
'-1') {
849 $object->accountancy_code_sell_intra =
'';
851 $object->accountancy_code_sell_intra = $accountancy_code_sell_intra;
853 if (empty($accountancy_code_sell_export) || $accountancy_code_sell_export ==
'-1') {
854 $object->accountancy_code_sell_export =
'';
856 $object->accountancy_code_sell_export = $accountancy_code_sell_export;
858 if (empty($accountancy_code_buy) || $accountancy_code_buy ==
'-1') {
859 $object->accountancy_code_buy =
'';
861 $object->accountancy_code_buy = $accountancy_code_buy;
863 if (empty($accountancy_code_buy_intra) || $accountancy_code_buy_intra ==
'-1') {
864 $object->accountancy_code_buy_intra =
'';
866 $object->accountancy_code_buy_intra = $accountancy_code_buy_intra;
868 if (empty($accountancy_code_buy_export) || $accountancy_code_buy_export ==
'-1') {
869 $object->accountancy_code_buy_export =
'';
871 $object->accountancy_code_buy_export = $accountancy_code_buy_export;
874 $object->mandatory_period = (!empty($checkmandatory)) ? 1 : 0 ;
880 $ret = $extrafields->setOptionalsFromPost(
null,
$object,
'@GETPOSTISSET');
885 if (!$error &&
$object->check()) {
888 $categories =
GETPOST(
'categories',
'array');
889 $object->setCategories($categories);
904 setEventMessages($langs->trans(
"ErrorProductBadRefOrLabel"),
null,
'errors');
913 if ($action ==
'confirm_clone' && $confirm !=
'yes') {
916 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
927 $clone->ref =
GETPOST(
'clone_ref',
'alphanohtml');
929 $clone->status_buy = 0;
930 $clone->barcode = -1;
932 if ($clone->check()) {
935 $clone->context[
'createfromclone'] =
'createfromclone';
936 $id = $clone->create($user);
938 if (
GETPOST(
'clone_composition')) {
939 $result = $clone->clone_associations(
$object->id, $id);
947 if (!$error &&
GETPOST(
'clone_categories')) {
948 $result = $clone->cloneCategories(
$object->id, $id);
956 if (!$error &&
GETPOST(
'clone_prices')) {
957 $result = $clone->clone_price(
$object->id, $id);
967 if ($clone->error ==
'ErrorProductAlreadyExists') {
971 $mesg = $langs->trans(
"ErrorProductAlreadyExists", $clone->ref);
972 $mesg .=
' <a href="' . $_SERVER[
"PHP_SELF"] .
'?ref=' . $clone->ref .
'">' . $langs->trans(
"ShowCardHere") .
'</a>.';
975 setEventMessages(empty($clone->error) ?
'' : $langs->trans($clone->error), $clone->errors,
'errors');
980 unset($clone->context[
'createfromclone']);
987 header(
"Location: " . $_SERVER[
"PHP_SELF"] .
"?id=" . $id);
991 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"NewRefForClone")),
null,
'errors');
1001 if ($action ==
'confirm_delete' && $confirm !=
'yes') {
1004 if ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
1005 $result =
$object->delete($user);
1008 header(
'Location: '.DOL_URL_ROOT.
'/product/list.php?type='.
$object->type.
'&delprod='.urlencode(
$object->ref));
1019 if (
$object->id > 0 && $action ==
'addin') {
1021 if (
GETPOST(
'propalid') > 0) {
1022 $propal =
new Propal($db);
1023 $result = $propal->fetch(
GETPOST(
'propalid'));
1028 $thirpdartyid = $propal->socid;
1029 } elseif (
GETPOST(
'commandeid') > 0) {
1031 $result = $commande->fetch(
GETPOST(
'commandeid'));
1036 $thirpdartyid = $commande->socid;
1037 } elseif (
GETPOST(
'factureid') > 0) {
1039 $result = $facture->fetch(
GETPOST(
'factureid'));
1044 $thirpdartyid = $facture->socid;
1047 if ($thirpdartyid > 0) {
1049 $result = $soc->fetch($thirpdartyid);
1059 if (empty($tva_tx)) {
1062 $localtax1_tx =
get_localtax($tva_tx, 1, $soc, $mysoc, $tva_npr);
1063 $localtax2_tx =
get_localtax($tva_tx, 2, $soc, $mysoc, $tva_npr);
1067 $price_base_type =
$object->price_base_type;
1070 if ($conf->global->PRODUIT_MULTIPRICES && $soc->price_level) {
1071 $pu_ht =
$object->multiprices[$soc->price_level];
1072 $pu_ttc =
$object->multiprices_ttc[$soc->price_level];
1073 $price_base_type =
$object->multiprices_base_type[$soc->price_level];
1075 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1079 $filter = array(
't.fk_product' =>
$object->id,
't.fk_soc' => $soc->id);
1081 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1083 if (count($prodcustprice->lines) > 0) {
1084 $pu_ht =
price($prodcustprice->lines [0]->price);
1085 $pu_ttc =
price($prodcustprice->lines [0]->price_ttc);
1086 $price_base_type = $prodcustprice->lines [0]->price_base_type;
1087 $tva_tx = $prodcustprice->lines [0]->tva_tx;
1092 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1093 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $prod->tva_tx));
1097 if ($tmpvat != $tmpprodvat) {
1098 if ($price_base_type !=
'HT') {
1099 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
1101 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
1105 if (
GETPOST(
'propalid') > 0) {
1108 if (($result = $propal->defineBuyPrice($pu_ht,
price2num(
GETPOST(
'remise_percent'),
'', 2),
$object->id)) < 0) {
1109 dol_syslog($langs->trans(
'FailedToGetCostPrice'));
1112 $buyprice = $result;
1115 $result = $propal->addline(
1140 header(
"Location: ".DOL_URL_ROOT.
"/comm/propal/card.php?id=".$propal->id);
1144 setEventMessages($langs->trans(
"ErrorUnknown").
": $result",
null,
'errors');
1145 } elseif (
GETPOST(
'commandeid') > 0) {
1148 if (($result = $commande->defineBuyPrice($pu_ht,
price2num(
GETPOST(
'remise_percent'),
'', 2),
$object->id)) < 0) {
1149 dol_syslog($langs->trans(
'FailedToGetCostPrice'));
1152 $buyprice = $result;
1155 $result = $commande->addline(
1182 header(
"Location: ".DOL_URL_ROOT.
"/commande/card.php?id=".urlencode((
string) ($commande->id)));
1185 } elseif (
GETPOST(
'factureid') > 0) {
1188 if (($result = $facture->defineBuyPrice($pu_ht,
price2num(
GETPOST(
'remise_percent'),
'', 2),
$object->id)) < 0) {
1189 dol_syslog($langs->trans(
'FailedToGetCostPrice'));
1192 $buyprice = $result;
1195 $result = $facture->addline(
1227 header(
"Location: ".DOL_URL_ROOT.
"/compta/facture/card.php?facid=".$facture->id);
1233 setEventMessages($langs->trans(
"WarningSelectOneDocument"),
null,
'warnings');
1251 $sellOrEatByMandatoryList =
null;
1256 $title = $langs->trans(
'ProductServiceCard');
1261 if ($action ==
'create') {
1262 $title = $langs->trans(
"NewProduct");
1264 $title = $langs->trans(
'Product').
" ".$shortlabel.
" - ".$langs->trans(
'Card');
1265 $help_url =
'EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos|DE:Modul_Produkte';
1269 if ($action ==
'create') {
1270 $title = $langs->trans(
"NewService");
1272 $title = $langs->trans(
'Service').
" ".$shortlabel.
" - ".$langs->trans(
'Card');
1273 $help_url =
'EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios|DE:Modul_Leistungen';
1282 $module = strtolower($conf->global->BARCODE_PRODUCT_ADDON_NUM);
1283 $dirbarcode = array_merge(array(
'/core/modules/barcode/'), $conf->modules_parts[
'barcode']);
1284 foreach ($dirbarcode as $dirroot) {
1291 $modBarCodeProduct =
new $module();
1295 $canvasdisplayaction = $action;
1296 if (in_array($canvasdisplayaction, array(
'merge',
'confirm_merge'))) {
1297 $canvasdisplayaction =
'view';
1300 if (is_object($objcanvas) && $objcanvas->displayCanvasExists($canvasdisplayaction)) {
1304 $objcanvas->assign_values($canvasdisplayaction,
$object->id,
$object->ref);
1305 $objcanvas->display_canvas($canvasdisplayaction);
1310 if ($action ==
'create' && $usercancreate) {
1312 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1314 if (!empty($conf->use_javascript_ajax)) {
1315 print
'<script type="text/javascript">';
1316 print
'$(document).ready(function () {
1317 $("#selectcountry_id").change(function() {
1318 document.formprod.action.value="create";
1319 document.formprod.submit();
1322 print
'</script>'.
"\n";
1326 $module = (
getDolGlobalString(
'PRODUCT_CODEPRODUCT_ADDON') ? $conf->global->PRODUCT_CODEPRODUCT_ADDON :
'mod_codeproduct_leopard');
1327 if (substr($module, 0, 16) ==
'mod_codeproduct_' && substr($module, -3) ==
'php') {
1328 $module = substr($module, 0,
dol_strlen($module) - 4);
1332 $modCodeProduct =
new $module();
1337 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST" name="formprod">';
1338 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1339 print
'<input type="hidden" name="action" value="add">';
1340 print
'<input type="hidden" name="type" value="'.$type.
'">'.
"\n";
1341 if (!empty($modCodeProduct->code_auto)) {
1342 print
'<input type="hidden" name="code_auto" value="1">';
1344 if (!empty($modBarCodeProduct->code_auto)) {
1345 print
'<input type="hidden" name="barcode_auto" value="1">';
1347 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1351 $title = $langs->trans(
"NewService");
1354 $title = $langs->trans(
"NewProduct");
1361 if (
$object->country_id > 0) {
1363 $object->country_code = $tmparray[
'code'];
1364 $object->country = $tmparray[
'label'];
1372 $reshook = $hookmanager->executeHooks(
'tabContentCreateProduct',
$parameters,
$object, $action);
1373 if (empty($reshook)) {
1374 print
'<table class="border centpercent">';
1379 if (!empty($modCodeProduct->code_auto)) {
1380 $tmpcode = $modCodeProduct->getNextValue(
$object, $type);
1382 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
"ProductRef").
'</td><td><input id="ref" name="ref" class="maxwidth200" maxlength="128" value="'.
dol_escape_htmltag(
GETPOSTISSET(
'ref') ?
GETPOST(
'ref',
'alphanohtml') : $tmpcode).
'">';
1383 if ($refalreadyexists) {
1384 print $langs->trans(
"RefAlreadyExists");
1390 print
'<tr><td class="fieldrequired">'.$langs->trans(
"Label").
'</td><td><input name="label" class="minwidth300 maxwidth400onsmartphone" maxlength="255" value="'.
dol_escape_htmltag(
GETPOST(
'label', $label_security_check)).
'"></td></tr>';
1393 print
'<tr><td class="fieldrequired">'.$langs->trans(
"Status").
' ('.$langs->trans(
"Sell").
')</td><td>';
1394 $statutarray = array(
'1' => $langs->trans(
"OnSell"),
'0' => $langs->trans(
"NotOnSell"));
1395 print
$form->selectarray(
'statut', $statutarray,
GETPOST(
'statut'));
1399 print
'<tr><td class="fieldrequired">'.$langs->trans(
"Status").
' ('.$langs->trans(
"Buy").
')</td><td>';
1400 $statutarray = array(
'1' => $langs->trans(
"ProductStatusOnBuy"),
'0' => $langs->trans(
"ProductStatusNotOnBuy"));
1401 print
$form->selectarray(
'statut_buy', $statutarray,
GETPOST(
'statut_buy'));
1406 print
'<tr><td>'.$langs->trans(
"ManageLotSerial").
'</td><td>';
1407 $statutarray = array(
'0' => $langs->trans(
"ProductStatusNotOnBatch"),
'1' => $langs->trans(
"ProductStatusOnBatch"),
'2' => $langs->trans(
"ProductStatusOnSerial"));
1408 print
$form->selectarray(
'status_batch', $statutarray,
GETPOST(
'status_batch'));
1411 $status_batch =
GETPOST(
'status_batch');
1412 if ($status_batch !==
'0') {
1413 $langs->load(
"admin");
1414 $tooltip = $langs->trans(
"GenericMaskCodes", $langs->transnoentities(
"Batch"), $langs->transnoentities(
"Batch"));
1415 $tooltip .=
'<br>'.$langs->trans(
"GenericMaskCodes2");
1416 $tooltip .=
'<br>'.$langs->trans(
"GenericMaskCodes3");
1417 $tooltip .=
'<br>'.$langs->trans(
"GenericMaskCodes4a", $langs->transnoentities(
"Batch"), $langs->transnoentities(
"Batch"));
1418 $tooltip .=
'<br>'.$langs->trans(
"GenericMaskCodes5");
1421 print
'<tr><td id="mask_option">'.$langs->trans(
"ManageLotMask").
'</td>';
1424 print
'<td id="field_mask">';
1425 print
$form->textwithpicto(
'<input type="text" class="flat minwidth175" name="batch_mask" id="batch_mask_input">', $tooltip, 1, 1);
1426 print
'<script type="text/javascript">
1427 $(document).ready(function() {
1428 $("#field_mask, #mask_option").addClass("hideobject");
1429 $("#status_batch").on("change", function () {
1430 console.log("We change batch status");
1431 var optionSelected = $("option:selected", this);
1432 var valueSelected = this.value;
1433 $("#field_mask, #mask_option").addClass("hideobject");
1437 if (this.value == 1) {
1438 $("#field_mask, #mask_option").toggleClass("hideobject");
1439 $("#batch_mask_input").val("'.$inherited_mask_lot.
'");
1443 if (isset($conf->global->PRODUCTBATCH_SN_USE_PRODUCT_MASKS) &&
getDolGlobalString(
'PRODUCTBATCH_SN_ADDON') ==
'mod_sn_advanced') {
1445 if (this.value == 2) {
1446 $("#field_mask, #mask_option").toggleClass("hideobject");
1447 $("#batch_mask_input").val("'.$inherited_mask_sn.
'");
1460 if (!empty($sellOrEatByMandatoryList)) {
1461 print
'<tr><td>'.$langs->trans(
'BatchSellOrEatByMandatoryList', $langs->trans(
'SellByDate'), $langs->trans(
'EatByDate')).
'</td><td>';
1462 print
$form->selectarray(
'sell_or_eat_by_mandatory', $sellOrEatByMandatoryList,
GETPOSTINT(
'sell_or_eat_by_mandatory'));
1468 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
1473 print
'<tr><td>'.$langs->trans(
'BarcodeType').
'</td><td>';
1475 $fk_barcode_type =
GETPOST(
'fk_barcode_type') ?
GETPOST(
'fk_barcode_type') : 0;
1480 $fk_barcode_type = 0;
1483 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formbarcode.class.php';
1485 print $formbarcode->selectBarcodeType($fk_barcode_type,
'fk_barcode_type', 1);
1488 print
'<td>'.$langs->trans(
"BarcodeValue").
'</td><td>';
1490 if (empty($tmpcode) && !empty($modBarCodeProduct->code_auto)) {
1491 $tmpcode = $modBarCodeProduct->getNextValue(
$object, $fk_barcode_type);
1493 print
img_picto(
'',
'barcode',
'class="pictofixedwidth"');
1494 print
'<input class="maxwidth100" type="text" name="barcode" value="'.dol_escape_htmltag($tmpcode).
'">';
1499 print
'<tr><td class="tdtop">'.$langs->trans(
"Description").
'</td><td>';
1500 $doleditor =
new DolEditor(
'desc',
GETPOST(
'desc',
'restricthtml'),
'', 160,
'dolibarr_details',
'',
false,
true,
getDolGlobalString(
'FCKEDITOR_ENABLE_DETAILS'), ROWS_4,
'90%');
1501 $doleditor->Create();
1506 print
'<tr><td>'.$langs->trans(
"PublicUrl").
'</td><td>';
1507 print
img_picto(
'',
'globe',
'class="pictofixedwidth"');
1508 print
'<input type="text" name="url" class="quatrevingtpercent" value="'.GETPOST(
'url').
'">';
1514 print
'<tr><td>'.$langs->trans(
"DefaultWarehouse").
'</td><td>';
1515 print
img_picto($langs->trans(
"DefaultWarehouse"),
'stock',
'class="pictofixedwidth"');
1516 print $formproduct->selectWarehouses(
GETPOSTINT(
'fk_default_warehouse'),
'fk_default_warehouse',
'warehouseopen', 1, 0, 0,
'', 0, 0, array(),
'minwidth300 widthcentpercentminusxx maxwidth500');
1517 print
' <a href="'.DOL_URL_ROOT.
'/product/stock/card.php?action=create&token='.
newToken().
'&backtopage='.urlencode($_SERVER[
'PHP_SELF'].
'?&action=create&type='.
GETPOSTINT(
'type')).
'">';
1518 print
'<span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddWarehouse").
'"></span>';
1526 print
'<tr><td>'.$form->textwithpicto($langs->trans(
"StockLimit"), $langs->trans(
"StockLimitDesc"), 1).
'</td><td>';
1527 print
'<input name="seuil_stock_alerte" class="maxwidth50" value="'.GETPOST(
'seuil_stock_alerte').
'">';
1532 print
'<tr><td>'.$form->textwithpicto($langs->trans(
"DesiredStock"), $langs->trans(
"DesiredStockDesc"), 1).
'</td><td>';
1533 print
'<input name="desiredstock" class="maxwidth50" value="'.GETPOST(
'desiredstock').
'">';
1538 print
'<input name="seuil_stock_alerte" type="hidden" value="0">';
1539 print
'<input name="desiredstock" type="hidden" value="0">';
1543 if ($type == $object::TYPE_SERVICE &&
isModEnabled(
"workstation")) {
1545 print
'<tr><td>'.$langs->trans(
"DefaultWorkstation").
'</td><td>';
1546 print
img_picto($langs->trans(
"DefaultWorkstation"),
'workstation',
'class="pictofixedwidth"');
1547 print $formproduct->selectWorkstations(
$object->fk_default_workstation,
'fk_default_workstation', 1);
1553 print
'<tr><td>'.$langs->trans(
"Duration").
'</td><td>';
1554 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
1555 print
'<input name="duration_value" size="4" value="'.GETPOSTINT(
'duration_value').
'">';
1556 print $formproduct->selectMeasuringUnits(
"duration_unit",
"time", (
GETPOSTISSET(
'duration_value') ?
GETPOST(
'duration_value',
'alpha') :
'h'), 0, 1);
1559 print
' ';
1560 print
'<input type="checkbox" id="mandatoryperiod" name="mandatoryperiod"'.($object->mandatory_period == 1 ?
' checked="checked"' :
'').
'>';
1561 print
'<label for="mandatoryperiod">';
1562 $htmltooltip = $langs->trans(
"mandatoryHelper");
1563 print
$form->textwithpicto($langs->trans(
"mandatoryperiod"), $htmltooltip, 1, 0);
1572 print
'<tr><td>'.$form->textwithpicto($langs->trans(
"NatureOfProductShort"), $langs->trans(
"NatureOfProductDesc")).
'</td><td>';
1573 print $formproduct->selectProductNature(
'finished',
$object->finished);
1581 print
'<tr><td>'.$langs->trans(
"Weight").
'</td><td>';
1582 print
img_picto(
'',
'fa-balance-scale',
'class="pictofixedwidth"');
1583 print
'<input name="weight" size="4" value="'.GETPOST(
'weight').
'">';
1584 print $formproduct->selectMeasuringUnits(
"weight_units",
"weight",
GETPOSTISSET(
'weight_units') ?
GETPOST(
'weight_units',
'alpha') : (!
getDolGlobalString(
'MAIN_WEIGHT_DEFAULT_UNIT') ? 0 : $conf->global->MAIN_WEIGHT_DEFAULT_UNIT), 0, 2);
1590 print
'<tr><td>'.$langs->trans(
"Length").
' x '.$langs->trans(
"Width").
' x '.$langs->trans(
"Height").
'</td><td>';
1591 print
img_picto(
'',
'fa-ruler',
'class="pictofixedwidth"');
1592 print
'<input name="size" class="width50" value="'.GETPOST(
'size').
'"> x ';
1593 print
'<input name="sizewidth" class="width50" value="'.GETPOST(
'sizewidth').
'"> x ';
1594 print
'<input name="sizeheight" class="width50" value="'.GETPOST(
'sizeheight').
'">';
1595 print $formproduct->selectMeasuringUnits(
"size_units",
"size",
GETPOSTISSET(
'size_units') ?
GETPOST(
'size_units',
'alpha') :
'0', 0, 2);
1600 print
'<tr><td>'.$langs->trans(
"Surface").
'</td><td>';
1601 print
'<input name="surface" size="4" value="'.GETPOST(
'surface').
'">';
1602 print $formproduct->selectMeasuringUnits(
"surface_units",
"surface",
GETPOSTISSET(
'surface_units') ?
GETPOST(
'surface_units',
'alpha') :
'0', 0, 2);
1607 print
'<tr><td>'.$langs->trans(
"Volume").
'</td><td>';
1608 print
'<input name="volume" size="4" value="'.GETPOST(
'volume').
'">';
1609 print $formproduct->selectMeasuringUnits(
"volume_units",
"volume",
GETPOSTISSET(
'volume_units') ?
GETPOST(
'volume_units',
'alpha') :
'0', 0, 2);
1615 print
'<tr><td>'.$langs->trans(
"NetMeasure").
'</td><td>';
1616 print
'<input name="net_measure" size="4" value="'.GETPOST(
'net_measure').
'">';
1617 print $formproduct->selectMeasuringUnits(
"net_measure_units",
'',
GETPOSTISSET(
'net_measure_units') ?
GETPOST(
'net_measure_units',
'alpha') : (!
getDolGlobalString(
'MAIN_WEIGHT_DEFAULT_UNIT') ? 0 : $conf->global->MAIN_WEIGHT_DEFAULT_UNIT), 0, 0);
1624 print
'<tr><td>'.$langs->trans(
'DefaultUnitToShow').
'</td>';
1626 print
$form->selectUnits(empty($line->fk_unit) ? $conf->global->PRODUCT_USE_UNITS : $line->fk_unit,
'units');
1632 print
'<tr><td class="wordbreak">'.$langs->trans(
"CustomCode").
'</td><td><input name="customcode" class="maxwidth100onsmartphone" value="'.
GETPOST(
'customcode').
'"></td></tr>';
1635 print
'<tr><td>'.$langs->trans(
"CountryOrigin").
'</td>';
1637 print
img_picto(
'',
'globe-americas',
'class="pictofixedwidth"');
1638 print
$form->select_country((
GETPOSTISSET(
'country_id') ?
GETPOST(
'country_id') :
$object->country_id),
'country_id',
'', 0,
'minwidth300 widthcentpercentminusx maxwidth500');
1640 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1648 print
'<td>'.$form->editfieldkey(
'RegionStateOrigin',
'state_id',
'',
$object, 0).
'</td><td>';
1650 print
'<td>'.$form->editfieldkey(
'StateOrigin',
'state_id',
'',
$object, 0).
'</td><td>';
1653 print
img_picto(
'',
'state',
'class="pictofixedwidth"');
1654 print $formcompany->select_state(
$object->state_id,
$object->country_code);
1661 print
'<tr><td>'.$langs->trans(
"LifeTime").
'</td><td><input name="lifetime" class="maxwidth50" value="'.
GETPOST(
'lifetime').
'"></td></tr>';
1662 print
'<tr><td>'.$langs->trans(
"QCFrequency").
'</td><td><input name="qc_frequency" class="maxwidth50" value="'.
GETPOST(
'qc_frequency').
'"></td></tr>';
1666 $parameters = array(
'colspan' =>
' colspan="2"',
'cols' => 2);
1667 $reshook = $hookmanager->executeHooks(
'formObjectOptions',
$parameters,
$object, $action);
1668 print $hookmanager->resPrint;
1669 if (empty($reshook)) {
1676 print
'<tr><td class="tdtop">'.$langs->trans(
"NoteNotVisibleOnBill").
'</td><td>';
1679 $doleditor =
new DolEditor(
'note_private',
GETPOST(
'note_private',
'restricthtml'),
'', 140,
'dolibarr_details',
'',
false,
true,
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE'), ROWS_8,
'90%');
1680 $doleditor->Create();
1687 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td>';
1688 $cate_arbo =
$form->select_all_categories(Categorie::TYPE_PRODUCT,
'',
'parent', 64, 0, 3);
1689 print
img_picto(
'',
'category',
'class="pictofixedwidth"').$form->multiselectarray(
'categories', $cate_arbo,
GETPOST(
'categories',
'array'),
'', 0,
'quatrevingtpercent widthcentpercentminusx', 0, 0);
1701 print
'<table class="border centpercent">';
1703 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"VATRate").
'</td><td>';
1705 print
$form->load_tva(
"tva_tx", $defaultva, $mysoc, $mysoc, 0, 0,
'',
false, 1);
1712 print
'<table class="border centpercent">';
1715 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"SellingPrice").
'</td>';
1716 print
'<td><input name="price" class="maxwidth50" value="'.$object->price.
'">';
1717 print
$form->selectPriceBaseType($conf->global->PRODUCT_PRICE_BASE_TYPE,
"price_base_type");
1721 print
'<tr><td>'.$langs->trans(
"MinPrice").
'</td>';
1722 print
'<td><input name="price_min" class="maxwidth50" value="'.$object->price_min.
'">';
1726 print
'<tr><td>'.$langs->trans(
"VATRate").
'</td><td>';
1728 print
$form->load_tva(
"tva_tx", $defaultva, $mysoc, $mysoc, 0, 0,
'',
false, 1);
1738 print
'<!-- accountancy codes -->'.
"\n";
1739 print
'<table class="border centpercent">';
1744 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellCode").
'</td>';
1751 print $formaccounting->select_account($accountancy_code_sell,
'accountancy_code_sell', 1,
null, 1, 1,
'minwidth150 maxwidth300', 1);
1755 if ($mysoc->isInEEC()) {
1756 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellIntraCode").
'</td>';
1759 $accountancy_code_sell_intra = (
GETPOSTISSET(
'accountancy_code_sell_intra') ?
GETPOST(
'accountancy_code_sell_intra',
'alpha') :
getDolGlobalString(
"ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT"));
1761 $accountancy_code_sell_intra = (
GETPOSTISSET(
'accountancy_code_sell_intra') ?
GETPOST(
'accountancy_code_sell_intra',
'alpha') :
getDolGlobalString(
"ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT"));
1763 print $formaccounting->select_account($accountancy_code_sell_intra,
'accountancy_code_sell_intra', 1,
null, 1, 1,
'minwidth150 maxwidth300', 1);
1768 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellExportCode").
'</td>';
1771 $accountancy_code_sell_export = (
GETPOST(
'accountancy_code_sell_export') ?
GETPOST(
'accountancy_code_sell_export',
'alpha') :
getDolGlobalString(
"ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT"));
1773 $accountancy_code_sell_export = (
GETPOST(
'accountancy_code_sell_export') ?
GETPOST(
'accountancy_code_sell_export',
'alpha') :
getDolGlobalString(
"ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT"));
1775 print $formaccounting->select_account($accountancy_code_sell_export,
'accountancy_code_sell_export', 1,
null, 1, 1,
'minwidth150 maxwidth300', 1);
1779 print
'<tr><td>'.$langs->trans(
"ProductAccountancyBuyCode").
'</td>';
1782 $accountancy_code_buy = (
GETPOST(
'accountancy_code_buy',
'alpha') ? (
GETPOST(
'accountancy_code_buy',
'alpha')) :
getDolGlobalString(
"ACCOUNTING_PRODUCT_BUY_ACCOUNT"));
1784 $accountancy_code_buy = (
GETPOST(
'accountancy_code_buy',
'alpha') ? (
GETPOST(
'accountancy_code_buy',
'alpha')) :
getDolGlobalString(
"ACCOUNTING_SERVICE_BUY_ACCOUNT"));
1786 print $formaccounting->select_account($accountancy_code_buy,
'accountancy_code_buy', 1,
null, 1, 1,
'minwidth150 maxwidth300', 1);
1790 if ($mysoc->isInEEC()) {
1791 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancyBuyIntraCode").
'</td>';
1794 $accountancy_code_buy_intra = (
GETPOSTISSET(
'accountancy_code_buy_intra') ?
GETPOST(
'accountancy_code_buy_intra',
'alpha') :
getDolGlobalString(
"ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT"));
1796 $accountancy_code_buy_intra = (
GETPOSTISSET(
'accountancy_code_buy_intra') ?
GETPOST(
'accountancy_code_buy_intra',
'alpha') :
getDolGlobalString(
"ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT"));
1798 print $formaccounting->select_account($accountancy_code_buy_intra,
'accountancy_code_buy_intra', 1,
null, 1, 1,
'minwidth150 maxwidth300', 1);
1803 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancyBuyExportCode").
'</td>';
1806 $accountancy_code_buy_export = (
GETPOST(
'accountancy_code_buy_export') ?
GETPOST(
'accountancy_code_buy_export',
'alpha') :
getDolGlobalString(
"ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT"));
1808 $accountancy_code_buy_export = (
GETPOST(
'accountancy_code_buy_export') ?
GETPOST(
'accountancy_code_buy_export',
'alpha') :
getDolGlobalString(
"ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT"));
1810 print $formaccounting->select_account($accountancy_code_buy_export,
'accountancy_code_buy_export', 1,
null, 1, 1,
'minwidth150 maxwidth300', 1);
1813 if (!empty($accountancy_code_sell)) {
1814 $object->accountancy_code_sell = $accountancy_code_sell;
1816 if (!empty($accountancy_code_sell_intra)) {
1817 $object->accountancy_code_sell_intra = $accountancy_code_sell_intra;
1819 if (!empty($accountancy_code_sell_export)) {
1820 $object->accountancy_code_sell_export = $accountancy_code_sell_export;
1822 if (!empty($accountancy_code_buy)) {
1823 $object->accountancy_code_buy = $accountancy_code_buy;
1825 if (!empty($accountancy_code_buy_intra)) {
1826 $object->accountancy_code_buy_intra = $accountancy_code_buy_intra;
1828 if (!empty($accountancy_code_buy_export)) {
1829 $object->accountancy_code_buy_export = $accountancy_code_buy_export;
1833 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellCode").
'</td>';
1834 print
'<td class="maxwidthonsmartphone"><input class="minwidth150" name="accountancy_code_sell" value="'.$object->accountancy_code_sell.
'">';
1838 if ($mysoc->isInEEC()) {
1839 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellIntraCode").
'</td>';
1840 print
'<td class="maxwidthonsmartphone"><input class="minwidth150" name="accountancy_code_sell_intra" value="'.$object->accountancy_code_sell_intra.
'">';
1845 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellExportCode").
'</td>';
1846 print
'<td class="maxwidthonsmartphone"><input class="minwidth150" name="accountancy_code_sell_export" value="'.$object->accountancy_code_sell_export.
'">';
1850 print
'<tr><td>'.$langs->trans(
"ProductAccountancyBuyCode").
'</td>';
1851 print
'<td class="maxwidthonsmartphone"><input class="minwidth150" name="accountancy_code_buy" value="'.$object->accountancy_code_buy.
'">';
1855 if ($mysoc->isInEEC()) {
1856 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancyBuyIntraCode").
'</td>';
1857 print
'<td class="maxwidthonsmartphone"><input class="minwidth150" name="accountancy_code_buy_intra" value="'.$object->accountancy_code_buy_intra.
'">';
1862 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancyBuyExportCode").
'</td>';
1863 print
'<td class="maxwidthonsmartphone"><input class="minwidth150" name="accountancy_code_buy_export" value="'.$object->accountancy_code_buy_export.
'">';
1872 print
$form->buttonsSaveCancel(
"Create");
1881 if ($action ==
'edit' && $usercancreate) {
1883 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1885 if (!empty($conf->use_javascript_ajax)) {
1886 print
'<script type="text/javascript">';
1887 print
'$(document).ready(function () {
1888 $("#selectcountry_id").change(function () {
1889 document.formprod.action.value="edit";
1890 document.formprod.submit();
1893 print
'</script>'.
"\n";
1900 $object->country_code = $tmparray[
'code'];
1901 $object->country = $tmparray[
'label'];
1904 $type = $langs->trans(
'Product');
1906 $type = $langs->trans(
'Service');
1911 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="POST" name="formprod">'.
"\n";
1912 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1913 print
'<input type="hidden" name="action" value="update">';
1914 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
1915 print
'<input type="hidden" name="canvas" value="'.$object->canvas.
'">';
1918 $titre = $langs->trans(
"CardProduct".
$object->type);
1925 $reshook = $hookmanager->executeHooks(
'tabContentEditProduct',
$parameters,
$object, $action);
1927 if (empty($reshook)) {
1928 print
'<table class="border allwidth">';
1932 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Ref").
'</td><td colspan="3"><input name="ref" class="maxwidth200" maxlength="128" value="'.
dol_escape_htmltag(
GETPOSTISSET(
'ref') ?
GETPOST(
'ref') :
$object->ref).
'"></td></tr>';
1934 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Ref").
'</td><td colspan="3"><input name="ref" class="maxwidth200" maxlength="128" value="'.
dol_escape_htmltag(
$object->ref).
'" readonly="true"></td></tr>';
1938 print
'<tr><td class="fieldrequired">'.$langs->trans(
"Label").
'</td><td colspan="3"><input name="label" class="minwidth300 maxwidth400onsmartphone" maxlength="255" value="'.
dol_escape_htmltag(
GETPOSTISSET(
'label') ?
GETPOST(
'label') :
$object->label).
'"></td></tr>';
1941 print
'<tr><td class="fieldrequired">'.$langs->trans(
"Status").
' ('.$langs->trans(
"Sell").
')</td><td colspan="3">';
1942 print
'<select class="flat" name="statut">';
1944 print
'<option value="1" selected>'.$langs->trans(
"OnSell").
'</option>';
1945 print
'<option value="0">'.$langs->trans(
"NotOnSell").
'</option>';
1947 print
'<option value="1">'.$langs->trans(
"OnSell").
'</option>';
1948 print
'<option value="0" selected>'.$langs->trans(
"NotOnSell").
'</option>';
1954 print
'<tr><td class="fieldrequired">'.$langs->trans(
"Status").
' ('.$langs->trans(
"Buy").
')</td><td colspan="3">';
1955 print
'<select class="flat" name="statut_buy">';
1957 print
'<option value="1" selected>'.$langs->trans(
"ProductStatusOnBuy").
'</option>';
1958 print
'<option value="0">'.$langs->trans(
"ProductStatusNotOnBuy").
'</option>';
1960 print
'<option value="1">'.$langs->trans(
"ProductStatusOnBuy").
'</option>';
1961 print
'<option value="0" selected>'.$langs->trans(
"ProductStatusNotOnBuy").
'</option>';
1969 print
'<tr><td>'.$langs->trans(
"ManageLotSerial").
'</td><td>';
1970 $statutarray = array(
'0' => $langs->trans(
"ProductStatusNotOnBatch"),
'1' => $langs->trans(
"ProductStatusOnBatch"),
'2' => $langs->trans(
"ProductStatusOnSerial"));
1974 print
'<span id="statusBatchWarning" class="warning" style="display: none;">';
1975 print
img_warning().
' '.$langs->trans(
"WarningConvertFromBatchToSerial").
'</span>';
1977 print
'<span id="statusBatchMouvToGlobal" class="warning" style="display: none;">';
1978 print
img_warning().
' '.$langs->trans(
"WarningTransferBatchStockMouvToGlobal").
'</span>';
1982 print
'<script type="text/javascript">
1983 $(document).ready(function() {
1984 console.log($("#statusBatchWarning"))
1985 $("#status_batch").on("change", function() {
1986 if ($("#status_batch")[0].value == 0){
1987 $("#statusBatchMouvToGlobal").show()
1989 $("#statusBatchMouvToGlobal").hide()
1995 if (
$object->status_batch == 1) {
1996 print
'<script type="text/javascript">
1997 $(document).ready(function() {
1998 console.log($("#statusBatchWarning"))
1999 $("#status_batch").on("change", function() {
2000 if ($("#status_batch")[0].value == 2){
2001 $("#statusBatchWarning").show()
2003 $("#statusBatchWarning").hide()
2011 if (!empty(
$object->status_batch) || !empty($conf->use_javascript_ajax)) {
2012 $langs->load(
"admin");
2013 $tooltip = $langs->trans(
"GenericMaskCodes", $langs->transnoentities(
"Batch"), $langs->transnoentities(
"Batch"));
2014 $tooltip .=
'<br>'.$langs->trans(
"GenericMaskCodes2");
2015 $tooltip .=
'<br>'.$langs->trans(
"GenericMaskCodes3");
2016 $tooltip .=
'<br>'.$langs->trans(
"GenericMaskCodes4a", $langs->transnoentities(
"Batch"), $langs->transnoentities(
"Batch"));
2017 $tooltip .=
'<br>'.$langs->trans(
"GenericMaskCodes5");
2018 print
'<tr><td id="mask_option">'.$langs->trans(
"ManageLotMask").
'</td>';
2028 print
'<td id="field_mask">';
2029 print
$form->textwithpicto(
'<input type="text" class="flat minwidth175" name="batch_mask" id="batch_mask_input" value="'.$mask.
'">', $tooltip, 1, 1);
2031 if (!empty($conf->use_javascript_ajax)) {
2032 print
'<script type="text/javascript">
2033 $(document).ready(function() {
2034 $("#field_mask").parent().addClass("hideobject");
2035 var preselect = document.getElementById("status_batch");';
2037 print
'if (preselect.value == "2") {
2038 $("#field_mask").parent().removeClass("hideobject");
2042 print
'if (preselect.value == "1") {
2043 $("#field_mask").parent().removeClass("hideobject");
2046 print
'$("#status_batch").on("change", function () {
2047 var optionSelected = $("option:selected", this);
2048 var valueSelected = this.value;
2049 $("#field_mask").parent().addClass("hideobject");
2053 if (this.value == 1) {
2054 $("#field_mask").parent().removeClass("hideobject");
2055 $("#batch_mask_input").val("'.$inherited_mask_lot.
'");
2061 if (this.value == 2) {
2062 $("#field_mask").parent().removeClass("hideobject");
2063 $("#batch_mask_input").val("'.$inherited_mask_sn.
'");
2077 if (!empty($sellOrEatByMandatoryList)) {
2079 $sellOrEatByMandatorySelectedId =
GETPOSTINT(
'sell_or_eat_by_mandatory');
2081 $sellOrEatByMandatorySelectedId =
$object->sell_or_eat_by_mandatory;
2083 print
'<tr><td>'.$langs->trans(
'BatchSellOrEatByMandatoryList', $langs->trans(
'SellByDate'), $langs->trans(
'EatByDate')).
'</td><td>';
2084 print
$form->selectarray(
'sell_or_eat_by_mandatory', $sellOrEatByMandatoryList, $sellOrEatByMandatorySelectedId);
2091 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
2096 print
'<tr><td>'.$langs->trans(
'BarcodeType').
'</td><td>';
2098 $fk_barcode_type =
GETPOST(
'fk_barcode_type');
2100 $fk_barcode_type =
$object->barcode_type;
2105 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formbarcode.class.php';
2107 print $formbarcode->selectBarcodeType($fk_barcode_type,
'fk_barcode_type', 1);
2109 print
'<tr><td>'.$langs->trans(
"BarcodeValue").
'</td><td>';
2111 if (empty($tmpcode) && !empty($modBarCodeProduct->code_auto)) {
2112 $tmpcode = $modBarCodeProduct->getNextValue(
$object, $fk_barcode_type);
2114 print
'<input class="maxwidth150 maxwidthonsmartphone" type="text" name="barcode" value="'.dol_escape_htmltag($tmpcode).
'">';
2119 print
'<tr><td class="tdtop">'.$langs->trans(
"Description").
'</td><td>';
2122 $doleditor =
new DolEditor(
'desc',
GETPOSTISSET(
'desc') ?
GETPOST(
'desc',
'restricthtml') :
$object->description,
'', 160,
'dolibarr_details',
'',
false,
true,
getDolGlobalInt(
'FCKEDITOR_ENABLE_DETAILS'), ROWS_4,
'90%');
2123 $doleditor->Create();
2130 print
'<tr><td>'.$langs->trans(
"PublicUrl").
'</td><td>';
2131 print
img_picto(
'',
'globe',
'class="pictofixedwidth"');
2132 print
'<input type="text" name="url" class="maxwidth500 widthcentpercentminusx" value="'.(GETPOSTISSET(
'url') ?
GETPOST(
'url') :
$object->url).
'">';
2139 print
'<tr><td>'.$langs->trans(
"DefaultWarehouse").
'</td><td>';
2140 print
img_picto($langs->trans(
"DefaultWarehouse"),
'stock',
'class="pictofixedwidth"');
2141 print $formproduct->selectWarehouses((
GETPOSTISSET(
'fk_default_warehouse') ?
GETPOST(
'fk_default_warehouse') :
$object->fk_default_warehouse),
'fk_default_warehouse',
'warehouseopen', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2142 print
' <a href="'.DOL_URL_ROOT.
'/product/stock/card.php?action=create&backtopage='.urlencode($_SERVER[
'PHP_SELF'].
'?action=edit&id='.((
int)
$object->id)).
'">';
2143 print
'<span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddWarehouse").
'"></span></a>';
2158 print
'<tr><td>'.$langs->trans(
"DefaultWorkstation").
'</td><td>';
2159 print
img_picto($langs->trans(
"DefaultWorkstation"),
'workstation',
'class="pictofixedwidth"');
2160 print $formproduct->selectWorkstations(
$object->fk_default_workstation,
'fk_default_workstation', 1);
2173 print
'<tr><td>'.$langs->trans(
"Duration").
'</td><td>';
2174 print
'<input name="duration_value" size="5" value="'.$object->duration_value.
'"> ';
2175 print $formproduct->selectMeasuringUnits(
"duration_unit",
"time",
$object->duration_unit, 0, 1);
2178 print
' ';
2179 print
'<input type="checkbox" id="mandatoryperiod" name="mandatoryperiod"'.($object->mandatory_period == 1 ?
' checked="checked"' :
'').
'>';
2180 print
'<label for="mandatoryperiod">';
2181 $htmltooltip = $langs->trans(
"mandatoryHelper");
2182 print
$form->textwithpicto($langs->trans(
"mandatoryperiod"), $htmltooltip, 1, 0);
2189 print
'<tr><td>'.$form->textwithpicto($langs->trans(
"NatureOfProductShort"), $langs->trans(
"NatureOfProductDesc")).
'</td><td>';
2196 print
'<tr><td>'.$form->textwithpicto($langs->trans(
"DefaultBOM"), $langs->trans(
"DefaultBOMDesc", $langs->transnoentitiesnoconv(
"Finished"))).
'</td><td>';
2197 $bomkey =
"Bom:bom/class/bom.class.php:0:(t.status:=:1) AND (t.fk_product:=:".((int)
$object->id).
')';
2205 print
'<tr><td>'.$langs->trans(
"Weight").
'</td><td>';
2206 print
'<input name="weight" size="5" value="'.(GETPOSTISSET(
'weight') ?
GETPOST(
'weight') :
$object->weight).
'"> ';
2207 print $formproduct->selectMeasuringUnits(
"weight_units",
"weight",
GETPOSTISSET(
'weight_units') ?
GETPOST(
'weight_units') :
$object->weight_units, 0, 2);
2213 print
'<tr><td>'.$langs->trans(
"Length").
' x '.$langs->trans(
"Width").
' x '.$langs->trans(
"Height").
'</td><td>';
2214 print
'<input name="size" size="5" value="'.(GETPOSTISSET(
'size') ?
GETPOST(
'size') :
$object->length).
'">x';
2215 print
'<input name="sizewidth" size="5" value="'.(GETPOSTISSET(
'sizewidth') ?
GETPOST(
'sizewidth') :
$object->width).
'">x';
2216 print
'<input name="sizeheight" size="5" value="'.(GETPOSTISSET(
'sizeheight') ?
GETPOST(
'sizeheight') :
$object->height).
'"> ';
2217 print $formproduct->selectMeasuringUnits(
"size_units",
"size",
GETPOSTISSET(
'size_units') ?
GETPOST(
'size_units') :
$object->length_units, 0, 2);
2222 print
'<tr><td>'.$langs->trans(
"Surface").
'</td><td>';
2223 print
'<input name="surface" size="5" value="'.(GETPOSTISSET(
'surface') ?
GETPOST(
'surface') :
$object->surface).
'"> ';
2224 print $formproduct->selectMeasuringUnits(
"surface_units",
"surface",
GETPOSTISSET(
'surface_units') ?
GETPOST(
'surface_units') :
$object->surface_units, 0, 2);
2229 print
'<tr><td>'.$langs->trans(
"Volume").
'</td><td>';
2230 print
'<input name="volume" size="5" value="'.(GETPOSTISSET(
'volume') ?
GETPOST(
'volume') :
$object->volume).
'"> ';
2231 print $formproduct->selectMeasuringUnits(
"volume_units",
"volume",
GETPOSTISSET(
'volume_units') ?
GETPOST(
'volume_units') :
$object->volume_units, 0, 2);
2237 print
'<tr><td>'.$langs->trans(
"NetMeasure").
'</td><td>';
2238 print
'<input name="net_measure" size="5" value="'.(GETPOSTISSET(
'net_measure') ?
GETPOST(
'net_measure') :
$object->net_measure).
'"> ';
2239 print $formproduct->selectMeasuringUnits(
"net_measure_units",
"",
GETPOSTISSET(
'net_measure_units') ?
GETPOST(
'net_measure_units') :
$object->net_measure_units, 0, 0);
2245 print
'<tr><td>'.$langs->trans(
'DefaultUnitToShow').
'</td>';
2253 print
'<tr><td class="wordbreak">'.$langs->trans(
"CustomCode").
'</td><td><input name="customcode" class="maxwidth100onsmartphone" value="'.(
GETPOSTISSET(
'customcode') ?
GETPOST(
'customcode') :
$object->customcode).
'"></td></tr>';
2255 print
'<tr><td>'.$langs->trans(
"CountryOrigin").
'</td>';
2257 print
img_picto(
'',
'globe-americas',
'class="paddingrightonly"');
2260 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
2268 print
'<td>'.$form->editfieldkey(
'RegionStateOrigin',
'state_id',
'',
$object, 0).
'</td><td>';
2270 print
'<td>'.$form->editfieldkey(
'StateOrigin',
'state_id',
'',
$object, 0).
'</td><td>';
2273 print
img_picto(
'',
'state',
'class="pictofixedwidth"');
2282 print
'<tr><td>'.$langs->trans(
"LifeTime").
'</td><td><input name="lifetime" class="maxwidth100onsmartphone" value="'.
$object->lifetime.
'"></td></tr>';
2283 print
'<tr><td>'.$langs->trans(
"QCFrequency").
'</td><td><input name="qc_frequency" class="maxwidth100onsmartphone" value="'.
$object->qc_frequency.
'"></td></tr>';
2287 $parameters = array(
'colspan' =>
' colspan="2"',
'cols' => 2);
2288 $reshook = $hookmanager->executeHooks(
'formObjectOptions',
$parameters,
$object, $action);
2289 print $hookmanager->resPrint;
2290 if (empty($reshook)) {
2296 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td>';
2297 $cate_arbo =
$form->select_all_categories(Categorie::TYPE_PRODUCT,
'',
'parent', 64, 0, 3);
2299 $cats = $c->containing(
$object->id, Categorie::TYPE_PRODUCT);
2300 $arrayselected = array();
2301 if (is_array($cats)) {
2302 foreach ($cats as $cat) {
2303 $arrayselected[] = $cat->id;
2307 foreach (
GETPOST(
'categories',
'array') as $cat) {
2308 $arrayselected[] = $cat;
2311 print
img_picto(
'',
'category',
'class="pictofixedwidth"').$form->multiselectarray(
'categories', $cate_arbo, $arrayselected,
'', 0,
'quatrevingtpercent widthcentpercentminusx', 0, 0);
2317 print
'<tr><td class="tdtop">'.$langs->trans(
"NoteNotVisibleOnBill").
'</td><td>';
2319 $doleditor =
new DolEditor(
'note_private',
$object->note_private,
'', 140,
'dolibarr_notes',
'',
false,
true,
getDolGlobalInt(
'FCKEDITOR_ENABLE_NOTE_PRIVATE'), ROWS_4,
'90%');
2320 $doleditor->Create();
2329 print
'<table class="border centpercent">';
2334 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellCode").
'</td>';
2336 print $formaccounting->select_account((
GETPOSTISSET(
'accountancy_code_sell') ?
GETPOST(
'accountancy_code_sell') :
$object->accountancy_code_sell),
'accountancy_code_sell', 1,
'', 1, 1,
'minwidth150 maxwidth300');
2340 if ($mysoc->isInEEC()) {
2341 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellIntraCode").
'</td>';
2343 print $formaccounting->select_account((
GETPOSTISSET(
'accountancy_code_sell_intra') ?
GETPOST(
'accountancy_code_sell_intra') :
$object->accountancy_code_sell_intra),
'accountancy_code_sell_intra', 1,
'', 1, 1,
'minwidth150 maxwidth300');
2348 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellExportCode").
'</td>';
2350 print $formaccounting->select_account((
GETPOSTISSET(
'accountancy_code_sell_export') ?
GETPOST(
'accountancy_code_sell_export') :
$object->accountancy_code_sell_export),
'accountancy_code_sell_export', 1,
'', 1, 1,
'minwidth150 maxwidth300');
2354 print
'<tr><td>'.$langs->trans(
"ProductAccountancyBuyCode").
'</td>';
2356 print $formaccounting->select_account((
GETPOSTISSET(
'accountancy_code_buy') ?
GETPOST(
'accountancy_code_buy') :
$object->accountancy_code_buy),
'accountancy_code_buy', 1,
'', 1, 1,
'minwidth150 maxwidth300');
2360 if ($mysoc->isInEEC()) {
2361 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancyBuyIntraCode").
'</td>';
2363 print $formaccounting->select_account((
GETPOSTISSET(
'accountancy_code_buy_intra') ?
GETPOST(
'accountancy_code_buy_intra') :
$object->accountancy_code_buy_intra),
'accountancy_code_buy_intra', 1,
'', 1, 1,
'minwidth150 maxwidth300');
2368 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancyBuyExportCode").
'</td>';
2370 print $formaccounting->select_account((
GETPOSTISSET(
'accountancy_code_buy_export') ?
GETPOST(
'accountancy_code_buy_export') :
$object->accountancy_code_buy_export),
'accountancy_code_buy_export', 1,
'', 1, 1,
'minwidth150 maxwidth300');
2375 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellCode").
'</td>';
2376 print
'<td><input name="accountancy_code_sell" class="maxwidth200" value="'.(GETPOSTISSET(
'accountancy_code_sell') ?
GETPOST(
'accountancy_code_sell') :
$object->accountancy_code_sell).
'">';
2380 if ($mysoc->isInEEC()) {
2381 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellIntraCode").
'</td>';
2382 print
'<td><input name="accountancy_code_sell_intra" class="maxwidth200" value="'.(GETPOSTISSET(
'accountancy_code_sell_intra') ?
GETPOST(
'accountancy_code_sell_intra') :
$object->accountancy_code_sell_intra).
'">';
2387 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancySellExportCode").
'</td>';
2388 print
'<td><input name="accountancy_code_sell_export" class="maxwidth200" value="'.(GETPOSTISSET(
'accountancy_code_sell_export') ?
GETPOST(
'accountancy_code_sell_export') :
$object->accountancy_code_sell_export).
'">';
2392 print
'<tr><td>'.$langs->trans(
"ProductAccountancyBuyCode").
'</td>';
2393 print
'<td><input name="accountancy_code_buy" class="maxwidth200" value="'.(GETPOSTISSET(
'accountancy_code_buy') ?
GETPOST(
'accountancy_code_buy') :
$object->accountancy_code_buy).
'">';
2397 if ($mysoc->isInEEC()) {
2398 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancyBuyIntraCode").
'</td>';
2399 print
'<td><input name="accountancy_code_buy_intra" class="maxwidth200" value="'.(GETPOSTISSET(
'accountancy_code_buy_intra') ?
GETPOST(
'accountancy_code_buy_intra') :
$object->accountancy_code_buy_intra).
'">';
2404 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ProductAccountancyBuyExportCode").
'</td>';
2405 print
'<td><input name="accountancy_code_buy_export" class="maxwidth200" value="'.(GETPOSTISSET(
'accountancy_code_buy_export') ?
GETPOST(
'accountancy_code_buy_export') :
$object->accountancy_code_buy_export).
'">';
2414 print
$form->buttonsSaveCancel();
2421 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
2426 $titre = $langs->trans(
"CardProduct".
$object->type);
2431 $linkback =
'<a href="'.DOL_URL_ROOT.
'/product/list.php?restore_lastsearch_values=1&type='.
$object->type.
'">'.$langs->trans(
"BackToList").
'</a>';
2432 $object->next_prev_filter =
"fk_product_type:=:".((int)
$object->type);
2435 if ($user->socid && !in_array(
'product', explode(
',',
getDolGlobalString(
'MAIN_MODULES_FOR_EXTERNAL')))) {
2439 dol_banner_tab(
$object,
'ref', $linkback, $shownav,
'ref');
2444 $reshook = $hookmanager->executeHooks(
'tabContentViewProduct',
$parameters,
$object, $action);
2445 if (empty($reshook)) {
2446 print
'<div class="fichecenter">';
2447 print
'<div class="fichehalfleft">';
2449 print
'<div class="underbanner clearboth"></div>';
2450 print
'<table class="border tableforfield centpercent">';
2454 $typeformat =
'select;0:'.$langs->trans(
"Product").
',1:'.$langs->trans(
"Service");
2455 print
'<tr><td class="titlefield">';
2456 print (!
getDolGlobalString(
'PRODUCT_DENY_CHANGE_PRODUCT_TYPE')) ?
$form->editfieldkey(
"Type",
'fk_product_type',
$object->type,
$object, $usercancreate, $typeformat) : $langs->trans(
'Type');
2458 print
$form->editfieldval(
"Type",
'fk_product_type',
$object->type,
$object, $usercancreate, $typeformat);
2464 print
'<tr><td class="nowrap">';
2465 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
2466 print $langs->trans(
"BarcodeType");
2468 if (($action !=
'editbarcodetype') && $usercancreate && $createbarcode) {
2469 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editbarcodetype&id='.
$object->id.
'&token='.
newToken().
'">'.
img_edit($langs->trans(
'Edit'), 1).
'</a></td>';
2471 print
'</tr></table>';
2473 if ($action ==
'editbarcodetype' || $action ==
'editbarcode') {
2474 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formbarcode.class.php';
2478 $fk_barcode_type =
'';
2479 if ($action ==
'editbarcodetype') {
2480 print $formbarcode->formBarcodeType($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->barcode_type,
'fk_barcode_type');
2481 $fk_barcode_type =
$object->barcode_type;
2484 $fk_barcode_type =
$object->barcode_type;
2485 print
$object->barcode_type_label ?
$object->barcode_type_label : (
$object->barcode ?
'<div class="warning">'.$langs->trans(
"SetDefaultBarcodeType").
'<div>' :
'');
2487 print
'</td></tr>'.
"\n";
2490 print
'<tr><td class="nowrap">';
2491 print
'<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
2492 print $langs->trans(
"BarcodeValue");
2494 if (($action !=
'editbarcode') && $usercancreate && $createbarcode) {
2495 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editbarcode&id='.
$object->id.
'&token='.
newToken().
'">'.
img_edit($langs->trans(
'Edit'), 1).
'</a></td>';
2497 print
'</tr></table>';
2498 print
'</td><td class="wordbreak">';
2499 if ($action ==
'editbarcode') {
2501 if (empty($tmpcode) && !empty($modBarCodeProduct->code_auto)) {
2502 $tmpcode = $modBarCodeProduct->getNextValue(
$object, $fk_barcode_type);
2505 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'">';
2506 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2507 print
'<input type="hidden" name="action" value="setbarcode">';
2508 print
'<input type="hidden" name="barcode_type_code" value="'.$object->barcode_type_code.
'">';
2509 print
'<input class="width300" class="maxwidthonsmartphone" type="text" name="barcode" value="'.$tmpcode.
'">';
2510 print
' <input type="submit" class="button smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
2515 print
'</td></tr>'.
"\n";
2521 print
'<tr><td>'.$langs->trans(
"ManageLotSerial").
'</td><td>';
2522 print
$object->getLibStatut(0, 2);
2526 print
'<tr><td>'.$langs->trans(
"ManageLotMask").
'</td><td>';
2532 print
'<tr><td>'.$langs->trans(
'BatchSellOrEatByMandatoryList', $langs->trans(
'SellByDate'), $langs->trans(
'EatByDate')).
'</td><td>';
2533 print
$object->getSellOrEatByMandatoryLabel();
2539 print
'<tr><td class="nowrap">';
2540 print $langs->trans(
"ProductAccountancySellCode");
2543 if (!empty(
$object->accountancy_code_sell)) {
2545 $accountingaccount->fetch(
'',
$object->accountancy_code_sell, 1);
2547 print $accountingaccount->getNomUrl(0, 1, 1,
'', 1);
2550 print
$object->accountancy_code_sell;
2555 if ($mysoc->isInEEC()) {
2556 print
'<tr><td class="nowrap">';
2557 print $langs->trans(
"ProductAccountancySellIntraCode");
2560 if (!empty(
$object->accountancy_code_sell_intra)) {
2562 $accountingaccount2->fetch(
'',
$object->accountancy_code_sell_intra, 1);
2564 print $accountingaccount2->getNomUrl(0, 1, 1,
'', 1);
2567 print
$object->accountancy_code_sell_intra;
2573 print
'<tr><td class="nowrap">';
2574 print $langs->trans(
"ProductAccountancySellExportCode");
2577 if (!empty(
$object->accountancy_code_sell_export)) {
2579 $accountingaccount3->fetch(
'',
$object->accountancy_code_sell_export, 1);
2581 print $accountingaccount3->getNomUrl(0, 1, 1,
'', 1);
2584 print
$object->accountancy_code_sell_export;
2589 print
'<tr><td class="nowrap">';
2590 print $langs->trans(
"ProductAccountancyBuyCode");
2593 if (!empty(
$object->accountancy_code_buy)) {
2595 $accountingaccount4->fetch(
'',
$object->accountancy_code_buy, 1);
2597 print $accountingaccount4->getNomUrl(0, 1, 1,
'', 1);
2600 print
$object->accountancy_code_buy;
2605 if ($mysoc->isInEEC()) {
2606 print
'<tr><td class="nowrap">';
2607 print $langs->trans(
"ProductAccountancyBuyIntraCode");
2610 if (!empty(
$object->accountancy_code_buy_intra)) {
2612 $accountingaccount5->fetch(
'',
$object->accountancy_code_buy_intra, 1);
2614 print $accountingaccount5->getNomUrl(0, 1, 1,
'', 1);
2617 print
$object->accountancy_code_buy_intra;
2623 print
'<tr><td class="nowrap">';
2624 print $langs->trans(
"ProductAccountancyBuyExportCode");
2627 if (!empty(
$object->accountancy_code_buy_export)) {
2629 $accountingaccount6->fetch(
'',
$object->accountancy_code_buy_export, 1);
2631 print $accountingaccount6->getNomUrl(0, 1, 1,
'', 1);
2634 print
$object->accountancy_code_buy_export;
2640 print
'<tr><td class="tdtop">'.$langs->trans(
"Description").
'</td><td class="wordbreakimp wrapimp">'.(
dol_textishtml(
$object->description) ?
$object->description :
dol_nl2br(
$object->description, 1,
true)).
'</td></tr>';
2644 print
'<tr><td>'.$langs->trans(
"PublicUrl").
'</td><td>';
2652 $warehouse->fetch(
$object->fk_default_warehouse);
2654 print
'<tr><td>'.$langs->trans(
"DefaultWarehouse").
'</td><td>';
2655 print(!empty($warehouse->id) ? $warehouse->getNomUrl(1) :
'');
2661 $res = $workstation->fetch(
$object->fk_default_workstation);
2663 print
'<tr><td>'.$langs->trans(
"DefaultWorkstation").
'</td><td>';
2664 print(!empty($workstation->id) ? $workstation->getNomUrl(1) :
'');
2672 if ($combination->fetchByFkProductChild(
$object->id) > 0) {
2673 $prodstatic =
new Product($db);
2674 $prodstatic->fetch($combination->fk_product_parent);
2677 print
'<tr><td>'.$langs->trans(
"ParentProduct").
'</td><td>';
2678 print $prodstatic->getNomUrl(1);
2685 print
'<div class="fichehalfright">';
2687 print
'<div class="underbanner clearboth"></div>';
2688 print
'<table class="border tableforfield centpercent">';
2692 print
'<tr><td class="titlefield">'.$langs->trans(
"Duration").
'</td><td>';
2693 print
$object->duration_value;
2694 if (
$object->duration_value > 1) {
2695 $dur = array(
"i" => $langs->trans(
"Minute"),
"h" => $langs->trans(
"Hours"),
"d" => $langs->trans(
"Days"),
"w" => $langs->trans(
"Weeks"),
"m" => $langs->trans(
"Months"),
"y" => $langs->trans(
"Years"));
2696 } elseif (
$object->duration_value > 0) {
2697 $dur = array(
"i" => $langs->trans(
"Minute"),
"h" => $langs->trans(
"Hour"),
"d" => $langs->trans(
"Day"),
"w" => $langs->trans(
"Week"),
"m" => $langs->trans(
"Month"),
"y" => $langs->trans(
"Year"));
2699 print(!empty(
$object->duration_unit) && isset($dur[
$object->duration_unit]) ?
" ".$langs->trans($dur[
$object->duration_unit]).
" " :
'');
2702 if (
$object->duration_value > 0) {
2703 print
' ';
2705 $htmltooltip = $langs->trans(
"mandatoryHelper");
2706 print
'<input type="checkbox" class="" name="mandatoryperiod"'.($object->mandatory_period == 1 ?
' checked="checked"' :
'').
' disabled>';
2707 print
$form->textwithpicto($langs->trans(
"mandatoryperiod"), $htmltooltip, 1, 0);
2713 print
'<tr><td class="titlefield">'.$form->textwithpicto($langs->trans(
"NatureOfProductShort"), $langs->trans(
"NatureOfProductDesc")).
'</td><td>';
2714 print
$object->getLibFinished();
2720 print
'<tr><td class="titlefield">'.$form->textwithpicto($langs->trans(
"DefaultBOM"), $langs->trans(
"DefaultBOMDesc", $langs->transnoentitiesnoconv(
"Finished"))).
'</td><td>';
2721 if (
$object->fk_default_bom) {
2722 $bom_static =
new BOM($db);
2723 $bom_static->fetch(
$object->fk_default_bom);
2724 print $bom_static->getNomUrl(1);
2732 print
'<tr><td class="titlefield">'.$langs->trans(
"Weight").
'</td><td>';
2738 print
"</td></tr>\n";
2743 print
'<tr><td>'.$langs->trans(
"Length").
' x '.$langs->trans(
"Width").
' x '.$langs->trans(
"Height").
'</td><td>';
2747 print
" x ".$object->width;
2750 print
" x ".$object->height;
2752 print
' '.measuringUnitString(0,
"size",
$object->length_units);
2756 print
"</td></tr>\n";
2760 print
'<tr><td>'.$langs->trans(
"Surface").
'</td><td>';
2766 print
"</td></tr>\n";
2770 print
'<tr><td>'.$langs->trans(
"Volume").
'</td><td>';
2776 print
"</td></tr>\n";
2781 print
'<tr><td class="titlefield">'.$langs->trans(
"NetMeasure").
'</td><td>';
2782 if (
$object->net_measure !=
'') {
2793 $unit =
$object->getLabelOfUnit();
2795 print
'<tr><td>'.$langs->trans(
'DefaultUnitToShow').
'</td><td>';
2797 print $langs->trans($unit);
2804 print
'<tr><td>'.$langs->trans(
"CustomCode").
'</td><td>'.
$object->customcode.
'</td></tr>';
2807 print
'<tr><td>'.$langs->trans(
"Origin").
'</td><td>'.
getCountry(
$object->country_id, 0, $db);
2808 if (!empty(
$object->state_id)) {
2809 print
' - '.getState(
$object->state_id, 0, $db);
2816 print
'<tr><td>'.$langs->trans(
"LifeTime").
'</td><td>'.
$object->lifetime.
'</td></tr>';
2817 print
'<tr><td>'.$langs->trans(
"QCFrequency").
'</td><td>'.
$object->qc_frequency.
'</td></tr>';
2822 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2826 print
'<tr><td class="valignmiddle">'.$langs->trans(
"Categories").
'</td><td>';
2827 print
$form->showCategories(
$object->id, Categorie::TYPE_PRODUCT, 1);
2833 print
'<!-- show Note --> '.
"\n";
2835 print
'<!-- End show Note --> '.
"\n";
2842 print
'<div class="clearboth"></div>';
2847 } elseif ($action !=
'create') {
2853 if (!empty($modCodeProduct->code_auto)) {
2854 $tmpcode = $modCodeProduct->getNextValue(
$object,
$object->type);
2860 if (($action ==
'delete' && (empty($conf->use_javascript_ajax) || !empty($conf->dol_use_jmobile)))
2861 || (!empty($conf->use_javascript_ajax) && empty($conf->dol_use_jmobile))) {
2862 $formconfirm =
$form->formconfirm(
"card.php?id=".
$object->id, $langs->trans(
"DeleteProduct"), $langs->trans(
"ConfirmDeleteProduct"),
"confirm_delete",
'', 0,
"action-delete");
2864 if ($action ==
'merge') {
2865 $formquestion = array(
2867 'name' =>
'product_origin',
2868 'label' => $langs->trans(
'MergeOriginProduct'),
2870 'value' =>
$form->select_produits(
'',
'product_origin',
'', 0, 0, 1, 2,
'', 1, array(), 0, 1, 0,
'minwidth200', 0,
'',
null, 1),
2873 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".
$object->id, $langs->trans(
"MergeProducts"), $langs->trans(
"ConfirmMergeProducts"),
"confirm_merge", $formquestion,
'no', 1, 250);
2877 if (($action ==
'clone' && (empty($conf->use_javascript_ajax) || !empty($conf->dol_use_jmobile)))
2878 || (!empty($conf->use_javascript_ajax) && empty($conf->dol_use_jmobile))) {
2880 $formquestionclone = array(
2881 'text' => $langs->trans(
"ConfirmClone"),
2882 0 => array(
'type' =>
'text',
'name' =>
'clone_ref',
'label' => $langs->trans(
"NewRefForClone"),
'value' => empty($tmpcode) ? $langs->trans(
"CopyOf").
' '.
$object->ref : $tmpcode,
'morecss' =>
'width150'),
2883 1 => array(
'type' =>
'checkbox',
'name' =>
'clone_content',
'label' => $langs->trans(
"CloneContentProduct"),
'value' => 1),
2884 2 => array(
'type' =>
'checkbox',
'name' =>
'clone_categories',
'label' => $langs->trans(
"CloneCategoriesProduct"),
'value' => 1),
2887 $formquestionclone[] = array(
'type' =>
'checkbox',
'name' =>
'clone_prices',
'label' => $langs->trans(
"ClonePricesProduct").
' ('.$langs->trans(
"CustomerPrices").
')',
'value' => 0);
2890 $formquestionclone[] = array(
'type' =>
'checkbox',
'name' =>
'clone_composition',
'label' => $langs->trans(
'CloneCompositionProduct'),
'value' => 1);
2893 $formconfirm .=
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneProduct',
$object->ref),
'confirm_clone', $formquestionclone,
'yes',
'action-clone', 350, 600);
2899 if (empty($reshook)) {
2901 } elseif ($reshook > 0) {
2911 if ($action !=
'create' && $action !=
'edit') {
2912 $cloneProductUrl = $_SERVER[
"PHP_SELF"].
'?action=clone&token='.
newToken();
2913 $cloneButtonId =
'action-clone-no-ajax';
2915 print
"\n".
'<div class="tabsAction">'.
"\n";
2918 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons',
$parameters,
$object, $action);
2919 if (empty($reshook)) {
2920 if ($usercancreate) {
2921 if (!isset(
$object->no_button_edit) ||
$object->no_button_edit != 1) {
2925 if (!isset(
$object->no_button_copy) ||
$object->no_button_copy != 1) {
2926 if (!empty($conf->use_javascript_ajax) && empty($conf->dol_use_jmobile)) {
2927 $cloneProductUrl =
'';
2928 $cloneButtonId =
'action-clone';
2930 print
dolGetButtonAction($langs->trans(
'ToClone'),
'',
'default', $cloneProductUrl, $cloneButtonId, $usercancreate);
2935 if ($usercandelete) {
2936 if (empty($object_is_used) && (!isset(
$object->no_button_delete) ||
$object->no_button_delete != 1)) {
2937 if (!empty($conf->use_javascript_ajax) && empty($conf->dol_use_jmobile)) {
2938 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete',
'#',
'action-delete',
true);
2943 print
dolGetButtonAction($langs->trans(
"ProductIsUsed"), $langs->trans(
'Delete'),
'delete',
'#',
'',
false);
2946 print
'<a class="butActionDelete" href="card.php?action=merge&id='.$object->id.
'" title="'.
dol_escape_htmltag($langs->trans(
"MergeProducts")).
'">'.$langs->trans(
'Merge').
'</a>'.
"\n";
2949 print
dolGetButtonAction($langs->trans(
"NotEnoughPermissions"), $langs->trans(
'Delete'),
'delete',
'#',
'',
false);
2967 if (
isModEnabled(
"propal") && $user->hasRight(
'propal',
'creer')) {
2968 $propal =
new Propal($db);
2970 $langs->load(
"propal");
2972 $otherprop = $propal->liste_array(2, 1, 0);
2974 if (is_array($otherprop) && count($otherprop)) {
2975 $html .=
'<tr><td style="width: 200px;">';
2976 $html .= $langs->trans(
"AddToDraftProposals").
'</td><td>';
2977 $html .=
$form->selectarray(
"propalid", $otherprop, 0, 1);
2978 $html .=
'</td></tr>';
2980 $html .=
'<tr><td style="width: 200px;">';
2981 $html .= $langs->trans(
"AddToDraftProposals").
'</td><td>';
2982 $html .= $langs->trans(
"NoDraftProposals");
2983 $html .=
'</td></tr>';
2988 if (
isModEnabled(
'order') && $user->hasRight(
'commande',
'creer')) {
2991 $langs->load(
"orders");
2993 $othercom = $commande->liste_array(2, 1,
null);
2994 if (is_array($othercom) && count($othercom)) {
2995 $html .=
'<tr><td style="width: 200px;">';
2996 $html .= $langs->trans(
"AddToDraftOrders").
'</td><td>';
2997 $html .=
$form->selectarray(
"commandeid", $othercom, 0, 1);
2998 $html .=
'</td></tr>';
3000 $html .=
'<tr><td style="width: 200px;">';
3001 $html .= $langs->trans(
"AddToDraftOrders").
'</td><td>';
3002 $html .= $langs->trans(
"NoDraftOrders");
3003 $html .=
'</td></tr>';
3008 if (
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
3011 $langs->load(
"bills");
3013 $otherinvoice = $invoice->liste_array(2, 1,
null);
3014 if (is_array($otherinvoice) && count($otherinvoice)) {
3015 $html .=
'<tr><td style="width: 200px;">';
3016 $html .= $langs->trans(
"AddToDraftInvoices").
'</td><td>';
3017 $html .=
$form->selectarray(
"factureid", $otherinvoice, 0, 1);
3018 $html .=
'</td></tr>';
3020 $html .=
'<tr><td style="width: 200px;">';
3021 $html .= $langs->trans(
"AddToDraftInvoices").
'</td><td>';
3022 $html .= $langs->trans(
"NoDraftInvoices");
3023 $html .=
'</td></tr>';
3028 if (!empty($html)) {
3029 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'">';
3030 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3031 print
'<input type="hidden" name="action" value="addin">';
3037 $html .=
'<tr><td class="nowrap">'.$langs->trans(
"Quantity").
' ';
3038 $html .=
'<input type="text" class="flat" name="qty" size="1" value="1"></td>';
3039 $html .=
'<td class="nowrap">'.$langs->trans(
"ReductionShort").
'(%) ';
3040 $html .=
'<input type="text" class="flat" name="remise_percent" size="1" value="0">';
3041 $html .=
'</td></tr>';
3043 print
'<table width="100%" class="border">';
3047 print
'<div class="center">';
3048 print
'<input type="submit" class="button button-add" value="'.$langs->trans(
"Add").
'">';
3062 if ($action !=
'create' && $action !=
'edit' && $action !=
'delete') {
3063 print
'<div class="fichecenter"><div class="fichehalfleft">';
3064 print
'<a name="builddoc"></a>';
3068 if (!empty($conf->product->multidir_output[
$object->entity])) {
3069 $filedir = $conf->product->multidir_output[
$object->entity].
'/'.$objectref;
3071 $filedir = $conf->product->dir_output.
'/'.$objectref;
3073 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3074 $genallowed = $usercanread;
3075 $delallowed = $usercancreate;
3077 print $formfile->showdocuments($modulepart,
$object->ref, $filedir, $urlsource, $genallowed, $delallowed,
'', 0, 0, 0, 28, 0,
'', 0,
'', $langs->getDefaultLang(),
'',
$object);
3078 $somethingshown = $formfile->numoffiles;
3080 print
'</div><div class="fichehalfright">';
3083 $morehtmlcenter =
'<div class="nowraponall">';
3084 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/product/messaging.php?id='.
$object->id);
3085 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/product/agenda.php?id='.
$object->id);
3086 $morehtmlcenter .=
'</div>';
3089 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3091 $somethingshown =
$formactions->showactions(
$object,
'product', 0, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3093 print
'</div></div>';
if($user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif($action=='specimen') elseif($action=='setmodel') elseif($action=='del') elseif($action=='setdoc') $formactions
View.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Class to manage accounting accounts.
Class to manage categories.
Class to manage customers orders.
Class to manage a WYSIWYG editor.
Class to manage warehouses.
Class to manage invoices.
const TYPE_STANDARD
Standard invoice.
Class of a generic business object.
Class ProductCombination Used to represent the relation between a product and one of its variants.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
static getSellOrEatByMandatoryList()
Get sell or eat by mandatory list.
const TYPE_SERVICE
Service.
Class to manage proposals.
Class to manage third parties objects (customers, suppliers, prospects...)
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
if(isModEnabled('invoice') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&!getDolGlobalString('MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') && $user->hasRight('tax', 'charges', 'lire')) if(isModEnabled('invoice') &&isModEnabled('order') && $user->hasRight("commande", "lire") &&!getDolGlobalString('WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER')) $sql
Social contributions to pay.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
dol_print_url($url, $target='_blank', $max=32, $withpicto=0, $morecss='')
Show Url link.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_set_focus($selector)
Set focus onto field with selector (similar behaviour of 'autofocus' HTML5 tag)
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
dol_textishtml($msg, $option=0)
Return if a text is a html content.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information in HTML for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
$formconfirm
if ($action == 'delbookkeepingyear') {
product_prepare_head($object)
Prepare array with list of tabs.
measuringUnitString($unit, $measuring_style='', $scale='', $use_short_label=0, $outputlangs=null)
Return translation label of a unit key.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.