47require
'../../main.inc.php';
48require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
49require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formother.class.php';
50require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formfile.class.php';
51require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formpropal.class.php';
52require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formmargin.class.php';
53require_once DOL_DOCUMENT_ROOT .
'/comm/propal/class/propal.class.php';
54require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
55require_once DOL_DOCUMENT_ROOT .
'/core/modules/propale/modules_propale.php';
56require_once DOL_DOCUMENT_ROOT .
'/core/lib/propal.lib.php';
57require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
58require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
59require_once DOL_DOCUMENT_ROOT .
'/core/class/doleditor.class.php';
61 require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
62 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
66 require_once DOL_DOCUMENT_ROOT .
'/variants/class/ProductCombination.class.php';
79$langs->loadLangs(array(
'companies',
'propal',
'compta',
'bills',
'orders',
'products',
'sendings',
'other'));
81 $langs->load(
'incoterm');
84 $langs->load(
'margins');
89$array_options = array();
94$action =
GETPOST(
'action',
'aZ09');
95$cancel =
GETPOST(
'cancel',
'alpha');
96$origin =
GETPOST(
'origin',
'alpha');
99$confirm =
GETPOST(
'confirm',
'alpha');
100$backtopage =
GETPOST(
'backtopage',
'alpha');
115$extrafields->fetch_name_optionals_label(
$object->table_element);
118if ($id > 0 || !empty($ref)) {
119 $ret =
$object->fetch($id, $ref);
121 $ret =
$object->fetch_thirdparty();
122 if ($ret > 0 && isset(
$object->fk_project)) {
123 $ret =
$object->fetchProject();
133$hookmanager->initHooks(array(
'propalcard',
'globalcard'));
135$usercanread = $user->hasRight(
"propal",
"lire");
136$usercancreate = $user->hasRight(
"propal",
"creer");
137$usercandelete = $user->hasRight(
"propal",
"supprimer");
139$usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'close')));
140$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'validate')));
143$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
144$usercancreateorder = ($user->hasRight(
'commande',
'creer') == 1);
145$usercancreateinvoice = ($user->hasRight(
'facture',
'creer') == 1);
146$usercancreatecontract = ($user->hasRight(
'contrat',
'creer') == 1);
147$usercancreateintervention = ($user->hasRight(
'ficheinter',
'creer') == 1);
148$usercancreatepurchaseorder = ($user->hasRight(
'fournisseur',
'commande',
'creer') || $user->hasRight(
'supplier_order',
'creer'));
149$usercanreopen = ((!
getDolGlobalBool(
'MAIN_USE_ADVANCED_PERMS') && $usercanclose) || (
getDolGlobalBool(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'reopen')));
151 $usercanreopen =
false;
154$permissiontoadd = $usercancreate;
155$permissionnote = $usercancreate;
156$permissiondellink = $usercancreate;
157$permissiontoedit = $usercancreate;
158$permissiontoeditextra = $permissiontoadd;
159if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
161 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
164$price_base_type =
null;
165$shipping_method_id =
null;
169if (!empty($user->socid)) {
170 $socid = $user->socid;
179$parameters = array(
'socid' => $socid);
180$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
184if (empty($reshook)) {
185 $backurlforlist = DOL_URL_ROOT .
'/comm/propal/list.php';
187 if (empty($backtopage) || ($cancel && empty($id))) {
188 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
189 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
190 $backtopage = $backurlforlist;
192 $backtopage = DOL_URL_ROOT .
'/comm/propal/card.php?id=' . ((!empty($id) &&
$id > 0) ? $id :
'__ID__');
198 if (!empty($backtopageforcancel)) {
199 header(
"Location: " . $backtopageforcancel);
201 } elseif (!empty($backtopage)) {
202 header(
"Location: " . $backtopage);
208 include DOL_DOCUMENT_ROOT .
'/core/actions_setnotes.inc.php';
210 include DOL_DOCUMENT_ROOT .
'/core/actions_dellink.inc.php';
212 include DOL_DOCUMENT_ROOT .
'/core/actions_lineupdown.inc.php';
215 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
217 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'IdThirdParty')),
null,
'errors');
230 $date_delivery_old =
$object->delivery_date;
231 if (!empty($date_delivery_old) && !empty($date_delivery)) {
242 $difference = $date_delivery - $old_date_delivery;
243 if ($difference != 0) {
244 $object->delivery_date = $date_delivery;
245 foreach (
$object->lines as $line) {
246 if (isset($line->date_start)) {
247 $line->date_start += $difference;
249 if (isset($line->date_end)) {
250 $line->date_end += $difference;
257 $result =
$object->createFromClone($user, $socid, (GETPOSTISSET(
'entity') ?
GETPOSTINT(
'entity') : null), (
GETPOST(
'update_prices') ==
'on'), (
GETPOST(
'update_desc') ==
'on'));
259 $warningMsgLineList = array();
261 foreach (
$object->lines as $line) {
262 if (!is_object($line->product)) {
263 $line->fetch_product();
265 if (is_object($line->product) && $line->product->id > 0) {
266 if (empty($line->product->status)) {
267 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
271 if (!empty($warningMsgLineList)) {
275 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
'?id=' . $result);
278 if (count(
$object->errors) > 0) {
285 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanclose) {
287 $result =
$object->setCancel($user);
289 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
292 $langs->load(
"errors");
295 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
297 $result =
$object->delete($user);
299 header(
'Location: ' . DOL_URL_ROOT .
'/comm/propal/list.php?restore_lastsearch_values=1');
302 $langs->load(
"errors");
305 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
307 $result =
$object->deleteLine($lineid);
312 $langs->load(
"errors");
318 $outputlangs = $langs;
321 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
322 $outputlangs->setDefaultLang($newlang);
328 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
331 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
333 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $usercancreate) {
338 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'));
343 $outputlangs = $langs;
349 $newlang =
$object->thirdparty->default_lang;
351 if (!empty($newlang)) {
353 $outputlangs->setDefaultLang($newlang);
354 $outputlangs->load(
'products');
358 $result =
$object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
361 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
368 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
371 $result =
$object->valid($user);
373 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
381 $outputlangs = $langs;
384 $newlang =
GETPOST(
'lang_id',
'aZ09');
387 $newlang =
$object->thirdparty->default_lang;
389 if (!empty($newlang)) {
391 $outputlangs->setDefaultLang($newlang);
395 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
398 $langs->load(
"errors");
399 if (count(
$object->errors) > 0) {
405 } elseif ($action ==
'setdate' && $usercancreate) {
410 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
414 $result =
$object->set_date($user, $datep);
415 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
416 $datev = $datep + (
$object->duree_validite * 24 * 3600);
417 $result =
$object->set_echeance($user, $datev, 1);
422 $outputlangs = $langs;
425 $newlang =
GETPOST(
'lang_id',
'aZ09');
428 $newlang =
$object->thirdparty->default_lang;
430 if (!empty($newlang)) {
432 $outputlangs->setDefaultLang($newlang);
440 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
443 } elseif ($action ==
'setecheance' && $usercancreate) {
447 $outputlangs = $langs;
450 $newlang =
GETPOST(
'lang_id',
'aZ09');
453 $newlang =
$object->thirdparty->default_lang;
455 if (!empty($newlang)) {
457 $outputlangs->setDefaultLang($newlang);
465 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
470 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
475 } elseif ($action ==
'setref_client' && $usercancreate) {
481 } elseif ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $usercancreate) {
484 } elseif ($action ==
'settags' &&
isModEnabled(
'category') && $usercancreate) {
486 } elseif ($action ==
'add' && $usercancreate) {
496 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
500 if (empty($duration)) {
501 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
507 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
522 $object->delivery_date = $date_delivery;
528 $object->duree_validite = $duration;
538 $object->user_author_id = $user->id;
544 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
554 $object->delivery_date = $date_delivery;
569 $object->user_author_id = $user->id;
573 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
580 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
584 $ret = $extrafields->setOptionalsFromPost(
null, $object);
592 if ($origin && $originid) {
594 $element = $subelement = $origin;
596 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
598 $subelement = $regs[2];
602 if ($element ==
'order') {
603 $element = $subelement =
'commande';
605 if ($element ==
'propal') {
606 $element =
'comm/propal';
607 $subelement =
'propal';
609 if ($element ==
'contract') {
610 $element = $subelement =
'contrat';
612 if ($element ==
'inter') {
613 $element = $subelement =
'fichinter';
615 if ($element ==
'shipping') {
616 $element = $subelement =
'expedition';
620 if (($origin !=
'contrat' || $renewal !=
'true') && !
getDolGlobalInt(
'CONTRACT_NEW_CONTRACT_ON_RENEWAL')) {
622 $object->origin_id = $originid;
628 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
635 $classname = ucfirst($subelement);
636 $srcobject =
new $classname($db);
637 '@phan-var-force Commande|Propal|Contrat|Fichinter|Expedition $srcobject';
640 dol_syslog(
"Try to find source object origin=" .
$object->origin .
" originid=" .
$object->origin_id .
" to add lines");
641 $result = $srcobject->fetch(
$object->origin_id);
644 $lines = $srcobject->lines;
645 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
646 $srcobject->fetch_lines();
647 $lines = $srcobject->lines;
651 $num = count($lines);
652 for ($i = 0; $i < $num; $i++) {
653 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
654 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
657 $product_type = ($lines[$i]->product_type ? (int) $lines[$i]->product_type : 0);
661 if ($lines[$i]->date_debut_prevue) {
662 $date_start = $lines[$i]->date_debut_prevue;
664 if ($lines[$i]->date_debut_reel) {
665 $date_start = $lines[$i]->date_debut_reel;
667 if ($lines[$i]->date_start) {
668 $date_start = $lines[$i]->date_start;
673 if ($lines[$i]->date_fin_prevue) {
674 $date_end = $lines[$i]->date_fin_prevue;
676 if ($lines[$i]->date_fin_reel) {
677 $date_end = $lines[$i]->date_fin_reel;
679 if ($lines[$i]->date_end) {
680 $date_end = $lines[$i]->date_end;
684 if ($origin ==
'contrat' && $renewal ==
'true') {
685 if ($lines[$i]->date_start && $lines[$i]->date_end) {
686 $duration = $lines[$i]->date_end - $lines[$i]->date_start;
687 $date_start = $lines[$i]->date_end + 86400;
688 $date_end = $date_start + $duration;
693 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
698 if (method_exists($lines[$i],
'fetch_optionals')) {
699 $lines[$i]->fetch_optionals();
700 $array_options = $lines[$i]->array_options;
703 $tva_tx = $lines[$i]->tva_tx;
704 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
705 $tva_tx .=
' (' . $lines[$i]->vat_src_code .
')';
708 $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);
719 if ($result > 0 && $lines[$i]->product_type == 9) {
720 $fk_parent_line = $result;
725 $parameters = array(
'objFrom' => $srcobject);
726 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
747 if (
GETPOST(
'contactid') > 0) {
756 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
759 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
763 $categories =
GETPOST(
'categories',
'array');
764 if (method_exists($object,
'setCategories')) {
765 $object->setCategories($categories);
774 $outputlangs = $langs;
777 $newlang =
GETPOST(
'lang_id',
'aZ09');
780 $newlang =
$object->thirdparty->default_lang;
782 if (!empty($newlang)) {
784 $outputlangs->setDefaultLang($newlang);
789 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
795 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
808 } elseif ($action ==
'classifybilled' && $usercanclose) {
812 $result =
$object->classifyBilled($user, 0,
'');
823 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
826 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
828 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
829 $locationTarget =
'';
843 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
848 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
851 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
852 && !empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
854 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
857 $forceFields = array();
859 if (GETPOSTISSET(
'date_pointoftax')) {
867 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
878 $ret = $deposit->fetch($deposit->id);
879 $outputlangs = $langs;
883 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
884 $outputlangs->load(
'products');
887 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
894 if ($locationTarget) {
895 header(
'Location: ' . $locationTarget);
907 } elseif ($action ==
'confirm_reopen' && $usercanreopen && !
GETPOST(
'cancel',
'alpha')) {
914 $result =
$object->reopen($user, $newstatus);
931 $fromElement =
GETPOST(
'fromelement');
932 $fromElementid =
GETPOST(
'fromelementid');
933 $importLines =
GETPOST(
'line_checkbox');
935 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && preg_match(
'/^[a-zA-Z]+$/', $fromElement) && !empty($fromElementid)) {
936 if ($fromElement ==
'commande') {
937 dol_include_once(
'/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
938 $lineClassName =
'OrderLine';
939 } elseif ($fromElement ==
'propal') {
940 dol_include_once(
'/comm/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
941 $lineClassName =
'PropaleLigne';
942 } elseif ($fromElement ==
'facture') {
943 dol_include_once(
'/compta/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
944 $lineClassName =
'FactureLigne';
946 $lineClassName =
null;
948 $nextRang = count(
$object->lines) + 1;
951 foreach ($importLines as $lineId) {
952 $lineId = intval($lineId);
953 $originLine =
new $lineClassName($db);
954 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
955 $originLine->fetch_optionals();
956 $desc = $originLine->desc;
957 $pu_ht = $originLine->subprice;
958 $qty = $originLine->qty;
959 $txtva = $originLine->tva_tx;
960 $txlocaltax1 = $originLine->localtax1_tx;
961 $txlocaltax2 = $originLine->localtax2_tx;
962 $fk_product = $originLine->fk_product;
963 $remise_percent = $originLine->remise_percent;
964 $date_start = $originLine->date_start;
965 $date_end = $originLine->date_end;
966 $fk_code_ventilation = 0;
967 $info_bits = $originLine->info_bits;
968 $fk_remise_except = $originLine->fk_remise_except;
969 $price_base_type =
'HT';
971 $type = $originLine->product_type;
973 $special_code = $originLine->special_code;
974 $origin = $originLine->element;
975 $origin_id = $originLine->id;
977 $fk_fournprice = $originLine->fk_fournprice;
978 $pa_ht = $originLine->pa_ht;
979 $label = $originLine->label;
980 $array_options = $originLine->array_options;
981 $situation_percent = 100;
983 $fk_unit = $originLine->fk_unit;
984 $pu_ht_devise = $originLine->multicurrency_subprice;
986 $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);
1002 } elseif ($action ==
'addline' &&
GETPOST(
'updateallvatlinesblock',
'alpha') &&
GETPOST(
'vatforblocklines',
'alpha') !==
'' && $usercancreate) {
1003 $tx_tva =
GETPOST(
'vatforblocklines') ?
GETPOST(
'vatforblocklines') : 0;
1004 $object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'tva', $tx_tva);
1005 } elseif ($action ==
'addline' &&
GETPOST(
'updatealldiscountlinesblock',
'alpha') &&
GETPOST(
'discountforblocklines',
'alpha') !==
'' && $usercancreate) {
1006 $discount =
GETPOST(
'discountforblocklines') ?
GETPOST(
'discountforblocklines') : 0;
1007 $object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'discount', $discount);
1010 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1013 $actiontypecode =
'AC_OTH_AUTO';
1014 $triggersendname =
'PROPAL_SENTBYMAIL';
1015 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
1016 $trackid =
'pro' .
$object->id;
1017 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1021 if ($action ==
'modif' && $usercancreate) {
1022 $result =
$object->setDraft($user);
1029 $outputlangs = $langs;
1031 $outputlangs =
new Translate(
"", $conf);
1032 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1033 $outputlangs->setDefaultLang($newlang);
1039 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1041 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
1050 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
1054 foreach (
$object->lines as $key => $line) {
1055 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1058 if ($line->product_type == 1) {
1059 $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);
1063 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
1065 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
1066 $vat_rate = str_replace(
'*',
'', $vat_rate);
1069 foreach (
$object->lines as $key => $line) {
1070 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1073 $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);
1076 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
1078 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
1079 $remise_percent = str_replace(
'*',
'', $remise_percent);
1080 foreach (
$object->lines as $key => $line) {
1081 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1084 $tvatx = $line->tva_tx;
1085 if (!empty($line->vat_src_code)) {
1086 $tvatx .=
' (' . $line->vat_src_code .
')';
1088 $result =
$object->updateline($line->id, $line->subprice, $line->qty, (
float) $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);
1091 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'' && $usercancreate) {
1093 $margin_rate = (
GETPOST(
'marginforalllines',
'alpha') ?
GETPOST(
'marginforalllines',
'alpha') : 0);
1094 foreach (
$object->lines as $key => $line) {
1095 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1098 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
1100 $prod->fetch($line->fk_product);
1101 if ($prod->price_min > $subprice) {
1102 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1103 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1104 setEventMessages($prod->ref .
' - ' . $prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1107 if ($line->subprice <> 0) {
1108 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1110 $multicurrency_subprice = 0;
1113 $result =
$object->updateline($line->id, (
float) $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);
1130 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
1133 $langs->load(
'subtotals');
1135 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
1136 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
1138 $subtotal_options = array();
1140 foreach (Propal::$TITLE_OPTIONS as $option) {
1141 $value =
GETPOST($option,
'alphanohtml');
1143 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1148 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1159 $outputlangs = $langs;
1160 $newlang =
GETPOST(
'lang_id',
'alpha');
1162 $newlang =
$object->thirdparty->default_lang;
1164 if (!empty($newlang)) {
1165 $outputlangs =
new Translate(
"", $conf);
1166 $outputlangs->setDefaultLang($newlang);
1169 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1174 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1176 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
1179 $langs->load(
'subtotals');
1181 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
1182 foreach (
$object->lines as $line) {
1183 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
1184 $desc = $line->desc;
1185 $depth = -$line->qty;
1189 $subtotal_options = array();
1191 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1192 $value =
GETPOST($option,
'alphanohtml');
1194 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1199 if (isset($desc) && isset($depth)) {
1200 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1202 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
1205 if (isset($result) && $result >= 0) {
1211 $outputlangs = $langs;
1212 $newlang =
GETPOST(
'lang_id',
'alpha');
1214 $newlang =
$object->thirdparty->default_lang;
1216 if (!empty($newlang)) {
1217 $outputlangs =
new Translate(
"", $conf);
1218 $outputlangs->setDefaultLang($newlang);
1221 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1226 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1228 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && !
GETPOST(
'markforalllines',
'alpha') && $usercancreate) {
1232 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1235 $price_ht_devise =
'';
1237 $price_ttc_devise =
'';
1241 if (
GETPOST(
'price_ht') !==
'') {
1244 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1247 if (
GETPOST(
'price_ttc') !==
'') {
1250 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1251 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1254 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1255 if ($prod_entry_mode ==
'free') {
1261 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1266 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1269 $remise_percent = (GETPOSTISSET(
'remise_percent' . $predef) ?
price2num(
GETPOST(
'remise_percent' . $predef,
'alpha'),
'', 2) : 0);
1270 if (empty($remise_percent)) {
1271 $remise_percent = 0;
1275 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1276 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1278 if (is_array($extralabelsline)) {
1280 foreach ($extralabelsline as $key => $value) {
1281 unset($_POST[
"options_" . $key]);
1285 $price_to_test_sign = ($price_ht ? $price_ht : $price_ttc);
1287 if ((empty($idprod) || $idprod < 0) && ($price_to_test_sign < 0) && ($qty < 0)) {
1288 $langs->load(
"errors");
1289 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1292 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1293 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1297 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1298 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1302 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1305 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1306 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1310 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1311 if ($combinations =
GETPOST(
'combinations',
'array:alphanohtml')) {
1315 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1316 $idprod = $res->fk_product_child;
1318 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1324 if (!$error && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1332 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1341 if (!empty($idprod) && $idprod > 0) {
1343 $prod->fetch($idprod);
1345 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
1355 $pu_ht = $prod->price;
1356 $pu_ttc = $prod->price_ttc;
1357 $price_min = $prod->price_min;
1358 $price_min_ttc = $prod->price_min_ttc;
1359 $price_base_type = $prod->price_base_type;
1363 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1365 $filter = array(
't.fk_product' => (
string) $prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1368 $pricebycustomerexist =
false;
1369 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1372 if (count($prodcustprice->lines) > 0) {
1373 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1374 foreach ($prodcustprice->lines as $k => $custprice_line) {
1375 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1376 $pricebycustomerexist =
true;
1377 $pu_ht =
price($custprice_line->price);
1378 $pu_ttc =
price($custprice_line->price_ttc);
1379 $price_min =
price($custprice_line->price_min);
1380 $price_min_ttc =
price($custprice_line->price_min_ttc);
1381 $price_base_type = $custprice_line->price_base_type;
1398 if (!$pricebycustomerexist && !empty(
$object->thirdparty->price_level)) {
1399 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1400 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1401 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1402 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1403 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1405 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1406 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1408 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1409 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1414 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1415 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1416 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1417 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1418 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1420 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1421 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1423 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1424 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1429 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1433 $filter = array(
't.fk_product' => (
string) $prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1435 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1438 if (count($prodcustprice->lines) > 0) {
1439 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1440 foreach ($prodcustprice->lines as $k => $custprice_line) {
1441 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1442 $pu_ht =
price($custprice_line->price);
1443 $pu_ttc =
price($custprice_line->price_ttc);
1444 $price_min =
price($custprice_line->price_min);
1445 $price_min_ttc =
price($custprice_line->price_min_ttc);
1446 $price_base_type = $custprice_line->price_base_type;
1464 if ($prod->prices_by_qty[0]) {
1469 foreach ($prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1470 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1474 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1475 $pu_ht = $priceforthequantityarray[
'unitprice'];
1477 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1485 if ($prod->prices_by_qty[
$object->thirdparty->price_level]) {
1490 foreach ($prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1491 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1495 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1496 $pu_ht = $priceforthequantityarray[
'unitprice'];
1498 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1506 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1507 $tmpprodvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
1510 if (!empty($price_ht) || (string) $price_ht ===
'0') {
1511 $pu_ht = (float)
price2num($price_ht,
'MU');
1512 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1513 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1514 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1515 $pu_ttc_devise = (float)
price2num((
float) $pu_ht_devise * (1 + ((float) $tmpvat / 100)),
'MU');
1518 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1519 $pu_ttc = (float)
price2num($price_ttc,
'MU');
1520 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1521 } elseif (!empty($price_ttc_devise) || (
string) $price_ttc_devise ===
'0') {
1522 $pu_ttc_devise = (float)
price2num($price_ttc_devise,
'MU');
1523 $pu_ht_devise = (float)
price2num((
float) $pu_ttc_devise / (1 + ((float) $tmpvat / 100)),
'MU');
1526 } elseif ($tmpvat != $tmpprodvat) {
1528 if ($price_base_type !=
'HT') {
1529 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1531 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1539 $outputlangs = $langs;
1541 if (
GETPOST(
'lang_id',
'aZ09')) {
1542 $newlang =
GETPOST(
'lang_id',
'aZ09');
1544 if (empty($newlang)) {
1545 $newlang =
$object->thirdparty->default_lang;
1547 if (!empty($newlang)) {
1548 $outputlangs =
new Translate(
"", $conf);
1549 $outputlangs->setDefaultLang($newlang);
1552 $desc = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1554 $desc = $prod->description;
1566 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1570 $outputlangs = $langs;
1572 if (
GETPOST(
'lang_id',
'alpha')) {
1573 $newlang =
GETPOST(
'lang_id',
'alpha');
1575 if (empty($newlang)) {
1576 $newlang =
$object->thirdparty->default_lang;
1578 if (!empty($newlang)) {
1579 $outputlangs =
new Translate(
"", $conf);
1580 $outputlangs->setDefaultLang($newlang);
1581 $outputlangs->load(
'products');
1583 if (!empty($prod->customcode)) {
1584 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode") .
': ' . $prod->customcode;
1586 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1589 if (!empty($prod->country_code)) {
1590 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry($prod->country_code,
'', $db, $outputlangs, 0);
1593 if (!empty($prod->customcode)) {
1594 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode") .
': ' . $prod->customcode;
1596 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1599 if (!empty($prod->country_code)) {
1600 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry($prod->country_code,
'', $db, $langs, 0);
1607 $type = $prod->type;
1608 $fk_unit = $prod->fk_unit;
1612 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1613 $tva_tx = str_replace(
'*',
'', $tva_tx);
1614 if (empty($tva_tx)) {
1617 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1620 $fk_unit =
GETPOST(
'units',
'alpha');
1621 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1622 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1624 if ($pu_ttc && !$pu_ht) {
1625 $price_base_type =
'TTC';
1639 $fournprice = (int) (
GETPOST(
'fournprice' . $predef) ?
GETPOST(
'fournprice' . $predef) :
'');
1640 $buyingprice =
price2num((
GETPOST(
'buying_price' . $predef) !=
'' ?
GETPOST(
'buying_price' . $predef) :
''),
'', 2);
1646 $pu_equivalent = $pu_ht;
1647 $pu_equivalent_ttc = $pu_ttc;
1648 $currency_tx =
$object->multicurrency_tx;
1652 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1653 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1655 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1656 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1676 if ($usermustrespectpricemin) {
1677 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1678 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1681 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) < (
float)
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1682 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1690 $result =
$object->addline($desc, $pu_ht, (
float) $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,
GETPOSTINT(
'fk_parent_line'), (
int) $fournprice, $buyingprice, $label, $date_start, $date_end, $array_options, $fk_unit,
'', 0, (
float) $pu_ht_devise);
1702 $outputlangs = $langs;
1703 $newlang =
GETPOST(
'lang_id',
'alpha');
1705 $newlang =
$object->thirdparty->default_lang;
1707 if (!empty($newlang)) {
1708 $outputlangs =
new Translate(
"", $conf);
1709 $outputlangs->setDefaultLang($newlang);
1711 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1714 unset($_POST[
'prod_entry_mode']);
1716 unset($_POST[
'qty']);
1717 unset($_POST[
'type']);
1718 unset($_POST[
'remise_percent']);
1719 unset($_POST[
'price_ht']);
1720 unset($_POST[
'multicurrency_price_ht']);
1721 unset($_POST[
'price_ttc']);
1722 unset($_POST[
'tva_tx']);
1723 unset($_POST[
'product_ref']);
1724 unset($_POST[
'product_label']);
1725 unset($_POST[
'product_desc']);
1726 unset($_POST[
'fournprice']);
1727 unset($_POST[
'buying_price']);
1728 unset($_POST[
'np_marginRate']);
1729 unset($_POST[
'np_markRate']);
1730 unset($_POST[
'dp_desc']);
1731 unset($_POST[
'idprod']);
1732 unset($_POST[
'units']);
1734 unset($_POST[
'date_starthour']);
1735 unset($_POST[
'date_startmin']);
1736 unset($_POST[
'date_startsec']);
1737 unset($_POST[
'date_startday']);
1738 unset($_POST[
'date_startmonth']);
1739 unset($_POST[
'date_startyear']);
1740 unset($_POST[
'date_endhour']);
1741 unset($_POST[
'date_endmin']);
1742 unset($_POST[
'date_endsec']);
1743 unset($_POST[
'date_endday']);
1744 unset($_POST[
'date_endmonth']);
1745 unset($_POST[
'date_endyear']);
1753 } elseif ($action ==
'addline' && $usercancreate && (
1754 (
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'') ||
1755 (
GETPOST(
'submitforallmark',
'alpha') &&
GETPOST(
'markforalllines',
'alpha') !==
''))) {
1758 $margin_rate = GETPOSTISSET(
'marginforalllines') ?
GETPOST(
'marginforalllines',
'int') :
'';
1759 $mark_rate = GETPOSTISSET(
'markforalllines') ?
GETPOST(
'markforalllines',
'int') :
'';
1760 foreach (
$object->lines as &$line)
if ($line->subprice > 0) {
1761 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1764 $subprice_multicurrency = $line->subprice;
1765 if (is_numeric($margin_rate) && $margin_rate > 0) {
1766 $line->subprice = (float)
price2num((
float) $line->pa_ht * (1 + (float) $margin_rate / 100),
'MU');
1767 } elseif (is_numeric($mark_rate) && $mark_rate > 0) {
1768 $line->subprice = (float) ($line->pa_ht / (1 - ((
float) $mark_rate / 100)));
1770 $line->subprice = (float) $line->pa_ht;
1774 $res = $prod->fetch($line->fk_product);
1776 if ($prod->price_min > $line->subprice) {
1777 $price_subprice =
price($line->subprice, 0, $outlangs, 1, -1, -1,
'auto');
1778 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1779 setEventMessages($prod->ref .
' - ' . $prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1783 } elseif ($line->fk_product) {
1788 $multicurrency_subprice = (float) $line->subprice * $line->multicurrency_subprice / $subprice_multicurrency;
1790 $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, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $multicurrency_subprice);
1793 if (is_numeric($margin_rate) && empty($mark_rate)) {
1794 $line->marge_tx = $margin_rate;
1795 } elseif (is_numeric($mark_rate) && empty($margin_rate)) {
1796 $line->marque_tx = $mark_rate;
1798 $line->total_ht = $line->qty * (float) $line->subprice;
1799 $line->total_tva = $line->tva_tx * $line->qty * (float) $line->subprice;
1800 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $line->subprice;
1802 $line->multicurrency_total_ht = $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1803 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1804 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1806 $line->multicurrency_subprice = $multicurrency_subprice;
1811 } elseif ($action ==
'updatetitleline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1814 $langs->load(
'subtotals');
1816 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1819 $subtotal_options = array();
1821 foreach (Propal::$TITLE_OPTIONS as $option) {
1822 $value =
GETPOST($option,
'alphanohtml');
1824 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1829 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1840 $outputlangs = $langs;
1841 $newlang =
GETPOST(
'lang_id',
'alpha');
1843 $newlang =
$object->thirdparty->default_lang;
1845 if (!empty($newlang)) {
1846 $outputlangs =
new Translate(
"", $conf);
1847 $outputlangs->setDefaultLang($newlang);
1850 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1855 } elseif ($action ==
'updatesubtotalline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1858 $langs->load(
'subtotals');
1860 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1863 $subtotal_options = array();
1865 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1866 $value =
GETPOST($option,
'alphanohtml');
1868 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1873 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1881 $outputlangs = $langs;
1882 $newlang =
GETPOST(
'lang_id',
'alpha');
1884 $newlang =
$object->thirdparty->default_lang;
1886 if (!empty($newlang)) {
1887 $outputlangs =
new Translate(
"", $conf);
1888 $outputlangs->setDefaultLang($newlang);
1891 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1896 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1904 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1909 $vat_rate = (
GETPOST(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : 0);
1910 $vat_rate = str_replace(
'*',
'', $vat_rate);
1917 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
1927 if (empty($remise_percent)) {
1928 $remise_percent = 0;
1932 $pu_equivalent = $pu_ht;
1933 $pu_equivalent_ttc = $pu_ttc;
1935 $currency_tx =
$object->multicurrency_tx;
1939 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1940 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1942 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1943 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1958 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1959 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1961 if (is_array($extralabelsline)) {
1963 foreach ($extralabelsline as $key => $value) {
1964 unset($_POST[
"options_" . $key]);
1975 $price_base_type =
'HT';
1976 if (empty($pu) && !empty($pu_ttc)) {
1978 $price_base_type =
'TTC';
1983 if (!empty($productid)) {
1985 $res = $product->fetch($productid);
1987 $type = $product->type;
1991 $price_min = $product->price_min;
1993 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1995 $price_min_ttc = $product->price_min_ttc;
1997 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
2004 if ($usermustrespectpricemin) {
2005 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
2006 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2009 $action =
'editline';
2010 } 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') {
2011 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2014 $action =
'editline';
2019 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2023 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
2031 if (!$user->hasRight(
'margins',
'creer')) {
2032 foreach (
$object->lines as &$line) {
2034 $fournprice = $line->fk_fournprice;
2035 $buyingprice = (string) $line->pa_ht;
2043 $result =
$object->updateline(
GETPOSTINT(
'lineid'), (
float) $pu, (
float) $qty, $remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $description, $price_base_type, $info_bits, $special_code,
GETPOSTINT(
'fk_parent_line'), 0, (
int) $fournprice, $buyingprice, $label, $type, $date_start, $date_end, $array_options,
GETPOSTINT(
"units"), (
float) $pu_ht_devise);
2050 $outputlangs = $langs;
2052 $outputlangs =
new Translate(
"", $conf);
2053 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
2054 $outputlangs->setDefaultLang($newlang);
2060 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2063 unset($_POST[
'qty']);
2064 unset($_POST[
'type']);
2065 unset($_POST[
'productid']);
2066 unset($_POST[
'remise_percent']);
2067 unset($_POST[
'price_ht']);
2068 unset($_POST[
'multicurrency_price_ht']);
2069 unset($_POST[
'price_ttc']);
2070 unset($_POST[
'tva_tx']);
2071 unset($_POST[
'product_ref']);
2072 unset($_POST[
'product_label']);
2073 unset($_POST[
'product_desc']);
2074 unset($_POST[
'fournprice']);
2075 unset($_POST[
'buying_price']);
2077 unset($_POST[
'date_starthour']);
2078 unset($_POST[
'date_startmin']);
2079 unset($_POST[
'date_startsec']);
2080 unset($_POST[
'date_startday']);
2081 unset($_POST[
'date_startmonth']);
2082 unset($_POST[
'date_startyear']);
2083 unset($_POST[
'date_endhour']);
2084 unset($_POST[
'date_endmin']);
2085 unset($_POST[
'date_endsec']);
2086 unset($_POST[
'date_endday']);
2087 unset($_POST[
'date_endmonth']);
2088 unset($_POST[
'date_endyear']);
2095 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
2096 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
2098 } elseif ($action ==
'classin' && $usercancreate) {
2101 } elseif ($action ==
'setavailability' && $usercancreate) {
2104 } elseif ($action ==
'setdemandreason' && $usercancreate) {
2107 } elseif ($action ==
'setconditions' && $usercancreate) {
2110 } elseif ($action ==
'setmode' && $usercancreate) {
2113 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
2115 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
2116 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
2119 } elseif ($action ==
'setbankaccount' && $usercancreate) {
2122 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
2125 } elseif ($action ==
'setwarehouse' && $usercancreate) {
2128 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
2131 $attribute_name =
GETPOST(
'attribute',
'aZ09');
2134 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
2139 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
2146 $action =
'edit_extras';
2151 if ($action ==
'addcontact' && $usercancreate) {
2155 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2159 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2162 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2163 $langs->load(
"errors");
2164 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
2169 } elseif ($action ==
'swapstatut' && $usercancreate) {
2171 if (
$object->fetch($id) > 0) {
2176 } elseif ($action ==
'deletecontact' && $usercancreate) {
2179 $result =
$object->delete_contact($lineid);
2182 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2191 $upload_dir = !empty($conf->propal->multidir_output[
$object->entity ?? $conf->entity]) ? $conf->propal->multidir_output[
$object->entity ?? $conf->entity] : $conf->propal->dir_output;
2192 $permissiontoadd = $usercancreate;
2193 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
2201$form =
new Form($db);
2210$title =
$object->ref .
" - " . $langs->trans(
'Card');
2211if ($action ==
'create') {
2212 $title = $langs->trans(
"NewPropal");
2214$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
2221if ($action ==
'create') {
2228 $res = $soc->fetch($socid);
2231 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2232 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2233 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2239 if (!empty($origin) && !empty($originid)) {
2241 $element = $subelement = $origin;
2243 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2244 $element = $regs[1];
2245 $subelement = $regs[2];
2248 if ($element ==
'project') {
2249 $projectid = $originid;
2253 $project->fetch($projectid);
2254 if ($project->socid > 0) {
2256 $soc->fetch($project->socid);
2260 if ($element ==
'order' || $element ==
'commande') {
2261 $element = $subelement =
'commande';
2263 if ($element ==
'propal') {
2264 $element =
'comm/propal';
2265 $subelement =
'propal';
2267 if ($element ==
'contract') {
2268 $element = $subelement =
'contrat';
2270 if ($element ==
'shipping') {
2271 $element = $subelement =
'expedition';
2276 $classname = ucfirst($subelement);
2277 $objectsrc =
new $classname($db);
2278 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
2280 $objectsrc->fetch($originid);
2281 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2282 $objectsrc->fetch_lines();
2284 $objectsrc->fetch_thirdparty();
2286 $projectid = (int) $objectsrc->fk_project;
2287 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
2289 $soc = $objectsrc->thirdparty;
2291 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2292 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2293 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : -1));
2296 $objectsrc->fetch_optionals();
2297 $object->array_options = $objectsrc->array_options;
2300 if (!empty($objectsrc->multicurrency_code)) {
2301 $currency_code = $objectsrc->multicurrency_code;
2303 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2304 $currency_tx = $objectsrc->multicurrency_tx;
2312 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
2313 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
2314 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
2315 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
2316 $shipping_method_id = $soc->shipping_method_id;
2317 $warehouse_id = !empty($soc->fk_warehouse) ? $soc->fk_warehouse : $warehouse_id;
2318 $remise_percent = $soc->remise_percent;
2320 if (
isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
2321 $currency_code = $soc->multicurrency_code;
2326 if (!
GETPOST(
'changecompany')) {
2327 if (GETPOSTISSET(
'cond_reglement_id')) {
2328 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2330 if (GETPOSTISSET(
'deposit_percent')) {
2333 if (GETPOSTISSET(
'mode_reglement_id')) {
2334 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2336 if (GETPOSTISSET(
'fk_account')) {
2339 if (GETPOSTISSET(
'shipping_method_id')) {
2340 $shipping_method_id =
GETPOSTINT(
'shipping_method_id');
2344 if ($soc->fk_warehouse > 0) {
2345 $warehouse_id = $soc->fk_warehouse;
2352 $warehouse_id = $user->fk_warehouse;
2356 print
'<form name="addprop" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
2357 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2358 print
'<input type="hidden" name="action" value="add">';
2359 print
'<input type="hidden" name="changecompany" value="0">';
2360 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
2361 if ($origin !=
'project' && $originid) {
2362 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
2363 print
'<input type="hidden" name="originid" value="' . $originid .
'">';
2364 if ($origin ==
'contrat' && !empty($renewal)) {
2365 print
'<input type="hidden" name="renewal" value="' . $renewal .
'">';
2367 } elseif ($origin ==
'project' && !empty($projectid)) {
2368 print
'<input type="hidden" name="projectid" value="' . $projectid .
'">';
2374 $parameters = array();
2376 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters, $object, $action);
2377 if (empty($reshook)) {
2378 print
'<table class="border centpercent">';
2381 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Ref') .
'</td><td class="valuefieldcreate">' . $langs->trans(
"Draft") .
'</td></tr>';
2384 print
'<tr class="field_ref_client"><td class="titlefieldcreate">' . $langs->trans(
'RefCustomer') .
'</td><td class="valuefieldcreate">';
2385 print
'<input type="text" name="ref_client" value="' . (!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')) .
'"></td>';
2389 print
'<tr class="field_socid">';
2391 print
'<td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Customer') .
'</td>';
2392 $shipping_method_id = 0;
2395 print
'<td class="valuefieldcreate">';
2396 print $soc->getNomUrl(1,
'customer');
2397 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
2399 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2400 $shipping_method_id = $soc->shipping_method_id;
2403 print
'<td class="valuefieldcreate">';
2404 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2405 print
img_picto(
'',
'company',
'class="pictofixedwidth"') . $form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2409 $(document).ready(function() {
2410 $("#socid").change(function() {
2411 console.log("We have changed the company - Reload page");
2412 var socid = $(this).val();
2414 $("input[name=action]").val("create");
2415 $("input[name=changecompany]").val("1");
2416 $("form[name=addprop]").submit();
2421 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>';
2424 print
'</tr>' .
"\n";
2428 print
'<tr class="field_contactid"><td class="titlefieldcreate">' . $langs->trans(
"DefaultContact") .
'</td><td class="valuefieldcreate">';
2429 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2431 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2435 print
'<tr class="field_discount_info"><td class="titlefieldcreate">' . $langs->trans(
'Discounts') .
'</td><td class="valuefieldcreate">';
2437 $absolute_discount = $soc->getAvailableDiscounts();
2441 $backtopage = $_SERVER[
"PHP_SELF"] .
'?socid=' . $thirdparty->id .
'&action=' . $action .
'&origin=' . urlencode((
string) (
GETPOST(
'origin'))) .
'&originid=' . urlencode((
string) (
GETPOSTINT(
'originid')));
2442 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
2448 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'DatePropal') .
'</td><td class="valuefieldcreate">';
2449 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2450 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2454 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>';
2457 print
'<tr class="field_cond_reglement_id"><td class="nowrap">' . $langs->trans(
'PaymentConditionsShort') .
'</td><td>';
2458 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2460 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2464 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">' . $langs->trans(
'PaymentMode') .
'</td><td class="valuefieldcreate">';
2465 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2466 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2471 print
'<tr class="field_fk_account"><td class="titlefieldcreate">' . $langs->trans(
'BankAccount') .
'</td><td class="valuefieldcreate">';
2472 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"') . $form->select_comptes((
int) $fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2477 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">' . $langs->trans(
'Source') .
'</td><td class="valuefieldcreate">';
2478 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2479 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2484 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2485 $shipping_method_id = $soc->shipping_method_id;
2487 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">' . $langs->trans(
'SendingMethod') .
'</td><td class="valuefieldcreate">';
2488 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2489 $form->selectShippingMethod((
string) $shipping_method_id,
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2493 $formproduct =
null;
2496 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
2498 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">' . $langs->trans(
'Warehouse') .
'</td><td class="valuefieldcreate">';
2499 print
img_picto(
'',
'stock',
'class="pictofixedwidth"') . $formproduct->selectWarehouses((
int) $warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2504 print
'<tr class="field_availability_id"><td class="titlefieldcreate">' . $langs->trans(
'AvailabilityPeriod');
2506 print
' (' . $langs->trans(
'AfterOrder') .
')';
2508 print
'</td><td class="valuefieldcreate">';
2509 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2510 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2514 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">' . $langs->trans(
"DeliveryDate") .
'</td>';
2515 print
'<td class="valuefieldcreate">';
2516 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2518 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2519 $syear =
date(
"Y", $tmpdte);
2520 $smonth =
date(
"m", $tmpdte);
2521 $sday =
date(
"d", $tmpdte);
2522 print $form->selectDate($syear .
"-" . $smonth .
"-" . $sday,
'date_livraison', 0, 0, 0,
"addprop");
2524 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2525 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2530 if (
isModEnabled(
'project') && is_object($formproject)) {
2531 $langs->load(
"projects");
2532 print
'<tr class="field_projectid">';
2533 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2534 print
img_picto(
'',
'project',
'class="pictofixedwidth"').$formproject->select_projects((($soc->id > 0 && !
getDolGlobalString(
'PROJECT_CAN_ALWAYS_LINK_TO_ALL_CUSTOMERS')) ? $soc->id : -1), (string) $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500 widthcentpercentminusxx');
2535 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>';
2542 print
'<tr class="field_incoterm_id">';
2543 print
'<td class="titlefieldcreate"><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1) .
'</label></td>';
2544 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2545 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2546 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2551 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td colspan="3">';
2552 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
2556 print
'<tr class="field_model">';
2557 print
'<td class="titlefieldcreate">' . $langs->trans(
"DefaultModel") .
'</td>';
2558 print
'<td class="valuefieldcreate">';
2559 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2562 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2567 print
'<tr class="field_currency">';
2568 print
'<td class="titlefieldcreate">' . $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0) .
'</td>';
2569 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2570 print
img_picto(
'',
'currency',
'class="pictofixedwidth"') . $form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2575 print
'<tr class="field_note_public">';
2576 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePublic') .
'</td>';
2577 print
'<td class="valuefieldcreate">';
2578 $note_public =
GETPOST(
'note_public',
'restricthtml');
2579 if (!GETPOSTISSET(
'note_public') && empty($note_public) && !empty($objectsrc)) {
2580 $note_public = $objectsrc->note_public;
2582 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2583 print $doleditor->Create(1);
2586 if (empty($user->socid)) {
2587 print
'<tr class="field_note_private">';
2588 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePrivate') .
'</td>';
2589 print
'<td class="valuefieldcreate">';
2590 $note_private =
GETPOST(
'note_private',
'restricthtml');
2591 if (!GETPOSTISSET(
'note_private') && empty($note_private) && !empty($objectsrc)) {
2592 $note_private = $objectsrc->note_private;
2594 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2595 print $doleditor->Create(1);
2601 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_add.tpl.php';
2604 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2606 if ($origin ==
'contrat') {
2610 $objectsrc->update_price(1,
'auto', 1);
2613 print
"\n<!-- " . $classname .
" info -->";
2615 print
'<input type="hidden" name="amount" value="' . $objectsrc->total_ht .
'">' .
"\n";
2616 print
'<input type="hidden" name="total" value="' . $objectsrc->total_ttc .
'">' .
"\n";
2617 print
'<input type="hidden" name="tva" value="' . $objectsrc->total_tva .
'">' .
"\n";
2618 print
'<input type="hidden" name="origin" value="' . $objectsrc->element .
'">';
2619 print
'<input type="hidden" name="originid" value="' . $objectsrc->id .
'">';
2621 $newclassname = $classname;
2622 if ($newclassname ==
'Propal') {
2623 $newclassname =
'CommercialProposal';
2624 } elseif ($newclassname ==
'Commande') {
2625 $newclassname =
'Order';
2626 } elseif ($newclassname ==
'Expedition') {
2627 $newclassname =
'Sending';
2628 } elseif ($newclassname ==
'Fichinter') {
2629 $newclassname =
'Intervention';
2632 print
'<tr><td>' . $langs->trans($newclassname) .
'</td><td>' . $objectsrc->getNomUrl(1) .
'</td></tr>';
2633 print
'<tr><td>' . $langs->trans(
'AmountHT') .
'</td><td>' .
price($objectsrc->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td></tr>';
2634 print
'<tr><td>' . $langs->trans(
'AmountVAT') .
'</td><td>' .
price($objectsrc->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2635 if (
$mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2636 print
'<tr><td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2639 if (
$mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2640 print
'<tr><td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2642 print
'<tr><td>' . $langs->trans(
'AmountTTC') .
'</td><td>' .
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2645 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountHT') .
'</td><td>' .
price($objectsrc->multicurrency_total_ht) .
'</td></tr>';
2646 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountVAT') .
'</td><td>' .
price($objectsrc->multicurrency_total_tva) .
"</td></tr>";
2647 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountTTC') .
'</td><td>' .
price($objectsrc->multicurrency_total_ttc) .
"</td></tr>";
2659 print
'<input type="hidden" name="createmode" value="empty">';
2663 print
'<br><table>';
2667 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2668 print
'<td>' . $langs->trans(
"CopyPropalFrom") .
' </td>';
2670 $liste_propal = array();
2671 $liste_propal[0] =
'';
2673 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2674 $sql .=
" FROM " . MAIN_DB_PREFIX .
"propal p";
2675 $sql .=
", " . MAIN_DB_PREFIX .
"societe s";
2676 $sql .=
" WHERE s.rowid = p.fk_soc";
2677 $sql .=
" AND p.entity IN (" .
getEntity(
'propal') .
")";
2678 $sql .=
" AND p.fk_statut <> 0";
2679 $sql .=
" ORDER BY Id";
2681 $resql = $db->query($sql);
2683 $num = $db->num_rows($resql);
2686 $row = $db->fetch_row($resql);
2687 $propalRefAndSocName = $row[1] .
" - " . $row[2];
2688 $liste_propal[$row[0]] = $propalRefAndSocName;
2691 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2697 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2698 print
'<td valign="top" colspan="2">' . $langs->trans(
"CreateEmptyPropal") .
'</td></tr>';
2705 $langs->load(
"bills");
2707 print $form->buttonsSaveCancel(
"CreateDraft");
2713 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2716 $title = $langs->trans(
'ProductsAndServices');
2719 print
'<div class="div-table-responsive-no-min">';
2720 print
'<table class="noborder centpercent">';
2722 $objectsrc->printOriginLinesList();
2739 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
$object->picto, 0,
'',
'', 0,
'', 1);
2744 if ($action ==
'clone') {
2746 $filter =
'(s.client:IN:1,2,3)';
2747 $formquestion = array(
2750 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2751 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2752 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2755 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2758 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1, 0, 600);
2762 if ($action ==
'add_title_line') {
2763 $langs->load(
'subtotals');
2765 $depth_array =
$object->getPossibleLevels($langs);
2767 } elseif ($action ==
'add_subtotal_line') {
2768 $langs->load(
'subtotals');
2770 $titles =
$object->getPossibleTitles();
2774 if ($action ==
'closeas') {
2776 $formquestion = array();
2778 $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)));
2780 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2782 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2787 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2789 if (!empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2790 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2794 $eligibleForDepositGeneration =
true;
2796 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2797 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2798 '@phan-var-force Facture $invoice';
2801 $eligibleForDepositGeneration =
false;
2807 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2808 foreach (
$object->linkedObjects[
'commande'] as $order) {
2809 $order->fetchObjectLinked();
2811 if (array_key_exists(
'facture', $order->linkedObjects)) {
2812 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2813 '@phan-var-force Facture $invoice';
2816 $eligibleForDepositGeneration =
false;
2825 if ($eligibleForDepositGeneration) {
2826 $formquestion[] = array(
2827 'type' =>
'checkbox',
2828 'tdclass' =>
'showonlyifsigned',
2829 'name' =>
'generate_deposit',
2830 'morecss' =>
'margintoponly marginbottomonly',
2831 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2834 $formquestion[] = array(
2836 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2838 'label' => $langs->trans(
'DateInvoice'),
2844 $formquestion[] = array(
2846 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2847 'name' =>
'date_pointoftax',
2848 'label' => $langs->trans(
'DatePointOfTax'),
2854 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2856 $formquestion[] = array(
2858 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2859 'name' =>
'cond_reglement_id',
2860 'label' => $langs->trans(
'PaymentTerm'),
2861 'value' => $paymentTermsSelect
2864 $formquestion[] = array(
2865 'type' =>
'checkbox',
2866 'tdclass' =>
'showonlyifgeneratedeposit',
2867 'name' =>
'validate_generated_deposit',
2868 'morecss' =>
'margintoponly marginbottomonly',
2869 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2872 $formquestion[] = array(
2873 'type' =>
'onecolumn',
2876 let signedValue = ' . $object::STATUS_SIGNED .
';
2878 $(document).ready(function() {
2879 $("[name=generate_deposit]").change(function () {
2880 let $self = $(this);
2881 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2883 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2892 $("#statut").change(function() {
2893 let $target = $(".showonlyifsigned").parent(".tagtr");
2895 if ($(this).val() == signedValue) {
2901 $("[name=generate_deposit]").trigger("change");
2906 $("#statut").trigger("change");
2916 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2917 $notify =
new Notify($db);
2918 $formquestion = array_merge($formquestion, array(
2919 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid, $object)),
2924 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2926 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2928 } elseif ($action ==
'cancel') {
2930 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2931 } elseif ($action ==
'delete') {
2933 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2934 } elseif ($action ==
'reopen') {
2936 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2937 } elseif ($action ==
'ask_deleteline') {
2939 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2940 } elseif ($action ==
'ask_subtotal_deleteline') {
2942 $langs->load(
"subtotals");
2943 $title =
"DeleteSubtotalLine";
2944 $question =
"ConfirmDeleteSubtotalLine";
2945 if (
GETPOST(
'type') ==
'title') {
2946 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2947 $title =
"DeleteTitleLine";
2948 $question =
"ConfirmDeleteTitleLine";
2950 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2951 } elseif ($action ==
'validate') {
2956 $ref = substr(
$object->ref, 1, 4);
2957 if ($ref ==
'PROV' || $ref ==
'') {
2958 $numref =
$object->getNextNumRef($soc);
2959 if (empty($numref)) {
2964 $numref = (string)
$object->ref;
2967 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2969 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2970 $notify =
new Notify($db);
2972 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid, $object);
2977 foreach (
$object->lines as $line) {
2978 $res = $line->fetch_product();
2980 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2986 if ($nbMandated > 0) {
2988 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2991 $text .=
'<div><span class="clearboth nowraponall warning">' .
img_warning() . $langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate") .
'</span></div>';
2996 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
3001 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
3002 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
3003 if (empty($reshook)) {
3004 $formconfirm .= $hookmanager->resPrint;
3005 } elseif ($reshook > 0) {
3006 $formconfirm = $hookmanager->resPrint;
3015 $linkback =
'<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
3017 $morehtmlref =
'<div class="refidno">';
3019 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client, $object, $usercancreate,
'string',
'', 0, 1);
3020 $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);
3022 $morehtmlref .=
'<br>' . $soc->getNomUrl(1,
'customer');
3024 $morehtmlref .=
' (<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?socid=' . ((int) $soc->id) .
'">' . $langs->trans(
"OtherProposals") .
'</a>)';
3028 $langs->load(
"projects");
3029 $morehtmlref .=
'<br>';
3030 if ($usercancreate) {
3031 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
3032 if ($action !=
'classify') {
3033 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
3035 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->socid, (
string)
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
3037 if (!empty(
$object->fk_project)) {
3039 $proj->fetch(
$object->fk_project);
3040 $morehtmlref .= $proj->getNomUrl(1);
3042 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
3047 $morehtmlref .=
'</div>';
3050 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
3053 $parameters = array();
3055 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters, $object, $action);
3056 if (empty($reshook)) {
3057 print
'<div class="fichecenter">';
3058 print
'<div class="fichehalfleft">';
3059 print
'<div class="underbanner clearboth"></div>';
3061 print
'<table class="border tableforfield centpercent">';
3065 $filterabsolutediscount =
"fk_facture_source IS NULL";
3066 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3068 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3069 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3072 print
'<tr><td class="titlefieldmax45">' . $langs->trans(
'Discounts') .
'</td><td>';
3074 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3075 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3076 $absolute_discount =
price2num($absolute_discount,
'MT');
3077 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3083 $backtopage = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id;
3084 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
3100 print $form->editfieldkey(
"DatePropal",
'date',
'', $object, (
int) $editenable);
3101 print
'</td><td class="valuefield">';
3102 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3103 print
'<form name="editdate" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3104 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3105 print
'<input type="hidden" name="action" value="setdate">';
3106 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3107 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3108 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3122 print
'<table class="nobordernopadding centpercent"><tr><td>';
3123 print $langs->trans(
'DateEndPropal');
3125 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3126 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>';
3128 print
'</tr></table>';
3129 print
'</td><td class="valuefield">';
3130 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3131 print
'<form name="editecheance" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3132 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3133 print
'<input type="hidden" name="action" value="setecheance">';
3134 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3135 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3136 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3139 if (!empty(
$object->fin_validite)) {
3153 print
'<table class="nobordernopadding centpercent"><tr><td>';
3154 print $langs->trans(
'PaymentConditionsShort');
3156 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3157 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>';
3159 print
'</tr></table>';
3160 print
'</td><td class="valuefield">';
3161 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3162 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3164 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3170 print
'<tr class="field_mode_reglement_id">';
3172 print
'<table class="nobordernopadding centpercent"><tr><td>';
3173 print $langs->trans(
'PaymentMode');
3175 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3176 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>';
3178 print
'</tr></table>';
3179 print
'</td><td class="valuefieldcreate">';
3180 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3181 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3183 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'none');
3189 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3190 print
'</td><td class="valuefieldedit">';
3191 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, $usercancreate && $caneditfield,
'datepicker');
3196 print
'<tr class="fielddeliverydelay"><td>';
3197 print
'<table class="nobordernopadding centpercent"><tr><td>';
3199 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod') .
' (' . $langs->trans(
'AfterOrder') .
')');
3201 print $langs->trans(
'AvailabilityPeriod');
3204 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3205 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>';
3207 print
'</tr></table>';
3208 print
'</td><td class="valuefield">';
3209 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3210 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'availability_id', 1);
3212 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'none', 1);
3221 print
'<table class="nobordernopadding centpercent"><tr><td>';
3222 print $langs->trans(
'SendingMethod');
3224 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3225 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>';
3227 print
'</tr></table>';
3228 print
'</td><td class="valuefield">';
3229 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3230 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3232 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'none');
3240 $langs->load(
'stocks');
3241 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
3243 print
'<tr class="field_warehouse_id"><td>';
3244 $editenable = $usercancreate;
3245 print $form->editfieldkey(
"Warehouse",
'warehouse',
'', $object, $editenable);
3246 print
'</td><td class="valuefieldcreate">';
3247 if ($action ==
'editwarehouse') {
3248 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3250 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'none');
3258 print
'<table class="nobordernopadding centpercent"><tr><td>';
3259 print $langs->trans(
'Source');
3261 if ($action !=
'editdemandreason' && $usercancreate) {
3262 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>';
3264 print
'</tr></table>';
3265 print
'</td><td class="valuefield">';
3266 if ($action ==
'editdemandreason' && $usercancreate) {
3267 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3269 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'none');
3274 if ($soc->outstanding_limit) {
3277 print $langs->trans(
'OutstandingBill');
3278 print
'</td><td class="valuefield">';
3279 $arrayoutstandingbills = $soc->getOutstandingBills();
3280 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
3281 print
price($arrayoutstandingbills[
'opened']) .
' / ';
3282 print
price($soc->outstanding_limit, 0, $langs, 1, -1, -1, $conf->currency);
3290 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3291 print $langs->trans(
'BankAccount');
3293 if ($action !=
'editbankaccount' && $usercancreate) {
3294 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>';
3296 print
'</tr></table>';
3297 print
'</td><td class="valuefield">';
3298 if ($action ==
'editbankaccount') {
3299 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3301 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'none');
3308 $tmparray =
$object->getTotalWeightVolume();
3309 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3310 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3312 print
'<tr><td>' . $langs->trans(
"CalculatedWeight") .
'</td>';
3313 print
'<td class="valuefield">';
3318 print
'<tr><td>' . $langs->trans(
"CalculatedVolume") .
'</td>';
3319 print
'<td class="valuefield">';
3328 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3329 print $langs->trans(
'IncotermLabel');
3330 print
'<td><td class="right">';
3331 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3332 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' .
img_edit() .
'</a>';
3336 print
'</td></tr></table>';
3338 print
'<td class="valuefield">';
3339 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3340 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3342 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3350 print
'<table class="nobordernopadding centpercent"><tr><td>';
3351 print $langs->trans(
"Categories");
3352 print
'<td><td class="right">';
3353 if ($usercancreate) {
3354 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=edittags&token='.
newToken().
'">'.
img_edit().
'</a>';
3358 print
'</td></tr></table>';
3361 if ($action ==
'edittags') {
3362 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'">';
3363 print
'<input type="hidden" name="action" value="settags">';
3364 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3365 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
3366 print
'<input type="submit" class="button valignmiddle smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
3369 print $form->showCategories(
$object->id, Categorie::TYPE_PROPOSAL, 1);
3375 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3380 print
'<div class="fichehalfright">';
3381 print
'<div class="underbanner clearboth"></div>';
3383 print
'<table class="border tableforfield centpercent">';
3385 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_currency_amount.tpl.php';
3388 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3389 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3391 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3396 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3397 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3399 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3403 if (
$mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3405 print
'<td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td>';
3406 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3410 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3415 if (
$mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3417 print
'<td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td>';
3418 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3422 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3428 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3429 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3431 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3439 $formmargin->displayMarginInfos($object);
3445 print
'<div class="clearboth"></div><br>';
3448 $blocname =
'contacts';
3449 $title = $langs->trans(
'ContactsAddresses');
3450 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3454 $blocname =
'notes';
3455 $title = $langs->trans(
'Notes');
3456 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3464 $result =
$object->getLinesArray();
3468 global $inputalsopricewithtax;
3469 $inputalsopricewithtax = 1;
3471 print
' <form name="addproduct" id="addproduct" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="POST">
3472 <input type="hidden" name="token" value="' .
newToken() .
'">
3473 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline') .
'">
3474 <input type="hidden" name="mode" value="">
3475 <input type="hidden" name="page_y" value="">
3476 <input type="hidden" name="backtopage" value="' . $backtopage .
'">
3477 <input type="hidden" name="id" value="' .
$object->id .
'">
3482 include DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_ajaxrow.tpl.php';
3484 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3488 print
'<div class="div-table-responsive-no-min">';
3490 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3499 if ($action !=
'editline') {
3500 $parameters = array();
3501 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3505 if (empty($reshook)) {
3509 $parameters = array();
3510 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters, $object, $action);
3529 if ($action !=
'presend') {
3530 $numlines = count(
$object->lines);
3531 print
'<div class="tabsAction">';
3533 $parameters = array();
3534 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3536 if (empty($reshook)) {
3537 if ($action !=
'editline') {
3541 $langs->load(
'subtotals');
3543 $url_button = array();
3545 $url_button[] = array(
3546 'lang' =>
'subtotals',
3548 'perm' => (
bool) $usercancreate,
3549 'label' => $langs->trans(
'AddTitleLine'),
3550 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_title_line&token=' .
newToken()
3553 $url_button[] = array(
3554 'lang' =>
'subtotals',
3556 'perm' => (
bool) $usercancreate,
3557 'label' => $langs->trans(
'AddSubtotalLine'),
3558 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_subtotal_line&token=' .
newToken()
3561 print
dolGetButtonAction(
'', $langs->trans(
'SubTotal'),
'default', $url_button,
'',
true);
3568 if ($usercanvalidate) {
3569 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>';
3571 print
'<a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
'Validate') .
'</a>';
3581 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=modif&token=' .
newToken() .
'">' . $langs->trans(
'Modify') .
'</a>';
3586 if ($usercanreopen) {
3587 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=reopen&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen') .
'"';
3588 print
'>' . $langs->trans(
'ReOpen') .
'</a>';
3590 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ReOpen") .
'</a>';
3595 if (empty($user->socid)) {
3597 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'', $usercansend);
3601 $arrayforbutaction = array();
3604 $arrayforbutaction[] = array(
3607 'perm' => $usercancreateorder,
3608 'label' =>
'AddOrder',
3609 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3619 $arrayforbutaction[] = array(
3622 'perm' => $usercancreatepurchaseorder,
3623 'label' =>
'AddPurchaseOrder',
3624 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3634 $arrayforbutaction[] = array(
3635 'lang' =>
'interventions',
3637 'perm' => $usercancreateintervention,
3638 'label' =>
'AddIntervention',
3639 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3649 $arrayforbutaction[] = array(
3650 'lang' =>
'contracts',
3652 'perm' => $usercancreatecontract,
3653 'label' =>
'AddContract',
3654 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3666 $arrayforbutaction[] = [
3667 'lang' =>
'invoice',
3669 'perm' => $usercancreateinvoice,
3670 'label' =>
'CreateBill',
3671 'url' =>
'/compta/facture/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((int)
$object->id) .
'&socid=' . ((int)
$object->socid),
3678 $actionButtonsParameters = [
3679 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3680 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3683 if ($numlines > 0) {
3684 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3686 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3690 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3691 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3692 if ($usercanclose) {
3693 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=classifybilled&token=' .
newToken() .
'&socid=' .
$object->socid .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3695 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3703 if ($usercanclose) {
3704 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3705 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3707 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'"';
3708 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3714 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token=' .
newToken() .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3715 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3721 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=cancel&token=' .
newToken() .
'">' . $langs->trans(
"CancelPropal") .
'</a>';
3725 if ($usercancreate) {
3726 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>';
3730 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' .
newToken(),
'delete', $usercandelete);
3738 if (
GETPOST(
'modelselected')) {
3739 $action =
'presend';
3742 if ($action !=
'presend') {
3743 print
'<div class="fichecenter"><div class="fichehalfleft">';
3744 print
'<a name="builddoc"></a>';
3750 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3751 $genallowed = $usercanread;
3752 $delallowed = $usercancreate;
3753 $tooltipAfterComboOfModels =
'';
3755 $tooltipAfterComboOfModels = $langs->trans(
"AccordingToYourSetupTheFileWillBeConcatenated",
getDolGlobalString(
'MAIN_INFO_PROPAL_TERMSOFSALE'));
3758 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'0',
'', $soc->default_lang,
'', $object, 0,
'remove_file', $tooltipAfterComboOfModels);
3761 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'propal'), 1);
3762 $linktoelem = $tmparray[
'linktoelem'];
3763 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3764 print $htmltoenteralink;
3766 $compatibleImportElementsList =
false;
3768 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3770 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, $compatibleImportElementsList);
3776 print
'<br><!-- Link to sign -->';
3777 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3778 print showOnlineSignatureUrl(
'proposal',
$object->ref, $object) .
'<br>';
3781 print
'</div><div class="fichehalfright">';
3785 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/comm/propal/messaging.php?id=' .
$object->id);
3786 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT .
'/comm/propal/agenda.php?id=' .
$object->id);
3789 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3791 $somethingshown = $formactions->showactions($object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3793 print
'</div></div>';
3797 $modelmail =
'propal_send';
3798 $defaulttopic =
'SendPropalRef';
3799 $diroutput = $conf->propal->multidir_output[
$object->entity ?? $conf->entity];
3800 $trackid =
'pro' .
$object->id;
3802 include DOL_DOCUMENT_ROOT .
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $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_now($mode='gmt')
Return date for now.
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...
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.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
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'.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
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...
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
getWarningDelay($module, $parmlevel1, $parmlevel2='')
Return a warning delay You can use it like this: if (getWarningDelay('module', 'paramlevel1')) It rep...
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 rate, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
propal_prepare_head($object)
Prepare array with list of tabs.
if(getDolGlobalString( 'TAKEPOS_SHOW_CUSTOMER')) print $langs trans('Date')." left Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date
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.