45require
'../../main.inc.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
47require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
48require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formpropal.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmargin.class.php';
50require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
51require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
52require_once DOL_DOCUMENT_ROOT.
'/core/modules/propale/modules_propale.php';
53require_once DOL_DOCUMENT_ROOT.
'/core/lib/propal.lib.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
56require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
57if (isModEnabled(
'project')) {
58 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
59 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
62if (isModEnabled(
'variants')) {
63 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination.class.php';
76$langs->loadLangs(array(
'companies',
'propal',
'compta',
'bills',
'orders',
'products',
'deliveries',
'sendings',
'other'));
77if (isModEnabled(
'incoterm')) {
78 $langs->load(
'incoterm');
80if (isModEnabled(
'margin')) {
81 $langs->load(
'margins');
86$array_options = array();
91$action =
GETPOST(
'action',
'aZ09');
92$cancel =
GETPOST(
'cancel',
'alpha');
93$origin =
GETPOST(
'origin',
'alpha');
95$confirm =
GETPOST(
'confirm',
'alpha');
96$backtopage =
GETPOST(
'backtopage',
'alpha');
111$extrafields->fetch_name_optionals_label(
$object->table_element);
114if ($id > 0 || !empty($ref)) {
115 $ret =
$object->fetch($id, $ref);
117 $ret =
$object->fetch_thirdparty();
118 if ($ret > 0 && isset(
$object->fk_project)) {
119 $ret =
$object->fetchProject();
129$hookmanager->initHooks(array(
'propalcard',
'globalcard'));
131$usercanread = $user->hasRight(
"propal",
"lire");
132$usercancreate = $user->hasRight(
"propal",
"creer");
133$usercandelete = $user->hasRight(
"propal",
"supprimer");
135$usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'close')));
136$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'validate')));
139$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
140$usercancreateorder = ($user->hasRight(
'commande',
'creer') == 1);
141$usercancreateinvoice = ($user->hasRight(
'facture',
'creer') == 1);
142$usercancreatecontract = ($user->hasRight(
'contrat',
'creer') == 1);
143$usercancreateintervention = ($user->hasRight(
'ficheinter',
'creer') == 1);
144$usercancreatepurchaseorder = ($user->hasRight(
'fournisseur',
'commande',
'creer') || $user->hasRight(
'supplier_order',
'creer'));
146$permissionnote = $usercancreate;
147$permissiondellink = $usercancreate;
148$permissiontoedit = $usercancreate;
150$price_base_type =
null;
153if (!empty($user->socid)) {
154 $socid = $user->socid;
163$parameters = array(
'socid' => $socid);
164$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
168if (empty($reshook)) {
169 $backurlforlist = DOL_URL_ROOT.
'/comm/propal/list.php';
171 if (empty($backtopage) || ($cancel && empty($id))) {
172 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
173 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
174 $backtopage = $backurlforlist;
176 $backtopage = DOL_URL_ROOT.
'/comm/propal/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
182 if (!empty($backtopageforcancel)) {
183 header(
"Location: ".$backtopageforcancel);
185 } elseif (!empty($backtopage)) {
186 header(
"Location: ".$backtopage);
192 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
194 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
196 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
199 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
201 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'IdThirdParty')),
null,
'errors');
214 $date_delivery_old =
$object->delivery_date;
215 if (!empty($date_delivery_old) && !empty($date_delivery)) {
226 $difference = $date_delivery - $old_date_delivery;
227 if ($difference != 0) {
228 $object->delivery_date = $date_delivery;
229 foreach (
$object->lines as $line) {
230 if (isset($line->date_start)) {
231 $line->date_start += $difference;
233 if (isset($line->date_end)) {
234 $line->date_end += $difference;
241 $result =
$object->createFromClone($user, $socid, (GETPOSTISSET(
'entity') ?
GETPOSTINT(
'entity') : null), (
GETPOSTINT(
'update_prices') ? true : false), (
GETPOSTINT(
'update_desc') ? true : false));
243 $warningMsgLineList = array();
245 foreach (
$object->lines as $line) {
246 if (!is_object($line->product)) {
247 $line->fetch_product();
249 if (is_object($line->product) && $line->product->id > 0) {
250 if (empty($line->product->status)) {
251 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
255 if (!empty($warningMsgLineList)) {
259 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
262 if (count(
$object->errors) > 0) {
269 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanclose) {
271 $result =
$object->setCancel($user);
273 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
276 $langs->load(
"errors");
279 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
281 $result =
$object->delete($user);
283 header(
'Location: '.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1');
286 $langs->load(
"errors");
289 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
291 $result =
$object->deleteLine($lineid);
296 $langs->load(
"errors");
302 $outputlangs = $langs;
305 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
306 $outputlangs->setDefaultLang($newlang);
312 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
315 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
317 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
320 $result =
$object->valid($user);
322 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
326 $outputlangs = $langs;
329 $newlang =
GETPOST(
'lang_id',
'aZ09');
332 $newlang =
$object->thirdparty->default_lang;
334 if (!empty($newlang)) {
336 $outputlangs->setDefaultLang($newlang);
344 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
347 $langs->load(
"errors");
348 if (count(
$object->errors) > 0) {
354 } elseif ($action ==
'setdate' && $usercancreate) {
359 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
363 $result =
$object->set_date($user, $datep);
364 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
365 $datev = $datep + (
$object->duree_validite * 24 * 3600);
366 $result =
$object->set_echeance($user, $datev, 1);
371 $outputlangs = $langs;
374 $newlang =
GETPOST(
'lang_id',
'aZ09');
377 $newlang =
$object->thirdparty->default_lang;
379 if (!empty($newlang)) {
381 $outputlangs->setDefaultLang($newlang);
389 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
392 } elseif ($action ==
'setecheance' && $usercancreate) {
396 $outputlangs = $langs;
399 $newlang =
GETPOST(
'lang_id',
'aZ09');
402 $newlang =
$object->thirdparty->default_lang;
404 if (!empty($newlang)) {
406 $outputlangs->setDefaultLang($newlang);
414 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
419 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
424 } elseif ($action ==
'setref_client' && $usercancreate) {
430 } elseif ($action ==
'set_incoterms' && isModEnabled(
'incoterm') && $usercancreate) {
433 } elseif ($action ==
'add' && $usercancreate) {
443 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
447 if (empty($duration)) {
448 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
454 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
469 $object->delivery_date = $date_delivery;
475 $object->duree_validite = $duration;
485 $object->user_author_id = $user->id;
491 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
500 $object->delivery_date = $date_delivery;
518 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
524 if (isModEnabled(
"multicurrency")) {
525 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
529 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
537 if ($origin && $originid) {
539 $element = $subelement = $origin;
541 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
543 $subelement = $regs[2];
547 if ($element ==
'order') {
548 $element = $subelement =
'commande';
550 if ($element ==
'propal') {
551 $element =
'comm/propal';
552 $subelement =
'propal';
554 if ($element ==
'contract') {
555 $element = $subelement =
'contrat';
557 if ($element ==
'inter') {
558 $element = $subelement =
'fichinter';
560 if ($element ==
'shipping') {
561 $element = $subelement =
'expedition';
565 $object->origin_id = $originid;
570 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
577 $classname = ucfirst($subelement);
578 $srcobject =
new $classname($db);
579 '@phan-var-force Commande|Propal|Contrat|Fichinter|Expedition $srcobject';
582 $result = $srcobject->fetch(
$object->origin_id);
585 $lines = $srcobject->lines;
586 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
587 $srcobject->fetch_lines();
588 $lines = $srcobject->lines;
592 $num = count($lines);
593 for ($i = 0; $i < $num; $i++) {
594 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
595 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
598 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
602 if ($lines[$i]->date_debut_prevue) {
603 $date_start = $lines[$i]->date_debut_prevue;
605 if ($lines[$i]->date_debut_reel) {
606 $date_start = $lines[$i]->date_debut_reel;
608 if ($lines[$i]->date_start) {
609 $date_start = $lines[$i]->date_start;
614 if ($lines[$i]->date_fin_prevue) {
615 $date_end = $lines[$i]->date_fin_prevue;
617 if ($lines[$i]->date_fin_reel) {
618 $date_end = $lines[$i]->date_fin_reel;
620 if ($lines[$i]->date_end) {
621 $date_end = $lines[$i]->date_end;
625 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
630 if (method_exists($lines[$i],
'fetch_optionals')) {
631 $lines[$i]->fetch_optionals();
632 $array_options = $lines[$i]->array_options;
635 $tva_tx = $lines[$i]->tva_tx;
636 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
637 $tva_tx .=
' ('.$lines[$i]->vat_src_code.
')';
640 $result =
$object->addline($desc, $lines[$i]->subprice, $lines[$i]->qty, $tva_tx, $lines[$i]->localtax1_tx, $lines[$i]->localtax2_tx, $lines[$i]->fk_product, $lines[$i]->remise_percent,
'HT', 0, $lines[$i]->info_bits, $product_type, $lines[$i]->rang, $lines[$i]->special_code, $fk_parent_line, $lines[$i]->fk_fournprice, $lines[$i]->pa_ht, $label, $date_start, $date_end, $array_options, $lines[$i]->fk_unit);
651 if ($result > 0 && $lines[$i]->product_type == 9) {
652 $fk_parent_line = $result;
657 $parameters = array(
'objFrom' => $srcobject);
658 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
679 if (
GETPOST(
'contactid') > 0) {
680 $result =
$object->add_contact(
GETPOST(
'contactid'),
'CUSTOMER',
'external');
688 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
691 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
700 $outputlangs = $langs;
703 $newlang =
GETPOST(
'lang_id',
'aZ09');
706 $newlang =
$object->thirdparty->default_lang;
708 if (!empty($newlang)) {
710 $outputlangs->setDefaultLang($newlang);
715 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
721 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
734 } elseif ($action ==
'classifybilled' && $usercanclose) {
738 $result =
$object->classifyBilled($user, 0,
'');
749 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
752 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
754 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
755 $locationTarget =
'';
769 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
774 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
777 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
778 && !empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
780 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
783 $forceFields = array();
785 if (GETPOSTISSET(
'date_pointoftax')) {
793 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
804 $ret = $deposit->fetch($deposit->id);
805 $outputlangs = $langs;
809 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
810 $outputlangs->load(
'products');
813 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
820 if ($locationTarget) {
821 header(
'Location: ' . $locationTarget);
833 } elseif ($action ==
'confirm_reopen' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
840 $result =
$object->reopen($user, $newstatus);
857 $fromElement =
GETPOST(
'fromelement');
858 $fromElementid =
GETPOST(
'fromelementid');
859 $importLines =
GETPOST(
'line_checkbox');
861 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
862 if ($fromElement ==
'commande') {
864 $lineClassName =
'OrderLine';
865 } elseif ($fromElement ==
'propal') {
866 dol_include_once(
'/comm/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
867 $lineClassName =
'PropaleLigne';
868 } elseif ($fromElement ==
'facture') {
869 dol_include_once(
'/compta/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
870 $lineClassName =
'FactureLigne';
872 $lineClassName =
null;
874 $nextRang = count(
$object->lines) + 1;
877 foreach ($importLines as $lineId) {
878 $lineId = intval($lineId);
879 $originLine =
new $lineClassName($db);
880 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
881 $originLine->fetch_optionals();
882 $desc = $originLine->desc;
883 $pu_ht = $originLine->subprice;
884 $qty = $originLine->qty;
885 $txtva = $originLine->tva_tx;
886 $txlocaltax1 = $originLine->localtax1_tx;
887 $txlocaltax2 = $originLine->localtax2_tx;
888 $fk_product = $originLine->fk_product;
889 $remise_percent = $originLine->remise_percent;
890 $date_start = $originLine->date_start;
891 $date_end = $originLine->date_end;
892 $fk_code_ventilation = 0;
893 $info_bits = $originLine->info_bits;
894 $fk_remise_except = $originLine->fk_remise_except;
895 $price_base_type =
'HT';
897 $type = $originLine->product_type;
899 $special_code = $originLine->special_code;
900 $origin = $originLine->element;
901 $origin_id = $originLine->id;
903 $fk_fournprice = $originLine->fk_fournprice;
904 $pa_ht = $originLine->pa_ht;
905 $label = $originLine->label;
906 $array_options = $originLine->array_options;
907 $situation_percent = 100;
909 $fk_unit = $originLine->fk_unit;
910 $pu_ht_devise = $originLine->multicurrency_subprice;
912 $res =
$object->addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1, $txlocaltax2, $fk_product, $remise_percent, $price_base_type, $pu_ttc, $info_bits, $type, $rang, $special_code, $fk_parent_line, $fk_fournprice, $pa_ht, $label, $date_start, $date_end, $array_options, $fk_unit, $origin, $origin_id, $pu_ht_devise, $fk_remise_except);
930 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
933 $actiontypecode =
'AC_OTH_AUTO';
934 $triggersendname =
'PROPAL_SENTBYMAIL';
935 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
936 $trackid =
'pro'.$object->id;
937 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
941 if ($action ==
'modif' && $usercancreate) {
942 $result =
$object->setDraft($user);
949 $outputlangs = $langs;
952 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
953 $outputlangs->setDefaultLang($newlang);
959 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
961 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
970 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
974 foreach (
$object->lines as $key => $line) {
975 if ($line->product_type == 1) {
976 $result =
$object->updateline($line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $alldate_start, $alldate_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
980 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
982 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
983 $vat_rate = str_replace(
'*',
'', $vat_rate);
986 foreach (
$object->lines as $key => $line) {
987 $result =
$object->updateline($line->id, $line->subprice, $line->qty, $line->remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
990 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
992 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
993 $remise_percent = str_replace(
'*',
'', $remise_percent);
994 foreach (
$object->lines as $key => $line) {
995 $tvatx = $line->tva_tx;
996 if (!empty($line->vat_src_code)) {
997 $tvatx .=
' ('.$line->vat_src_code.
')';
999 $result =
$object->updateline($line->id, $line->subprice, $line->qty, $remise_percent, $tvatx, $line->localtax1_tx, $line->localtax2_tx, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
1002 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines') !==
'' && $usercancreate) {
1004 $margin_rate = (
GETPOST(
'marginforalllines') ?
GETPOST(
'marginforalllines') : 0);
1005 foreach (
$object->lines as $key => $line) {
1006 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
1008 $prod->fetch($line->fk_product);
1009 if ($prod->price_min > $subprice) {
1010 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1011 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1012 setEventMessages($prod->ref.
' - '.$prod->label.
' ('.$price_subprice.
' < '.$price_price_min.
' '.strtolower($langs->trans(
"MinPrice")).
')'.
"\n",
null,
'warnings');
1015 if ($line->subprice <> 0) {
1016 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1018 $multicurrency_subprice = 0;
1021 $result =
$object->updateline($line->id, $subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $multicurrency_subprice);
1038 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && $usercancreate) {
1041 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1044 $price_ht_devise =
'';
1046 $price_ttc_devise =
'';
1050 if (
GETPOST(
'price_ht') !==
'') {
1053 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1056 if (
GETPOST(
'price_ttc') !==
'') {
1059 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1060 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1063 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1064 if ($prod_entry_mode ==
'free') {
1070 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1075 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1078 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef,
'alpha'),
'', 2) : 0);
1079 if (empty($remise_percent)) {
1080 $remise_percent = 0;
1084 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1085 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1087 if (is_array($extralabelsline)) {
1089 foreach ($extralabelsline as $key => $value) {
1090 unset($_POST[
"options_".$key]);
1094 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1095 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1099 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1100 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1103 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
1104 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1108 if (!$error && isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1109 if ($combinations =
GETPOST(
'combinations',
'array')) {
1113 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1114 $idprod = $res->fk_product_child;
1116 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1122 $propal_qty_requirement = (
getDolGlobalString(
'PROPAL_ENABLE_NEGATIVE_QTY') ? ($qty >= 0 || $qty <= 0) : $qty >= 0);
1123 if (!$error && $propal_qty_requirement && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
1131 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1140 if (!empty($idprod) && $idprod > 0) {
1142 $prod->fetch($idprod);
1144 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
1154 $pu_ht = $prod->price;
1155 $pu_ttc = $prod->price_ttc;
1156 $price_min = $prod->price_min;
1157 $price_min_ttc = $prod->price_min_ttc;
1158 $price_base_type = $prod->price_base_type;
1162 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1164 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
1167 $pricebycustomerexist =
false;
1168 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1171 if (count($prodcustprice->lines) > 0) {
1172 $pricebycustomerexist =
true;
1173 $pu_ht =
price($prodcustprice->lines[0]->price);
1174 $pu_ttc =
price($prodcustprice->lines[0]->price_ttc);
1175 $price_min =
price($prodcustprice->lines[0]->price_min);
1176 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
1177 $price_base_type = $prodcustprice->lines[0]->price_base_type;
1189 if (!$pricebycustomerexist &&
$object->thirdparty->price_level) {
1190 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1191 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1192 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1193 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1194 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1196 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1197 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1199 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1200 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1205 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1206 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1207 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1208 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1209 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1211 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1212 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1214 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1215 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1220 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1224 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
1226 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1229 if (count($prodcustprice->lines) > 0) {
1230 $pu_ht =
price($prodcustprice->lines[0]->price);
1231 $pu_ttc =
price($prodcustprice->lines[0]->price_ttc);
1232 $price_min =
price($prodcustprice->lines[0]->price_min);
1233 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
1234 $price_base_type = $prodcustprice->lines[0]->price_base_type;
1247 if ($prod->prices_by_qty[0]) {
1252 foreach ($prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1253 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1257 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1258 $pu_ht = $priceforthequantityarray[
'unitprice'];
1260 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1268 if ($prod->prices_by_qty[
$object->thirdparty->price_level]) {
1273 foreach ($prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1274 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1278 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1279 $pu_ht = $priceforthequantityarray[
'unitprice'];
1281 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1289 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1290 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
1293 if (!empty($price_ht) || (
string) $price_ht ===
'0') {
1295 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
1296 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1297 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1300 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1302 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
1303 } elseif ($tmpvat != $tmpprodvat) {
1305 if ($price_base_type !=
'HT') {
1306 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
1308 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
1316 $outputlangs = $langs;
1318 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
1319 $newlang =
GETPOST(
'lang_id',
'aZ09');
1321 if (empty($newlang)) {
1322 $newlang =
$object->thirdparty->default_lang;
1324 if (!empty($newlang)) {
1326 $outputlangs->setDefaultLang($newlang);
1329 $desc = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1331 $desc = $prod->description;
1340 $desc = $product_desc;
1346 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1350 $outputlangs = $langs;
1352 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
1353 $newlang =
GETPOST(
'lang_id',
'alpha');
1355 if (empty($newlang)) {
1356 $newlang =
$object->thirdparty->default_lang;
1358 if (!empty($newlang)) {
1360 $outputlangs->setDefaultLang($newlang);
1361 $outputlangs->load(
'products');
1363 if (!empty($prod->customcode)) {
1364 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1366 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1369 if (!empty($prod->country_code)) {
1370 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $outputlangs, 0);
1373 if (!empty($prod->customcode)) {
1374 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1376 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1379 if (!empty($prod->country_code)) {
1380 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $langs, 0);
1387 $type = $prod->type;
1388 $fk_unit = $prod->fk_unit;
1392 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1393 if (empty($tva_tx)) {
1396 $tva_tx = str_replace(
'*',
'', $tva_tx);
1397 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1398 $desc = $product_desc;
1400 $fk_unit =
GETPOST(
'units',
'alpha');
1401 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1402 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1404 if ($pu_ttc && !$pu_ht) {
1405 $price_base_type =
'TTC';
1426 $pu_equivalent = $pu_ht;
1427 $pu_equivalent_ttc = $pu_ttc;
1428 $currency_tx =
$object->multicurrency_tx;
1432 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1433 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1435 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1436 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1454 if ($usermustrespectpricemin) {
1455 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) <
price2num($price_min)) && $price_base_type ==
'HT') {
1456 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1459 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) <
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1460 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1468 $result =
$object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $pu_ttc, $info_bits, $type, min($rank, count(
$object->lines) + 1), 0,
GETPOST(
'fk_parent_line'), $fournprice, $buyingprice, $label, $date_start, $date_end, $array_options, $fk_unit,
'', 0, $pu_ht_devise);
1480 $outputlangs = $langs;
1483 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1484 $outputlangs->setDefaultLang($newlang);
1486 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1489 unset($_POST[
'prod_entry_mode']);
1491 unset($_POST[
'qty']);
1492 unset($_POST[
'type']);
1493 unset($_POST[
'remise_percent']);
1494 unset($_POST[
'price_ht']);
1495 unset($_POST[
'multicurrency_price_ht']);
1496 unset($_POST[
'price_ttc']);
1497 unset($_POST[
'tva_tx']);
1498 unset($_POST[
'product_ref']);
1499 unset($_POST[
'product_label']);
1500 unset($_POST[
'product_desc']);
1501 unset($_POST[
'fournprice']);
1502 unset($_POST[
'buying_price']);
1503 unset($_POST[
'np_marginRate']);
1504 unset($_POST[
'np_markRate']);
1505 unset($_POST[
'dp_desc']);
1506 unset($_POST[
'idprod']);
1507 unset($_POST[
'units']);
1509 unset($_POST[
'date_starthour']);
1510 unset($_POST[
'date_startmin']);
1511 unset($_POST[
'date_startsec']);
1512 unset($_POST[
'date_startday']);
1513 unset($_POST[
'date_startmonth']);
1514 unset($_POST[
'date_startyear']);
1515 unset($_POST[
'date_endhour']);
1516 unset($_POST[
'date_endmin']);
1517 unset($_POST[
'date_endsec']);
1518 unset($_POST[
'date_endday']);
1519 unset($_POST[
'date_endmonth']);
1520 unset($_POST[
'date_endyear']);
1528 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1536 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1542 $vat_rate = str_replace(
'*',
'', $vat_rate);
1559 if (empty($remise_percent)) {
1560 $remise_percent = 0;
1564 $pu_equivalent = $pu_ht;
1565 $pu_equivalent_ttc = $pu_ttc;
1567 $currency_tx =
$object->multicurrency_tx;
1571 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1572 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1574 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1575 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1590 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1591 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1593 if (is_array($extralabelsline)) {
1595 foreach ($extralabelsline as $key => $value) {
1596 unset($_POST[
"options_".$key]);
1608 if (!empty($productid)) {
1610 $res = $product->fetch($productid);
1612 $type = $product->type;
1615 $price_min = $product->price_min;
1617 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1619 $price_min_ttc = $product->price_min_ttc;
1621 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1628 if ($usermustrespectpricemin) {
1629 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1630 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1633 $action =
'editline';
1634 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - (
float) $remise_percent / 100)) < (
float)
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1635 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1638 $action =
'editline';
1643 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1647 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1655 if (!$user->hasRight(
'margins',
'creer')) {
1656 foreach (
$object->lines as &$line) {
1658 $fournprice = $line->fk_fournprice;
1659 $buyingprice = $line->pa_ht;
1668 $price_base_type =
'HT';
1669 if (empty($pu) && !empty($pu_ttc)) {
1671 $price_base_type =
'TTC';
1674 $result =
$object->updateline(
GETPOSTINT(
'lineid'), $pu, $qty, $remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $description, $price_base_type, $info_bits, $special_code,
GETPOST(
'fk_parent_line'), 0, $fournprice, $buyingprice, $label, $type, $date_start, $date_end, $array_options,
GETPOST(
"units"), $pu_ht_devise);
1681 $outputlangs = $langs;
1684 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1685 $outputlangs->setDefaultLang($newlang);
1691 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1694 unset($_POST[
'qty']);
1695 unset($_POST[
'type']);
1696 unset($_POST[
'productid']);
1697 unset($_POST[
'remise_percent']);
1698 unset($_POST[
'price_ht']);
1699 unset($_POST[
'multicurrency_price_ht']);
1700 unset($_POST[
'price_ttc']);
1701 unset($_POST[
'tva_tx']);
1702 unset($_POST[
'product_ref']);
1703 unset($_POST[
'product_label']);
1704 unset($_POST[
'product_desc']);
1705 unset($_POST[
'fournprice']);
1706 unset($_POST[
'buying_price']);
1708 unset($_POST[
'date_starthour']);
1709 unset($_POST[
'date_startmin']);
1710 unset($_POST[
'date_startsec']);
1711 unset($_POST[
'date_startday']);
1712 unset($_POST[
'date_startmonth']);
1713 unset($_POST[
'date_startyear']);
1714 unset($_POST[
'date_endhour']);
1715 unset($_POST[
'date_endmin']);
1716 unset($_POST[
'date_endsec']);
1717 unset($_POST[
'date_endday']);
1718 unset($_POST[
'date_endmonth']);
1719 unset($_POST[
'date_endyear']);
1726 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
1727 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1729 } elseif ($action ==
'classin' && $usercancreate) {
1732 } elseif ($action ==
'setavailability' && $usercancreate) {
1735 } elseif ($action ==
'setdemandreason' && $usercancreate) {
1738 } elseif ($action ==
'setconditions' && $usercancreate) {
1740 $sql =
"SELECT code ";
1741 $sql .=
"FROM " . $db->prefix() .
"c_payment_term";
1742 $sql .=
" WHERE rowid = " . ((int)
GETPOST(
'cond_reglement_id',
'int'));
1743 $result = $db->query($sql);
1745 $obj = $db->fetch_object($result);
1746 if ($obj->code ==
'DEP30PCTDEL') {
1758 } elseif ($action ==
'setmode' && $usercancreate) {
1761 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
1763 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
1764 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
1767 } elseif ($action ==
'setbankaccount' && $usercancreate) {
1770 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
1773 } elseif ($action ==
'setwarehouse' && $usercancreate) {
1776 } elseif ($action ==
'update_extras' && $usercancreate) {
1778 $attribute_name =
GETPOST(
'attribute',
'restricthtml');
1781 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
1786 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
1793 $action =
'edit_extras';
1798 if ($action ==
'addcontact' && $usercancreate) {
1802 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1806 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1809 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1810 $langs->load(
"errors");
1811 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1816 } elseif ($action ==
'swapstatut' && $usercancreate) {
1818 if (
$object->fetch($id) > 0) {
1823 } elseif ($action ==
'deletecontact' && $usercancreate) {
1826 $result =
$object->delete_contact($lineid);
1829 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1838 $upload_dir = !empty(
$conf->propal->multidir_output[
$object->entity]) ?
$conf->propal->multidir_output[
$object->entity] :
$conf->propal->dir_output;
1839 $permissiontoadd = $usercancreate;
1840 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1848$form =
new Form($db);
1853if (isModEnabled(
'project')) {
1857$title =
$object->ref.
" - ".$langs->trans(
'Card');
1858if ($action ==
'create') {
1859 $title = $langs->trans(
"NewPropal");
1861$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
1868if ($action ==
'create') {
1869 $currency_code =
$conf->currency;
1875 $res = $soc->fetch($socid);
1878 $currency_code =
$conf->currency;
1880 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1881 $deposit_percent =
GETPOST(
'cond_reglement_id_deposit_percent',
'alpha');
1882 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1884 $datepropal = (empty($datepropal) ? (!
getDolGlobalString(
'MAIN_AUTOFILL_DATE_PROPOSAL') ? -1 :
'') : $datepropal);
1888 if (!empty($origin) && !empty($originid)) {
1890 $element = $subelement = $origin;
1892 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1893 $element = $regs[1];
1894 $subelement = $regs[2];
1897 if ($element ==
'project') {
1898 $projectid = $originid;
1902 $project->fetch($projectid);
1903 if ($project->socid > 0) {
1905 $soc->fetch($project->socid);
1909 if ($element ==
'order' || $element ==
'commande') {
1910 $element = $subelement =
'commande';
1912 if ($element ==
'propal') {
1913 $element =
'comm/propal';
1914 $subelement =
'propal';
1916 if ($element ==
'contract') {
1917 $element = $subelement =
'contrat';
1919 if ($element ==
'shipping') {
1920 $element = $subelement =
'expedition';
1925 $classname = ucfirst($subelement);
1926 $objectsrc =
new $classname($db);
1927 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
1928 $objectsrc->fetch($originid);
1929 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1930 $objectsrc->fetch_lines();
1932 $objectsrc->fetch_thirdparty();
1934 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
1935 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
1937 $soc = $objectsrc->thirdparty;
1939 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1940 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1941 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : 0));
1944 $objectsrc->fetch_optionals();
1945 $object->array_options = $objectsrc->array_options;
1947 if (isModEnabled(
"multicurrency")) {
1948 if (!empty($objectsrc->multicurrency_code)) {
1949 $currency_code = $objectsrc->multicurrency_code;
1951 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
1952 $currency_tx = $objectsrc->multicurrency_tx;
1960 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
1961 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
1962 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
1963 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
1964 $shipping_method_id = $soc->shipping_method_id;
1965 $warehouse_id = $soc->fk_warehouse;
1966 $remise_percent = $soc->remise_percent;
1968 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
1969 $currency_code = $soc->multicurrency_code;
1974 if (!
GETPOST(
'changecompany')) {
1975 if (GETPOSTISSET(
'cond_reglement_id')) {
1976 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1978 if (GETPOSTISSET(
'deposit_percent')) {
1981 if (GETPOSTISSET(
'mode_reglement_id')) {
1982 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1984 if (GETPOSTISSET(
'cond_reglement_id')) {
1990 if ($soc->fk_warehouse > 0) {
1991 $warehouse_id = $soc->fk_warehouse;
1993 if (isModEnabled(
'stock') && empty($warehouse_id) &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER')) {
1998 $warehouse_id = $user->fk_warehouse;
2002 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2003 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2004 print
'<input type="hidden" name="action" value="add">';
2005 print
'<input type="hidden" name="changecompany" value="0">';
2006 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2007 if ($origin !=
'project' && $originid) {
2008 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
2009 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
2010 } elseif ($origin ==
'project' && !empty($projectid)) {
2011 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
2017 $parameters = array();
2019 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
2020 if (empty($reshook)) {
2021 print
'<table class="border centpercent">';
2024 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
2027 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
2028 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
2032 print
'<tr class="field_socid">';
2033 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
2034 $shipping_method_id = 0;
2037 print
'<td class="valuefieldcreate">';
2038 print $soc->getNomUrl(1,
'customer');
2039 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
2041 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2042 $shipping_method_id = $soc->shipping_method_id;
2046 print
'<td class="valuefieldcreate">';
2047 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2048 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2052 $(document).ready(function() {
2053 $("#socid").change(function() {
2054 console.log("We have changed the company - Reload page");
2055 var socid = $(this).val();
2057 $("input[name=action]").val("create");
2058 $("input[name=changecompany]").val("1");
2059 $("form[name=addprop]").submit();
2064 print
' <a href="'.DOL_URL_ROOT.
'/societe/card.php?action=create&client=3&fournisseur=0&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create').
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span></a>';
2071 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
2072 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2074 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2078 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
2080 $absolute_discount = $soc->getAvailableDiscounts();
2084 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
2085 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2091 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
2092 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2093 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2097 print
'<tr class="field_duree_validitee"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
"ValidityDuration").
'</td><td class="valuefieldcreate">'.
img_picto(
'',
'clock',
'class="pictofixedwidth"').
'<input name="duree_validite" class="width50" value="'.(GETPOSTISSET(
'duree_validite') ?
GETPOST(
'duree_validite',
'alphanohtml') :
$conf->global->PROPALE_VALIDITY_DURATION).
'"> '.$langs->trans(
"days").
'</td></tr>';
2100 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2101 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2103 print $form->getSelectConditionsPaiements($cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2107 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2108 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2109 print $form->select_types_paiements($mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2113 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2114 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2115 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2120 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2121 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2122 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2126 if (isModEnabled(
"shipping")) {
2127 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2128 $shipping_method_id = $soc->shipping_method_id;
2130 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2131 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2132 $form->selectShippingMethod((GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2136 $formproduct =
null;
2138 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2139 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2141 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2142 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2147 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2148 if (isModEnabled(
'order')) {
2149 print
' ('.$langs->trans(
'AfterOrder').
')';
2151 print
'</td><td class="valuefieldcreate">';
2152 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2153 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2157 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2158 print
'<td class="valuefieldcreate">';
2159 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2161 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2162 $syear = date(
"Y", $tmpdte);
2163 $smonth = date(
"m", $tmpdte);
2164 $sday = date(
"d", $tmpdte);
2165 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2167 $tmp_date_delivery =
GETPOST(
'date_delivery') ? : -1;
2168 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2173 if (isModEnabled(
'project') && is_object($formproject)) {
2174 $langs->load(
"projects");
2175 print
'<tr class="field_projectid">';
2176 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2177 print
img_picto(
'',
'project',
'class="pictofixedwidth"').$formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500 widthcentpercentminusxx');
2178 print
' <a href="'.DOL_URL_ROOT.
'/projet/card.php?socid='.$soc->id.
'&action=create&status=1&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create&socid='.$soc->id).
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddProject").
'"></span></a>';
2184 if (isModEnabled(
'incoterm')) {
2185 print
'<tr class="field_incoterm_id">';
2186 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2187 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2188 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2189 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2194 print
'<tr class="field_model">';
2195 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2196 print
'<td class="valuefieldcreate">';
2197 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2200 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2204 if (isModEnabled(
"multicurrency")) {
2205 print
'<tr class="field_currency">';
2206 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2207 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2208 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0);
2213 print
'<tr class="field_note_public">';
2214 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2215 print
'<td class="valuefieldcreate">';
2216 $note_public =
$object->getDefaultCreateValueFor(
'note_public', (!empty($objectsrc) ? $objectsrc->note_public : (
getDolGlobalString(
'PROPALE_ADDON_NOTE_PUBLIC_DEFAULT') ?
$conf->global->PROPALE_ADDON_NOTE_PUBLIC_DEFAULT : null)),
'restricthtml');
2217 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2218 print $doleditor->Create(1);
2221 if (empty($user->socid)) {
2222 print
'<tr class="field_note_private">';
2223 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2224 print
'<td class="valuefieldcreate">';
2225 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2226 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2227 print $doleditor->Create(1);
2233 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2236 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2238 if ($origin ==
'contrat') {
2242 $objectsrc->update_price(1,
'auto', 1);
2245 print
"\n<!-- ".$classname.
" info -->";
2247 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2248 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2249 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2250 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2251 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2253 $newclassname = $classname;
2254 if ($newclassname ==
'Propal') {
2255 $newclassname =
'CommercialProposal';
2256 } elseif ($newclassname ==
'Commande') {
2257 $newclassname =
'Order';
2258 } elseif ($newclassname ==
'Expedition') {
2259 $newclassname =
'Sending';
2260 } elseif ($newclassname ==
'Fichinter') {
2261 $newclassname =
'Intervention';
2264 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2265 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency).
'</td></tr>';
2266 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2267 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2268 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2271 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2272 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2274 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2276 if (isModEnabled(
"multicurrency")) {
2277 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2278 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2279 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2291 print
'<input type="hidden" name="createmode" value="empty">';
2295 print
'<br><table>';
2299 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2300 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2302 $liste_propal = array();
2303 $liste_propal [0] =
'';
2305 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2306 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2307 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2308 $sql .=
" WHERE s.rowid = p.fk_soc";
2309 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2310 $sql .=
" AND p.fk_statut <> 0";
2311 $sql .=
" ORDER BY Id";
2313 $resql = $db->query($sql);
2315 $num = $db->num_rows($resql);
2318 $row = $db->fetch_row($resql);
2319 $propalRefAndSocName = $row[1].
" - ".$row[2];
2320 $liste_propal[$row[0]] = $propalRefAndSocName;
2323 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2329 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2330 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2337 $langs->load(
"bills");
2339 print $form->buttonsSaveCancel(
"CreateDraft");
2345 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2348 $title = $langs->trans(
'ProductsAndServices');
2351 print
'<div class="div-table-responsive-no-min">';
2352 print
'<table class="noborder centpercent">';
2354 $objectsrc->printOriginLinesList();
2371 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
'propal', 0,
'',
'', 0,
'', 1);
2376 if ($action ==
'clone') {
2378 $filter =
'(s.client:IN:1,2,3)';
2379 $formquestion = array(
2382 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2383 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2384 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2387 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2390 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
2393 if ($action ==
'closeas') {
2395 $formquestion = array();
2397 $formquestion[] = array(
'type' =>
'select',
'name' =>
'statut',
'label' =>
'<span class="fieldrequired">'.$langs->trans(
"CloseAs").
'</span>',
'values' => array($object::STATUS_SIGNED =>
$object->LibStatut($object::STATUS_SIGNED), $object::STATUS_NOTSIGNED =>
$object->LibStatut($object::STATUS_NOTSIGNED)));
2399 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2401 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2406 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2408 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2409 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2413 $eligibleForDepositGeneration =
true;
2415 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2416 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2417 '@phan-var-force Facture $invoice';
2419 $eligibleForDepositGeneration =
false;
2425 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2426 foreach (
$object->linkedObjects[
'commande'] as $order) {
2427 $order->fetchObjectLinked();
2429 if (array_key_exists(
'facture', $order->linkedObjects)) {
2430 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2431 '@phan-var-force Facture $invoice';
2433 $eligibleForDepositGeneration =
false;
2442 if ($eligibleForDepositGeneration) {
2443 $formquestion[] = array(
2444 'type' =>
'checkbox',
2445 'tdclass' =>
'showonlyifsigned',
2446 'name' =>
'generate_deposit',
2447 'morecss' =>
'margintoponly marginbottomonly',
2448 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2451 $formquestion[] = array(
2453 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2455 'label' => $langs->trans(
'DateInvoice'),
2461 $formquestion[] = array(
2463 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2464 'name' =>
'date_pointoftax',
2465 'label' => $langs->trans(
'DatePointOfTax'),
2471 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2473 $formquestion[] = array(
2475 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2476 'name' =>
'cond_reglement_id',
2477 'label' => $langs->trans(
'PaymentTerm'),
2478 'value' => $paymentTermsSelect
2481 $formquestion[] = array(
2482 'type' =>
'checkbox',
2483 'tdclass' =>
'showonlyifgeneratedeposit',
2484 'name' =>
'validate_generated_deposit',
2485 'morecss' =>
'margintoponly marginbottomonly',
2486 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2489 $formquestion[] = array(
2490 'type' =>
'onecolumn',
2493 let signedValue = ' . $object::STATUS_SIGNED .
';
2495 $(document).ready(function() {
2496 $("[name=generate_deposit]").change(function () {
2497 let $self = $(this);
2498 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2500 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2509 $("#statut").change(function() {
2510 let $target = $(".showonlyifsigned").parent(".tagtr");
2512 if ($(this).val() == signedValue) {
2518 $("[name=generate_deposit]").trigger("change");
2523 $("#statut").trigger("change");
2532 if (isModEnabled(
'notification')) {
2533 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2534 $notify =
new Notify($db);
2535 $formquestion = array_merge($formquestion, array(
2536 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2541 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2543 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2545 } elseif ($action ==
'cancel') {
2547 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2548 } elseif ($action ==
'delete') {
2550 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2551 } elseif ($action ==
'reopen') {
2553 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2554 } elseif ($action ==
'ask_deleteline') {
2556 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2557 } elseif ($action ==
'validate') {
2562 $ref = substr(
$object->ref, 1, 4);
2563 if ($ref ==
'PROV' || $ref ==
'') {
2564 $numref =
$object->getNextNumRef($soc);
2565 if (empty($numref)) {
2573 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2574 if (isModEnabled(
'notification')) {
2575 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2576 $notify =
new Notify($db);
2578 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2583 foreach (
$object->lines as $line) {
2584 $res = $line->fetch_product();
2586 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2592 if ($nbMandated > 0) {
2594 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2597 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2602 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2607 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2608 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2609 if (empty($reshook)) {
2610 $formconfirm .= $hookmanager->resPrint;
2611 } elseif ($reshook > 0) {
2612 $formconfirm = $hookmanager->resPrint;
2621 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2623 $morehtmlref =
'<div class="refidno">';
2625 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2626 $morehtmlref .= $form->editfieldval(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string'.(isset(
$conf->global->THIRDPARTY_REF_INPUT_SIZE) ?
':' .
getDolGlobalString(
'THIRDPARTY_REF_INPUT_SIZE') :
''),
'', null, null,
'', 1);
2628 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2630 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2633 if (isModEnabled(
'project')) {
2634 $langs->load(
"projects");
2635 $morehtmlref .=
'<br>';
2636 if ($usercancreate) {
2637 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2638 if ($action !=
'classify') {
2639 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2641 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2643 if (!empty(
$object->fk_project)) {
2645 $proj->fetch(
$object->fk_project);
2646 $morehtmlref .= $proj->getNomUrl(1);
2648 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2653 $morehtmlref .=
'</div>';
2656 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2659 $parameters = array();
2661 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
2662 if (empty($reshook)) {
2663 print
'<div class="fichecenter">';
2664 print
'<div class="fichehalfleft">';
2665 print
'<div class="underbanner clearboth"></div>';
2667 print
'<table class="border tableforfield centpercent">';
2671 $filterabsolutediscount =
"fk_facture_source IS NULL";
2672 $filtercreditnote =
"fk_facture_source IS NOT NULL";
2674 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
2675 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
2678 print
'<tr><td class="titlefieldmax45">'.$langs->trans(
'Discounts').
'</td><td>';
2680 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
2681 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
2682 $absolute_discount =
price2num($absolute_discount,
'MT');
2683 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
2689 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
2690 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2706 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, $editenable);
2707 print
'</td><td class="valuefield">';
2708 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
2709 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2710 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2711 print
'<input type="hidden" name="action" value="setdate">';
2712 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2713 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
2714 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2728 print
'<table class="nobordernopadding centpercent"><tr><td>';
2729 print $langs->trans(
'DateEndPropal');
2731 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
2732 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editecheance&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->trans(
'SetConditions'), 1).
'</a></td>';
2734 print
'</tr></table>';
2735 print
'</td><td class="valuefield">';
2736 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
2737 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2738 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2739 print
'<input type="hidden" name="action" value="setecheance">';
2740 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2741 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
2742 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2745 if (!empty(
$object->fin_validite)) {
2759 print
'<table class="nobordernopadding centpercent"><tr><td>';
2760 print $langs->trans(
'PaymentConditionsShort');
2762 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
2763 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editconditions&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetConditions'), 1).
'</a></td>';
2765 print
'</tr></table>';
2766 print
'</td><td class="valuefield">';
2767 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
2768 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
2770 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
2776 print
'<tr class="field_mode_reglement_id">';
2778 print
'<table class="nobordernopadding centpercent"><tr><td>';
2779 print $langs->trans(
'PaymentMode');
2781 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
2782 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmode&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetMode'), 1).
'</a></td>';
2784 print
'</tr></table>';
2785 print
'</td><td class="valuefieldcreate">';
2786 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
2787 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
2789 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'none');
2794 $langs->load(
'deliveries');
2796 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2797 print
'</td><td class="valuefieldedit">';
2798 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2803 print
'<tr class="fielddeliverydelay"><td>';
2804 print
'<table class="nobordernopadding centpercent"><tr><td>';
2805 if (isModEnabled(
'order')) {
2806 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
2808 print $langs->trans(
'AvailabilityPeriod');
2811 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
2812 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editavailability&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetAvailability'), 1).
'</a></td>';
2814 print
'</tr></table>';
2815 print
'</td><td class="valuefield">';
2816 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
2817 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'availability_id', 1);
2819 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'none', 1);
2826 if (isModEnabled(
"shipping")) {
2828 print
'<table class="nobordernopadding centpercent"><tr><td>';
2829 print $langs->trans(
'SendingMethod');
2831 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
2832 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editshippingmethod&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->trans(
'SetShippingMode'), 1).
'</a></td>';
2834 print
'</tr></table>';
2835 print
'</td><td class="valuefield">';
2836 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
2837 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'shipping_method_id', 1);
2839 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'none');
2846 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2847 $langs->load(
'stocks');
2848 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2850 print
'<tr class="field_warehouse_id"><td>';
2851 $editenable = $usercancreate;
2852 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
2853 print
'</td><td class="valuefieldcreate">';
2854 if ($action ==
'editwarehouse') {
2855 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
2857 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
2865 print
'<table class="nobordernopadding centpercent"><tr><td>';
2866 print $langs->trans(
'Source');
2868 if ($action !=
'editdemandreason' && $usercancreate) {
2869 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editdemandreason&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetDemandReason'), 1).
'</a></td>';
2871 print
'</tr></table>';
2872 print
'</td><td class="valuefield">';
2873 if ($action ==
'editdemandreason' && $usercancreate) {
2874 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'demand_reason_id', 1);
2876 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'none');
2881 if ($soc->outstanding_limit) {
2884 print $langs->trans(
'OutstandingBill');
2885 print
'</td><td class="valuefield">';
2886 $arrayoutstandingbills = $soc->getOutstandingBills();
2887 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
2888 print
price($arrayoutstandingbills[
'opened']).
' / ';
2889 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1,
$conf->currency);
2894 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2897 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2898 print $langs->trans(
'BankAccount');
2900 if ($action !=
'editbankaccount' && $usercancreate) {
2901 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editbankaccount&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->trans(
'SetBankAccount'), 1).
'</a></td>';
2903 print
'</tr></table>';
2904 print
'</td><td class="valuefield">';
2905 if ($action ==
'editbankaccount') {
2906 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
2908 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
2915 $tmparray =
$object->getTotalWeightVolume();
2916 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
2917 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
2919 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
2920 print
'<td class="valuefield">';
2925 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
2926 print
'<td class="valuefield">';
2933 if (isModEnabled(
'incoterm')) {
2935 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2936 print $langs->trans(
'IncotermLabel');
2937 print
'<td><td class="right">';
2938 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
2939 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2943 print
'</td></tr></table>';
2945 print
'<td class="valuefield">';
2946 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
2947 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2949 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
2955 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2960 print
'<div class="fichehalfright">';
2961 print
'<div class="underbanner clearboth"></div>';
2963 print
'<table class="border tableforfield centpercent">';
2965 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
2968 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
2969 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2970 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2971 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2976 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
2977 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2978 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2979 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2983 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
2985 print
'<td>' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
2986 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2987 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2990 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2995 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
2997 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
2998 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2999 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3002 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3008 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3009 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3010 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3011 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3018 if (isModEnabled(
'margin')) {
3019 $formmargin->displayMarginInfos(
$object);
3025 print
'<div class="clearboth"></div><br>';
3028 $blocname =
'contacts';
3029 $title = $langs->trans(
'ContactsAddresses');
3030 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3034 $blocname =
'notes';
3035 $title = $langs->trans(
'Notes');
3036 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3044 $result =
$object->getLinesArray();
3048 global $inputalsopricewithtax;
3049 $inputalsopricewithtax = 1;
3051 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
3052 <input type="hidden" name="token" value="' .
newToken().
'">
3053 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3054 <input type="hidden" name="mode" value="">
3055 <input type="hidden" name="page_y" value="">
3056 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3057 <input type="hidden" name="id" value="' .
$object->id.
'">
3061 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3064 print
'<div class="div-table-responsive-no-min">';
3066 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3070 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3075 if ($action !=
'editline') {
3076 $parameters = array();
3077 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3081 if (empty($reshook)) {
3082 $object->formAddObjectLine(1, $mysoc, $soc);
3085 $parameters = array();
3086 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3105 if ($action !=
'presend') {
3106 $numlines = count(
$object->lines);
3107 print
'<div class="tabsAction">';
3109 $parameters = array();
3110 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3112 if (empty($reshook)) {
3113 if ($action !=
'editline') {
3117 if ($usercanvalidate) {
3118 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=validate&token='.
newToken().
'">'.(!
getDolGlobalString(
'PROPAL_SKIP_ACCEPT_REFUSE') ? $langs->trans(
'Validate') : $langs->trans(
'ValidateAndSign')).
'</a>';
3120 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3130 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3135 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3136 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3140 if (empty($user->socid)) {
3142 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3146 $arrayforbutaction = array();
3149 $arrayforbutaction[] = array(
3152 'perm' => $usercancreateorder,
3153 'label' =>
'AddOrder',
3154 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3164 $arrayforbutaction[] = array(
3167 'perm' => $usercancreatepurchaseorder,
3168 'label' =>
'AddPurchaseOrder',
3169 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3179 $arrayforbutaction[] = array(
3180 'lang' =>
'interventions',
3182 'perm' => $usercancreateintervention,
3183 'label' =>
'AddIntervention',
3184 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3194 $arrayforbutaction[] = array(
3195 'lang' =>
'contracts',
3197 'perm' => $usercancreatecontract,
3198 'label' =>
'AddContract',
3199 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3211 $arrayforbutaction[] = [
3212 'lang' =>
'invoice',
3213 'enabled' => isModEnabled(
'invoice'),
3214 'perm' => $usercancreateinvoice,
3215 'label' =>
'CreateBill',
3216 'url' =>
'/compta/facture/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((int)
$object->id).
'&socid='.((int)
$object->socid),
3223 $actionButtonsParameters = [
3224 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3225 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3228 if ($numlines > 0) {
3229 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 1, $actionButtonsParameters);
3231 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 0, $actionButtonsParameters);
3235 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3236 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3237 if ($usercanclose) {
3238 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3240 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3248 if ($usercanclose) {
3249 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3250 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3252 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3253 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3259 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3260 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3266 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3270 if ($usercancreate) {
3271 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&socid='.
$object->socid.
'&action=clone&token='.
newToken().
'&object='.
$object->element.
'">'.$langs->trans(
"ToClone").
'</a>';
3275 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3283 if (
GETPOST(
'modelselected')) {
3284 $action =
'presend';
3287 if ($action !=
'presend') {
3288 print
'<div class="fichecenter"><div class="fichehalfleft">';
3289 print
'<a name="builddoc"></a>';
3295 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3296 $genallowed = $usercanread;
3297 $delallowed = $usercancreate;
3299 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $soc->default_lang,
'',
$object);
3302 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'propal'), 1);
3303 $linktoelem = $tmparray[
'linktoelem'];
3304 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3305 print $htmltoenteralink;
3307 $compatibleImportElementsList =
false;
3309 $compatibleImportElementsList = array(
'commande',
'propal',
'facture');
3311 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3317 print
'<br><!-- Link to sign -->';
3318 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3319 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3322 print
'</div><div class="fichehalfright">';
3326 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3329 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3331 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3333 print
'</div></div>';
3337 $modelmail =
'propal_send';
3338 $defaulttopic =
'SendPropalRef';
3339 $diroutput =
$conf->propal->multidir_output[
$object->entity];
3340 $trackid =
'pro'.$object->id;
3342 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
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 a WYSIWYG editor.
static createDepositFromOrigin(CommonObject $origin, $date, $payment_terms_id, User $user, $notrigger=0, $autoValidateDeposit=false, $overrideFields=array())
Creates a deposit from a proposal or an order by grouping lines by VAT rates.
const TYPE_DEPOSIT
Deposit invoice.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage the table of subscription to notifications.
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.
Class to manage projects.
Class to manage proposals.
const STATUS_DRAFT
Draft status.
const STATUS_SIGNED
Signed quote.
const STATUS_NOTSIGNED
Not signed quote.
const STATUS_BILLED
Billed or processed quote.
const STATUS_CANCELED
Canceled status.
const STATUS_VALIDATED
Validated status.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
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.
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.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
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.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
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).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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.
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...
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_clone($object, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
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...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
getDictionaryValue($tablename, $field, $id, $checkentity=false, $rowidfield='rowid')
Return the value of a filed into a dictionary for the record $id.
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,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
propal_prepare_head($object)
Prepare array with list of tabs.
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.