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), (
GETPOST(
'update_prices') ==
'on'), (
GETPOST(
'update_desc') ==
'on'));
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 ? (int) $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;
1435 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1436 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1438 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1439 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1457 if ($usermustrespectpricemin) {
1458 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) <
price2num($price_min)) && $price_base_type ==
'HT') {
1459 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1462 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) <
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1463 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1471 $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);
1483 $outputlangs = $langs;
1486 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1487 $outputlangs->setDefaultLang($newlang);
1489 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1492 unset($_POST[
'prod_entry_mode']);
1494 unset($_POST[
'qty']);
1495 unset($_POST[
'type']);
1496 unset($_POST[
'remise_percent']);
1497 unset($_POST[
'price_ht']);
1498 unset($_POST[
'multicurrency_price_ht']);
1499 unset($_POST[
'price_ttc']);
1500 unset($_POST[
'tva_tx']);
1501 unset($_POST[
'product_ref']);
1502 unset($_POST[
'product_label']);
1503 unset($_POST[
'product_desc']);
1504 unset($_POST[
'fournprice']);
1505 unset($_POST[
'buying_price']);
1506 unset($_POST[
'np_marginRate']);
1507 unset($_POST[
'np_markRate']);
1508 unset($_POST[
'dp_desc']);
1509 unset($_POST[
'idprod']);
1510 unset($_POST[
'units']);
1512 unset($_POST[
'date_starthour']);
1513 unset($_POST[
'date_startmin']);
1514 unset($_POST[
'date_startsec']);
1515 unset($_POST[
'date_startday']);
1516 unset($_POST[
'date_startmonth']);
1517 unset($_POST[
'date_startyear']);
1518 unset($_POST[
'date_endhour']);
1519 unset($_POST[
'date_endmin']);
1520 unset($_POST[
'date_endsec']);
1521 unset($_POST[
'date_endday']);
1522 unset($_POST[
'date_endmonth']);
1523 unset($_POST[
'date_endyear']);
1531 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1539 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1545 $vat_rate = str_replace(
'*',
'', $vat_rate);
1562 if (empty($remise_percent)) {
1563 $remise_percent = 0;
1567 $pu_equivalent = $pu_ht;
1568 $pu_equivalent_ttc = $pu_ttc;
1570 $currency_tx =
$object->multicurrency_tx;
1577 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1578 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1580 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1581 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1596 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1597 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1599 if (is_array($extralabelsline)) {
1601 foreach ($extralabelsline as $key => $value) {
1602 unset($_POST[
"options_".$key]);
1613 $price_base_type =
'HT';
1614 if (empty($pu) && !empty($pu_ttc)) {
1616 $price_base_type =
'TTC';
1621 if (!empty($productid)) {
1623 $res = $product->fetch($productid);
1625 $type = $product->type;
1626 $price_base_type = $product->price_base_type;
1629 $price_min = $product->price_min;
1631 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1633 $price_min_ttc = $product->price_min_ttc;
1635 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1642 if ($usermustrespectpricemin) {
1643 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1644 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1647 $action =
'editline';
1648 } 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') {
1649 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1652 $action =
'editline';
1657 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1661 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1669 if (!$user->hasRight(
'margins',
'creer')) {
1670 foreach (
$object->lines as &$line) {
1672 $fournprice = $line->fk_fournprice;
1673 $buyingprice = $line->pa_ht;
1681 $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);
1688 $outputlangs = $langs;
1691 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1692 $outputlangs->setDefaultLang($newlang);
1698 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1701 unset($_POST[
'qty']);
1702 unset($_POST[
'type']);
1703 unset($_POST[
'productid']);
1704 unset($_POST[
'remise_percent']);
1705 unset($_POST[
'price_ht']);
1706 unset($_POST[
'multicurrency_price_ht']);
1707 unset($_POST[
'price_ttc']);
1708 unset($_POST[
'tva_tx']);
1709 unset($_POST[
'product_ref']);
1710 unset($_POST[
'product_label']);
1711 unset($_POST[
'product_desc']);
1712 unset($_POST[
'fournprice']);
1713 unset($_POST[
'buying_price']);
1715 unset($_POST[
'date_starthour']);
1716 unset($_POST[
'date_startmin']);
1717 unset($_POST[
'date_startsec']);
1718 unset($_POST[
'date_startday']);
1719 unset($_POST[
'date_startmonth']);
1720 unset($_POST[
'date_startyear']);
1721 unset($_POST[
'date_endhour']);
1722 unset($_POST[
'date_endmin']);
1723 unset($_POST[
'date_endsec']);
1724 unset($_POST[
'date_endday']);
1725 unset($_POST[
'date_endmonth']);
1726 unset($_POST[
'date_endyear']);
1733 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
1734 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1736 } elseif ($action ==
'classin' && $usercancreate) {
1739 } elseif ($action ==
'setavailability' && $usercancreate) {
1742 } elseif ($action ==
'setdemandreason' && $usercancreate) {
1745 } elseif ($action ==
'setconditions' && $usercancreate) {
1747 $sql =
"SELECT code ";
1748 $sql .=
"FROM " . $db->prefix() .
"c_payment_term";
1749 $sql .=
" WHERE rowid = " . ((int)
GETPOST(
'cond_reglement_id',
'int'));
1750 $result = $db->query($sql);
1752 $obj = $db->fetch_object($result);
1753 if ($obj->code ==
'DEP30PCTDEL') {
1765 } elseif ($action ==
'setmode' && $usercancreate) {
1768 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
1770 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
1771 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
1774 } elseif ($action ==
'setbankaccount' && $usercancreate) {
1777 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
1780 } elseif ($action ==
'setwarehouse' && $usercancreate) {
1783 } elseif ($action ==
'update_extras' && $usercancreate) {
1785 $attribute_name =
GETPOST(
'attribute',
'restricthtml');
1788 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
1793 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
1800 $action =
'edit_extras';
1805 if ($action ==
'addcontact' && $usercancreate) {
1809 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1813 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1816 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1817 $langs->load(
"errors");
1818 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1823 } elseif ($action ==
'swapstatut' && $usercancreate) {
1825 if (
$object->fetch($id) > 0) {
1830 } elseif ($action ==
'deletecontact' && $usercancreate) {
1833 $result =
$object->delete_contact($lineid);
1836 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1845 $upload_dir = !empty(
$conf->propal->multidir_output[
$object->entity]) ?
$conf->propal->multidir_output[
$object->entity] :
$conf->propal->dir_output;
1846 $permissiontoadd = $usercancreate;
1847 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1855$form =
new Form($db);
1860if (isModEnabled(
'project')) {
1864$title =
$object->ref.
" - ".$langs->trans(
'Card');
1865if ($action ==
'create') {
1866 $title = $langs->trans(
"NewPropal");
1868$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
1875if ($action ==
'create') {
1876 $currency_code =
$conf->currency;
1882 $res = $soc->fetch($socid);
1885 $currency_code =
$conf->currency;
1887 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1888 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
1889 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1891 $datepropal = (empty($datepropal) ? (!
getDolGlobalString(
'MAIN_AUTOFILL_DATE_PROPOSAL') ? -1 :
'') : $datepropal);
1895 if (!empty($origin) && !empty($originid)) {
1897 $element = $subelement = $origin;
1899 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1900 $element = $regs[1];
1901 $subelement = $regs[2];
1904 if ($element ==
'project') {
1905 $projectid = $originid;
1909 $project->fetch($projectid);
1910 if ($project->socid > 0) {
1912 $soc->fetch($project->socid);
1916 if ($element ==
'order' || $element ==
'commande') {
1917 $element = $subelement =
'commande';
1919 if ($element ==
'propal') {
1920 $element =
'comm/propal';
1921 $subelement =
'propal';
1923 if ($element ==
'contract') {
1924 $element = $subelement =
'contrat';
1926 if ($element ==
'shipping') {
1927 $element = $subelement =
'expedition';
1932 $classname = ucfirst($subelement);
1933 $objectsrc =
new $classname($db);
1934 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
1935 $objectsrc->fetch($originid);
1936 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1937 $objectsrc->fetch_lines();
1939 $objectsrc->fetch_thirdparty();
1941 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
1942 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
1944 $soc = $objectsrc->thirdparty;
1946 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1947 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1948 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : 0));
1951 $objectsrc->fetch_optionals();
1952 $object->array_options = $objectsrc->array_options;
1954 if (isModEnabled(
"multicurrency")) {
1955 if (!empty($objectsrc->multicurrency_code)) {
1956 $currency_code = $objectsrc->multicurrency_code;
1958 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
1959 $currency_tx = $objectsrc->multicurrency_tx;
1967 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
1968 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
1969 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
1970 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
1971 $shipping_method_id = $soc->shipping_method_id;
1972 $warehouse_id = $soc->fk_warehouse;
1973 $remise_percent = $soc->remise_percent;
1975 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
1976 $currency_code = $soc->multicurrency_code;
1981 if (!
GETPOST(
'changecompany')) {
1982 if (GETPOSTISSET(
'cond_reglement_id')) {
1983 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1985 if (GETPOSTISSET(
'deposit_percent')) {
1988 if (GETPOSTISSET(
'mode_reglement_id')) {
1989 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1991 if (GETPOSTISSET(
'fk_account')) {
1997 if ($soc->fk_warehouse > 0) {
1998 $warehouse_id = $soc->fk_warehouse;
2000 if (isModEnabled(
'stock') && empty($warehouse_id) &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER')) {
2005 $warehouse_id = $user->fk_warehouse;
2009 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2010 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2011 print
'<input type="hidden" name="action" value="add">';
2012 print
'<input type="hidden" name="changecompany" value="0">';
2013 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2014 if ($origin !=
'project' && $originid) {
2015 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
2016 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
2017 } elseif ($origin ==
'project' && !empty($projectid)) {
2018 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
2024 $parameters = array();
2026 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
2027 if (empty($reshook)) {
2028 print
'<table class="border centpercent">';
2031 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
2034 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
2035 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
2039 print
'<tr class="field_socid">';
2040 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
2041 $shipping_method_id = 0;
2044 print
'<td class="valuefieldcreate">';
2045 print $soc->getNomUrl(1,
'customer');
2046 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
2048 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2049 $shipping_method_id = $soc->shipping_method_id;
2053 print
'<td class="valuefieldcreate">';
2054 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2055 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2059 $(document).ready(function() {
2060 $("#socid").change(function() {
2061 console.log("We have changed the company - Reload page");
2062 var socid = $(this).val();
2064 $("input[name=action]").val("create");
2065 $("input[name=changecompany]").val("1");
2066 $("form[name=addprop]").submit();
2071 print
' <a href="'.DOL_URL_ROOT.
'/societe/card.php?action=create&prospect=3&fournisseur=0&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create').
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span></a>';
2078 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
2079 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2081 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2085 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
2087 $absolute_discount = $soc->getAvailableDiscounts();
2091 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
2092 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2098 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
2099 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2100 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2104 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') :
getDolGlobalString(
'PROPALE_VALIDITY_DURATION')).
'"> '.$langs->trans(
"days").
'</td></tr>';
2107 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2108 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2110 print $form->getSelectConditionsPaiements($cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2114 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2115 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2116 print $form->select_types_paiements($mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2120 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2121 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2122 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2127 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2128 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2129 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2133 if (isModEnabled(
"shipping")) {
2134 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2135 $shipping_method_id = $soc->shipping_method_id;
2137 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2138 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2139 $form->selectShippingMethod((GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2143 $formproduct =
null;
2145 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2146 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2148 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2149 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2154 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2155 if (isModEnabled(
'order')) {
2156 print
' ('.$langs->trans(
'AfterOrder').
')';
2158 print
'</td><td class="valuefieldcreate">';
2159 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2160 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2164 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2165 print
'<td class="valuefieldcreate">';
2166 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2168 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2169 $syear = date(
"Y", $tmpdte);
2170 $smonth = date(
"m", $tmpdte);
2171 $sday = date(
"d", $tmpdte);
2172 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2174 $tmp_date_delivery =
GETPOST(
'date_delivery') ? : -1;
2175 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2180 if (isModEnabled(
'project') && is_object($formproject)) {
2181 $langs->load(
"projects");
2182 print
'<tr class="field_projectid">';
2183 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2184 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');
2185 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>';
2191 if (isModEnabled(
'incoterm')) {
2192 print
'<tr class="field_incoterm_id">';
2193 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2194 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2195 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2196 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2201 print
'<tr class="field_model">';
2202 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2203 print
'<td class="valuefieldcreate">';
2204 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2207 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2211 if (isModEnabled(
"multicurrency")) {
2212 print
'<tr class="field_currency">';
2213 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2214 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2215 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0);
2220 print
'<tr class="field_note_public">';
2221 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2222 print
'<td class="valuefieldcreate">';
2223 $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');
2224 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2225 print $doleditor->Create(1);
2228 if (empty($user->socid)) {
2229 print
'<tr class="field_note_private">';
2230 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2231 print
'<td class="valuefieldcreate">';
2232 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2233 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2234 print $doleditor->Create(1);
2240 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2243 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2245 if ($origin ==
'contrat') {
2249 $objectsrc->update_price(1,
'auto', 1);
2252 print
"\n<!-- ".$classname.
" info -->";
2254 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2255 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2256 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2257 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2258 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2260 $newclassname = $classname;
2261 if ($newclassname ==
'Propal') {
2262 $newclassname =
'CommercialProposal';
2263 } elseif ($newclassname ==
'Commande') {
2264 $newclassname =
'Order';
2265 } elseif ($newclassname ==
'Expedition') {
2266 $newclassname =
'Sending';
2267 } elseif ($newclassname ==
'Fichinter') {
2268 $newclassname =
'Intervention';
2271 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2272 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency).
'</td></tr>';
2273 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2274 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2275 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2278 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2279 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2281 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2283 if (isModEnabled(
"multicurrency")) {
2284 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2285 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2286 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2298 print
'<input type="hidden" name="createmode" value="empty">';
2302 print
'<br><table>';
2306 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2307 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2309 $liste_propal = array();
2310 $liste_propal [0] =
'';
2312 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2313 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2314 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2315 $sql .=
" WHERE s.rowid = p.fk_soc";
2316 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2317 $sql .=
" AND p.fk_statut <> 0";
2318 $sql .=
" ORDER BY Id";
2320 $resql = $db->query($sql);
2322 $num = $db->num_rows($resql);
2325 $row = $db->fetch_row($resql);
2326 $propalRefAndSocName = $row[1].
" - ".$row[2];
2327 $liste_propal[$row[0]] = $propalRefAndSocName;
2330 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2336 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2337 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2344 $langs->load(
"bills");
2346 print $form->buttonsSaveCancel(
"CreateDraft");
2352 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2355 $title = $langs->trans(
'ProductsAndServices');
2358 print
'<div class="div-table-responsive-no-min">';
2359 print
'<table class="noborder centpercent">';
2361 $objectsrc->printOriginLinesList();
2378 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
'propal', 0,
'',
'', 0,
'', 1);
2383 if ($action ==
'clone') {
2385 $filter =
'(s.client:IN:1,2,3)';
2386 $formquestion = array(
2389 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2390 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2391 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2394 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2397 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1, 250, 600);
2400 if ($action ==
'closeas') {
2402 $formquestion = array();
2404 $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)));
2406 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2408 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2413 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2415 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2416 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2420 $eligibleForDepositGeneration =
true;
2422 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2423 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2424 '@phan-var-force Facture $invoice';
2426 $eligibleForDepositGeneration =
false;
2432 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2433 foreach (
$object->linkedObjects[
'commande'] as $order) {
2434 $order->fetchObjectLinked();
2436 if (array_key_exists(
'facture', $order->linkedObjects)) {
2437 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2438 '@phan-var-force Facture $invoice';
2440 $eligibleForDepositGeneration =
false;
2449 if ($eligibleForDepositGeneration) {
2450 $formquestion[] = array(
2451 'type' =>
'checkbox',
2452 'tdclass' =>
'showonlyifsigned',
2453 'name' =>
'generate_deposit',
2454 'morecss' =>
'margintoponly marginbottomonly',
2455 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2458 $formquestion[] = array(
2460 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2462 'label' => $langs->trans(
'DateInvoice'),
2468 $formquestion[] = array(
2470 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2471 'name' =>
'date_pointoftax',
2472 'label' => $langs->trans(
'DatePointOfTax'),
2478 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2480 $formquestion[] = array(
2482 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2483 'name' =>
'cond_reglement_id',
2484 'label' => $langs->trans(
'PaymentTerm'),
2485 'value' => $paymentTermsSelect
2488 $formquestion[] = array(
2489 'type' =>
'checkbox',
2490 'tdclass' =>
'showonlyifgeneratedeposit',
2491 'name' =>
'validate_generated_deposit',
2492 'morecss' =>
'margintoponly marginbottomonly',
2493 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2496 $formquestion[] = array(
2497 'type' =>
'onecolumn',
2500 let signedValue = ' . $object::STATUS_SIGNED .
';
2502 $(document).ready(function() {
2503 $("[name=generate_deposit]").change(function () {
2504 let $self = $(this);
2505 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2507 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2516 $("#statut").change(function() {
2517 let $target = $(".showonlyifsigned").parent(".tagtr");
2519 if ($(this).val() == signedValue) {
2525 $("[name=generate_deposit]").trigger("change");
2530 $("#statut").trigger("change");
2539 if (isModEnabled(
'notification')) {
2540 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2541 $notify =
new Notify($db);
2542 $formquestion = array_merge($formquestion, array(
2543 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2548 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2550 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2552 } elseif ($action ==
'cancel') {
2554 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2555 } elseif ($action ==
'delete') {
2557 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2558 } elseif ($action ==
'reopen') {
2560 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2561 } elseif ($action ==
'ask_deleteline') {
2563 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2564 } elseif ($action ==
'validate') {
2569 $ref = substr(
$object->ref, 1, 4);
2570 if ($ref ==
'PROV' || $ref ==
'') {
2571 $numref =
$object->getNextNumRef($soc);
2572 if (empty($numref)) {
2580 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2581 if (isModEnabled(
'notification')) {
2582 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2583 $notify =
new Notify($db);
2585 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2590 foreach (
$object->lines as $line) {
2591 $res = $line->fetch_product();
2593 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2599 if ($nbMandated > 0) {
2601 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2604 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2609 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2614 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2615 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2616 if (empty($reshook)) {
2617 $formconfirm .= $hookmanager->resPrint;
2618 } elseif ($reshook > 0) {
2619 $formconfirm = $hookmanager->resPrint;
2628 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2630 $morehtmlref =
'<div class="refidno">';
2632 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2633 $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);
2635 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2637 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2640 if (isModEnabled(
'project')) {
2641 $langs->load(
"projects");
2642 $morehtmlref .=
'<br>';
2643 if ($usercancreate) {
2644 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2645 if ($action !=
'classify') {
2646 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2648 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2650 if (!empty(
$object->fk_project)) {
2652 $proj->fetch(
$object->fk_project);
2653 $morehtmlref .= $proj->getNomUrl(1);
2655 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2660 $morehtmlref .=
'</div>';
2663 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2666 $parameters = array();
2668 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
2669 if (empty($reshook)) {
2670 print
'<div class="fichecenter">';
2671 print
'<div class="fichehalfleft">';
2672 print
'<div class="underbanner clearboth"></div>';
2674 print
'<table class="border tableforfield centpercent">';
2678 $filterabsolutediscount =
"fk_facture_source IS NULL";
2679 $filtercreditnote =
"fk_facture_source IS NOT NULL";
2681 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
2682 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
2685 print
'<tr><td class="titlefieldmax45">'.$langs->trans(
'Discounts').
'</td><td>';
2687 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
2688 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
2689 $absolute_discount =
price2num($absolute_discount,
'MT');
2690 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
2696 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
2697 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2713 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, $editenable);
2714 print
'</td><td class="valuefield">';
2715 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
2716 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2717 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2718 print
'<input type="hidden" name="action" value="setdate">';
2719 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2720 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
2721 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2735 print
'<table class="nobordernopadding centpercent"><tr><td>';
2736 print $langs->trans(
'DateEndPropal');
2738 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
2739 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>';
2741 print
'</tr></table>';
2742 print
'</td><td class="valuefield">';
2743 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
2744 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2745 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2746 print
'<input type="hidden" name="action" value="setecheance">';
2747 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2748 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
2749 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2752 if (!empty(
$object->fin_validite)) {
2766 print
'<table class="nobordernopadding centpercent"><tr><td>';
2767 print $langs->trans(
'PaymentConditionsShort');
2769 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
2770 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>';
2772 print
'</tr></table>';
2773 print
'</td><td class="valuefield">';
2774 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
2775 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
2777 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
2783 print
'<tr class="field_mode_reglement_id">';
2785 print
'<table class="nobordernopadding centpercent"><tr><td>';
2786 print $langs->trans(
'PaymentMode');
2788 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
2789 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>';
2791 print
'</tr></table>';
2792 print
'</td><td class="valuefieldcreate">';
2793 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
2794 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
2796 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'none');
2801 $langs->load(
'deliveries');
2803 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2804 print
'</td><td class="valuefieldedit">';
2805 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2810 print
'<tr class="fielddeliverydelay"><td>';
2811 print
'<table class="nobordernopadding centpercent"><tr><td>';
2812 if (isModEnabled(
'order')) {
2813 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
2815 print $langs->trans(
'AvailabilityPeriod');
2818 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
2819 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>';
2821 print
'</tr></table>';
2822 print
'</td><td class="valuefield">';
2823 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
2824 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'availability_id', 1);
2826 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'none', 1);
2833 if (isModEnabled(
"shipping")) {
2835 print
'<table class="nobordernopadding centpercent"><tr><td>';
2836 print $langs->trans(
'SendingMethod');
2838 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
2839 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>';
2841 print
'</tr></table>';
2842 print
'</td><td class="valuefield">';
2843 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
2844 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'shipping_method_id', 1);
2846 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'none');
2853 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2854 $langs->load(
'stocks');
2855 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2857 print
'<tr class="field_warehouse_id"><td>';
2858 $editenable = $usercancreate;
2859 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
2860 print
'</td><td class="valuefieldcreate">';
2861 if ($action ==
'editwarehouse') {
2862 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
2864 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
2872 print
'<table class="nobordernopadding centpercent"><tr><td>';
2873 print $langs->trans(
'Source');
2875 if ($action !=
'editdemandreason' && $usercancreate) {
2876 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>';
2878 print
'</tr></table>';
2879 print
'</td><td class="valuefield">';
2880 if ($action ==
'editdemandreason' && $usercancreate) {
2881 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'demand_reason_id', 1);
2883 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'none');
2888 if ($soc->outstanding_limit) {
2891 print $langs->trans(
'OutstandingBill');
2892 print
'</td><td class="valuefield">';
2893 $arrayoutstandingbills = $soc->getOutstandingBills();
2894 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
2895 print
price($arrayoutstandingbills[
'opened']).
' / ';
2896 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1,
$conf->currency);
2901 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2904 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2905 print $langs->trans(
'BankAccount');
2907 if ($action !=
'editbankaccount' && $usercancreate) {
2908 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>';
2910 print
'</tr></table>';
2911 print
'</td><td class="valuefield">';
2912 if ($action ==
'editbankaccount') {
2913 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
2915 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
2922 $tmparray =
$object->getTotalWeightVolume();
2923 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
2924 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
2926 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
2927 print
'<td class="valuefield">';
2932 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
2933 print
'<td class="valuefield">';
2940 if (isModEnabled(
'incoterm')) {
2942 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2943 print $langs->trans(
'IncotermLabel');
2944 print
'<td><td class="right">';
2945 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
2946 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2950 print
'</td></tr></table>';
2952 print
'<td class="valuefield">';
2953 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
2954 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2956 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
2962 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2967 print
'<div class="fichehalfright">';
2968 print
'<div class="underbanner clearboth"></div>';
2970 print
'<table class="border tableforfield centpercent">';
2972 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
2975 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
2976 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2977 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2978 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2983 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
2984 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2985 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2986 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2990 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
2992 print
'<td>' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
2993 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2994 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2997 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3002 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3004 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
3005 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3006 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3009 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3015 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3016 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3017 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3018 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3025 if (isModEnabled(
'margin')) {
3026 $formmargin->displayMarginInfos(
$object);
3032 print
'<div class="clearboth"></div><br>';
3035 $blocname =
'contacts';
3036 $title = $langs->trans(
'ContactsAddresses');
3037 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3041 $blocname =
'notes';
3042 $title = $langs->trans(
'Notes');
3043 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3051 $result =
$object->getLinesArray();
3055 global $inputalsopricewithtax;
3056 $inputalsopricewithtax = 1;
3058 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
3059 <input type="hidden" name="token" value="' .
newToken().
'">
3060 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3061 <input type="hidden" name="mode" value="">
3062 <input type="hidden" name="page_y" value="">
3063 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3064 <input type="hidden" name="id" value="' .
$object->id.
'">
3068 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3071 print
'<div class="div-table-responsive-no-min">';
3073 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3077 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3082 if ($action !=
'editline') {
3083 $parameters = array();
3084 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3088 if (empty($reshook)) {
3089 $object->formAddObjectLine(1, $mysoc, $soc);
3092 $parameters = array();
3093 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3112 if ($action !=
'presend') {
3113 $numlines = count(
$object->lines);
3114 print
'<div class="tabsAction">';
3116 $parameters = array();
3117 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3119 if (empty($reshook)) {
3120 if ($action !=
'editline') {
3124 if ($usercanvalidate) {
3125 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>';
3127 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3137 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3142 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3143 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3147 if (empty($user->socid)) {
3149 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3153 $arrayforbutaction = array();
3156 $arrayforbutaction[] = array(
3159 'perm' => $usercancreateorder,
3160 'label' =>
'AddOrder',
3161 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3171 $arrayforbutaction[] = array(
3174 'perm' => $usercancreatepurchaseorder,
3175 'label' =>
'AddPurchaseOrder',
3176 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3186 $arrayforbutaction[] = array(
3187 'lang' =>
'interventions',
3189 'perm' => $usercancreateintervention,
3190 'label' =>
'AddIntervention',
3191 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3201 $arrayforbutaction[] = array(
3202 'lang' =>
'contracts',
3204 'perm' => $usercancreatecontract,
3205 'label' =>
'AddContract',
3206 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3218 $arrayforbutaction[] = [
3219 'lang' =>
'invoice',
3220 'enabled' => isModEnabled(
'invoice'),
3221 'perm' => $usercancreateinvoice,
3222 'label' =>
'CreateBill',
3223 'url' =>
'/compta/facture/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((int)
$object->id).
'&socid='.((int)
$object->socid),
3230 $actionButtonsParameters = [
3231 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3232 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3235 if ($numlines > 0) {
3236 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 1, $actionButtonsParameters);
3238 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 0, $actionButtonsParameters);
3242 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3243 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3244 if ($usercanclose) {
3245 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3247 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3255 if ($usercanclose) {
3256 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3257 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3259 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3260 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3266 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3267 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3273 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3277 if ($usercancreate) {
3278 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>';
3282 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3290 if (
GETPOST(
'modelselected')) {
3291 $action =
'presend';
3294 if ($action !=
'presend') {
3295 print
'<div class="fichecenter"><div class="fichehalfleft">';
3296 print
'<a name="builddoc"></a>';
3302 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3303 $genallowed = $usercanread;
3304 $delallowed = $usercancreate;
3306 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $soc->default_lang,
'',
$object);
3309 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'propal'), 1);
3310 $linktoelem = $tmparray[
'linktoelem'];
3311 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3312 print $htmltoenteralink;
3314 $compatibleImportElementsList =
false;
3316 $compatibleImportElementsList = array(
'commande',
'propal',
'facture');
3318 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3324 print
'<br><!-- Link to sign -->';
3325 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3326 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3329 print
'</div><div class="fichehalfright">';
3333 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3336 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3338 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3340 print
'</div></div>';
3344 $modelmail =
'propal_send';
3345 $defaulttopic =
'SendPropalRef';
3346 $diroutput =
$conf->propal->multidir_output[
$object->entity];
3347 $trackid =
'pro'.$object->id;
3349 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_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
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_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
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.