47require
'../../main.inc.php';
57require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
58require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formother.class.php';
59require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formfile.class.php';
60require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formpropal.class.php';
61require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formmargin.class.php';
62require_once DOL_DOCUMENT_ROOT .
'/comm/propal/class/propal.class.php';
63require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
64require_once DOL_DOCUMENT_ROOT .
'/core/modules/propale/modules_propale.php';
65require_once DOL_DOCUMENT_ROOT .
'/core/lib/propal.lib.php';
66require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
67require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
68require_once DOL_DOCUMENT_ROOT .
'/core/class/doleditor.class.php';
70 require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
71 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
75 require_once DOL_DOCUMENT_ROOT .
'/variants/class/ProductCombination.class.php';
80$langs->loadLangs(array(
'companies',
'propal',
'compta',
'bills',
'orders',
'products',
'sendings',
'other'));
82 $langs->load(
'incoterm');
85 $langs->load(
'margins');
90$array_options = array();
95$action =
GETPOST(
'action',
'aZ09');
96$cancel =
GETPOST(
'cancel',
'alpha');
97$origin =
GETPOST(
'origin',
'alpha');
100$confirm =
GETPOST(
'confirm',
'alpha');
101$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);
182 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
184if (empty($reshook)) {
185 $backurlforlist =
dolBuildUrl(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 =
dolBuildUrl(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');
222 '@phan-var-force Propal $objectutil';
234 $date_delivery_old = $objectutil->delivery_date;
235 if (!empty($date_delivery_old) && !empty($date_delivery)) {
246 $difference = $date_delivery - $old_date_delivery;
247 if ($difference != 0) {
248 $objectutil->delivery_date = $date_delivery;
249 foreach ($objectutil->lines as $line) {
250 if (isset($line->date_start)) {
251 $line->date_start += $difference;
253 if (isset($line->date_end)) {
254 $line->date_end += $difference;
261 $result = $objectutil->createFromClone($user, $socid, (
GETPOSTISSET(
'entity') ?
GETPOSTINT(
'entity') : null), (
GETPOST(
'update_prices') ==
'on'), (
GETPOST(
'update_desc') ==
'on'));
263 $warningMsgLineList = array();
265 foreach ($objectutil->lines as $line) {
266 if (!is_object($line->product)) {
267 $line->fetch_product();
269 if (is_object($line->product) && $line->product->id > 0) {
270 if (empty($line->product->status)) {
271 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
275 if (!empty($warningMsgLineList)) {
276 setEventMessages(
'', $warningMsgLineList,
'warnings');
279 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
'?id=' . $result);
282 if (count($objectutil->errors) > 0) {
283 setEventMessages($objectutil->error, $objectutil->errors,
'errors');
289 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanclose) {
291 $result =
$object->setCancel($user);
296 $langs->load(
"errors");
299 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
302 $result =
$object->delete($user);
304 header(
'Location: ' .
dolBuildUrl(DOL_URL_ROOT .
'/comm/propal/list.php', [
'restore_lastsearch_values' => 1]));
307 $langs->load(
"errors");
310 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
312 $result =
$object->deleteLine($lineid);
317 $langs->load(
"errors");
328 $outputlangs = $langs;
331 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
332 $outputlangs->setDefaultLang($newlang);
334 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
336 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $usercancreate) {
341 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'));
346 $outputlangs = $langs;
352 $newlang =
$object->thirdparty->default_lang;
354 if (!empty($newlang)) {
356 $outputlangs->setDefaultLang($newlang);
357 $outputlangs->load(
'products');
361 $result =
$object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
364 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
371 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
374 $result =
$object->valid($user);
376 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
387 $outputlangs = $langs;
390 $newlang =
GETPOST(
'lang_id',
'aZ09');
393 $newlang =
$object->thirdparty->default_lang;
395 if (!empty($newlang)) {
397 $outputlangs->setDefaultLang($newlang);
401 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
403 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
406 $langs->load(
"errors");
407 if (count(
$object->errors) > 0) {
410 setEventMessages($langs->trans(
$object->error),
null,
'errors');
413 } elseif ($action ==
'setdate' && $usercancreate) {
418 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
422 $result =
$object->set_date($user, $datep);
423 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
424 $datev = $datep + (
$object->duree_validite * 24 * 3600);
425 $result =
$object->set_echeance($user, $datev, 1);
428 dol_print_error($db,
$object->error);
430 $outputlangs = $langs;
433 $newlang =
GETPOST(
'lang_id',
'aZ09');
436 $newlang =
$object->thirdparty->default_lang;
438 if (!empty($newlang)) {
440 $outputlangs->setDefaultLang($newlang);
448 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
451 } elseif ($action ==
'setecheance' && $usercancreate) {
455 $outputlangs = $langs;
458 $newlang =
GETPOST(
'lang_id',
'aZ09');
461 $newlang =
$object->thirdparty->default_lang;
463 if (!empty($newlang)) {
465 $outputlangs->setDefaultLang($newlang);
473 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
478 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
483 } elseif ($action ==
'setref_client' && $usercancreate) {
489 } elseif ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $usercancreate) {
495 } elseif ($action ==
'settags' &&
isModEnabled(
'category') && $usercancreate) {
500 } elseif ($action ==
'add' && $usercancreate) {
510 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
514 if (empty($duration)) {
515 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
521 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
536 $object->delivery_date = $date_delivery;
542 $object->duree_validite = $duration;
552 $object->user_author_id = $user->id;
558 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
560 setEventMessages($langs->trans(
"ErrorFailedToCopyProposal",
GETPOST(
'copie_propal')),
null,
'errors');
568 $object->delivery_date = $date_delivery;
583 $object->user_author_id = $user->id;
587 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
594 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
598 $ret = $extrafields->setOptionalsFromPost(
null, $object);
606 if ($origin && $originid) {
608 $element = $subelement = $origin;
610 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
612 $subelement = $regs[2];
616 if ($element ==
'order') {
617 $element = $subelement =
'commande';
619 if ($element ==
'propal') {
620 $element =
'comm/propal';
621 $subelement =
'propal';
623 if ($element ==
'contract') {
624 $element = $subelement =
'contrat';
626 if ($element ==
'inter') {
627 $element = $subelement =
'fichinter';
629 if ($element ==
'shipping') {
630 $element = $subelement =
'expedition';
634 if (($origin !=
'contrat' || $renewal !=
'true') && !
getDolGlobalInt(
'CONTRACT_NEW_CONTRACT_ON_RENEWAL')) {
636 $object->origin_id = $originid;
642 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
649 $classname = ucfirst($subelement);
650 $srcobject =
new $classname($db);
651 '@phan-var-force Commande|Propal|Contrat|Fichinter|Expedition $srcobject';
654 dol_syslog(
"Try to find source object origin=" .
$object->origin .
" originid=" .
$object->origin_id .
" to add lines");
655 $result = $srcobject->fetch(
$object->origin_id);
658 $lines = $srcobject->lines;
659 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
660 $srcobject->fetch_lines();
661 $lines = $srcobject->lines;
665 $num = count($lines);
666 for ($i = 0; $i < $num; $i++) {
667 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
668 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
671 $product_type = ($lines[$i]->product_type ? (int) $lines[$i]->product_type : 0);
675 if ($lines[$i]->date_debut_prevue) {
678 if ($lines[$i]->date_debut_reel) {
681 if ($lines[$i]->date_start) {
687 if ($lines[$i]->date_fin_prevue) {
688 $date_end = $lines[$i]->date_fin_prevue;
690 if ($lines[$i]->date_fin_reel) {
691 $date_end = $lines[$i]->date_fin_reel;
693 if ($lines[$i]->date_end) {
694 $date_end = $lines[$i]->date_end;
698 if ($origin ==
'contrat' && $renewal ==
'true') {
699 if ($lines[$i]->date_start && $lines[$i]->date_end) {
700 $duration = $lines[$i]->date_end - $lines[$i]->date_start;
707 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
712 if (method_exists($lines[$i],
'fetch_optionals')) {
713 $lines[$i]->fetch_optionals();
714 $array_options = $lines[$i]->array_options;
717 $tva_tx = $lines[$i]->tva_tx;
718 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
719 $tva_tx .=
' (' . $lines[$i]->vat_src_code .
')';
724 $line_price_base_type = $lines[$i]->getPriceBaseType();
725 $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, $line_price_base_type, (
float) $lines[$i]->subprice_ttc, $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);
736 if ($result > 0 && $lines[$i]->product_type == 9) {
737 $fk_parent_line = $result;
742 $parameters = array(
'objFrom' => $srcobject);
743 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
746 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
750 setEventMessages($srcobject->error, $srcobject->errors,
'errors');
764 if (
GETPOST(
'contactid') > 0) {
768 setEventMessages($langs->trans(
"ErrorFailedToAddContact"),
null,
'errors');
773 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
776 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
780 $categories =
GETPOST(
'categories',
'array');
781 if (method_exists($object,
'setCategories')) {
782 $object->setCategories($categories);
791 $outputlangs = $langs;
794 $newlang =
GETPOST(
'lang_id',
'aZ09');
797 $newlang =
$object->thirdparty->default_lang;
799 if (!empty($newlang)) {
801 $outputlangs->setDefaultLang($newlang);
806 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
812 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
825 } elseif ($action ==
'classifybilled' && $usercanclose) {
829 $result =
$object->classifyBilled($user, 0,
'');
840 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
843 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
845 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
846 $locationTarget =
'';
860 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
865 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
868 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
869 && !empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
871 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
874 $forceFields = array();
883 setEventMessage(
'DepositGenerated');
884 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
887 setEventMessages(
"Failed to create down payment - " .
$object->error,
$object->errors,
'errors');
895 $ret = $deposit->fetch($deposit->id);
896 $outputlangs = $langs;
900 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
901 $outputlangs->load(
'products');
904 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
907 setEventMessages($deposit->error, $deposit->errors,
'errors');
911 if ($locationTarget) {
912 header(
'Location: ' . $locationTarget);
924 } elseif ($action ==
'confirm_reopen' && $usercanreopen && !
GETPOST(
'cancel',
'alpha')) {
931 $result =
$object->reopen($user, $newstatus);
948 $fromElement =
GETPOST(
'fromelement');
949 $fromElementid =
GETPOST(
'fromelementid');
950 $importLines =
GETPOST(
'line_checkbox');
952 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && preg_match(
'/^[a-zA-Z]+$/', $fromElement) && !empty($fromElementid)) {
953 if ($fromElement ==
'commande') {
954 dol_include_once(
'/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
955 $lineClassName =
'OrderLine';
956 } elseif ($fromElement ==
'propal') {
957 dol_include_once(
'/comm/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
958 $lineClassName =
'PropaleLigne';
959 } elseif ($fromElement ==
'facture') {
960 dol_include_once(
'/compta/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
961 $lineClassName =
'FactureLigne';
963 $lineClassName =
null;
965 $nextRang = count(
$object->lines) + 1;
968 foreach ($importLines as $lineId) {
969 $lineId = intval($lineId);
970 $originLine =
new $lineClassName($db);
971 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
972 $originLine->fetch_optionals();
973 $desc = $originLine->desc;
974 $pu_ht = $originLine->subprice;
975 $qty = $originLine->qty;
976 $txtva = $originLine->tva_tx;
977 $txlocaltax1 = $originLine->localtax1_tx;
978 $txlocaltax2 = $originLine->localtax2_tx;
979 $fk_product = $originLine->fk_product;
980 $remise_percent = $originLine->remise_percent;
982 $date_end = $originLine->date_end;
983 $fk_code_ventilation = 0;
984 $info_bits = $originLine->info_bits;
985 $fk_remise_except = $originLine->fk_remise_except;
986 $price_base_type =
'HT';
988 $type = $originLine->product_type;
990 $special_code = $originLine->special_code;
991 $origin = $originLine->element;
992 $origin_id = $originLine->id;
994 $fk_fournprice = $originLine->fk_fournprice;
995 $pa_ht = $originLine->pa_ht;
996 $label = $originLine->label;
997 $array_options = $originLine->array_options;
998 $situation_percent = 100;
1000 $fk_unit = $originLine->fk_unit;
1001 $pu_ht_devise = $originLine->multicurrency_subprice;
1003 $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);
1016 setEventMessages($langs->trans(
'ErrorsOnXLines', $error),
null,
'errors');
1019 } elseif ($action ==
'addline' &&
GETPOST(
'updateallvatlinesblock',
'alpha') &&
GETPOST(
'vatforblocklines',
'alpha') !==
'' && $usercancreate) {
1020 $tx_tva =
GETPOST(
'vatforblocklines') ?
GETPOST(
'vatforblocklines') : 0;
1021 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'tva', $tx_tva);
1025 } elseif ($action ==
'addline' &&
GETPOST(
'updatealldiscountlinesblock',
'alpha') &&
GETPOST(
'discountforblocklines',
'alpha') !==
'' && $usercancreate) {
1026 $discount =
GETPOST(
'discountforblocklines') ?
GETPOST(
'discountforblocklines') : 0;
1027 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'discount', $discount);
1033 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1036 $actiontypecode =
'AC_EMAIL';
1037 $triggersendname =
'PROPAL_SENTBYMAIL';
1038 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
1039 $trackid =
'pro' .
$object->id;
1040 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1044 if ($action ==
'modif' && $usercancreate) {
1045 $result =
$object->setDraft($user);
1052 $outputlangs = $langs;
1055 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1056 $outputlangs->setDefaultLang($newlang);
1062 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1064 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
1073 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
1077 foreach (
$object->lines as $key => $line) {
1078 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1081 if ($line->product_type == 1) {
1083 $line_price_base_type = $line->getPriceBaseType();
1084 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1085 $result =
$object->updateline($line->id, $line_pu, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->desc, $line_price_base_type, $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);
1089 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
1091 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
1092 $vat_rate = str_replace(
'*',
'', $vat_rate);
1095 foreach (
$object->lines as $key => $line) {
1096 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1100 $line_price_base_type = $line->getPriceBaseType();
1101 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1102 $result =
$object->updateline($line->id, $line_pu, $line->qty, $line->remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $line->desc, $line_price_base_type, $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);
1105 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
1107 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
1108 $remise_percent = str_replace(
'*',
'', $remise_percent);
1109 foreach (
$object->lines as $key => $line) {
1110 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1113 $tvatx = $line->tva_tx;
1114 if (!empty($line->vat_src_code)) {
1115 $tvatx .=
' (' . $line->vat_src_code .
')';
1118 $line_price_base_type = $line->getPriceBaseType();
1119 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1120 $result =
$object->updateline($line->id, $line_pu, $line->qty, (
float) $remise_percent, $tvatx, $line->localtax1_tx, $line->localtax2_tx, $line->desc, $line_price_base_type, $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);
1123 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'' && $usercancreate) {
1125 $margin_rate = (
GETPOST(
'marginforalllines',
'alpha') ?
GETPOST(
'marginforalllines',
'alpha') : 0);
1126 foreach (
$object->lines as $key => $line) {
1127 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1130 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
1132 $prod->fetch($line->fk_product);
1133 if (
$prod->price_min > $subprice) {
1134 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1135 $price_price_min =
price(
$prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1136 setEventMessages(
$prod->ref .
' - ' .
$prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1139 if ($line->subprice <> 0) {
1140 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1142 $multicurrency_subprice = 0;
1145 $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);
1162 } elseif ($action ==
'confirm_addtextline' && $usercancreate) {
1165 $langs->load(
'subtotals');
1167 $desc =
GETPOST(
'subtotaltextcontent',
'restricthtml');
1170 $result =
$object->addSubtotalLine($langs, $desc, 0, array());
1181 $outputlangs = $langs;
1182 $newlang =
GETPOST(
'lang_id',
'alpha');
1184 $newlang =
$object->thirdparty->default_lang;
1186 if (!empty($newlang)) {
1188 $outputlangs->setDefaultLang($newlang);
1191 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1196 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1198 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
1201 $langs->load(
'subtotals');
1203 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
1204 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
1206 $subtotal_options = array();
1208 foreach (Propal::$TITLE_OPTIONS as $option) {
1209 $value =
GETPOST($option,
'alphanohtml');
1211 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1216 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1227 $outputlangs = $langs;
1228 $newlang =
GETPOST(
'lang_id',
'alpha');
1230 $newlang =
$object->thirdparty->default_lang;
1232 if (!empty($newlang)) {
1234 $outputlangs->setDefaultLang($newlang);
1237 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1242 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1244 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
1247 $langs->load(
'subtotals');
1249 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
1250 foreach (
$object->lines as $line) {
1251 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
1252 $desc = $line->desc;
1253 $depth = -$line->qty;
1257 $subtotal_options = array();
1259 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1260 $value =
GETPOST($option,
'alphanohtml');
1262 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1267 if (isset($desc) && isset($depth)) {
1268 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1271 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
1280 $outputlangs = $langs;
1281 $newlang =
GETPOST(
'lang_id',
'alpha');
1283 $newlang =
$object->thirdparty->default_lang;
1285 if (!empty($newlang)) {
1287 $outputlangs->setDefaultLang($newlang);
1290 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1295 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1297 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && !
GETPOST(
'markforalllines',
'alpha') && $usercancreate) {
1304 $price_ht_devise =
'';
1306 $price_ttc_devise =
'';
1310 if (
GETPOST(
'price_ht') !==
'') {
1313 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1316 if (
GETPOST(
'price_ttc') !==
'') {
1319 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1320 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1323 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1324 if ($prod_entry_mode ==
'free') {
1330 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1335 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1339 if (empty($remise_percent)) {
1340 $remise_percent = 0;
1344 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1345 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1347 if (is_array($extralabelsline)) {
1349 foreach ($extralabelsline as $key => $value) {
1350 unset($_POST[
"options_" . $key]);
1354 $price_to_test_sign = ($price_ht ? $price_ht : $price_ttc);
1356 if ((empty($idprod) || $idprod < 0) && ($price_to_test_sign < 0) && ($qty < 0)) {
1357 $langs->load(
"errors");
1358 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1361 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1362 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1366 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1367 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1371 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1374 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1375 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1379 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1380 if ($combinations =
GETPOST(
'combinations',
'array:alphanohtml')) {
1384 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1385 $idprod = $res->fk_product_child;
1387 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1393 if (!$error && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1401 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1410 if (!empty($idprod) && $idprod > 0) {
1412 $prod->fetch($idprod);
1424 $pu_ht =
$prod->price;
1425 $pu_ttc =
$prod->price_ttc;
1426 $price_min =
$prod->price_min;
1427 $price_min_ttc =
$prod->price_min_ttc;
1428 $price_base_type =
$prod->price_base_type;
1432 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1434 $filter = array(
't.fk_product' => (
string)
$prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1437 $pricebycustomerexist =
false;
1438 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1441 if (count($prodcustprice->lines) > 0) {
1442 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1443 foreach ($prodcustprice->lines as $k => $custprice_line) {
1444 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1445 $pricebycustomerexist =
true;
1446 $pu_ht =
price($custprice_line->price);
1447 $pu_ttc =
price($custprice_line->price_ttc);
1448 $price_min =
price($custprice_line->price_min);
1449 $price_min_ttc =
price($custprice_line->price_min_ttc);
1450 $price_base_type = $custprice_line->price_base_type;
1464 setEventMessages($prodcustprice->error, $prodcustprice->errors,
'errors');
1467 if (!$pricebycustomerexist && !empty(
$object->thirdparty->price_level)) {
1468 $pu_ht =
$prod->multiprices[
$object->thirdparty->price_level];
1469 $pu_ttc =
$prod->multiprices_ttc[
$object->thirdparty->price_level];
1470 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
1471 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1472 $price_base_type =
$prod->multiprices_base_type[
$object->thirdparty->price_level];
1474 if (isset(
$prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1475 $tva_tx =
$prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1477 if (isset(
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1478 $tva_npr =
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1483 $pu_ht =
$prod->multiprices[
$object->thirdparty->price_level];
1484 $pu_ttc =
$prod->multiprices_ttc[
$object->thirdparty->price_level];
1485 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
1486 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1487 $price_base_type =
$prod->multiprices_base_type[
$object->thirdparty->price_level];
1489 if (isset(
$prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1490 $tva_tx =
$prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1492 if (isset(
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1493 $tva_npr =
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1498 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1502 $filter = array(
't.fk_product' => (
string)
$prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1504 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1507 if (count($prodcustprice->lines) > 0) {
1508 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1509 foreach ($prodcustprice->lines as $k => $custprice_line) {
1510 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1511 $pu_ht =
price($custprice_line->price);
1512 $pu_ttc =
price($custprice_line->price_ttc);
1513 $price_min =
price($custprice_line->price_min);
1514 $price_min_ttc =
price($custprice_line->price_min_ttc);
1515 $price_base_type = $custprice_line->price_base_type;
1529 setEventMessages($prodcustprice->error, $prodcustprice->errors,
'errors');
1533 if (
$prod->prices_by_qty[0]) {
1538 foreach (
$prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1539 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1543 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1544 $pu_ht = $priceforthequantityarray[
'unitprice'];
1546 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1554 if (
$prod->prices_by_qty[
$object->thirdparty->price_level]) {
1559 foreach (
$prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1560 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1564 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1565 $pu_ht = $priceforthequantityarray[
'unitprice'];
1567 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1575 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1576 $tmpprodvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string)
$prod->tva_tx));
1581 if (!empty($price_ht) || (string) $price_ht ===
'0') {
1582 $pu_ht = (float)
price2num($price_ht,
'MU');
1583 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1584 $price_base_type =
'HT';
1585 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1586 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1587 $pu_ttc_devise = (float)
price2num((
float) $pu_ht_devise * (1 + ((float) $tmpvat / 100)),
'MU');
1590 $price_base_type =
'HT';
1591 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1592 $pu_ttc = (float)
price2num($price_ttc,
'MU');
1593 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1594 $price_base_type =
'TTC';
1595 } elseif (!empty($price_ttc_devise) || (
string) $price_ttc_devise ===
'0') {
1596 $pu_ttc_devise = (float)
price2num($price_ttc_devise,
'MU');
1597 $pu_ht_devise = (float)
price2num((
float) $pu_ttc_devise / (1 + ((float) $tmpvat / 100)),
'MU');
1600 $price_base_type =
'TTC';
1601 } elseif ($tmpvat != $tmpprodvat) {
1603 if ($price_base_type !=
'HT') {
1604 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1606 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1614 $outputlangs = $langs;
1616 if (
GETPOST(
'lang_id',
'aZ09')) {
1617 $newlang =
GETPOST(
'lang_id',
'aZ09');
1619 if (empty($newlang)) {
1620 $newlang =
$object->thirdparty->default_lang;
1622 if (!empty($newlang)) {
1624 $outputlangs->setDefaultLang($newlang);
1627 $desc = (!empty(
$prod->multilangs[$outputlangs->defaultlang][
"description"])) ?
$prod->multilangs[$outputlangs->defaultlang][
"description"] :
$prod->
description;
1629 $desc =
$prod->description;
1645 $outputlangs = $langs;
1647 if (
GETPOST(
'lang_id',
'alpha')) {
1648 $newlang =
GETPOST(
'lang_id',
'alpha');
1650 if (empty($newlang)) {
1651 $newlang =
$object->thirdparty->default_lang;
1653 if (!empty($newlang)) {
1655 $outputlangs->setDefaultLang($newlang);
1656 $outputlangs->load(
'products');
1658 if (!empty(
$prod->customcode)) {
1659 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode") .
': ' .
$prod->customcode;
1661 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1664 if (!empty(
$prod->country_code)) {
1665 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry(
$prod->country_code,
'', $db, $outputlangs, 0);
1668 if (!empty(
$prod->customcode)) {
1669 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode") .
': ' .
$prod->customcode;
1671 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1674 if (!empty(
$prod->country_code)) {
1675 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry(
$prod->country_code,
'', $db, $langs, 0);
1682 $type =
$prod->type;
1683 $fk_unit =
$prod->fk_unit;
1687 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1688 $tva_tx = str_replace(
'*',
'', $tva_tx);
1689 if (empty($tva_tx)) {
1692 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1695 $fk_unit =
GETPOST(
'units',
'alpha');
1696 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1697 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1699 if ($pu_ttc && !$pu_ht) {
1700 $price_base_type =
'TTC';
1714 $fournprice = (int) (
GETPOST(
'fournprice' . $predef) ?
GETPOST(
'fournprice' . $predef) :
'');
1715 $buyingprice =
price2num((
GETPOST(
'buying_price' . $predef) !=
'' ?
GETPOST(
'buying_price' . $predef) :
''),
'', 2);
1721 $pu_equivalent = $pu_ht;
1722 $pu_equivalent_ttc = $pu_ttc;
1723 $currency_tx =
$object->multicurrency_tx;
1727 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1728 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1730 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1731 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1751 if ($usermustrespectpricemin) {
1752 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1753 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1754 setEventMessages($mesg,
null,
'errors');
1756 } 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') {
1757 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1758 setEventMessages($mesg,
null,
'errors');
1765 $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);
1777 $outputlangs = $langs;
1778 $newlang =
GETPOST(
'lang_id',
'alpha');
1780 $newlang =
$object->thirdparty->default_lang;
1782 if (!empty($newlang)) {
1784 $outputlangs->setDefaultLang($newlang);
1786 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1789 unset($_POST[
'prod_entry_mode']);
1791 unset($_POST[
'qty']);
1792 unset($_POST[
'type']);
1793 unset($_POST[
'remise_percent']);
1794 unset($_POST[
'price_ht']);
1795 unset($_POST[
'multicurrency_price_ht']);
1796 unset($_POST[
'price_ttc']);
1797 unset($_POST[
'tva_tx']);
1798 unset($_POST[
'product_ref']);
1799 unset($_POST[
'product_label']);
1800 unset($_POST[
'product_desc']);
1801 unset($_POST[
'fournprice']);
1802 unset($_POST[
'buying_price']);
1803 unset($_POST[
'np_marginRate']);
1804 unset($_POST[
'np_markRate']);
1805 unset($_POST[
'dp_desc']);
1806 unset($_POST[
'idprod']);
1807 unset($_POST[
'units']);
1809 unset($_POST[
'date_starthour']);
1810 unset($_POST[
'date_startmin']);
1811 unset($_POST[
'date_startsec']);
1812 unset($_POST[
'date_startday']);
1813 unset($_POST[
'date_startmonth']);
1814 unset($_POST[
'date_startyear']);
1815 unset($_POST[
'date_endhour']);
1816 unset($_POST[
'date_endmin']);
1817 unset($_POST[
'date_endsec']);
1818 unset($_POST[
'date_endday']);
1819 unset($_POST[
'date_endmonth']);
1820 unset($_POST[
'date_endyear']);
1822 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
1831 } elseif ($action ==
'addline' && $usercancreate && (
1832 (
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'') ||
1833 (
GETPOST(
'submitforallmark',
'alpha') &&
GETPOST(
'markforalllines',
'alpha') !==
'')
1837 $margin_rate =
GETPOSTISSET(
'marginforalllines') ?
GETPOST(
'marginforalllines',
'int') :
'';
1839 foreach (
$object->lines as &$line) {
1840 if ($line->subprice > 0) {
1841 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1844 $subprice_multicurrency = $line->subprice;
1845 if (is_numeric($margin_rate) && $margin_rate > 0) {
1846 $line->subprice = (float)
price2num((
float) $line->pa_ht * (1 + (float) $margin_rate / 100),
'MU');
1847 } elseif (is_numeric($mark_rate) && $mark_rate > 0) {
1848 $line->subprice = (float) ($line->pa_ht / (1 - ((
float) $mark_rate / 100)));
1850 $line->subprice = (float) $line->pa_ht;
1853 if ($line->fk_product > 0) {
1855 $res =
$prod->fetch($line->fk_product);
1857 if (
$prod->price_min > $line->subprice) {
1858 $price_subprice =
price($line->subprice, 0, $outlangs, 1, -1, -1,
'auto');
1859 $price_price_min =
price(
$prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1860 setEventMessages(
$prod->ref .
' - ' .
$prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1862 setEventMessages(
$prod->error,
$prod->errors,
'errors');
1865 setEventMessages(
$prod->error,
$prod->errors,
'errors');
1870 $multicurrency_subprice = (float) $line->subprice * $line->multicurrency_subprice / $subprice_multicurrency;
1872 $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);
1875 if (is_numeric($margin_rate) && empty($mark_rate)) {
1876 $line->marge_tx = $margin_rate;
1877 } elseif (is_numeric($mark_rate) && empty($margin_rate)) {
1878 $line->marque_tx = $mark_rate;
1880 $line->total_ht = $line->qty * (float) $line->subprice;
1881 $line->total_tva = $line->tva_tx * $line->qty * (float) $line->subprice;
1882 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $line->subprice;
1884 $line->multicurrency_total_ht = $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1885 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1886 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1888 $line->multicurrency_subprice = $multicurrency_subprice;
1894 } elseif ($action ==
'updatetitleline' &&
GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1897 $langs->load(
'subtotals');
1899 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1902 $subtotal_options = array();
1904 foreach (Propal::$TITLE_OPTIONS as $option) {
1905 $value =
GETPOST($option,
'alphanohtml');
1907 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1912 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1923 $outputlangs = $langs;
1924 $newlang =
GETPOST(
'lang_id',
'alpha');
1926 $newlang =
$object->thirdparty->default_lang;
1928 if (!empty($newlang)) {
1930 $outputlangs->setDefaultLang($newlang);
1933 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1938 } elseif ($action ==
'updatetextline' &&
GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1941 $langs->load(
'subtotals');
1943 $desc =
GETPOST(
'line_desc',
'restricthtml');
1946 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, 0, array());
1957 $outputlangs = $langs;
1958 $newlang =
GETPOST(
'lang_id',
'alpha');
1960 $newlang =
$object->thirdparty->default_lang;
1962 if (!empty($newlang)) {
1964 $outputlangs->setDefaultLang($newlang);
1967 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1972 } elseif ($action ==
'updatesubtotalline' &&
GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1975 $langs->load(
'subtotals');
1977 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1980 $subtotal_options = array();
1982 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1983 $value =
GETPOST($option,
'alphanohtml');
1985 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1990 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1998 $outputlangs = $langs;
1999 $newlang =
GETPOST(
'lang_id',
'alpha');
2001 $newlang =
$object->thirdparty->default_lang;
2003 if (!empty($newlang)) {
2005 $outputlangs->setDefaultLang($newlang);
2008 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2013 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
2021 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
2026 $vat_rate = (
GETPOST(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : 0);
2027 $vat_rate = str_replace(
'*',
'', $vat_rate);
2034 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
2044 if (empty($remise_percent)) {
2045 $remise_percent = 0;
2049 $pu_equivalent = $pu_ht;
2050 $pu_equivalent_ttc = $pu_ttc;
2052 $currency_tx =
$object->multicurrency_tx;
2056 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
2057 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
2059 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
2060 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
2075 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
2076 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
2078 if (is_array($extralabelsline)) {
2080 foreach ($extralabelsline as $key => $value) {
2081 unset($_POST[
"options_" . $key]);
2095 $price_base_type =
'HT';
2096 if (empty($pu_ht) && !empty($pu_ttc)) {
2098 $price_base_type =
'TTC';
2099 } elseif (!empty($pu_ht) && !empty($pu_ttc)) {
2100 foreach (
$object->lines as $line_obj) {
2102 if ($line_obj->wasEnteredIncludingTax()) {
2104 $price_base_type =
'TTC';
2113 if (!empty($productid)) {
2115 $res = $product->fetch($productid);
2117 $type = $product->type;
2121 $price_min = $product->price_min;
2123 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
2125 $price_min_ttc = $product->price_min_ttc;
2127 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
2134 if ($usermustrespectpricemin) {
2135 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
2136 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
2137 setEventMessages($mesg,
null,
'errors');
2139 $action =
'editline';
2140 } 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') {
2141 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
2142 setEventMessages($mesg,
null,
'errors');
2144 $action =
'editline';
2149 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2153 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
2161 if (!$user->hasRight(
'margins',
'creer')) {
2162 foreach (
$object->lines as &$line) {
2164 $fournprice = $line->fk_fournprice;
2165 $buyingprice = (string) $line->pa_ht;
2173 $result =
$object->updateline(
GETPOSTINT(
'lineid'), (
float) $pu, (
float) $qty, (
float) $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);
2180 $outputlangs = $langs;
2183 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
2184 $outputlangs->setDefaultLang($newlang);
2190 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2193 unset($_POST[
'qty']);
2194 unset($_POST[
'type']);
2195 unset($_POST[
'productid']);
2196 unset($_POST[
'remise_percent']);
2197 unset($_POST[
'price_ht']);
2198 unset($_POST[
'multicurrency_price_ht']);
2199 unset($_POST[
'price_ttc']);
2200 unset($_POST[
'tva_tx']);
2201 unset($_POST[
'product_ref']);
2202 unset($_POST[
'product_label']);
2203 unset($_POST[
'product_desc']);
2204 unset($_POST[
'fournprice']);
2205 unset($_POST[
'buying_price']);
2207 unset($_POST[
'date_starthour']);
2208 unset($_POST[
'date_startmin']);
2209 unset($_POST[
'date_startsec']);
2210 unset($_POST[
'date_startday']);
2211 unset($_POST[
'date_startmonth']);
2212 unset($_POST[
'date_startyear']);
2213 unset($_POST[
'date_endhour']);
2214 unset($_POST[
'date_endmin']);
2215 unset($_POST[
'date_endsec']);
2216 unset($_POST[
'date_endday']);
2217 unset($_POST[
'date_endmonth']);
2218 unset($_POST[
'date_endyear']);
2225 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
2226 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
2228 } elseif ($action ==
'classin' && $usercancreate) {
2231 } elseif ($action ==
'setavailability' && $usercancreate) {
2234 } elseif ($action ==
'setdemandreason' && $usercancreate) {
2237 } elseif ($action ==
'setconditions' && $usercancreate) {
2240 } elseif ($action ==
'setmode' && $usercancreate) {
2243 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
2245 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
2246 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
2249 } elseif ($action ==
'setbankaccount' && $usercancreate) {
2252 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
2255 } elseif ($action ==
'setwarehouse' && $usercancreate) {
2258 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
2261 $attribute_name =
GETPOST(
'attribute',
'aZ09');
2264 $result = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
2270 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
2277 $action =
'edit_extras';
2282 if ($action ==
'addcontact' && $usercancreate) {
2287 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2291 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2294 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2295 $langs->load(
"errors");
2296 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
2301 } elseif ($action ==
'swapstatut' && $usercancreate) {
2303 if (
$object->fetch($id) > 0) {
2306 dol_print_error($db);
2308 } elseif ($action ==
'deletecontact' && $usercancreate) {
2311 $result =
$object->delete_contact($lineid);
2314 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2317 dol_print_error($db);
2324 $permissiontoadd = $usercancreate;
2325 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
2333$form =
new Form($db);
2342$title =
$object->ref .
" - " . $langs->trans(
'Card');
2343if ($action ==
'create') {
2344 $title = $langs->trans(
"NewPropal");
2346$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
2353if ($action ==
'create') {
2360 $res = $soc->fetch($socid);
2363 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2364 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2365 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2371 if (!empty($origin) && !empty($originid)) {
2373 $element = $subelement = $origin;
2375 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2376 $element = $regs[1];
2377 $subelement = $regs[2];
2380 if ($element ==
'project') {
2381 $projectid = $originid;
2385 $project->fetch($projectid);
2386 if ($project->socid > 0) {
2388 $soc->fetch($project->socid);
2392 if ($element ==
'order' || $element ==
'commande') {
2393 $element = $subelement =
'commande';
2395 if ($element ==
'propal') {
2396 $element =
'comm/propal';
2397 $subelement =
'propal';
2399 if ($element ==
'contract') {
2400 $element = $subelement =
'contrat';
2402 if ($element ==
'shipping') {
2403 $element = $subelement =
'expedition';
2408 $classname = ucfirst($subelement);
2409 $objectsrc =
new $classname($db);
2410 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
2412 $objectsrc->fetch($originid);
2413 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2414 $objectsrc->fetch_lines();
2416 $objectsrc->fetch_thirdparty();
2418 $projectid = (int) $objectsrc->fk_project;
2419 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
2421 $soc = $objectsrc->thirdparty;
2423 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2424 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2425 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : -1));
2428 $objectsrc->fetch_optionals();
2429 $object->array_options = $objectsrc->array_options;
2432 if (!empty($objectsrc->multicurrency_code)) {
2433 $currency_code = $objectsrc->multicurrency_code;
2435 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2436 $currency_tx = $objectsrc->multicurrency_tx;
2444 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
2445 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
2446 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
2447 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
2448 $shipping_method_id = $soc->shipping_method_id;
2449 $warehouse_id = !empty($soc->fk_warehouse) ? $soc->fk_warehouse : $warehouse_id;
2450 $remise_percent = $soc->remise_percent;
2452 if (
isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
2453 $currency_code = $soc->multicurrency_code;
2458 if (!
GETPOST(
'changecompany')) {
2460 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2466 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2472 $shipping_method_id =
GETPOSTINT(
'shipping_method_id');
2476 if ($soc->fk_warehouse > 0) {
2477 $warehouse_id = $soc->fk_warehouse;
2484 $warehouse_id = $user->fk_warehouse;
2488 print
'<form name="addprop" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
2489 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2490 print
'<input type="hidden" name="action" value="add">';
2491 print
'<input type="hidden" name="changecompany" value="0">';
2492 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
2493 if ($origin !=
'project' && $originid) {
2494 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
2495 print
'<input type="hidden" name="originid" value="' . $originid .
'">';
2496 if ($origin ==
'contrat' && !empty($renewal)) {
2497 print
'<input type="hidden" name="renewal" value="' . $renewal .
'">';
2499 } elseif ($origin ==
'project' && !empty($projectid)) {
2500 print
'<input type="hidden" name="projectid" value="' . $projectid .
'">';
2506 $parameters = array();
2508 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters, $object, $action);
2509 if (empty($reshook)) {
2510 print
'<table class="border centpercent">';
2516 print
'<tr class="field_socid">';
2518 print
'<td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Customer') .
'</td>';
2519 $shipping_method_id = 0;
2522 print
'<td class="valuefieldcreate">';
2523 print $soc->getNomUrl(1,
'customer');
2524 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
2526 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2527 $shipping_method_id = $soc->shipping_method_id;
2530 print
'<td class="valuefieldcreate">';
2531 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2532 print img_picto(
'',
'company',
'class="pictofixedwidth"');
2533 print $form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2537 $(document).ready(function() {
2538 $("#socid").change(function() {
2539 console.log("We have changed the company - Reload page");
2540 var socid = $(this).val();
2542 $("input[name=action]").val("create");
2543 $("input[name=changecompany]").val("1");
2544 $("form[name=addprop]").submit();
2549 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>';
2552 print
'</tr>' .
"\n";
2556 print
'<tr class="field_ref_client"><td class="titlefieldcreate">';
2557 print $form->textwithpicto($langs->trans(
'RefCustomer'), $langs->trans(
'RefOfOnCustomerSide', $langs->transnoentitiesnoconv(
"Proposal")));
2558 print
'</td><td class="valuefieldcreate">';
2559 print
'<input type="text" name="ref_client" value="' . (!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')) .
'"></td>';
2565 print
'<tr class="field_contactid"><td class="titlefieldcreate">' . $langs->trans(
"DefaultContact") .
'</td><td class="valuefieldcreate">';
2566 print img_picto(
'',
'contact',
'class="pictofixedwidth"');
2568 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2572 print
'<tr class="field_discount_info"><td class="titlefieldcreate">' . $langs->trans(
'Discounts') .
'</td><td class="valuefieldcreate">';
2574 $absolute_discount = $soc->getAvailableDiscounts();
2578 $backtopage = $_SERVER[
"PHP_SELF"] .
'?socid=' . $thirdparty->id .
'&action=' . $action .
'&origin=' . urlencode((
string) (
GETPOST(
'origin'))) .
'&originid=' . urlencode((
string) (
GETPOSTINT(
'originid')));
2579 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
2585 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Date') .
'</td><td class="valuefieldcreate">';
2586 print img_picto(
'',
'action',
'class="pictofixedwidth"');
2587 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2591 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>';
2594 print
'<tr class="field_cond_reglement_id"><td class="nowrap">' . $langs->trans(
'PaymentConditionsShort') .
'</td><td>';
2595 print img_picto(
'',
'payment',
'class="pictofixedwidth"');
2597 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2601 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">' . $langs->trans(
'PaymentMode') .
'</td><td class="valuefieldcreate">';
2602 print img_picto(
'',
'bank',
'class="pictofixedwidth"');
2603 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2608 print
'<tr class="field_fk_account"><td class="titlefieldcreate">' . $langs->trans(
'BankAccount') .
'</td><td class="valuefieldcreate">';
2609 print img_picto(
'',
'bank_account',
'class="pictofixedwidth"') . $form->select_comptes((
int) $fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2614 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">' . $langs->trans(
'Source') .
'</td><td class="valuefieldcreate">';
2615 print img_picto(
'',
'question',
'class="pictofixedwidth"');
2616 $form->selectInputReason((
GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2621 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2622 $shipping_method_id = $soc->shipping_method_id;
2624 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">' . $langs->trans(
'SendingMethod') .
'</td><td class="valuefieldcreate">';
2625 print img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2626 $form->selectShippingMethod((
string) $shipping_method_id,
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2630 $formproduct =
null;
2633 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
2635 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">' . $langs->trans(
'Warehouse') .
'</td><td class="valuefieldcreate">';
2636 print img_picto(
'',
'stock',
'class="pictofixedwidth"') . $formproduct->selectWarehouses((
int) $warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2641 print
'<tr class="field_availability_id"><td class="titlefieldcreate">' . $langs->trans(
'AvailabilityPeriod');
2643 print
' (' . $langs->trans(
'AfterOrder') .
')';
2645 print
'</td><td class="valuefieldcreate">';
2646 print img_picto(
'',
'clock',
'class="pictofixedwidth"');
2647 print $form->selectAvailabilityDelay((
GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx', 1);
2651 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">' . $langs->trans(
"DeliveryDate") .
'</td>';
2652 print
'<td class="valuefieldcreate">';
2653 print img_picto(
'',
'action',
'class="pictofixedwidth"');
2656 $syear =
date(
"Y", $tmpdte);
2657 $smonth =
date(
"m", $tmpdte);
2658 $sday =
date(
"d", $tmpdte);
2659 print $form->selectDate($syear .
"-" . $smonth .
"-" . $sday,
'date_livraison', 0, 0, 0,
"addprop");
2661 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2662 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2667 if (
isModEnabled(
'project') && is_object($formproject)) {
2668 $langs->load(
"projects");
2669 print
'<tr class="field_projectid">';
2670 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2671 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');
2672 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>';
2679 print
'<tr class="field_incoterm_id">';
2680 print
'<td class="titlefieldcreate"><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1) .
'</label></td>';
2681 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2682 print img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2683 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2688 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td colspan="3">';
2689 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
2693 include_once DOL_DOCUMENT_ROOT .
'/core/modules/propale/modules_propale.php';
2695 if (is_array($list) && count($list) > 0) {
2696 print
'<tr class="field_model">';
2697 print
'<td class="titlefieldcreate">' . $langs->trans(
"DefaultModel") .
'</td>';
2698 print
'<td class="valuefieldcreate">';
2699 print img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2701 print $form->selectarray(
'model', $list, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2707 print
'<tr class="field_currency">';
2708 print
'<td class="titlefieldcreate">' . $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0) .
'</td>';
2709 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2710 print img_picto(
'',
'currency',
'class="pictofixedwidth"') . $form->selectMultiCurrency(((
GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2715 print
'<tr class="field_note_public">';
2716 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePublic') .
'</td>';
2717 print
'<td class="valuefieldcreate">';
2718 $note_public =
GETPOST(
'note_public',
'restricthtml');
2719 if (!
GETPOSTISSET(
'note_public') && empty($note_public) && !empty($objectsrc)) {
2720 $note_public = $objectsrc->note_public;
2722 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2723 print $doleditor->Create(1);
2726 if (empty($user->socid)) {
2727 print
'<tr class="field_note_private">';
2728 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePrivate') .
'</td>';
2729 print
'<td class="valuefieldcreate">';
2730 $note_private =
GETPOST(
'note_private',
'restricthtml');
2731 if (!
GETPOSTISSET(
'note_private') && empty($note_private) && !empty($objectsrc)) {
2732 $note_private = $objectsrc->note_private;
2734 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2735 print $doleditor->Create(1);
2741 if (
getDolGlobalInt(
'THIRDPARTY_PROPAGATE_EXTRAFIELDS_TO_PROPAL') && $socid > 0) {
2742 $thirdpartytopropagateextrafieldsfrom = $soc;
2744 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_add.tpl.php';
2747 if (!empty($origin) && !empty($originid) && is_object($objectsrc) && !empty($classname)) {
2749 if ($origin ==
'contrat') {
2751 $objectsrc->update_price(1,
'auto', 1);
2754 print
"\n<!-- " . $classname .
" info -->";
2756 print
'<input type="hidden" name="amount" value="' . $objectsrc->total_ht .
'">' .
"\n";
2757 print
'<input type="hidden" name="total" value="' . $objectsrc->total_ttc .
'">' .
"\n";
2758 print
'<input type="hidden" name="tva" value="' . $objectsrc->total_tva .
'">' .
"\n";
2759 print
'<input type="hidden" name="origin" value="' . $objectsrc->element .
'">';
2760 print
'<input type="hidden" name="originid" value="' . $objectsrc->id .
'">';
2762 $newclassname = $classname;
2763 if ($newclassname ==
'Propal') {
2764 $newclassname =
'CommercialProposal';
2765 } elseif ($newclassname ==
'Commande') {
2766 $newclassname =
'Order';
2767 } elseif ($newclassname ==
'Expedition') {
2768 $newclassname =
'Sending';
2769 } elseif ($newclassname ==
'Fichinter') {
2770 $newclassname =
'Intervention';
2773 print
'<tr><td>' . $langs->trans($newclassname) .
'</td><td>' . $objectsrc->getNomUrl(1) .
'</td></tr>';
2774 print
'<tr><td>' . $langs->trans(
'AmountHT') .
'</td><td>' .
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td></tr>';
2775 print
'<tr><td>' . $langs->trans(
'AmountVAT') .
'</td><td>' .
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2776 if (
$mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2777 print
'<tr><td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2780 if (
$mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2781 print
'<tr><td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2783 print
'<tr><td>' . $langs->trans(
'AmountTTC') .
'</td><td>' .
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2786 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
'</td></tr>';
2787 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
"</td></tr>";
2788 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
"</td></tr>";
2800 print
'<input type="hidden" name="createmode" value="empty">';
2804 print
'<br><table>';
2808 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2809 print
'<td>' . $langs->trans(
"CopyPropalFrom") .
' </td>';
2811 $liste_propal = array();
2812 $liste_propal[0] =
'';
2814 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2815 $sql .=
" FROM " . MAIN_DB_PREFIX .
"propal p";
2816 $sql .=
", " . MAIN_DB_PREFIX .
"societe s";
2817 $sql .=
" WHERE s.rowid = p.fk_soc";
2818 $sql .=
" AND p.entity IN (" .
getEntity(
'propal') .
")";
2819 $sql .=
" AND p.fk_statut <> 0";
2820 $sql .=
" ORDER BY Id";
2822 $resql = $db->query($sql);
2824 $num = $db->num_rows($resql);
2827 $row = $db->fetch_row($resql);
2828 $propalRefAndSocName = $row[1] .
" - " . $row[2];
2829 $liste_propal[$row[0]] = $propalRefAndSocName;
2832 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2834 dol_print_error($db);
2838 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2839 print
'<td valign="top" colspan="2">' . $langs->trans(
"CreateEmptyPropal") .
'</td></tr>';
2846 $langs->load(
"bills");
2848 print $form->buttonsSaveCancel(
"CreateDraft");
2854 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2857 $title = $langs->trans(
'ProductsAndServices');
2860 print
'<div class="div-table-responsive-no-min">';
2861 print
'<table class="noborder centpercent">';
2863 $objectsrc->printOriginLinesList();
2880 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
$object->picto, 0,
'',
'', 0,
'', 1);
2885 if ($action ==
'clone') {
2887 $filter =
'(s.client:IN:1,2,3)';
2888 $formquestion = array(
2891 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2892 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2893 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2896 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2899 $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);
2903 if ($action ==
'add_title_line') {
2904 $langs->load(
'subtotals');
2906 $depth_array =
$object->getPossibleLevels($langs);
2908 } elseif ($action ==
'add_subtotal_line') {
2909 $langs->load(
'subtotals');
2911 $titles =
$object->getPossibleTitles();
2913 } elseif ($action ==
'add_text_line') {
2914 $langs->load(
'subtotals');
2919 if ($action ==
'closeas') {
2921 $formquestion = array();
2923 $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)));
2925 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2927 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2932 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2934 if (!empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2935 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2939 $eligibleForDepositGeneration =
true;
2941 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2942 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2943 '@phan-var-force Facture $invoice';
2946 $eligibleForDepositGeneration =
false;
2952 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2953 foreach (
$object->linkedObjects[
'commande'] as $order) {
2954 $order->fetchObjectLinked();
2956 if (array_key_exists(
'facture', $order->linkedObjects)) {
2957 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2958 '@phan-var-force Facture $invoice';
2961 $eligibleForDepositGeneration =
false;
2970 if ($eligibleForDepositGeneration) {
2971 $formquestion[] = array(
2972 'type' =>
'checkbox',
2973 'tdclass' =>
'showonlyifsigned',
2974 'name' =>
'generate_deposit',
2975 'morecss' =>
'margintoponly marginbottomonly',
2976 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2979 $formquestion[] = array(
2981 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2983 'label' => $langs->trans(
'DateInvoice'),
2989 $formquestion[] = array(
2991 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2992 'name' =>
'date_pointoftax',
2993 'label' => $langs->trans(
'DatePointOfTax'),
2999 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
3001 $formquestion[] = array(
3003 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
3004 'name' =>
'cond_reglement_id',
3005 'label' => $langs->trans(
'PaymentTerm'),
3006 'value' => $paymentTermsSelect
3009 $formquestion[] = array(
3010 'type' =>
'checkbox',
3011 'tdclass' =>
'showonlyifgeneratedeposit',
3012 'name' =>
'validate_generated_deposit',
3013 'morecss' =>
'margintoponly marginbottomonly',
3014 'label' => $langs->trans(
'ValidateGeneratedDeposit')
3017 $formquestion[] = array(
3018 'type' =>
'onecolumn',
3021 let signedValue = ' . $object::STATUS_SIGNED .
';
3023 $(document).ready(function() {
3024 $("[name=generate_deposit]").change(function () {
3025 let $self = $(this);
3026 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
3028 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
3037 $("#statut").change(function() {
3038 let $target = $(".showonlyifsigned").parent(".tagtr");
3040 if ($(this).val() == signedValue) {
3046 $("[name=generate_deposit]").trigger("change");
3051 $("#statut").trigger("change");
3061 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
3062 $notify =
new Notify($db);
3063 $formquestion = array_merge($formquestion, array(
3064 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid, $object)),
3069 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
3071 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
3073 } elseif ($action ==
'cancel') {
3075 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
3076 } elseif ($action ==
'delete') {
3078 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
3079 } elseif ($action ==
'reopen') {
3081 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
3082 } elseif ($action ==
'ask_deleteline') {
3084 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
3085 } elseif ($action ==
'ask_subtotal_deleteline') {
3087 $langs->load(
"subtotals");
3088 $title =
"DeleteSubtotalLine";
3089 $question =
"ConfirmDeleteSubtotalLine";
3090 if (
GETPOST(
'type') ==
'title') {
3091 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
3092 $title =
"DeleteTitleLine";
3093 $question =
"ConfirmDeleteTitleLine";
3095 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
3096 } elseif ($action ==
'validate') {
3101 $ref = substr(
$object->ref, 1, 4);
3102 if ($ref ==
'PROV' || $ref ==
'') {
3103 $numref =
$object->getNextNumRef($soc);
3104 if (empty($numref)) {
3109 $numref = (string)
$object->ref;
3112 $text = $langs->trans(
'ConfirmValidateProp', $numref);
3114 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
3115 $notify =
new Notify($db);
3117 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid, $object);
3122 foreach (
$object->lines as $line) {
3123 $res = $line->fetch_product();
3125 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
3131 if ($nbMandated > 0) {
3133 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
3136 $text .=
'<div><span class="clearboth nowraponall warning">' . img_warning() . $langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate") .
'</span></div>';
3141 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
3146 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
3147 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
3148 if (empty($reshook)) {
3149 $formconfirm .= $hookmanager->resPrint;
3150 } elseif ($reshook > 0) {
3151 $formconfirm = $hookmanager->resPrint;
3160 $linkback =
'<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
3162 $morehtmlref =
'<div class="refidno">';
3164 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client, $object, $usercancreate,
'string',
'', 0, 1);
3165 $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);
3167 $morehtmlref .=
'<br>' . $soc->getNomUrl(1,
'customer');
3169 $morehtmlref .=
' (<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?socid=' . ((int) $soc->id) .
'">' . $langs->trans(
"OtherProposals") .
'</a>)';
3173 $langs->load(
"projects");
3174 $morehtmlref .=
'<br>';
3175 if ($usercancreate) {
3176 $morehtmlref .= img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
3177 if ($action !=
'classify') {
3178 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' . img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
3180 $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');
3182 if (!empty(
$object->fk_project)) {
3184 $proj->fetch(
$object->fk_project);
3185 $morehtmlref .= $proj->getNomUrl(1);
3187 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
3192 $morehtmlref .=
'</div>';
3195 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
3198 $parameters = array();
3200 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters, $object, $action);
3201 if (empty($reshook)) {
3202 print
'<div class="fichecenter">';
3203 print
'<div class="fichehalfleft">';
3204 print
'<div class="underbanner clearboth"></div>';
3206 print
'<table class="border tableforfield centpercent">';
3210 $filterabsolutediscount =
"fk_facture_source IS NULL";
3211 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3213 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3214 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3217 print
'<tr><td class="titlefieldmax45">' . $langs->trans(
'Discounts') .
'</td><td>';
3219 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3220 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3221 $absolute_discount =
price2num($absolute_discount,
'MT');
3222 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3228 $backtopage = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id;
3229 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
3245 print $form->editfieldkey(
"DatePropal",
'date',
'', $object, (
int) $editenable);
3246 print
'</td><td class="valuefield">';
3247 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3248 print
'<form name="editdate" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3249 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3250 print
'<input type="hidden" name="action" value="setdate">';
3251 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3252 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3253 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3267 print
'<table class="nobordernopadding centpercent"><tr><td>';
3268 print $langs->trans(
'DateEndPropal');
3270 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3271 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>';
3273 print
'</tr></table>';
3274 print
'</td><td class="valuefield">';
3275 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3276 print
'<form name="editecheance" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3277 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3278 print
'<input type="hidden" name="action" value="setecheance">';
3279 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3280 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3281 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3284 if (!empty(
$object->fin_validite)) {
3287 print img_warning($langs->trans(
"Late"));
3298 print
'<table class="nobordernopadding centpercent"><tr><td>';
3299 print $langs->trans(
'PaymentConditionsShort');
3301 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3302 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>';
3304 print
'</tr></table>';
3305 print
'</td><td class="valuefield">';
3306 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3307 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3309 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3315 print
'<tr class="field_mode_reglement_id">';
3317 print
'<table class="nobordernopadding centpercent"><tr><td>';
3318 print $langs->trans(
'PaymentMode');
3320 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3321 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>';
3323 print
'</tr></table>';
3324 print
'</td><td class="valuefieldcreate">';
3325 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3326 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3328 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'none');
3333 print
'<tr class="fielddeliverydelay"><td>';
3334 print
'<table class="nobordernopadding centpercent"><tr><td>';
3336 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod') .
' (' . $langs->trans(
'AfterOrder') .
')');
3338 print $langs->trans(
'AvailabilityPeriod');
3341 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3342 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>';
3344 print
'</tr></table>';
3345 print
'</td><td class="valuefield">';
3346 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3347 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'availability_id', $langs->trans(
"Delay"));
3349 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'none', 1);
3357 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3358 print
'</td><td class="valuefieldedit">';
3359 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, $usercancreate && $caneditfield,
'datepicker');
3366 print
'<table class="nobordernopadding centpercent"><tr><td>';
3367 print $langs->trans(
'SendingMethod');
3369 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3370 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>';
3372 print
'</tr></table>';
3373 print
'</td><td class="valuefield">';
3374 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3375 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3377 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'none');
3385 $langs->load(
'stocks');
3386 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
3388 print
'<tr class="field_warehouse_id"><td>';
3389 $editenable = $usercancreate;
3390 print $form->editfieldkey(
"Warehouse",
'warehouse',
'', $object, $editenable);
3391 print
'</td><td class="valuefieldcreate">';
3392 if ($action ==
'editwarehouse') {
3393 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3395 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'none');
3403 print
'<table class="nobordernopadding centpercent"><tr><td>';
3404 print $langs->trans(
'Source');
3406 if ($action !=
'editdemandreason' && $usercancreate) {
3407 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>';
3409 print
'</tr></table>';
3410 print
'</td><td class="valuefield">';
3411 if ($action ==
'editdemandreason' && $usercancreate) {
3412 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3414 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'none');
3419 if ($soc->outstanding_limit) {
3422 print $langs->trans(
'OutstandingBill');
3423 print
'</td><td class="valuefield">';
3424 $arrayoutstandingbills = $soc->getOutstandingBills();
3425 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ? img_warning() :
'');
3426 print
price($arrayoutstandingbills[
'opened']) .
' / ';
3427 print
price($soc->outstanding_limit, 0, $langs, 1, -1, -1,
$conf->currency);
3435 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3436 print $langs->trans(
'BankAccount');
3438 if ($action !=
'editbankaccount' && $usercancreate) {
3439 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>';
3441 print
'</tr></table>';
3442 print
'</td><td class="valuefield">';
3443 if ($action ==
'editbankaccount') {
3444 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3446 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'none');
3453 $tmparray =
$object->getTotalWeightVolume();
3454 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3455 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3457 print
'<tr><td>' . $langs->trans(
"CalculatedWeight") .
'</td>';
3458 print
'<td class="valuefield">';
3463 print
'<tr><td>' . $langs->trans(
"CalculatedVolume") .
'</td>';
3464 print
'<td class="valuefield">';
3473 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3474 print $langs->trans(
'IncotermLabel');
3475 print
'<td><td class="right">';
3476 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3477 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' . img_edit() .
'</a>';
3481 print
'</td></tr></table>';
3483 print
'<td class="valuefield">';
3484 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3485 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3487 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3495 print
'<table class="nobordernopadding centpercent"><tr><td>';
3496 print $langs->trans(
"Categories");
3497 print
'<td><td class="right">';
3498 if ($usercancreate) {
3499 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=edittags&token='.
newToken().
'">'.img_edit().
'</a>';
3503 print
'</td></tr></table>';
3506 if ($action ==
'edittags') {
3507 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'">';
3508 print
'<input type="hidden" name="action" value="settags">';
3509 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3510 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
3511 print
'<input type="submit" class="button valignmiddle smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
3514 print $form->showCategories(
$object->id, Categorie::TYPE_PROPOSAL, 1);
3520 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3525 print
'<div class="fichehalfright">';
3526 print
'<div class="underbanner clearboth"></div>';
3528 print
'<table class="border tableforfield centpercent">';
3530 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_currency_amount.tpl.php';
3533 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3534 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3536 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3541 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3542 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3544 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3548 if (
$mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3550 print
'<td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td>';
3551 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3555 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3560 if (
$mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3562 print
'<td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td>';
3563 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3567 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3573 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3574 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3576 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3584 $formmargin->displayMarginInfos($object);
3590 print
'<div class="clearboth"></div><br>';
3593 $blocname =
'contacts';
3594 $title = $langs->trans(
'ContactsAddresses');
3595 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3599 $blocname =
'notes';
3600 $title = $langs->trans(
'Notes');
3601 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3609 $result =
$object->getLinesArray();
3613 global $inputalsopricewithtax;
3614 $inputalsopricewithtax = 1;
3616 print
' <form name="addproduct" id="addproduct" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="POST">
3617 <input type="hidden" name="token" value="' .
newToken() .
'">
3618 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline') .
'">
3619 <input type="hidden" name="mode" value="">
3620 <input type="hidden" name="page_y" value="">
3621 <input type="hidden" name="backtopage" value="' . $backtopage .
'">
3622 <input type="hidden" name="id" value="' .
$object->id .
'">
3627 include DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_ajaxrow.tpl.php';
3629 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3633 print
'<div class="div-table-responsive-no-min">';
3635 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3644 if ($action !=
'editline') {
3645 $parameters = array();
3646 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3648 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
3650 if (empty($reshook)) {
3654 $parameters = array();
3655 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters, $object, $action);
3674 if ($action !=
'presend') {
3675 $numlines = count(
$object->lines);
3676 print
'<div class="tabsAction">';
3678 $parameters = array();
3679 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3681 if (empty($reshook)) {
3682 if ($action !=
'editline') {
3686 $langs->load(
'subtotals');
3688 $url_button = array();
3690 $url_button[] = array(
3691 'lang' =>
'subtotals',
3693 'perm' => (
bool) $usercancreate,
3694 'label' => $langs->trans(
'AddTitleLine'),
3695 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_title_line&token=' .
newToken()
3698 $url_button[] = array(
3699 'lang' =>
'subtotals',
3701 'perm' => (
bool) $usercancreate,
3702 'label' => $langs->trans(
'AddSubtotalLine'),
3703 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_subtotal_line&token=' .
newToken()
3706 $url_button[] = array(
3707 'lang' =>
'subtotals',
3709 'perm' => (
bool) $usercancreate,
3710 'label' => $langs->trans(
'AddTextLine'),
3711 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_text_line&token=' .
newToken()
3714 print dolGetButtonAction(
'', $langs->trans(
'SubTotal'),
'default', $url_button,
'',
true);
3721 if ($usercanvalidate) {
3722 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>';
3724 print
'<a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
'Validate') .
'</a>';
3734 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=modif&token=' .
newToken() .
'">' . $langs->trans(
'Modify') .
'</a>';
3739 if ($usercanreopen) {
3740 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=reopen&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen') .
'"';
3741 print
'>' . $langs->trans(
'ReOpen') .
'</a>';
3743 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ReOpen") .
'</a>';
3748 if (empty($user->socid)) {
3750 print dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'', $usercansend);
3754 $arrayforbutaction = array();
3757 $arrayforbutaction[] = array(
3760 'perm' => $usercancreateorder,
3761 'label' =>
'AddOrder',
3762 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3772 $arrayforbutaction[] = array(
3775 'perm' => $usercancreatepurchaseorder,
3776 'label' =>
'AddPurchaseOrder',
3777 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id)
3787 $arrayforbutaction[] = array(
3788 'lang' =>
'interventions',
3790 'perm' => $usercancreateintervention,
3791 'label' =>
'AddIntervention',
3792 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3802 $arrayforbutaction[] = array(
3803 'lang' =>
'contracts',
3805 'perm' => $usercancreatecontract,
3806 'label' =>
'AddContract',
3807 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3819 $arrayforbutaction[] = [
3820 'lang' =>
'invoice',
3822 'perm' => $usercancreateinvoice,
3823 'label' =>
'CreateBill',
3824 'url' =>
'/compta/facture/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((int)
$object->id) .
'&socid=' . ((int)
$object->socid),
3831 $actionButtonsParameters = [
3832 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3833 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3836 if ($numlines > 0) {
3837 print dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3839 print dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3843 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3844 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3845 if ($usercanclose) {
3846 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=classifybilled&token=' .
newToken() .
'&socid=' .
$object->socid .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3848 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3856 if ($usercanclose) {
3857 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3858 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3860 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'"';
3861 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3867 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token=' .
newToken() .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3868 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3874 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=cancel&token=' .
newToken() .
'">' . $langs->trans(
"CancelPropal") .
'</a>';
3878 if ($usercancreate) {
3879 print dolGetButtonAction($langs->trans(
"ToClone"), $langs->trans(
"ToClone"),
'clone', $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id .
'&socid=' .
$object->socid .
'&action=clone&token=' .
newToken() .
'&object=' .
$object->element,
'',
true, array(
'attr' => array(
'class' =>
'reposition')));
3883 print dolGetButtonAction($langs->trans(
"Delete"), $langs->trans(
"Delete"),
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' .
newToken(),
'delete', $usercandelete, array(
'attr' => array(
'class' =>
'reposition'))).
"\n";
3891 if (
GETPOST(
'modelselected')) {
3892 $action =
'presend';
3895 if ($action !=
'presend') {
3896 print
'<div class="fichecenter"><div class="fichehalfleft">';
3897 print
'<a name="builddoc"></a>';
3903 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3904 $genallowed = $usercanread;
3905 $delallowed = $usercancreate;
3906 $tooltipAfterComboOfModels =
'';
3908 $tooltipAfterComboOfModels = $langs->trans(
"AccordingToYourSetupTheFileWillBeConcatenated",
getDolGlobalString(
'MAIN_INFO_PROPAL_TERMSOFSALE'));
3911 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);
3914 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'propal'), 1);
3915 $linktoelem = $tmparray[
'linktoelem'];
3916 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3917 print $htmltoenteralink;
3919 $compatibleImportElementsList =
false;
3921 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3923 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, $compatibleImportElementsList);
3929 print
'<br><!-- Link to sign -->';
3930 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3931 print showOnlineSignatureUrl(
'proposal',
$object->ref, $object) .
'<br>';
3934 print
'</div><div class="fichehalfright">';
3938 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/comm/propal/messaging.php?id=' .
$object->id);
3939 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT .
'/comm/propal/agenda.php?id=' .
$object->id);
3942 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3944 $somethingshown = $formactions->showactions($object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3946 print
'</div></div>';
3950 $modelmail =
'propal_send';
3951 $defaulttopic =
'SendPropalRef';
3953 $trackid =
'pro' .
$object->id;
3955 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.
$date_start
Variables from include:
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...
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
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.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
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', ...)
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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...
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_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.
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.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
propal_prepare_head($object)
Prepare array with list of tabs.
print $langs trans('Date')." left Ref 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 Paid 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, $nodie=0, $mode='')
Check permissions of a user to show a page and an object.