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;
1432 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1433 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1435 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1436 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1454 if ($usermustrespectpricemin) {
1455 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) <
price2num($price_min)) && $price_base_type ==
'HT') {
1456 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1459 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) <
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1460 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1468 $result =
$object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $pu_ttc, $info_bits, $type, min($rank, count(
$object->lines) + 1), 0,
GETPOST(
'fk_parent_line'), $fournprice, $buyingprice, $label, $date_start, $date_end, $array_options, $fk_unit,
'', 0, $pu_ht_devise);
1480 $outputlangs = $langs;
1483 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1484 $outputlangs->setDefaultLang($newlang);
1486 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1489 unset($_POST[
'prod_entry_mode']);
1491 unset($_POST[
'qty']);
1492 unset($_POST[
'type']);
1493 unset($_POST[
'remise_percent']);
1494 unset($_POST[
'price_ht']);
1495 unset($_POST[
'multicurrency_price_ht']);
1496 unset($_POST[
'price_ttc']);
1497 unset($_POST[
'tva_tx']);
1498 unset($_POST[
'product_ref']);
1499 unset($_POST[
'product_label']);
1500 unset($_POST[
'product_desc']);
1501 unset($_POST[
'fournprice']);
1502 unset($_POST[
'buying_price']);
1503 unset($_POST[
'np_marginRate']);
1504 unset($_POST[
'np_markRate']);
1505 unset($_POST[
'dp_desc']);
1506 unset($_POST[
'idprod']);
1507 unset($_POST[
'units']);
1509 unset($_POST[
'date_starthour']);
1510 unset($_POST[
'date_startmin']);
1511 unset($_POST[
'date_startsec']);
1512 unset($_POST[
'date_startday']);
1513 unset($_POST[
'date_startmonth']);
1514 unset($_POST[
'date_startyear']);
1515 unset($_POST[
'date_endhour']);
1516 unset($_POST[
'date_endmin']);
1517 unset($_POST[
'date_endsec']);
1518 unset($_POST[
'date_endday']);
1519 unset($_POST[
'date_endmonth']);
1520 unset($_POST[
'date_endyear']);
1528 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1536 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1542 $vat_rate = str_replace(
'*',
'', $vat_rate);
1559 if (empty($remise_percent)) {
1560 $remise_percent = 0;
1564 $pu_equivalent = $pu_ht;
1565 $pu_equivalent_ttc = $pu_ttc;
1567 $currency_tx =
$object->multicurrency_tx;
1571 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1572 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1574 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1575 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1590 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1591 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1593 if (is_array($extralabelsline)) {
1595 foreach ($extralabelsline as $key => $value) {
1596 unset($_POST[
"options_".$key]);
1607 $price_base_type =
'HT';
1608 if (empty($pu) && !empty($pu_ttc)) {
1610 $price_base_type =
'TTC';
1615 if (!empty($productid)) {
1617 $res = $product->fetch($productid);
1619 $type = $product->type;
1620 $price_base_type = $product->price_base_type;
1623 $price_min = $product->price_min;
1625 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1627 $price_min_ttc = $product->price_min_ttc;
1629 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1636 if ($usermustrespectpricemin) {
1637 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1638 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1641 $action =
'editline';
1642 } 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') {
1643 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1646 $action =
'editline';
1651 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1655 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1663 if (!$user->hasRight(
'margins',
'creer')) {
1664 foreach (
$object->lines as &$line) {
1666 $fournprice = $line->fk_fournprice;
1667 $buyingprice = $line->pa_ht;
1675 $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);
1682 $outputlangs = $langs;
1685 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1686 $outputlangs->setDefaultLang($newlang);
1692 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1695 unset($_POST[
'qty']);
1696 unset($_POST[
'type']);
1697 unset($_POST[
'productid']);
1698 unset($_POST[
'remise_percent']);
1699 unset($_POST[
'price_ht']);
1700 unset($_POST[
'multicurrency_price_ht']);
1701 unset($_POST[
'price_ttc']);
1702 unset($_POST[
'tva_tx']);
1703 unset($_POST[
'product_ref']);
1704 unset($_POST[
'product_label']);
1705 unset($_POST[
'product_desc']);
1706 unset($_POST[
'fournprice']);
1707 unset($_POST[
'buying_price']);
1709 unset($_POST[
'date_starthour']);
1710 unset($_POST[
'date_startmin']);
1711 unset($_POST[
'date_startsec']);
1712 unset($_POST[
'date_startday']);
1713 unset($_POST[
'date_startmonth']);
1714 unset($_POST[
'date_startyear']);
1715 unset($_POST[
'date_endhour']);
1716 unset($_POST[
'date_endmin']);
1717 unset($_POST[
'date_endsec']);
1718 unset($_POST[
'date_endday']);
1719 unset($_POST[
'date_endmonth']);
1720 unset($_POST[
'date_endyear']);
1727 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
1728 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1730 } elseif ($action ==
'classin' && $usercancreate) {
1733 } elseif ($action ==
'setavailability' && $usercancreate) {
1736 } elseif ($action ==
'setdemandreason' && $usercancreate) {
1739 } elseif ($action ==
'setconditions' && $usercancreate) {
1741 $sql =
"SELECT code ";
1742 $sql .=
"FROM " . $db->prefix() .
"c_payment_term";
1743 $sql .=
" WHERE rowid = " . ((int)
GETPOST(
'cond_reglement_id',
'int'));
1744 $result = $db->query($sql);
1746 $obj = $db->fetch_object($result);
1747 if ($obj->code ==
'DEP30PCTDEL') {
1759 } elseif ($action ==
'setmode' && $usercancreate) {
1762 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
1764 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
1765 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
1768 } elseif ($action ==
'setbankaccount' && $usercancreate) {
1771 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
1774 } elseif ($action ==
'setwarehouse' && $usercancreate) {
1777 } elseif ($action ==
'update_extras' && $usercancreate) {
1779 $attribute_name =
GETPOST(
'attribute',
'restricthtml');
1782 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
1787 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
1794 $action =
'edit_extras';
1799 if ($action ==
'addcontact' && $usercancreate) {
1803 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1807 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1810 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1811 $langs->load(
"errors");
1812 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1817 } elseif ($action ==
'swapstatut' && $usercancreate) {
1819 if (
$object->fetch($id) > 0) {
1824 } elseif ($action ==
'deletecontact' && $usercancreate) {
1827 $result =
$object->delete_contact($lineid);
1830 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1839 $upload_dir = !empty(
$conf->propal->multidir_output[
$object->entity]) ?
$conf->propal->multidir_output[
$object->entity] :
$conf->propal->dir_output;
1840 $permissiontoadd = $usercancreate;
1841 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1849$form =
new Form($db);
1854if (isModEnabled(
'project')) {
1858$title =
$object->ref.
" - ".$langs->trans(
'Card');
1859if ($action ==
'create') {
1860 $title = $langs->trans(
"NewPropal");
1862$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
1869if ($action ==
'create') {
1870 $currency_code =
$conf->currency;
1876 $res = $soc->fetch($socid);
1879 $currency_code =
$conf->currency;
1881 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1882 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
1883 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1885 $datepropal = (empty($datepropal) ? (!
getDolGlobalString(
'MAIN_AUTOFILL_DATE_PROPOSAL') ? -1 :
'') : $datepropal);
1889 if (!empty($origin) && !empty($originid)) {
1891 $element = $subelement = $origin;
1893 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1894 $element = $regs[1];
1895 $subelement = $regs[2];
1898 if ($element ==
'project') {
1899 $projectid = $originid;
1903 $project->fetch($projectid);
1904 if ($project->socid > 0) {
1906 $soc->fetch($project->socid);
1910 if ($element ==
'order' || $element ==
'commande') {
1911 $element = $subelement =
'commande';
1913 if ($element ==
'propal') {
1914 $element =
'comm/propal';
1915 $subelement =
'propal';
1917 if ($element ==
'contract') {
1918 $element = $subelement =
'contrat';
1920 if ($element ==
'shipping') {
1921 $element = $subelement =
'expedition';
1926 $classname = ucfirst($subelement);
1927 $objectsrc =
new $classname($db);
1928 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
1929 $objectsrc->fetch($originid);
1930 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1931 $objectsrc->fetch_lines();
1933 $objectsrc->fetch_thirdparty();
1935 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
1936 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
1938 $soc = $objectsrc->thirdparty;
1940 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1941 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1942 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : 0));
1945 $objectsrc->fetch_optionals();
1946 $object->array_options = $objectsrc->array_options;
1948 if (isModEnabled(
"multicurrency")) {
1949 if (!empty($objectsrc->multicurrency_code)) {
1950 $currency_code = $objectsrc->multicurrency_code;
1952 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
1953 $currency_tx = $objectsrc->multicurrency_tx;
1961 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
1962 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
1963 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
1964 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
1965 $shipping_method_id = $soc->shipping_method_id;
1966 $warehouse_id = $soc->fk_warehouse;
1967 $remise_percent = $soc->remise_percent;
1969 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
1970 $currency_code = $soc->multicurrency_code;
1975 if (!
GETPOST(
'changecompany')) {
1976 if (GETPOSTISSET(
'cond_reglement_id')) {
1977 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1979 if (GETPOSTISSET(
'deposit_percent')) {
1982 if (GETPOSTISSET(
'mode_reglement_id')) {
1983 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1985 if (GETPOSTISSET(
'fk_account')) {
1991 if ($soc->fk_warehouse > 0) {
1992 $warehouse_id = $soc->fk_warehouse;
1994 if (isModEnabled(
'stock') && empty($warehouse_id) &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER')) {
1999 $warehouse_id = $user->fk_warehouse;
2003 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2004 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2005 print
'<input type="hidden" name="action" value="add">';
2006 print
'<input type="hidden" name="changecompany" value="0">';
2007 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2008 if ($origin !=
'project' && $originid) {
2009 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
2010 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
2011 } elseif ($origin ==
'project' && !empty($projectid)) {
2012 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
2018 $parameters = array();
2020 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
2021 if (empty($reshook)) {
2022 print
'<table class="border centpercent">';
2025 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
2028 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
2029 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
2033 print
'<tr class="field_socid">';
2034 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
2035 $shipping_method_id = 0;
2038 print
'<td class="valuefieldcreate">';
2039 print $soc->getNomUrl(1,
'customer');
2040 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
2042 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2043 $shipping_method_id = $soc->shipping_method_id;
2047 print
'<td class="valuefieldcreate">';
2048 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2049 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2053 $(document).ready(function() {
2054 $("#socid").change(function() {
2055 console.log("We have changed the company - Reload page");
2056 var socid = $(this).val();
2058 $("input[name=action]").val("create");
2059 $("input[name=changecompany]").val("1");
2060 $("form[name=addprop]").submit();
2065 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>';
2072 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
2073 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2075 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2079 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
2081 $absolute_discount = $soc->getAvailableDiscounts();
2085 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
2086 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2092 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
2093 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2094 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2098 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>';
2101 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2102 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2104 print $form->getSelectConditionsPaiements($cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2108 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2109 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2110 print $form->select_types_paiements($mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2114 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2115 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2116 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2121 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2122 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2123 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2127 if (isModEnabled(
"shipping")) {
2128 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2129 $shipping_method_id = $soc->shipping_method_id;
2131 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2132 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2133 $form->selectShippingMethod((GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2137 $formproduct =
null;
2139 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2140 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2142 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2143 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2148 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2149 if (isModEnabled(
'order')) {
2150 print
' ('.$langs->trans(
'AfterOrder').
')';
2152 print
'</td><td class="valuefieldcreate">';
2153 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2154 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2158 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2159 print
'<td class="valuefieldcreate">';
2160 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2162 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2163 $syear = date(
"Y", $tmpdte);
2164 $smonth = date(
"m", $tmpdte);
2165 $sday = date(
"d", $tmpdte);
2166 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2168 $tmp_date_delivery =
GETPOST(
'date_delivery') ? : -1;
2169 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2174 if (isModEnabled(
'project') && is_object($formproject)) {
2175 $langs->load(
"projects");
2176 print
'<tr class="field_projectid">';
2177 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2178 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');
2179 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>';
2185 if (isModEnabled(
'incoterm')) {
2186 print
'<tr class="field_incoterm_id">';
2187 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2188 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2189 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2190 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2195 print
'<tr class="field_model">';
2196 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2197 print
'<td class="valuefieldcreate">';
2198 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2201 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2205 if (isModEnabled(
"multicurrency")) {
2206 print
'<tr class="field_currency">';
2207 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2208 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2209 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0);
2214 print
'<tr class="field_note_public">';
2215 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2216 print
'<td class="valuefieldcreate">';
2217 $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');
2218 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2219 print $doleditor->Create(1);
2222 if (empty($user->socid)) {
2223 print
'<tr class="field_note_private">';
2224 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2225 print
'<td class="valuefieldcreate">';
2226 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2227 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2228 print $doleditor->Create(1);
2234 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2237 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2239 if ($origin ==
'contrat') {
2243 $objectsrc->update_price(1,
'auto', 1);
2246 print
"\n<!-- ".$classname.
" info -->";
2248 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2249 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2250 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2251 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2252 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2254 $newclassname = $classname;
2255 if ($newclassname ==
'Propal') {
2256 $newclassname =
'CommercialProposal';
2257 } elseif ($newclassname ==
'Commande') {
2258 $newclassname =
'Order';
2259 } elseif ($newclassname ==
'Expedition') {
2260 $newclassname =
'Sending';
2261 } elseif ($newclassname ==
'Fichinter') {
2262 $newclassname =
'Intervention';
2265 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2266 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency).
'</td></tr>';
2267 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2268 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2269 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2272 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2273 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2275 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2277 if (isModEnabled(
"multicurrency")) {
2278 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2279 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2280 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2292 print
'<input type="hidden" name="createmode" value="empty">';
2296 print
'<br><table>';
2300 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2301 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2303 $liste_propal = array();
2304 $liste_propal [0] =
'';
2306 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2307 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2308 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2309 $sql .=
" WHERE s.rowid = p.fk_soc";
2310 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2311 $sql .=
" AND p.fk_statut <> 0";
2312 $sql .=
" ORDER BY Id";
2314 $resql = $db->query($sql);
2316 $num = $db->num_rows($resql);
2319 $row = $db->fetch_row($resql);
2320 $propalRefAndSocName = $row[1].
" - ".$row[2];
2321 $liste_propal[$row[0]] = $propalRefAndSocName;
2324 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2330 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2331 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2338 $langs->load(
"bills");
2340 print $form->buttonsSaveCancel(
"CreateDraft");
2346 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2349 $title = $langs->trans(
'ProductsAndServices');
2352 print
'<div class="div-table-responsive-no-min">';
2353 print
'<table class="noborder centpercent">';
2355 $objectsrc->printOriginLinesList();
2372 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
'propal', 0,
'',
'', 0,
'', 1);
2377 if ($action ==
'clone') {
2379 $filter =
'(s.client:IN:1,2,3)';
2380 $formquestion = array(
2383 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2384 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2385 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2388 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2391 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1, 250, 600);
2394 if ($action ==
'closeas') {
2396 $formquestion = array();
2398 $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)));
2400 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2402 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2407 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2409 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2410 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2414 $eligibleForDepositGeneration =
true;
2416 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2417 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2418 '@phan-var-force Facture $invoice';
2420 $eligibleForDepositGeneration =
false;
2426 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2427 foreach (
$object->linkedObjects[
'commande'] as $order) {
2428 $order->fetchObjectLinked();
2430 if (array_key_exists(
'facture', $order->linkedObjects)) {
2431 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2432 '@phan-var-force Facture $invoice';
2434 $eligibleForDepositGeneration =
false;
2443 if ($eligibleForDepositGeneration) {
2444 $formquestion[] = array(
2445 'type' =>
'checkbox',
2446 'tdclass' =>
'showonlyifsigned',
2447 'name' =>
'generate_deposit',
2448 'morecss' =>
'margintoponly marginbottomonly',
2449 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2452 $formquestion[] = array(
2454 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2456 'label' => $langs->trans(
'DateInvoice'),
2462 $formquestion[] = array(
2464 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2465 'name' =>
'date_pointoftax',
2466 'label' => $langs->trans(
'DatePointOfTax'),
2472 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2474 $formquestion[] = array(
2476 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2477 'name' =>
'cond_reglement_id',
2478 'label' => $langs->trans(
'PaymentTerm'),
2479 'value' => $paymentTermsSelect
2482 $formquestion[] = array(
2483 'type' =>
'checkbox',
2484 'tdclass' =>
'showonlyifgeneratedeposit',
2485 'name' =>
'validate_generated_deposit',
2486 'morecss' =>
'margintoponly marginbottomonly',
2487 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2490 $formquestion[] = array(
2491 'type' =>
'onecolumn',
2494 let signedValue = ' . $object::STATUS_SIGNED .
';
2496 $(document).ready(function() {
2497 $("[name=generate_deposit]").change(function () {
2498 let $self = $(this);
2499 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2501 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2510 $("#statut").change(function() {
2511 let $target = $(".showonlyifsigned").parent(".tagtr");
2513 if ($(this).val() == signedValue) {
2519 $("[name=generate_deposit]").trigger("change");
2524 $("#statut").trigger("change");
2533 if (isModEnabled(
'notification')) {
2534 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2535 $notify =
new Notify($db);
2536 $formquestion = array_merge($formquestion, array(
2537 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2542 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2544 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2546 } elseif ($action ==
'cancel') {
2548 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2549 } elseif ($action ==
'delete') {
2551 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2552 } elseif ($action ==
'reopen') {
2554 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2555 } elseif ($action ==
'ask_deleteline') {
2557 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2558 } elseif ($action ==
'validate') {
2563 $ref = substr(
$object->ref, 1, 4);
2564 if ($ref ==
'PROV' || $ref ==
'') {
2565 $numref =
$object->getNextNumRef($soc);
2566 if (empty($numref)) {
2574 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2575 if (isModEnabled(
'notification')) {
2576 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2577 $notify =
new Notify($db);
2579 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2584 foreach (
$object->lines as $line) {
2585 $res = $line->fetch_product();
2587 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2593 if ($nbMandated > 0) {
2595 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2598 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2603 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2608 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2609 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2610 if (empty($reshook)) {
2611 $formconfirm .= $hookmanager->resPrint;
2612 } elseif ($reshook > 0) {
2613 $formconfirm = $hookmanager->resPrint;
2622 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2624 $morehtmlref =
'<div class="refidno">';
2626 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2627 $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);
2629 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2631 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2634 if (isModEnabled(
'project')) {
2635 $langs->load(
"projects");
2636 $morehtmlref .=
'<br>';
2637 if ($usercancreate) {
2638 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2639 if ($action !=
'classify') {
2640 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2642 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2644 if (!empty(
$object->fk_project)) {
2646 $proj->fetch(
$object->fk_project);
2647 $morehtmlref .= $proj->getNomUrl(1);
2649 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2654 $morehtmlref .=
'</div>';
2657 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2660 $parameters = array();
2662 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
2663 if (empty($reshook)) {
2664 print
'<div class="fichecenter">';
2665 print
'<div class="fichehalfleft">';
2666 print
'<div class="underbanner clearboth"></div>';
2668 print
'<table class="border tableforfield centpercent">';
2672 $filterabsolutediscount =
"fk_facture_source IS NULL";
2673 $filtercreditnote =
"fk_facture_source IS NOT NULL";
2675 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
2676 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
2679 print
'<tr><td class="titlefieldmax45">'.$langs->trans(
'Discounts').
'</td><td>';
2681 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
2682 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
2683 $absolute_discount =
price2num($absolute_discount,
'MT');
2684 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
2690 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
2691 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2707 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, $editenable);
2708 print
'</td><td class="valuefield">';
2709 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
2710 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2711 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2712 print
'<input type="hidden" name="action" value="setdate">';
2713 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2714 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
2715 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2729 print
'<table class="nobordernopadding centpercent"><tr><td>';
2730 print $langs->trans(
'DateEndPropal');
2732 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
2733 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>';
2735 print
'</tr></table>';
2736 print
'</td><td class="valuefield">';
2737 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
2738 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2739 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2740 print
'<input type="hidden" name="action" value="setecheance">';
2741 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2742 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
2743 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2746 if (!empty(
$object->fin_validite)) {
2760 print
'<table class="nobordernopadding centpercent"><tr><td>';
2761 print $langs->trans(
'PaymentConditionsShort');
2763 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
2764 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>';
2766 print
'</tr></table>';
2767 print
'</td><td class="valuefield">';
2768 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
2769 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
2771 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
2777 print
'<tr class="field_mode_reglement_id">';
2779 print
'<table class="nobordernopadding centpercent"><tr><td>';
2780 print $langs->trans(
'PaymentMode');
2782 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
2783 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>';
2785 print
'</tr></table>';
2786 print
'</td><td class="valuefieldcreate">';
2787 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
2788 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
2790 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'none');
2795 $langs->load(
'deliveries');
2797 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2798 print
'</td><td class="valuefieldedit">';
2799 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2804 print
'<tr class="fielddeliverydelay"><td>';
2805 print
'<table class="nobordernopadding centpercent"><tr><td>';
2806 if (isModEnabled(
'order')) {
2807 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
2809 print $langs->trans(
'AvailabilityPeriod');
2812 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
2813 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>';
2815 print
'</tr></table>';
2816 print
'</td><td class="valuefield">';
2817 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
2818 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'availability_id', 1);
2820 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'none', 1);
2827 if (isModEnabled(
"shipping")) {
2829 print
'<table class="nobordernopadding centpercent"><tr><td>';
2830 print $langs->trans(
'SendingMethod');
2832 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
2833 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>';
2835 print
'</tr></table>';
2836 print
'</td><td class="valuefield">';
2837 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
2838 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'shipping_method_id', 1);
2840 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'none');
2847 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2848 $langs->load(
'stocks');
2849 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2851 print
'<tr class="field_warehouse_id"><td>';
2852 $editenable = $usercancreate;
2853 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
2854 print
'</td><td class="valuefieldcreate">';
2855 if ($action ==
'editwarehouse') {
2856 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
2858 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
2866 print
'<table class="nobordernopadding centpercent"><tr><td>';
2867 print $langs->trans(
'Source');
2869 if ($action !=
'editdemandreason' && $usercancreate) {
2870 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>';
2872 print
'</tr></table>';
2873 print
'</td><td class="valuefield">';
2874 if ($action ==
'editdemandreason' && $usercancreate) {
2875 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'demand_reason_id', 1);
2877 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'none');
2882 if ($soc->outstanding_limit) {
2885 print $langs->trans(
'OutstandingBill');
2886 print
'</td><td class="valuefield">';
2887 $arrayoutstandingbills = $soc->getOutstandingBills();
2888 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
2889 print
price($arrayoutstandingbills[
'opened']).
' / ';
2890 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1,
$conf->currency);
2895 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2898 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2899 print $langs->trans(
'BankAccount');
2901 if ($action !=
'editbankaccount' && $usercancreate) {
2902 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>';
2904 print
'</tr></table>';
2905 print
'</td><td class="valuefield">';
2906 if ($action ==
'editbankaccount') {
2907 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
2909 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
2916 $tmparray =
$object->getTotalWeightVolume();
2917 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
2918 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
2920 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
2921 print
'<td class="valuefield">';
2926 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
2927 print
'<td class="valuefield">';
2934 if (isModEnabled(
'incoterm')) {
2936 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2937 print $langs->trans(
'IncotermLabel');
2938 print
'<td><td class="right">';
2939 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
2940 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2944 print
'</td></tr></table>';
2946 print
'<td class="valuefield">';
2947 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
2948 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2950 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
2956 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2961 print
'<div class="fichehalfright">';
2962 print
'<div class="underbanner clearboth"></div>';
2964 print
'<table class="border tableforfield centpercent">';
2966 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
2969 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
2970 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2971 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2972 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2977 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
2978 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2979 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2980 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2984 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
2986 print
'<td>' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
2987 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2988 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2991 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2996 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
2998 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
2999 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3000 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3003 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3009 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3010 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3011 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3012 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3019 if (isModEnabled(
'margin')) {
3020 $formmargin->displayMarginInfos(
$object);
3026 print
'<div class="clearboth"></div><br>';
3029 $blocname =
'contacts';
3030 $title = $langs->trans(
'ContactsAddresses');
3031 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3035 $blocname =
'notes';
3036 $title = $langs->trans(
'Notes');
3037 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3045 $result =
$object->getLinesArray();
3049 global $inputalsopricewithtax;
3050 $inputalsopricewithtax = 1;
3052 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
3053 <input type="hidden" name="token" value="' .
newToken().
'">
3054 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3055 <input type="hidden" name="mode" value="">
3056 <input type="hidden" name="page_y" value="">
3057 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3058 <input type="hidden" name="id" value="' .
$object->id.
'">
3062 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3065 print
'<div class="div-table-responsive-no-min">';
3067 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3071 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3076 if ($action !=
'editline') {
3077 $parameters = array();
3078 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3082 if (empty($reshook)) {
3083 $object->formAddObjectLine(1, $mysoc, $soc);
3086 $parameters = array();
3087 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3106 if ($action !=
'presend') {
3107 $numlines = count(
$object->lines);
3108 print
'<div class="tabsAction">';
3110 $parameters = array();
3111 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3113 if (empty($reshook)) {
3114 if ($action !=
'editline') {
3118 if ($usercanvalidate) {
3119 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>';
3121 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3131 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3136 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3137 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3141 if (empty($user->socid)) {
3143 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3147 $arrayforbutaction = array();
3150 $arrayforbutaction[] = array(
3153 'perm' => $usercancreateorder,
3154 'label' =>
'AddOrder',
3155 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3165 $arrayforbutaction[] = array(
3168 'perm' => $usercancreatepurchaseorder,
3169 'label' =>
'AddPurchaseOrder',
3170 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3180 $arrayforbutaction[] = array(
3181 'lang' =>
'interventions',
3183 'perm' => $usercancreateintervention,
3184 'label' =>
'AddIntervention',
3185 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3195 $arrayforbutaction[] = array(
3196 'lang' =>
'contracts',
3198 'perm' => $usercancreatecontract,
3199 'label' =>
'AddContract',
3200 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3212 $arrayforbutaction[] = [
3213 'lang' =>
'invoice',
3214 'enabled' => isModEnabled(
'invoice'),
3215 'perm' => $usercancreateinvoice,
3216 'label' =>
'CreateBill',
3217 'url' =>
'/compta/facture/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((int)
$object->id).
'&socid='.((int)
$object->socid),
3224 $actionButtonsParameters = [
3225 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3226 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3229 if ($numlines > 0) {
3230 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 1, $actionButtonsParameters);
3232 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 0, $actionButtonsParameters);
3236 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3237 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3238 if ($usercanclose) {
3239 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3241 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3249 if ($usercanclose) {
3250 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3251 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3253 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3254 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3260 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3261 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3267 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3271 if ($usercancreate) {
3272 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>';
3276 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3284 if (
GETPOST(
'modelselected')) {
3285 $action =
'presend';
3288 if ($action !=
'presend') {
3289 print
'<div class="fichecenter"><div class="fichehalfleft">';
3290 print
'<a name="builddoc"></a>';
3296 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3297 $genallowed = $usercanread;
3298 $delallowed = $usercancreate;
3300 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $soc->default_lang,
'',
$object);
3303 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'propal'), 1);
3304 $linktoelem = $tmparray[
'linktoelem'];
3305 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3306 print $htmltoenteralink;
3308 $compatibleImportElementsList =
false;
3310 $compatibleImportElementsList = array(
'commande',
'propal',
'facture');
3312 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3318 print
'<br><!-- Link to sign -->';
3319 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3320 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3323 print
'</div><div class="fichehalfright">';
3327 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3330 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3332 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3334 print
'</div></div>';
3338 $modelmail =
'propal_send';
3339 $defaulttopic =
'SendPropalRef';
3340 $diroutput =
$conf->propal->multidir_output[
$object->entity];
3341 $trackid =
'pro'.$object->id;
3343 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.