36require
'../../main.inc.php';
37require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
42require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productstockentrepot.class.php';
44if (isModEnabled(
'productbatch')) {
45 require_once DOL_DOCUMENT_ROOT.
'/product/class/productbatch.class.php';
47if (isModEnabled(
'project')) {
48 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
49 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
52if (isModEnabled(
'variants')) {
53 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductAttribute.class.php';
54 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductAttributeValue.class.php';
55 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination.class.php';
56 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination2ValuePair.class.php';
68$langs->loadlangs(array(
'products',
'suppliers',
'orders',
'bills',
'stocks',
'sendings',
'margins'));
69if (isModEnabled(
'productbatch')) {
70 $langs->load(
"productbatch");
73$backtopage =
GETPOST(
'backtopage',
'alpha');
74$action =
GETPOST(
'action',
'aZ09');
75$cancel =
GETPOST(
'cancel',
'alpha');
81$cancel =
GETPOST(
'cancel',
'alpha');
82$fieldid = GETPOSTISSET(
"ref") ?
'ref' :
'rowid';
86$batchnumber =
GETPOST(
'batch_number',
'san_alpha');
87if (!empty($batchnumber)) {
88 $batchnumber = trim($batchnumber);
90$cost_price =
GETPOST(
'cost_price',
'alpha');
95$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
96$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
98if (empty($page) || $page < 0 ||
GETPOST(
'button_search',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
102$offset = $limit * $page;
103$pageprev = $page - 1;
104$pagenext = $page + 1;
109 $socid = $user->socid;
116$extrafields->fetch_name_optionals_label(
$object->table_element);
118if ($id > 0 || !empty($ref)) {
119 $result =
$object->fetch($id, $ref);
122if (empty($id) && !empty(
$object->id)) {
126$modulepart =
'product';
131if (!empty($canvas)) {
132 require_once DOL_DOCUMENT_ROOT.
'/core/class/canvas.class.php';
133 $objcanvas =
new Canvas($db, $action);
134 $objcanvas->getCanvas(
'stockproduct',
'card', $canvas);
138$hookmanager->initHooks(array(
'stockproductcard',
'globalcard'));
144$usercancreadprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'product',
'product_advance',
'read_prices') : $user->hasRight(
'product',
'lire');
145$usercancreadsupplierprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'product',
'product_advance',
'read_supplier_prices') : $user->hasRight(
'product',
'lire');
146$usercanupdatestock = $user->hasRight(
'stock',
'mouvement',
'creer');
149 $label = $langs->trans(
'Service');
150 $usercancreadprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'service',
'service_advance',
'read_prices') : $user->hasRight(
'service',
'lire');
151 $usercancreadsupplierprice =
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') ? $user->hasRight(
'service',
'service_advance',
'read_supplier_prices') : $user->hasRight(
'service',
'lire');
155 if (
$object->type == $object::TYPE_PRODUCT) {
158 if (
$object->type == $object::TYPE_SERVICE) {
162 restrictedArea($user,
'produit|service', $id,
'product&product',
'',
'', $fieldid);
174$parameters = array(
'id' => $id,
'ref' => $ref,
'objcanvas' => $objcanvas);
175$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
180if ($action ==
'setcost_price' && $usercancreate) {
195if ($action ==
'addlimitstockwarehouse' && $usercancreate) {
196 $seuil_stock_alerte =
GETPOST(
'seuil_stock_alerte');
197 $desiredstock =
GETPOST(
'desiredstock');
200 if ($seuil_stock_alerte ==
'') {
201 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"StockLimit")),
null,
'errors');
204 if ($desiredstock ==
'' || is_array($desiredstock)) {
205 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DesiredStock")),
null,
'errors');
209 $desiredstock = (float) $desiredstock;
214 if ($pse->fetch(0, $id,
GETPOSTINT(
'fk_entrepot')) > 0) {
216 $pse->seuil_stock_alerte = $seuil_stock_alerte;
217 $pse->desiredstock = $desiredstock;
218 if ($pse->update($user) > 0) {
219 setEventMessages($langs->trans(
'ProductStockWarehouseUpdated'),
null,
'mesgs');
223 $pse->fk_entrepot =
GETPOSTINT(
'fk_entrepot');
224 $pse->fk_product =
$id;
225 $pse->seuil_stock_alerte =
GETPOST(
'seuil_stock_alerte');
227 if ($pse->create($user) > 0) {
228 setEventMessages($langs->trans(
'ProductStockWarehouseCreated'),
null,
'mesgs');
233 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
237if ($action ==
'delete_productstockwarehouse' && $usercancreate) {
240 $pse->fetch(
GETPOSTINT(
'fk_productstockwarehouse'));
241 if ($pse->delete($user) > 0) {
242 setEventMessages($langs->trans(
'ProductStockWarehouseDeleted'),
null,
'mesgs');
249if ($action ==
'setseuil_stock_alerte' && $usercancreate) {
252 $object->seuil_stock_alerte = $stocklimit;
263if ($action ==
'setdesiredstock' && $usercancreate) {
266 $object->desiredstock = $desiredstock;
276if ($action ==
"correct_stock" && !$cancel && $usercanupdatestock) {
278 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Warehouse")),
null,
'errors');
280 $action =
'correction';
283 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
285 $action =
'correction';
288 if (isModEnabled(
'productbatch')) {
292 if (
$object->hasbatch() && !$batchnumber) {
293 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"batch_number")),
null,
'errors');
295 $action =
'correction';
302 if (is_numeric($nbpiece) && $nbpiece != 0 && $id) {
303 $origin_element =
'';
307 $origin_element =
'project';
316 $disablestockchangeforsubproduct = 0;
317 if (
GETPOST(
'disablesubproductstockchange')) {
318 $disablestockchangeforsubproduct = 1;
322 $result =
$object->correct_stock_batch(
327 GETPOST(
"label",
'alphanohtml'),
332 GETPOST(
'inventorycode',
'alphanohtml'),
335 $disablestockchangeforsubproduct
338 $result =
$object->correct_stock(
343 GETPOST(
"label",
'alphanohtml'),
345 GETPOST(
'inventorycode',
'alphanohtml'),
348 $disablestockchangeforsubproduct
354 header(
"Location: ".$backtopage);
357 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
$object->id);
362 $action =
'correction';
369if ($action ==
"transfert_stock" && !$cancel && $usercanupdatestock) {
371 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Warehouse")),
null,
'errors');
373 $action =
'transfert';
376 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"NumberOfUnit")),
null,
'errors');
378 $action =
'transfert';
381 setEventMessages($langs->trans(
"ErrorSrcAndTargetWarehouseMustDiffers"),
null,
'errors');
383 $action =
'transfert';
385 if (isModEnabled(
'productbatch')) {
389 if (
$object->hasbatch() && !$batchnumber) {
390 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"batch_number")),
null,
'errors');
392 $action =
'transfert';
408 $object->load_stock(
'novirtual');
415 $pricedest = $pricesrc;
425 $result = $pdluo->fetch($pdluoid);
427 $srcwarehouseid = $pdluo->warehouseid;
428 $batch = $pdluo->batch;
429 $eatby = $pdluo->eatby;
430 $sellby = $pdluo->sellby;
437 $batch = $batchnumber;
446 $result1 =
$object->correct_stock_batch(
451 GETPOST(
"label",
'alphanohtml'),
456 GETPOST(
'inventorycode',
'alphanohtml')
464 $result2 =
$object->correct_stock_batch(
469 GETPOST(
"label",
'alphanohtml'),
474 GETPOST(
'inventorycode',
'alphanohtml')
483 $result1 =
$object->correct_stock(
488 GETPOST(
"label",
'alphanohtml'),
490 GETPOST(
'inventorycode',
'alphanohtml')
498 $result2 =
$object->correct_stock(
503 GETPOST(
"label",
'alphanohtml'),
505 GETPOST(
'inventorycode',
'alphanohtml')
514 if (!$error && $result1 >= 0 && $result2 >= 0) {
518 header(
"Location: ".$backtopage);
521 header(
"Location: product.php?id=".
$object->id);
527 $action =
'transfert';
534if ($action ==
'updateline' &&
GETPOST(
'save') == $langs->trans(
"Save") && $usercancreate) {
536 $result = $pdluo->fetch(
GETPOSTINT(
'pdluoid'));
540 if ((!
GETPOST(
"sellby")) && (!
GETPOST(
"eatby")) && (!$batchnumber)) {
541 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"atleast1batchfield")),
null,
'errors');
545 $pdluo->batch = $batchnumber;
546 $pdluo->eatby = $d_eatby;
547 $pdluo->sellby = $d_sellby;
548 $result = $pdluo->update($user);
554 setEventMessages($langs->trans(
'BatchInformationNotfound'),
null,
'errors');
559 header(
"Location: product.php?id=".$id);
568$form =
new Form($db);
571if (isModEnabled(
'project')) {
577if ($id > 0 || $ref) {
579 $result =
$object->fetch($id, $ref);
581 $variants =
$object->hasVariants();
585 $title = $langs->trans(
'ProductServiceCard');
589 $title = $langs->trans(
'Product').
" ".$shortlabel.
" - ".$langs->trans(
'Stock');
590 $helpurl =
'EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos';
593 $title = $langs->trans(
'Service').
" ".$shortlabel.
" - ".$langs->trans(
'Stock');
594 $helpurl =
'EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios';
597 llxHeader(
'', $title, $helpurl,
'', 0, 0,
'',
'',
'',
'mod-product page-card_stock_product');
599 if (!empty(
$conf->use_javascript_ajax)) {
601 <script
type=
"text/javascript">
602 $(document).ready(
function() {
603 $(
".collapse_batch").click(
function() {
604 console.log(
"We click on collapse_batch");
605 var id_entrepot = $(
this).attr(
'id').replace(
'ent',
'');
607 if($(
this).text().indexOf(
'+') > 0) {
608 $(
".batch_warehouse" + id_entrepot).show();
610 jQuery(
"#show_all").hide();
611 jQuery(
"#hide_all").show();
614 $(
".batch_warehouse" + id_entrepot).hide();
621 $(
"#show_all").click(
function() {
622 console.log(
"We click on show_all");
623 $(
"[class^=batch_warehouse]").show();
624 $(
"[class^=collapse_batch]").html(
'(-)');
625 jQuery(
"#show_all").hide();
626 jQuery(
"#hide_all").show();
630 $(
"#hide_all").click(
function() {
631 console.log(
"We click on hide_all");
632 $(
"[class^=batch_warehouse]").hide();
633 $(
"[class^=collapse_batch]").html(
'(+)');
634 jQuery(
"#hide_all").hide();
635 jQuery(
"#show_all").show();
646 $titre = $langs->trans(
"CardProduct".
$object->type);
653 $linkback =
'<a href="'.DOL_URL_ROOT.
'/product/list.php?restore_lastsearch_values=1&type='.
$object->type.
'">'.$langs->trans(
"BackToList").
'</a>';
654 $object->next_prev_filter =
"(te.fk_product_type:=:".((int)
$object->type).
")";
657 if ($user->socid && !in_array(
'stock', explode(
',',
getDolGlobalString(
'MAIN_MODULES_FOR_EXTERNAL')))) {
661 dol_banner_tab(
$object,
'ref', $linkback, $shownav,
'ref');
664 print
'<div class="fichecenter">';
666 print
'<div class="fichehalfleft">';
667 print
'<div class="underbanner clearboth"></div>';
669 print
'<table class="border tableforfield centpercent">';
672 if (isModEnabled(
"product") && isModEnabled(
"service")) {
673 $typeformat =
'select;0:'.$langs->trans(
"Product").
',1:'.$langs->trans(
"Service");
674 print
'<tr><td class="">';
675 print (!
getDolGlobalString(
'PRODUCT_DENY_CHANGE_PRODUCT_TYPE')) ? $form->editfieldkey(
"Type",
'fk_product_type', (
string)
$object->type,
$object, 0, $typeformat) : $langs->trans(
'Type');
677 print $form->editfieldval(
"Type",
'fk_product_type',
$object->type,
$object, 0, $typeformat);
681 if (isModEnabled(
'productbatch')) {
682 print
'<tr><td class="">'.$langs->trans(
"ManageLotSerial").
'</td><td>';
683 print
$object->getLibStatut(0, 2);
689 $textdesc = $langs->trans(
"CostPriceDescription");
690 $textdesc .=
"<br>".$langs->trans(
"CostPriceUsage");
691 $text = $form->textwithpicto($langs->trans(
"CostPrice"), $textdesc, 1,
'help',
'');
692 if (!$usercancreadsupplierprice) {
693 print $form->editfieldkey($text,
'cost_price',
'',
$object, 0,
'amount:6');
695 print $form->editfieldval($text,
'cost_price',
'',
$object, 0,
'amount:6');
697 print $form->editfieldkey($text,
'cost_price', (
string)
$object->cost_price,
$object, (
int) $usercancreate,
'amount:6');
699 print $form->editfieldval($text,
'cost_price',
$object->cost_price,
$object, $usercancreate,
'amount:6');
706 print
'<tr><td class="titlefieldmiddle">';
707 print $form->textwithpicto($langs->trans(
"AverageUnitPricePMPShort"), $langs->trans(
"AverageUnitPricePMPDesc"));
710 if (
$object->pmp > 0 && $usercancreadsupplierprice) {
717 print
'<tr><td>'.$langs->trans(
"BuyingPriceMin").
'</td>';
720 if ($product_fourn->find_min_price_product_fournisseur(
$object->id) > 0) {
721 if ($product_fourn->product_fourn_price_id > 0 && $usercancreadsupplierprice) {
722 print $product_fourn->display_price_product_fournisseur();
724 print $langs->trans(
"NotDefined");
731 print
'<tr><td>'.$langs->trans(
"SellingPrice").
'</td><td>';
732 if ($usercancreadprice) {
733 if (
$object->price_base_type ==
'TTC') {
742 print
'<tr><td>'.$langs->trans(
"MinPrice").
'</td><td>';
743 if ($usercancreadprice) {
744 if (
$object->price_base_type ==
'TTC') {
753 print
'<tr><td>'.$langs->trans(
"SellingPrice").
'</td><td>';
754 print
'<span class="opacitymedium">'.$langs->trans(
"Variable").
'</span>';
758 print
'<tr><td>'.$langs->trans(
"MinPrice").
'</td><td>';
759 print
'<span class="opacitymedium">'.$langs->trans(
"Variable").
'</span>';
764 $parameters = array();
765 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters,
$object, $action);
766 print $hookmanager->resPrint;
771 print
'<div class="fichehalfright"><div class="underbanner clearboth"></div>';
773 print
'<table class="border tableforfield centpercent">';
776 print
'<tr><td>'.$form->editfieldkey($form->textwithpicto($langs->trans(
"StockLimit"), $langs->trans(
"StockLimitDesc"), 1),
'seuil_stock_alerte', (
string)
$object->seuil_stock_alerte,
$object, $user->hasRight(
'produit',
'creer')).
'</td><td>';
777 print $form->editfieldval(
"StockLimit",
'seuil_stock_alerte',
$object->seuil_stock_alerte,
$object, $user->hasRight(
'produit',
'creer'),
'string');
781 print
'<tr><td>'.$form->editfieldkey($form->textwithpicto($langs->trans(
"DesiredStock"), $langs->trans(
"DesiredStockDesc"), 1),
'desiredstock', (
string)
$object->desiredstock,
$object, $user->hasRight(
'produit',
'creer'));
783 print $form->editfieldval(
"DesiredStock",
'desiredstock',
$object->desiredstock,
$object, $user->hasRight(
'produit',
'creer'),
'string');
787 $text_stock_options = $langs->trans(
"RealStockDesc").
'<br>';
788 $text_stock_options .= $langs->trans(
"RealStockWillAutomaticallyWhen").
'<br>';
789 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SHIPMENT') ||
getDolGlobalString(
'STOCK_CALCULATE_ON_SHIPMENT_CLOSE') ?
'- '.$langs->trans(
"DeStockOnShipment").
'<br>' :
'');
790 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') ?
'- '.$langs->trans(
"DeStockOnValidateOrder").
'<br>' :
'');
791 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_BILL') ?
'- '.$langs->trans(
"DeStockOnBill").
'<br>' :
'');
792 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SUPPLIER_BILL') ?
'- '.$langs->trans(
"ReStockOnBill").
'<br>' :
'');
793 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER') ?
'- '.$langs->trans(
"ReStockOnValidateOrder").
'<br>' :
'');
794 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER') ?
'- '.$langs->trans(
"ReStockOnDispatchOrder").
'<br>' :
'');
795 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_RECEPTION') ||
getDolGlobalString(
'STOCK_CALCULATE_ON_RECEPTION_CLOSE') ?
'- '.$langs->trans(
"StockOnReception").
'<br>' :
'');
796 $parameters = array();
797 $reshook = $hookmanager->executeHooks(
'physicalStockTextStockOptions', $parameters,
$object, $action);
799 $text_stock_options = $hookmanager->resPrint;
800 } elseif ($reshook == 0) {
801 $text_stock_options .= $hookmanager->resPrint;
807 print $form->textwithpicto($langs->trans(
"PhysicalStock"), $text_stock_options, 1);
809 print
'<td>'.price2num(
$object->stock_reel,
'MS');
811 print
' '.img_warning($langs->trans(
"StockLowerThanLimit",
$object->seuil_stock_alerte));
814 print
' <a href="'.DOL_URL_ROOT.
'/product/stock/stockatdate.php?productid='.
$object->id.
'">'.$langs->trans(
"StockAtDate").
'</a>';
821 $helpondiff =
'<strong>'.$langs->trans(
"StockDiffPhysicTeoric").
':</strong><br>';
823 if (isModEnabled(
'order')) {
825 $helpondiff .=
'<br>';
829 $helpondiff .= $langs->trans(
"ProductQtyInCustomersOrdersRunning").
': '.
$object->stats_commande[
'qty'];
830 $result =
$object->load_stats_commande(0,
'0', 1);
834 $helpondiff .=
' <span class="opacitymedium">('.$langs->trans(
"ProductQtyInDraft").
': '.
$object->stats_commande[
'qty'].
')</span>';
838 if (isModEnabled(
"shipping")) {
839 require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expedition.class.php';
840 $filterShipmentStatus =
'';
847 $helpondiff .=
'<br>';
851 $result =
$object->load_stats_sending(0,
'2', 1, $filterShipmentStatus);
852 $helpondiff .= $langs->trans(
"ProductQtyInShipmentAlreadySent").
': '.
$object->stats_expedition[
'qty'];
856 if (isModEnabled(
"supplier_order") || isModEnabled(
"supplier_invoice")) {
858 $helpondiff .=
'<br>';
862 $result =
$object->load_stats_commande_fournisseur(0,
'3,4', 1);
863 $helpondiff .= $langs->trans(
"ProductQtyInSuppliersOrdersRunning").
': '.
$object->stats_commande_fournisseur[
'qty'];
864 $result =
$object->load_stats_commande_fournisseur(0,
'0,1,2', 1);
868 $helpondiff .=
' <span class="opacitymedium">('.$langs->trans(
"ProductQtyInDraftOrWaitingApproved").
': '.
$object->stats_commande_fournisseur[
'qty'].
')</span>';
872 if (isModEnabled(
"supplier_order") || isModEnabled(
"supplier_invoice")) {
874 $helpondiff .=
'<br>';
878 $helpondiff .= $langs->trans(
"ProductQtyInSuppliersShipmentAlreadyRecevied").
': '.
$object->stats_reception[
'qty'];
882 if (isModEnabled(
'mrp')) {
884 $helpondiff .=
'<br>';
888 $helpondiff .= $langs->trans(
"ProductQtyToConsumeByMO").
': '.
$object->stats_mrptoconsume[
'qty'].
'<br>';
889 $helpondiff .= $langs->trans(
"ProductQtyToProduceByMO").
': '.
$object->stats_mrptoproduce[
'qty'];
891 $parameters = array(
'found' => &$found,
'id' =>
$object->id,
'includedraftpoforvirtual' =>
null);
892 $reshook = $hookmanager->executeHooks(
'virtualStockHelpOnDiff', $parameters,
$object, $action);
894 $helpondiff = $hookmanager->resPrint;
895 } elseif ($reshook == 0) {
896 $helpondiff .= $hookmanager->resPrint;
904 print $form->textwithpicto($langs->trans(
"VirtualStock"), $langs->trans(
"VirtualStockDesc"));
908 print $form->textwithpicto((empty($stocktheo) ? 0 : $stocktheo), $helpondiff);
910 print
' '.img_warning($langs->trans(
"StockLowerThanLimit",
$object->seuil_stock_alerte));
912 print
' <a href="'.DOL_URL_ROOT.
'/product/stock/stockatdate.php?mode=future&productid='.
$object->id.
'">'.$langs->trans(
"VirtualStockAtDate").
'</a>';
917 if ($user->hasRight(
'stock',
'mouvement',
'lire')) {
918 $sql =
"SELECT max(m.datem) as datem";
919 $sql .=
" FROM ".MAIN_DB_PREFIX.
"stock_mouvement as m";
920 $sql .=
" WHERE m.fk_product = ".((int)
$object->id);
921 $lastmovementdate = 0;
922 $resqlbis = $db->query($sql);
924 $obj = $db->fetch_object($resqlbis);
925 $lastmovementdate = $db->jdate($obj->datem);
929 print
'<tr><td class="tdtop">'.$langs->trans(
"LastMovement").
'</td><td>';
930 if ($lastmovementdate) {
932 print
' ';
933 print
img_picto($langs->trans(
"StockMovement"),
'movement',
'class="pictofixedwidth"');
934 print
'<a href="'.DOL_URL_ROOT.
'/product/stock/movement_list.php?idproduct='.
$object->id.
'">'.$langs->trans(
"FullList").
'</a>';
936 print
img_picto($langs->trans(
"StockMovement"),
'movement',
'class="pictofixedwidth"');
937 print
'<a href="'.DOL_URL_ROOT.
'/product/stock/movement_list.php?idproduct='.
$object->id.
'">'.$langs->trans(
"None").
'</a>';
947 print
'<div class="clearboth"></div>';
954 if ($action ==
"correction") {
955 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stockcorrection.tpl.php';
960 if ($action ==
"transfert") {
961 include DOL_DOCUMENT_ROOT.
'/product/stock/tpl/stocktransfer.tpl.php';
971$parameters = array();
973$reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
974if (empty($reshook)) {
975 if (empty($action) &&
$object->id) {
976 print
"<div class=\"tabsAction\">\n";
978 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
979 if (!$variants ||
getDolGlobalString(
'VARIANT_ALLOW_STOCK_MOVEMENT_ON_VARIANT_PARENT')) {
980 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=transfert&token='.
newToken().
'">'.$langs->trans(
"TransferStock").
'</a>';
982 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"ActionAvailableOnVariantProductOnly").
'">'.$langs->trans(
"TransferStock").
'</a>';
985 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"TransferStock").
'</a>';
988 if ($user->hasRight(
'stock',
'mouvement',
'creer')) {
989 if (!$variants ||
getDolGlobalString(
'VARIANT_ALLOW_STOCK_MOVEMENT_ON_VARIANT_PARENT')) {
990 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=correction&token='.
newToken().
'">'.$langs->trans(
"CorrectStock").
'</a>';
992 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"ActionAvailableOnVariantProductOnly").
'">'.$langs->trans(
"CorrectStock").
'</a>';
995 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"CorrectStock").
'</a>';
1003if (!$variants ||
getDolGlobalString(
'VARIANT_ALLOW_STOCK_MOVEMENT_ON_VARIANT_PARENT')) {
1008 print
'<div class="div-table-responsive">';
1009 print
'<table class="noborder centpercent">';
1011 print
'<tr class="liste_titre">';
1012 print
'<td colspan="4">'.$langs->trans(
"Warehouse").
'</td>';
1013 print
'<td class="right">'.$langs->trans(
"NumberOfUnit").
'</td>';
1014 print
'<td class="right">'.$form->textwithpicto($langs->trans(
"AverageUnitPricePMPShort"), $langs->trans(
"AverageUnitPricePMPDesc")).
'</td>';
1015 print
'<td class="right">'.$langs->trans(
"EstimatedStockValueShort").
'</td>';
1016 print
'<td class="right">'.$langs->trans(
"SellPriceMin").
'</td>';
1017 print
'<td class="right">'.$langs->trans(
"EstimatedStockValueSellShort").
'</td>';
1022 if ((isModEnabled(
'productbatch')) &&
$object->hasbatch()) {
1024 print
'<tr class="liste_titre"><td class="minwidth200">';
1025 if (!empty(
$conf->use_javascript_ajax)) {
1026 print
'<a id="show_all" href="#" class="hideobject">'.img_picto(
'',
'folder-open',
'class="paddingright"').$langs->trans(
"ShowAllLots").
'</a>';
1028 print
'<a id="hide_all" href="#">'.img_picto(
'',
'folder',
'class="paddingright"').$langs->trans(
"HideLots").
'</a>';
1032 print
'<td class="right">'.$langs->trans(
"batch_number").
'</td>';
1035 print
'<td class="center width100">'.$langs->trans(
"SellByDate").
'</td>';
1039 print
'<td class="center width100">'.$langs->trans(
"EatByDate").
'</td>';
1041 print
'<td colspan="'.$colspan.
'"></td>';
1051 $sql =
"SELECT e.rowid, e.ref, e.lieu, e.fk_parent, e.statut as status, ps.reel, ps.rowid as product_stock_id, p.pmp";
1052 $sql .=
" FROM ".MAIN_DB_PREFIX.
"entrepot as e,";
1053 $sql .=
" ".MAIN_DB_PREFIX.
"product_stock as ps";
1054 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON p.rowid = ps.fk_product";
1055 $sql .=
" WHERE ps.reel != 0";
1056 $sql .=
" AND ps.fk_entrepot = e.rowid";
1057 $sql .=
" AND e.entity IN (".getEntity(
'stock').
")";
1058 $sql .=
" AND ps.fk_product = ".((int)
$object->id);
1059 $sql .=
" ORDER BY e.ref";
1061 $entrepotstatic =
new Entrepot($db);
1066 $totalvalue = $totalvaluesell = 0;
1069 $resql = $db->query($sql);
1071 $num = $db->num_rows($resql);
1072 $total = $totalwithpmp;
1076 $obj = $db->fetch_object($resql);
1078 $entrepotstatic->id = $obj->rowid;
1079 $entrepotstatic->ref = $obj->ref;
1080 $entrepotstatic->label = $obj->ref;
1081 $entrepotstatic->lieu = $obj->lieu;
1082 $entrepotstatic->fk_parent = $obj->fk_parent;
1083 $entrepotstatic->statut = $obj->status;
1084 $entrepotstatic->status = $obj->status;
1086 $stock_real =
price2num($obj->reel,
'MS');
1087 print
'<tr class="oddeven">';
1090 print
'<td colspan="4">';
1091 print $entrepotstatic->getNomUrl(1);
1092 if (!empty(
$conf->use_javascript_ajax) && isModEnabled(
'productbatch') &&
$object->hasbatch()) {
1093 print
'<a class="collapse_batch marginleftonly" id="ent' . $entrepotstatic->id .
'" href="#">';
1099 print
'<td class="right">'.$stock_real.($stock_real < 0 ?
' '.img_warning() :
'').
'</td>';
1102 print
'<td class="right nowraponall">'.(price2num(
$object->pmp) ?
price2num(
$object->pmp,
'MU') :
'').
'</td>';
1105 if ($usercancreadsupplierprice) {
1106 print
'<td class="right amount nowraponall">'.(price2num(
$object->pmp) ?
price(
price2num(
$object->pmp * $obj->reel,
'MT')) :
'').
'</td>';
1108 print
'<td class="right amount nowraponall"></td>';
1112 $minsellprice =
null;
1113 $maxsellprice =
null;
1114 print
'<td class="right nowraponall">';
1116 foreach (
$object->multiprices as $priceforlevel) {
1117 if (is_numeric($priceforlevel)) {
1118 if (is_null($maxsellprice) || $priceforlevel > $maxsellprice) {
1119 $maxsellprice = $priceforlevel;
1121 if (is_null($minsellprice) || $priceforlevel < $minsellprice) {
1122 $minsellprice = $priceforlevel;
1126 print
'<span class="valignmiddle">';
1127 if ($usercancreadprice) {
1128 if ($minsellprice != $maxsellprice) {
1135 print $form->textwithpicto(
'', $langs->trans(
"Variable"));
1136 } elseif ($usercancreadprice) {
1142 print
'<td class="right amount nowraponall">';
1144 print
'<span class="valignmiddle">';
1145 if ($usercancreadprice) {
1146 if ($minsellprice != $maxsellprice) {
1153 print $form->textwithpicto(
'', $langs->trans(
"Variable"));
1155 if ($usercancreadprice) {
1163 $total += $obj->reel;
1165 $totalwithpmp += $obj->reel;
1167 $totalvalue += (
$object->pmp * $obj->reel);
1168 $totalvaluesell += (
$object->price * $obj->reel);
1170 if ((isModEnabled(
'productbatch')) &&
$object->hasbatch()) {
1175 foreach ($details as $pdluo) {
1176 $product_lot_static->id = $pdluo->lotid;
1177 $product_lot_static->batch = $pdluo->batch;
1178 $product_lot_static->eatby = $pdluo->eatby;
1179 $product_lot_static->sellby = $pdluo->sellby;
1181 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $pdluo->id) {
1183 print
'<td colspan="9">';
1184 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1185 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1186 print
'<input type="hidden" name="pdluoid" value="'.$pdluo->id.
'"><input type="hidden" name="action" value="updateline"><input type="hidden" name="id" value="'.
$id.
'"><table class="noborder centpercent"><tr><td width="10%"></td>';
1187 print
'<td class="right" width="10%"><input type="text" name="batch_number" value="'.$pdluo->batch.
'"></td>';
1189 print
'<td class="center" width="10%">';
1190 print $form->selectDate($pdluo->sellby,
'sellby', 0, 0, 1,
'', 1, 0);
1194 print
'<td class="center" width="10%">';
1195 print $form->selectDate($pdluo->eatby,
'eatby', 0, 0, 1,
'', 1, 0);
1198 print
'<td class="right" colspan="3">'.$pdluo->qty.($pdluo->qty < 0 ?
' '.img_warning() :
'').
'</td>';
1199 print
'<td colspan="4"><input type="submit" class="button button-save" id="savelinebutton marginbottomonly" name="save" value="'.$langs->trans(
"Save").
'">';
1200 print
'<input type="submit" class="button button-cancel" id="cancellinebutton" name="Cancel" value="'.$langs->trans(
"Cancel").
'"></td></tr>';
1208 print
"\n".
'<tr style="display:'.(!
getDolGlobalString(
'STOCK_SHOW_ALL_BATCH_BY_DEFAULT') ?
'none' :
'visible').
';" class="batch_warehouse'.$entrepotstatic->id.
'"><td class="left">';
1210 print
'<td class="right nowraponall">';
1211 if ($product_lot_static->id > 0) {
1212 print $product_lot_static->getNomUrl(1);
1214 print $product_lot_static->getNomUrl(1,
'nolink');
1220 print
'<td class="center">'.dol_print_date($pdluo->sellby,
'day').
'</td>';
1224 print
'<td class="center">'.dol_print_date($pdluo->eatby,
'day').
'</td>';
1226 print
'<td class="right" colspan="'.$colspan.
'">'.$pdluo->qty.($pdluo->qty < 0 ?
' '.img_warning() : (($pdluo->qty > 1 &&
$object->status_batch == 2) ?
' '.
img_warning($langs->trans(
'IlligalQtyForSerialNumbers')) :
'')).
'</td>';
1227 print
'<td colspan="4"></td>';
1228 print
'<td class="center tdoverflowmax125" title="'.dol_escape_htmltag($langs->trans(
"TransferStock")).
'">';
1229 if ($entrepotstatic->status != $entrepotstatic::STATUS_CLOSED) {
1230 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&id_entrepot='.$entrepotstatic->id.
'&action=transfert&pdluoid='.$pdluo->id.
'&token='.
newToken().
'">';
1231 print
img_picto($langs->trans(
"TransferStock"),
'add',
'class="hideonsmartphone paddingright" style="color: #a69944"');
1232 print $langs->trans(
"TransferStock");
1240 print
'<td class="center tdoverflowmax125" title="'.dol_escape_htmltag($langs->trans(
"CorrectStock")).
'">';
1241 if ($entrepotstatic->status != $entrepotstatic::STATUS_CLOSED) {
1242 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&id_entrepot='.$entrepotstatic->id.
'&action=correction&pdluoid='.$pdluo->id.
'&token='.
newToken().
'">';
1243 print
img_picto($langs->trans(
"CorrectStock"),
'add',
'class="hideonsmartphone paddingright" style="color: #a69944"');
1244 print $langs->trans(
"CorrectStock");
1263 print
'<tr class="liste_total"><td class="right liste_total" colspan="4">'.$langs->trans(
"Total").
':</td>';
1264 print
'<td class="liste_total right">'.price2num($total,
'MS').
'</td>';
1265 print
'<td class="liste_total right">';
1266 if ($usercancreadsupplierprice) {
1267 print($totalwithpmp ?
price(
price2num($totalvalue / $totalwithpmp,
'MU')) :
' ');
1271 print
'<td class="liste_total right">';
1272 if ($usercancreadsupplierprice) {
1273 print $totalvalue ?
price(
price2num($totalvalue,
'MT'), 1) :
' ';
1276 print
'<td class="liste_total right">';
1279 print
'<span class="valignmiddle">';
1281 print $form->textwithpicto(
'', $langs->trans(
"Variable"));
1282 } elseif ($usercancreadprice) {
1283 print
price($totalvaluesell / $total, 1);
1290 print
'<td class="liste_total right amount">';
1292 print
'<span class="valignmiddle">';
1296 print $form->textwithpicto(
'', $langs->trans(
"Variable"));
1312 if ($user->hasRight(
'produit',
'creer')) {
1313 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1314 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1315 print
'<input type="hidden" name="action" value="addlimitstockwarehouse">';
1316 print
'<input type="hidden" name="id" value="'.$id.
'">';
1318 print
'<table class="noborder centpercent">';
1319 if ($user->hasRight(
'produit',
'creer')) {
1320 print
'<tr class="liste_titre"><td>'.$formproduct->selectWarehouses(
'',
'fk_entrepot').
'</td>';
1321 print
'<td class="right"><input name="seuil_stock_alerte" type="text" placeholder="'.$langs->trans(
"StockLimit").
'" /></td>';
1322 print
'<td class="right"><input name="desiredstock" type="text" placeholder="'.$langs->trans(
"DesiredStock").
'" /></td>';
1323 print
'<td class="right"><input type="submit" value="'.$langs->trans(
"Save").
'" class="button button-save" /></td>';
1326 print
'<tr class="liste_titre"><td>'.$langs->trans(
"Warehouse").
'</td>';
1327 print
'<td class="right">'.$langs->trans(
"StockLimit").
'</td>';
1328 print
'<td class="right">'.$langs->trans(
"DesiredStock").
'</td>';
1333 $lines = $pse->fetchAll($id);
1335 $visibleWarehouseEntities = explode(
',',
getEntity(
'stock'));
1337 if (!empty($lines)) {
1339 foreach ($lines as $line) {
1341 $ent->fetch($line[
'fk_entrepot']);
1343 if (!isModEnabled(
"multicompany") || in_array($ent->entity, $visibleWarehouseEntities)) {
1345 print
'<tr class="oddeven"><td>'.$ent->getNomUrl(3).
'</td>';
1346 print
'<td class="right">'.$line[
'seuil_stock_alerte'].
'</td>';
1347 print
'<td class="right">'.$line[
'desiredstock'].
'</td>';
1348 if ($user->hasRight(
'produit',
'creer')) {
1349 print
'<td class="right"><a href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$id.
'&fk_productstockwarehouse='.$line[
'id'].
'&action=delete_productstockwarehouse&token='.
newToken().
'">'.
img_delete().
'</a></td>';
1358 if ($user->hasRight(
'produit',
'creer')) {
1364 include_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination.class.php';
1365 include_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination2ValuePair.class.php';
1366 $prodstatic =
new Product($db);
1369 $productCombinations = $prodcomb->fetchAllByFkProductParent(
$object->id);
1371 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
1372 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1373 print
'<input type="hidden" name="action" value="massaction">';
1374 print
'<input type="hidden" name="id" value="'.$id.
'">';
1375 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1378 $title = $langs->trans(
"ProductCombinations");
1380 print_barre_liste($title, 0, $_SERVER[
"PHP_SELF"],
'', $sortfield, $sortorder,
'', 0);
1382 print
'<div class="div-table-responsive">'; ?>
1383 <
table class=
"liste">
1384 <tr
class=
"liste_titre">
1385 <td
class=
"liste_titre"><?php echo $langs->trans(
'Product') ?></td>
1386 <td
class=
"liste_titre"><?php echo $langs->trans(
'Combination') ?></td>
1387 <td
class=
"liste_titre center"><?php echo $langs->trans(
'OnSell') ?></td>
1388 <td
class=
"liste_titre center"><?php echo $langs->trans(
'OnBuy') ?></td>
1389 <td
class=
"liste_titre right"><?php echo $langs->trans(
'Stock') ?></td>
1390 <td
class=
"liste_titre"></td>
1394 if (count($productCombinations)) {
1396 foreach ($productCombinations as $currcomb) {
1397 $prodstatic->fetch($currcomb->fk_product_child);
1398 $prodstatic->load_stock();
1399 $stock_total += $prodstatic->stock_reel; ?>
1400 <tr
class=
"oddeven">
1401 <td><?php echo $prodstatic->getNomUrl(1) ?></td>
1405 $productCombination2ValuePairs = $comb2val->fetchByFkCombination($currcomb->id);
1406 $iMax = count($productCombination2ValuePairs);
1408 for ($i = 0; $i < $iMax; $i++) {
1411 if ($i !== ($iMax - 1)) {
1416 <td style=
"text-align: center;"><?php echo $prodstatic->getLibStatut(2, 0) ?></td>
1417 <td style=
"text-align: center;"><?php echo $prodstatic->getLibStatut(2, 1) ?></td>
1418 <td
class=
"right"><?php echo $prodstatic->stock_reel ?></td>
1420 <a
class=
"paddingleft paddingright editfielda" href=
"<?php echo dol_buildpath('/product/stock/product.php?id='.$currcomb->fk_product_child, 2) ?>"><?php echo
img_edit() ?></a>
1428 print
'<tr class="liste_total">';
1429 print
'<td colspan="4" class="left">'.$langs->trans(
"Total").
'</td>';
1430 print
'<td class="right">'.$stock_total.
'</td>';
1434 print
'<tr><td colspan="8"><span class="opacitymedium">'.$langs->trans(
"None").
'</span></td></tr>';
$id
Support class for third parties, contacts, members, users or resources.
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage warehouses.
const STATUS_CLOSED
Closed status -> parcel was received by customer / end of process prev status : validated or shipment...
const STATUS_VALIDATED
Validated status -> parcel is ready to be sent prev status : draft next status : closed or shipment_i...
Class ProductCombination2ValuePair Used to represent the relation between a variant and its attribute...
Class ProductCombination Used to represent the relation between a product and one of its variants.
Class to manage predefined suppliers products.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
Class ProductStockEntrepot.
Manage record for batch number management.
static findAll($dbs, $fk_product_stock, $with_qty=0, $fk_product=0)
Return all batch detail records for a given product and warehouse.
Class with list of lots and properties.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
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, $morecssdiv='')
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
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.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
treeview li table
No Email.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
product_prepare_head($object)
Prepare array with list of tabs.
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
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.