47require
'../../main.inc.php';
48require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
49require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formother.class.php';
50require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formfile.class.php';
51require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formpropal.class.php';
52require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formmargin.class.php';
53require_once DOL_DOCUMENT_ROOT .
'/comm/propal/class/propal.class.php';
54require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
55require_once DOL_DOCUMENT_ROOT .
'/core/modules/propale/modules_propale.php';
56require_once DOL_DOCUMENT_ROOT .
'/core/lib/propal.lib.php';
57require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
58require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
59require_once DOL_DOCUMENT_ROOT .
'/core/class/doleditor.class.php';
61 require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
62 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
66 require_once DOL_DOCUMENT_ROOT .
'/variants/class/ProductCombination.class.php';
79$langs->loadLangs(array(
'companies',
'propal',
'compta',
'bills',
'orders',
'products',
'sendings',
'other'));
81 $langs->load(
'incoterm');
84 $langs->load(
'margins');
89$array_options = array();
94$action =
GETPOST(
'action',
'aZ09');
95$cancel =
GETPOST(
'cancel',
'alpha');
96$origin =
GETPOST(
'origin',
'alpha');
99$confirm =
GETPOST(
'confirm',
'alpha');
100$backtopage =
GETPOST(
'backtopage',
'alpha');
115$extrafields->fetch_name_optionals_label(
$object->table_element);
118if ($id > 0 || !empty($ref)) {
119 $ret =
$object->fetch($id, $ref);
121 $ret =
$object->fetch_thirdparty();
122 if ($ret > 0 && isset(
$object->fk_project)) {
123 $ret =
$object->fetchProject();
133$hookmanager->initHooks(array(
'propalcard',
'globalcard'));
135$usercanread = $user->hasRight(
"propal",
"lire");
136$usercancreate = $user->hasRight(
"propal",
"creer");
137$usercandelete = $user->hasRight(
"propal",
"supprimer");
139$usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'close')));
140$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'validate')));
143$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
144$usercancreateorder = ($user->hasRight(
'commande',
'creer') == 1);
145$usercancreateinvoice = ($user->hasRight(
'facture',
'creer') == 1);
146$usercancreatecontract = ($user->hasRight(
'contrat',
'creer') == 1);
147$usercancreateintervention = ($user->hasRight(
'ficheinter',
'creer') == 1);
148$usercancreatepurchaseorder = ($user->hasRight(
'fournisseur',
'commande',
'creer') || $user->hasRight(
'supplier_order',
'creer'));
149$usercanreopen = ((!
getDolGlobalBool(
'MAIN_USE_ADVANCED_PERMS') && $usercanclose) || (
getDolGlobalBool(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'reopen')));
151 $usercanreopen =
false;
154$permissiontoadd = $usercancreate;
155$permissionnote = $usercancreate;
156$permissiondellink = $usercancreate;
157$permissiontoedit = $usercancreate;
158$permissiontoeditextra = $permissiontoadd;
159if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
161 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
164$price_base_type =
null;
165$shipping_method_id =
null;
169if (!empty($user->socid)) {
170 $socid = $user->socid;
179$parameters = array(
'socid' => $socid);
180$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
184if (empty($reshook)) {
185 $backurlforlist = DOL_URL_ROOT .
'/comm/propal/list.php';
187 if (empty($backtopage) || ($cancel && empty($id))) {
188 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
189 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
190 $backtopage = $backurlforlist;
192 $backtopage = DOL_URL_ROOT .
'/comm/propal/card.php?id=' . ((!empty($id) &&
$id > 0) ? $id :
'__ID__');
198 if (!empty($backtopageforcancel)) {
199 header(
"Location: " . $backtopageforcancel);
201 } elseif (!empty($backtopage)) {
202 header(
"Location: " . $backtopage);
208 include DOL_DOCUMENT_ROOT .
'/core/actions_setnotes.inc.php';
210 include DOL_DOCUMENT_ROOT .
'/core/actions_dellink.inc.php';
212 include DOL_DOCUMENT_ROOT .
'/core/actions_lineupdown.inc.php';
215 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
217 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'IdThirdParty')),
null,
'errors');
230 $date_delivery_old =
$object->delivery_date;
231 if (!empty($date_delivery_old) && !empty($date_delivery)) {
242 $difference = $date_delivery - $old_date_delivery;
243 if ($difference != 0) {
244 $object->delivery_date = $date_delivery;
245 foreach (
$object->lines as $line) {
246 if (isset($line->date_start)) {
247 $line->date_start += $difference;
249 if (isset($line->date_end)) {
250 $line->date_end += $difference;
257 $result =
$object->createFromClone($user, $socid, (GETPOSTISSET(
'entity') ?
GETPOSTINT(
'entity') : null), (
GETPOST(
'update_prices') ==
'on'), (
GETPOST(
'update_desc') ==
'on'));
259 $warningMsgLineList = array();
261 foreach (
$object->lines as $line) {
262 if (!is_object($line->product)) {
263 $line->fetch_product();
265 if (is_object($line->product) && $line->product->id > 0) {
266 if (empty($line->product->status)) {
267 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
271 if (!empty($warningMsgLineList)) {
275 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
'?id=' . $result);
278 if (count(
$object->errors) > 0) {
285 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanclose) {
287 $result =
$object->setCancel($user);
289 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
292 $langs->load(
"errors");
295 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
297 $result =
$object->delete($user);
299 header(
'Location: ' . DOL_URL_ROOT .
'/comm/propal/list.php?restore_lastsearch_values=1');
302 $langs->load(
"errors");
305 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
307 $result =
$object->deleteLine($lineid);
312 $langs->load(
"errors");
318 $outputlangs = $langs;
321 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
322 $outputlangs->setDefaultLang($newlang);
328 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
331 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
333 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $usercancreate) {
338 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'));
343 $outputlangs = $langs;
349 $newlang =
$object->thirdparty->default_lang;
351 if (!empty($newlang)) {
353 $outputlangs->setDefaultLang($newlang);
354 $outputlangs->load(
'products');
358 $result =
$object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
361 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
368 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
371 $result =
$object->valid($user);
373 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
381 $outputlangs = $langs;
384 $newlang =
GETPOST(
'lang_id',
'aZ09');
387 $newlang =
$object->thirdparty->default_lang;
389 if (!empty($newlang)) {
391 $outputlangs->setDefaultLang($newlang);
395 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
398 $langs->load(
"errors");
399 if (count(
$object->errors) > 0) {
405 } elseif ($action ==
'setdate' && $usercancreate) {
410 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
414 $result =
$object->set_date($user, $datep);
415 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
416 $datev = $datep + (
$object->duree_validite * 24 * 3600);
417 $result =
$object->set_echeance($user, $datev, 1);
422 $outputlangs = $langs;
425 $newlang =
GETPOST(
'lang_id',
'aZ09');
428 $newlang =
$object->thirdparty->default_lang;
430 if (!empty($newlang)) {
432 $outputlangs->setDefaultLang($newlang);
440 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
443 } elseif ($action ==
'setecheance' && $usercancreate) {
447 $outputlangs = $langs;
450 $newlang =
GETPOST(
'lang_id',
'aZ09');
453 $newlang =
$object->thirdparty->default_lang;
455 if (!empty($newlang)) {
457 $outputlangs->setDefaultLang($newlang);
465 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
470 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
475 } elseif ($action ==
'setref_client' && $usercancreate) {
481 } elseif ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $usercancreate) {
484 } elseif ($action ==
'settags' &&
isModEnabled(
'category') && $usercancreate) {
486 } elseif ($action ==
'add' && $usercancreate) {
496 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
500 if (empty($duration)) {
501 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
507 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
522 $object->delivery_date = $date_delivery;
528 $object->duree_validite = $duration;
538 $object->user_author_id = $user->id;
544 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
554 $object->delivery_date = $date_delivery;
569 $object->user_author_id = $user->id;
573 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
580 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
584 $ret = $extrafields->setOptionalsFromPost(
null, $object);
592 if ($origin && $originid) {
594 $element = $subelement = $origin;
596 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
598 $subelement = $regs[2];
602 if ($element ==
'order') {
603 $element = $subelement =
'commande';
605 if ($element ==
'propal') {
606 $element =
'comm/propal';
607 $subelement =
'propal';
609 if ($element ==
'contract') {
610 $element = $subelement =
'contrat';
612 if ($element ==
'inter') {
613 $element = $subelement =
'fichinter';
615 if ($element ==
'shipping') {
616 $element = $subelement =
'expedition';
620 if (($origin !=
'contrat' || $renewal !=
'true') && !
getDolGlobalInt(
'CONTRACT_NEW_CONTRACT_ON_RENEWAL')) {
622 $object->origin_id = $originid;
628 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
635 $classname = ucfirst($subelement);
636 $srcobject =
new $classname($db);
637 '@phan-var-force Commande|Propal|Contrat|Fichinter|Expedition $srcobject';
640 dol_syslog(
"Try to find source object origin=" .
$object->origin .
" originid=" .
$object->origin_id .
" to add lines");
641 $result = $srcobject->fetch(
$object->origin_id);
644 $lines = $srcobject->lines;
645 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
646 $srcobject->fetch_lines();
647 $lines = $srcobject->lines;
651 $num = count($lines);
652 for ($i = 0; $i < $num; $i++) {
653 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
654 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
657 $product_type = ($lines[$i]->product_type ? (int) $lines[$i]->product_type : 0);
661 if ($lines[$i]->date_debut_prevue) {
662 $date_start = $lines[$i]->date_debut_prevue;
664 if ($lines[$i]->date_debut_reel) {
665 $date_start = $lines[$i]->date_debut_reel;
667 if ($lines[$i]->date_start) {
668 $date_start = $lines[$i]->date_start;
673 if ($lines[$i]->date_fin_prevue) {
674 $date_end = $lines[$i]->date_fin_prevue;
676 if ($lines[$i]->date_fin_reel) {
677 $date_end = $lines[$i]->date_fin_reel;
679 if ($lines[$i]->date_end) {
680 $date_end = $lines[$i]->date_end;
684 if ($origin ==
'contrat' && $renewal ==
'true') {
685 if ($lines[$i]->date_start && $lines[$i]->date_end) {
686 $duration = $lines[$i]->date_end - $lines[$i]->date_start;
687 $date_start = $lines[$i]->date_end + 86400;
688 $date_end = $date_start + $duration;
693 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
698 if (method_exists($lines[$i],
'fetch_optionals')) {
699 $lines[$i]->fetch_optionals();
700 $array_options = $lines[$i]->array_options;
703 $tva_tx = $lines[$i]->tva_tx;
704 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
705 $tva_tx .=
' (' . $lines[$i]->vat_src_code .
')';
708 $result =
$object->addline($desc, $lines[$i]->subprice, $lines[$i]->qty, $tva_tx, $lines[$i]->localtax1_tx, $lines[$i]->localtax2_tx, $lines[$i]->fk_product, $lines[$i]->remise_percent,
'HT', 0, $lines[$i]->info_bits, $product_type, $lines[$i]->rang, $lines[$i]->special_code, $fk_parent_line, $lines[$i]->fk_fournprice, $lines[$i]->pa_ht, $label, $date_start, $date_end, $array_options, $lines[$i]->fk_unit);
719 if ($result > 0 && $lines[$i]->product_type == 9) {
720 $fk_parent_line = $result;
725 $parameters = array(
'objFrom' => $srcobject);
726 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
747 if (
GETPOST(
'contactid') > 0) {
756 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
759 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
763 $categories =
GETPOST(
'categories',
'array');
764 if (method_exists($object,
'setCategories')) {
765 $object->setCategories($categories);
774 $outputlangs = $langs;
777 $newlang =
GETPOST(
'lang_id',
'aZ09');
780 $newlang =
$object->thirdparty->default_lang;
782 if (!empty($newlang)) {
784 $outputlangs->setDefaultLang($newlang);
789 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
795 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
808 } elseif ($action ==
'classifybilled' && $usercanclose) {
812 $result =
$object->classifyBilled($user, 0,
'');
823 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
826 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
828 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
829 $locationTarget =
'';
843 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
848 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
851 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
852 && !empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
854 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
857 $forceFields = array();
859 if (GETPOSTISSET(
'date_pointoftax')) {
867 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
878 $ret = $deposit->fetch($deposit->id);
879 $outputlangs = $langs;
883 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
884 $outputlangs->load(
'products');
887 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
894 if ($locationTarget) {
895 header(
'Location: ' . $locationTarget);
907 } elseif ($action ==
'confirm_reopen' && $usercanreopen && !
GETPOST(
'cancel',
'alpha')) {
914 $result =
$object->reopen($user, $newstatus);
931 $fromElement =
GETPOST(
'fromelement');
932 $fromElementid =
GETPOST(
'fromelementid');
933 $importLines =
GETPOST(
'line_checkbox');
935 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
936 if ($fromElement ==
'commande') {
937 dol_include_once(
'/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
938 $lineClassName =
'OrderLine';
939 } elseif ($fromElement ==
'propal') {
940 dol_include_once(
'/comm/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
941 $lineClassName =
'PropaleLigne';
942 } elseif ($fromElement ==
'facture') {
943 dol_include_once(
'/compta/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
944 $lineClassName =
'FactureLigne';
946 $lineClassName =
null;
948 $nextRang = count(
$object->lines) + 1;
951 foreach ($importLines as $lineId) {
952 $lineId = intval($lineId);
953 $originLine =
new $lineClassName($db);
954 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
955 $originLine->fetch_optionals();
956 $desc = $originLine->desc;
957 $pu_ht = $originLine->subprice;
958 $qty = $originLine->qty;
959 $txtva = $originLine->tva_tx;
960 $txlocaltax1 = $originLine->localtax1_tx;
961 $txlocaltax2 = $originLine->localtax2_tx;
962 $fk_product = $originLine->fk_product;
963 $remise_percent = $originLine->remise_percent;
964 $date_start = $originLine->date_start;
965 $date_end = $originLine->date_end;
966 $fk_code_ventilation = 0;
967 $info_bits = $originLine->info_bits;
968 $fk_remise_except = $originLine->fk_remise_except;
969 $price_base_type =
'HT';
971 $type = $originLine->product_type;
973 $special_code = $originLine->special_code;
974 $origin = $originLine->element;
975 $origin_id = $originLine->id;
977 $fk_fournprice = $originLine->fk_fournprice;
978 $pa_ht = $originLine->pa_ht;
979 $label = $originLine->label;
980 $array_options = $originLine->array_options;
981 $situation_percent = 100;
983 $fk_unit = $originLine->fk_unit;
984 $pu_ht_devise = $originLine->multicurrency_subprice;
986 $res =
$object->addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1, $txlocaltax2, $fk_product, $remise_percent, $price_base_type, $pu_ttc, $info_bits, $type, $rang, $special_code, $fk_parent_line, $fk_fournprice, $pa_ht, $label, $date_start, $date_end, $array_options, $fk_unit, $origin, $origin_id, $pu_ht_devise, $fk_remise_except);
1002 } elseif ($action ==
'addline' &&
GETPOST(
'updateallvatlinesblock',
'alpha') &&
GETPOST(
'vatforblocklines',
'alpha') !==
'' && $usercancreate) {
1003 $tx_tva =
GETPOST(
'vatforblocklines') ?
GETPOST(
'vatforblocklines') : 0;
1004 $object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'tva', $tx_tva);
1005 } elseif ($action ==
'addline' &&
GETPOST(
'updatealldiscountlinesblock',
'alpha') &&
GETPOST(
'discountforblocklines',
'alpha') !==
'' && $usercancreate) {
1006 $discount =
GETPOST(
'discountforblocklines') ?
GETPOST(
'discountforblocklines') : 0;
1007 $object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'discount', $discount);
1010 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1013 $actiontypecode =
'AC_OTH_AUTO';
1014 $triggersendname =
'PROPAL_SENTBYMAIL';
1015 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
1016 $trackid =
'pro' .
$object->id;
1017 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1021 if ($action ==
'modif' && $usercancreate) {
1022 $result =
$object->setDraft($user);
1029 $outputlangs = $langs;
1031 $outputlangs =
new Translate(
"", $conf);
1032 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1033 $outputlangs->setDefaultLang($newlang);
1039 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1041 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
1050 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
1054 foreach (
$object->lines as $key => $line) {
1055 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1058 if ($line->product_type == 1) {
1059 $result =
$object->updateline($line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $alldate_start, $alldate_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
1063 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
1065 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
1066 $vat_rate = str_replace(
'*',
'', $vat_rate);
1069 foreach (
$object->lines as $key => $line) {
1070 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1073 $result =
$object->updateline($line->id, $line->subprice, $line->qty, $line->remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
1076 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
1078 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
1079 $remise_percent = str_replace(
'*',
'', $remise_percent);
1080 foreach (
$object->lines as $key => $line) {
1081 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1084 $tvatx = $line->tva_tx;
1085 if (!empty($line->vat_src_code)) {
1086 $tvatx .=
' (' . $line->vat_src_code .
')';
1088 $result =
$object->updateline($line->id, $line->subprice, $line->qty, (
float) $remise_percent, $tvatx, $line->localtax1_tx, $line->localtax2_tx, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
1091 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'' && $usercancreate) {
1093 $margin_rate = (
GETPOST(
'marginforalllines',
'alpha') ?
GETPOST(
'marginforalllines',
'alpha') : 0);
1094 foreach (
$object->lines as $key => $line) {
1095 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1098 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
1100 $prod->fetch($line->fk_product);
1101 if ($prod->price_min > $subprice) {
1102 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1103 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1104 setEventMessages($prod->ref .
' - ' . $prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1107 if ($line->subprice <> 0) {
1108 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1110 $multicurrency_subprice = 0;
1113 $result =
$object->updateline($line->id, (
float) $subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $multicurrency_subprice);
1130 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
1133 $langs->load(
'subtotals');
1135 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
1136 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
1138 $subtotal_options = array();
1140 foreach (Propal::$TITLE_OPTIONS as $option) {
1141 $value =
GETPOST($option,
'alphanohtml');
1143 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1148 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1159 $outputlangs = $langs;
1160 $newlang =
GETPOST(
'lang_id',
'alpha');
1162 $newlang =
$object->thirdparty->default_lang;
1164 if (!empty($newlang)) {
1165 $outputlangs =
new Translate(
"", $conf);
1166 $outputlangs->setDefaultLang($newlang);
1169 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1174 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1176 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
1179 $langs->load(
'subtotals');
1181 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
1182 foreach (
$object->lines as $line) {
1183 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
1184 $desc = $line->desc;
1185 $depth = -$line->qty;
1189 $subtotal_options = array();
1191 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1192 $value =
GETPOST($option,
'alphanohtml');
1194 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1199 if (isset($desc) && isset($depth)) {
1200 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1202 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
1205 if (isset($result) && $result >= 0) {
1211 $outputlangs = $langs;
1212 $newlang =
GETPOST(
'lang_id',
'alpha');
1214 $newlang =
$object->thirdparty->default_lang;
1216 if (!empty($newlang)) {
1217 $outputlangs =
new Translate(
"", $conf);
1218 $outputlangs->setDefaultLang($newlang);
1221 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1226 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1228 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && !
GETPOST(
'markforalllines',
'alpha') && $usercancreate) {
1232 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1235 $price_ht_devise =
'';
1237 $price_ttc_devise =
'';
1241 if (
GETPOST(
'price_ht') !==
'') {
1244 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1247 if (
GETPOST(
'price_ttc') !==
'') {
1250 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1251 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1254 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1255 if ($prod_entry_mode ==
'free') {
1261 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1266 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1269 $remise_percent = (GETPOSTISSET(
'remise_percent' . $predef) ?
price2num(
GETPOST(
'remise_percent' . $predef,
'alpha'),
'', 2) : 0);
1270 if (empty($remise_percent)) {
1271 $remise_percent = 0;
1275 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1276 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1278 if (is_array($extralabelsline)) {
1280 foreach ($extralabelsline as $key => $value) {
1281 unset($_POST[
"options_" . $key]);
1285 $price_to_test_sign = ($price_ht ? $price_ht : $price_ttc);
1287 if ((empty($idprod) || $idprod < 0) && ($price_to_test_sign < 0) && ($qty < 0)) {
1288 $langs->load(
"errors");
1289 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1292 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1293 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1297 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1298 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1302 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1305 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1306 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1310 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1311 if ($combinations =
GETPOST(
'combinations',
'array:alphanohtml')) {
1315 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1316 $idprod = $res->fk_product_child;
1318 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1324 if (!$error && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1332 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1341 if (!empty($idprod) && $idprod > 0) {
1343 $prod->fetch($idprod);
1345 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
1355 $pu_ht = $prod->price;
1356 $pu_ttc = $prod->price_ttc;
1357 $price_min = $prod->price_min;
1358 $price_min_ttc = $prod->price_min_ttc;
1359 $price_base_type = $prod->price_base_type;
1363 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1365 $filter = array(
't.fk_product' => (
string) $prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1368 $pricebycustomerexist =
false;
1369 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1372 if (count($prodcustprice->lines) > 0) {
1373 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1374 foreach ($prodcustprice->lines as $k => $custprice_line) {
1375 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1376 $pricebycustomerexist =
true;
1377 $pu_ht =
price($custprice_line->price);
1378 $pu_ttc =
price($custprice_line->price_ttc);
1379 $price_min =
price($custprice_line->price_min);
1380 $price_min_ttc =
price($custprice_line->price_min_ttc);
1381 $price_base_type = $custprice_line->price_base_type;
1398 if (!$pricebycustomerexist && !empty(
$object->thirdparty->price_level)) {
1399 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1400 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1401 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1402 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1403 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1405 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1406 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1408 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1409 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1414 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1415 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1416 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1417 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1418 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1420 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1421 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1423 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1424 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1429 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1433 $filter = array(
't.fk_product' => (
string) $prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1435 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1438 if (count($prodcustprice->lines) > 0) {
1439 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1440 foreach ($prodcustprice->lines as $k => $custprice_line) {
1441 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1442 $pu_ht =
price($custprice_line->price);
1443 $pu_ttc =
price($custprice_line->price_ttc);
1444 $price_min =
price($custprice_line->price_min);
1445 $price_min_ttc =
price($custprice_line->price_min_ttc);
1446 $price_base_type = $custprice_line->price_base_type;
1464 if ($prod->prices_by_qty[0]) {
1469 foreach ($prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1470 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1474 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1475 $pu_ht = $priceforthequantityarray[
'unitprice'];
1477 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1485 if ($prod->prices_by_qty[
$object->thirdparty->price_level]) {
1490 foreach ($prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1491 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1495 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1496 $pu_ht = $priceforthequantityarray[
'unitprice'];
1498 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1506 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1507 $tmpprodvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
1510 if (!empty($price_ht) || (string) $price_ht ===
'0') {
1511 $pu_ht = (float)
price2num($price_ht,
'MU');
1512 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1513 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1514 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1515 $pu_ttc_devise = (float)
price2num((
float) $pu_ht_devise * (1 + ((float) $tmpvat / 100)),
'MU');
1518 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1519 $pu_ttc = (float)
price2num($price_ttc,
'MU');
1520 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1521 } elseif (!empty($price_ttc_devise) || (
string) $price_ttc_devise ===
'0') {
1522 $pu_ttc_devise = (float)
price2num($price_ttc_devise,
'MU');
1523 $pu_ht_devise = (float)
price2num((
float) $pu_ttc_devise / (1 + ((float) $tmpvat / 100)),
'MU');
1526 } elseif ($tmpvat != $tmpprodvat) {
1528 if ($price_base_type !=
'HT') {
1529 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1531 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1539 $outputlangs = $langs;
1541 if (
GETPOST(
'lang_id',
'aZ09')) {
1542 $newlang =
GETPOST(
'lang_id',
'aZ09');
1544 if (empty($newlang)) {
1545 $newlang =
$object->thirdparty->default_lang;
1547 if (!empty($newlang)) {
1548 $outputlangs =
new Translate(
"", $conf);
1549 $outputlangs->setDefaultLang($newlang);
1552 $desc = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1554 $desc = $prod->description;
1566 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1570 $outputlangs = $langs;
1572 if (
GETPOST(
'lang_id',
'alpha')) {
1573 $newlang =
GETPOST(
'lang_id',
'alpha');
1575 if (empty($newlang)) {
1576 $newlang =
$object->thirdparty->default_lang;
1578 if (!empty($newlang)) {
1579 $outputlangs =
new Translate(
"", $conf);
1580 $outputlangs->setDefaultLang($newlang);
1581 $outputlangs->load(
'products');
1583 if (!empty($prod->customcode)) {
1584 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode") .
': ' . $prod->customcode;
1586 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1589 if (!empty($prod->country_code)) {
1590 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry($prod->country_code,
'', $db, $outputlangs, 0);
1593 if (!empty($prod->customcode)) {
1594 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode") .
': ' . $prod->customcode;
1596 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1599 if (!empty($prod->country_code)) {
1600 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry($prod->country_code,
'', $db, $langs, 0);
1607 $type = $prod->type;
1608 $fk_unit = $prod->fk_unit;
1612 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1613 $tva_tx = str_replace(
'*',
'', $tva_tx);
1614 if (empty($tva_tx)) {
1617 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1620 $fk_unit =
GETPOST(
'units',
'alpha');
1621 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1622 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1624 if ($pu_ttc && !$pu_ht) {
1625 $price_base_type =
'TTC';
1639 $fournprice = (int) (
GETPOST(
'fournprice' . $predef) ?
GETPOST(
'fournprice' . $predef) :
'');
1640 $buyingprice =
price2num((
GETPOST(
'buying_price' . $predef) !=
'' ?
GETPOST(
'buying_price' . $predef) :
''),
'', 2);
1646 $pu_equivalent = $pu_ht;
1647 $pu_equivalent_ttc = $pu_ttc;
1648 $currency_tx =
$object->multicurrency_tx;
1652 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1653 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1655 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1656 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1676 if ($usermustrespectpricemin) {
1677 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1678 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1681 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) < (
float)
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1682 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1690 $result =
$object->addline($desc, $pu_ht, (
float) $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $pu_ttc, $info_bits, $type, min($rank, count(
$object->lines) + 1), 0,
GETPOSTINT(
'fk_parent_line'), (
int) $fournprice, $buyingprice, $label, $date_start, $date_end, $array_options, $fk_unit,
'', 0, (
float) $pu_ht_devise);
1702 $outputlangs = $langs;
1703 $newlang =
GETPOST(
'lang_id',
'alpha');
1705 $newlang =
$object->thirdparty->default_lang;
1707 if (!empty($newlang)) {
1708 $outputlangs =
new Translate(
"", $conf);
1709 $outputlangs->setDefaultLang($newlang);
1711 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1714 unset($_POST[
'prod_entry_mode']);
1716 unset($_POST[
'qty']);
1717 unset($_POST[
'type']);
1718 unset($_POST[
'remise_percent']);
1719 unset($_POST[
'price_ht']);
1720 unset($_POST[
'multicurrency_price_ht']);
1721 unset($_POST[
'price_ttc']);
1722 unset($_POST[
'tva_tx']);
1723 unset($_POST[
'product_ref']);
1724 unset($_POST[
'product_label']);
1725 unset($_POST[
'product_desc']);
1726 unset($_POST[
'fournprice']);
1727 unset($_POST[
'buying_price']);
1728 unset($_POST[
'np_marginRate']);
1729 unset($_POST[
'np_markRate']);
1730 unset($_POST[
'dp_desc']);
1731 unset($_POST[
'idprod']);
1732 unset($_POST[
'units']);
1734 unset($_POST[
'date_starthour']);
1735 unset($_POST[
'date_startmin']);
1736 unset($_POST[
'date_startsec']);
1737 unset($_POST[
'date_startday']);
1738 unset($_POST[
'date_startmonth']);
1739 unset($_POST[
'date_startyear']);
1740 unset($_POST[
'date_endhour']);
1741 unset($_POST[
'date_endmin']);
1742 unset($_POST[
'date_endsec']);
1743 unset($_POST[
'date_endday']);
1744 unset($_POST[
'date_endmonth']);
1745 unset($_POST[
'date_endyear']);
1753 } elseif ($action ==
'addline' && $usercancreate && (
1754 (
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'') ||
1755 (
GETPOST(
'submitforallmark',
'alpha') &&
GETPOST(
'markforalllines',
'alpha') !==
''))) {
1758 $margin_rate = GETPOSTISSET(
'marginforalllines') ?
GETPOST(
'marginforalllines',
'int') :
'';
1759 $mark_rate = GETPOSTISSET(
'markforalllines') ?
GETPOST(
'markforalllines',
'int') :
'';
1760 foreach (
$object->lines as &$line)
if ($line->subprice > 0) {
1761 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1764 $subprice_multicurrency = $line->subprice;
1765 if (is_numeric($margin_rate) && $margin_rate > 0) {
1766 $line->subprice = (float)
price2num((
float) $line->pa_ht * (1 + (float) $margin_rate / 100),
'MU');
1767 } elseif (is_numeric($mark_rate) && $mark_rate > 0) {
1768 $line->subprice = (float) ($line->pa_ht / (1 - ((
float) $mark_rate / 100)));
1770 $line->subprice = (float) $line->pa_ht;
1774 $res = $prod->fetch($line->fk_product);
1776 if ($prod->price_min > $line->subprice) {
1777 $price_subprice =
price($line->subprice, 0, $outlangs, 1, -1, -1,
'auto');
1778 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1779 setEventMessages($prod->ref .
' - ' . $prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1788 $multicurrency_subprice = (float) $line->subprice * $line->multicurrency_subprice / $subprice_multicurrency;
1790 $result =
$object->updateline($line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $multicurrency_subprice);
1793 if (is_numeric($margin_rate) && empty($mark_rate)) {
1794 $line->marge_tx = $margin_rate;
1795 } elseif (is_numeric($mark_rate) && empty($margin_rate)) {
1796 $line->marque_tx = $mark_rate;
1798 $line->total_ht = $line->qty * (float) $line->subprice;
1799 $line->total_tva = $line->tva_tx * $line->qty * (float) $line->subprice;
1800 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $line->subprice;
1802 $line->multicurrency_total_ht = $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1803 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1804 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1806 $line->multicurrency_subprice = $multicurrency_subprice;
1811 } elseif ($action ==
'updatetitleline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1814 $langs->load(
'subtotals');
1816 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1819 $subtotal_options = array();
1821 foreach (Propal::$TITLE_OPTIONS as $option) {
1822 $value =
GETPOST($option,
'alphanohtml');
1824 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1829 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1840 $outputlangs = $langs;
1841 $newlang =
GETPOST(
'lang_id',
'alpha');
1843 $newlang =
$object->thirdparty->default_lang;
1845 if (!empty($newlang)) {
1846 $outputlangs =
new Translate(
"", $conf);
1847 $outputlangs->setDefaultLang($newlang);
1850 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1855 } elseif ($action ==
'updatesubtotalline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1858 $langs->load(
'subtotals');
1860 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1863 $subtotal_options = array();
1865 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1866 $value =
GETPOST($option,
'alphanohtml');
1868 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1873 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1881 $outputlangs = $langs;
1882 $newlang =
GETPOST(
'lang_id',
'alpha');
1884 $newlang =
$object->thirdparty->default_lang;
1886 if (!empty($newlang)) {
1887 $outputlangs =
new Translate(
"", $conf);
1888 $outputlangs->setDefaultLang($newlang);
1891 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1896 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1904 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1909 $vat_rate = (
GETPOST(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : 0);
1910 $vat_rate = str_replace(
'*',
'', $vat_rate);
1917 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
1927 if (empty($remise_percent)) {
1928 $remise_percent = 0;
1932 $pu_equivalent = $pu_ht;
1933 $pu_equivalent_ttc = $pu_ttc;
1935 $currency_tx =
$object->multicurrency_tx;
1939 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1940 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1942 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1943 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1958 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1959 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1961 if (is_array($extralabelsline)) {
1963 foreach ($extralabelsline as $key => $value) {
1964 unset($_POST[
"options_" . $key]);
1975 $price_base_type =
'HT';
1976 if (empty($pu) && !empty($pu_ttc)) {
1978 $price_base_type =
'TTC';
1983 if (!empty($productid)) {
1985 $res = $product->fetch($productid);
1987 $type = $product->type;
1991 $price_min = $product->price_min;
1993 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1995 $price_min_ttc = $product->price_min_ttc;
1997 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
2004 if ($usermustrespectpricemin) {
2005 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
2006 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2009 $action =
'editline';
2010 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - (
float) $remise_percent / 100)) < (
float)
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
2011 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2014 $action =
'editline';
2019 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2023 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
2031 if (!$user->hasRight(
'margins',
'creer')) {
2032 foreach (
$object->lines as &$line) {
2034 $fournprice = $line->fk_fournprice;
2035 $buyingprice = (string) $line->pa_ht;
2043 $result =
$object->updateline(
GETPOSTINT(
'lineid'), (
float) $pu, (
float) $qty, $remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $description, $price_base_type, $info_bits, $special_code,
GETPOSTINT(
'fk_parent_line'), 0, (
int) $fournprice, $buyingprice, $label, $type, $date_start, $date_end, $array_options,
GETPOSTINT(
"units"), (
float) $pu_ht_devise);
2050 $outputlangs = $langs;
2052 $outputlangs =
new Translate(
"", $conf);
2053 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
2054 $outputlangs->setDefaultLang($newlang);
2060 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2063 unset($_POST[
'qty']);
2064 unset($_POST[
'type']);
2065 unset($_POST[
'productid']);
2066 unset($_POST[
'remise_percent']);
2067 unset($_POST[
'price_ht']);
2068 unset($_POST[
'multicurrency_price_ht']);
2069 unset($_POST[
'price_ttc']);
2070 unset($_POST[
'tva_tx']);
2071 unset($_POST[
'product_ref']);
2072 unset($_POST[
'product_label']);
2073 unset($_POST[
'product_desc']);
2074 unset($_POST[
'fournprice']);
2075 unset($_POST[
'buying_price']);
2077 unset($_POST[
'date_starthour']);
2078 unset($_POST[
'date_startmin']);
2079 unset($_POST[
'date_startsec']);
2080 unset($_POST[
'date_startday']);
2081 unset($_POST[
'date_startmonth']);
2082 unset($_POST[
'date_startyear']);
2083 unset($_POST[
'date_endhour']);
2084 unset($_POST[
'date_endmin']);
2085 unset($_POST[
'date_endsec']);
2086 unset($_POST[
'date_endday']);
2087 unset($_POST[
'date_endmonth']);
2088 unset($_POST[
'date_endyear']);
2095 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
2096 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
2098 } elseif ($action ==
'classin' && $usercancreate) {
2101 } elseif ($action ==
'setavailability' && $usercancreate) {
2104 } elseif ($action ==
'setdemandreason' && $usercancreate) {
2107 } elseif ($action ==
'setconditions' && $usercancreate) {
2110 } elseif ($action ==
'setmode' && $usercancreate) {
2113 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
2115 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
2116 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
2119 } elseif ($action ==
'setbankaccount' && $usercancreate) {
2122 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
2125 } elseif ($action ==
'setwarehouse' && $usercancreate) {
2128 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
2131 $attribute_name =
GETPOST(
'attribute',
'aZ09');
2134 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
2139 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
2146 $action =
'edit_extras';
2151 if ($action ==
'addcontact' && $usercancreate) {
2155 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2159 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2162 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2163 $langs->load(
"errors");
2164 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
2169 } elseif ($action ==
'swapstatut' && $usercancreate) {
2171 if (
$object->fetch($id) > 0) {
2176 } elseif ($action ==
'deletecontact' && $usercancreate) {
2179 $result =
$object->delete_contact($lineid);
2182 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2191 $upload_dir = !empty($conf->propal->multidir_output[
$object->entity ?? $conf->entity]) ? $conf->propal->multidir_output[
$object->entity ?? $conf->entity] : $conf->propal->dir_output;
2192 $permissiontoadd = $usercancreate;
2193 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
2201$form =
new Form($db);
2210$title =
$object->ref .
" - " . $langs->trans(
'Card');
2211if ($action ==
'create') {
2212 $title = $langs->trans(
"NewPropal");
2214$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
2221if ($action ==
'create') {
2228 $res = $soc->fetch($socid);
2231 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2232 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2233 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2239 if (!empty($origin) && !empty($originid)) {
2241 $element = $subelement = $origin;
2243 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2244 $element = $regs[1];
2245 $subelement = $regs[2];
2248 if ($element ==
'project') {
2249 $projectid = $originid;
2253 $project->fetch($projectid);
2254 if ($project->socid > 0) {
2256 $soc->fetch($project->socid);
2260 if ($element ==
'order' || $element ==
'commande') {
2261 $element = $subelement =
'commande';
2263 if ($element ==
'propal') {
2264 $element =
'comm/propal';
2265 $subelement =
'propal';
2267 if ($element ==
'contract') {
2268 $element = $subelement =
'contrat';
2270 if ($element ==
'shipping') {
2271 $element = $subelement =
'expedition';
2276 $classname = ucfirst($subelement);
2277 $objectsrc =
new $classname($db);
2278 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
2280 $objectsrc->fetch($originid);
2281 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2282 $objectsrc->fetch_lines();
2284 $objectsrc->fetch_thirdparty();
2286 $projectid = (int) $objectsrc->fk_project;
2287 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
2289 $soc = $objectsrc->thirdparty;
2291 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2292 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2293 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : -1));
2296 $objectsrc->fetch_optionals();
2297 $object->array_options = $objectsrc->array_options;
2300 if (!empty($objectsrc->multicurrency_code)) {
2301 $currency_code = $objectsrc->multicurrency_code;
2303 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2304 $currency_tx = $objectsrc->multicurrency_tx;
2312 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
2313 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
2314 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
2315 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
2316 $shipping_method_id = $soc->shipping_method_id;
2317 $warehouse_id = !empty($soc->fk_warehouse) ? $soc->fk_warehouse : $warehouse_id;
2318 $remise_percent = $soc->remise_percent;
2320 if (
isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
2321 $currency_code = $soc->multicurrency_code;
2326 if (!
GETPOST(
'changecompany')) {
2327 if (GETPOSTISSET(
'cond_reglement_id')) {
2328 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2330 if (GETPOSTISSET(
'deposit_percent')) {
2333 if (GETPOSTISSET(
'mode_reglement_id')) {
2334 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2336 if (GETPOSTISSET(
'fk_account')) {
2341 if ($soc->fk_warehouse > 0) {
2342 $warehouse_id = $soc->fk_warehouse;
2349 $warehouse_id = $user->fk_warehouse;
2353 print
'<form name="addprop" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
2354 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2355 print
'<input type="hidden" name="action" value="add">';
2356 print
'<input type="hidden" name="changecompany" value="0">';
2357 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
2358 if ($origin !=
'project' && $originid) {
2359 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
2360 print
'<input type="hidden" name="originid" value="' . $originid .
'">';
2361 if ($origin ==
'contrat' && !empty($renewal)) {
2362 print
'<input type="hidden" name="renewal" value="' . $renewal .
'">';
2364 } elseif ($origin ==
'project' && !empty($projectid)) {
2365 print
'<input type="hidden" name="projectid" value="' . $projectid .
'">';
2371 $parameters = array();
2373 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters, $object, $action);
2374 if (empty($reshook)) {
2375 print
'<table class="border centpercent">';
2378 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Ref') .
'</td><td class="valuefieldcreate">' . $langs->trans(
"Draft") .
'</td></tr>';
2381 print
'<tr class="field_ref_client"><td class="titlefieldcreate">' . $langs->trans(
'RefCustomer') .
'</td><td class="valuefieldcreate">';
2382 print
'<input type="text" name="ref_client" value="' . (!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')) .
'"></td>';
2386 print
'<tr class="field_socid">';
2388 print
'<td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Customer') .
'</td>';
2389 $shipping_method_id = 0;
2393 print
'<td class="valuefieldcreate">';
2394 print $soc->getNomUrl(1,
'customer');
2395 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
2397 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2398 $shipping_method_id = $soc->shipping_method_id;
2401 print
'<td class="valuefieldcreate">';
2402 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2403 print
img_picto(
'',
'company',
'class="pictofixedwidth"') . $form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2407 $(document).ready(function() {
2408 $("#socid").change(function() {
2409 console.log("We have changed the company - Reload page");
2410 var socid = $(this).val();
2412 $("input[name=action]").val("create");
2413 $("input[name=changecompany]").val("1");
2414 $("form[name=addprop]").submit();
2419 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>';
2422 print
'</tr>' .
"\n";
2426 print
'<tr class="field_contactid"><td class="titlefieldcreate">' . $langs->trans(
"DefaultContact") .
'</td><td class="valuefieldcreate">';
2427 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2429 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2433 print
'<tr class="field_discount_info"><td class="titlefieldcreate">' . $langs->trans(
'Discounts') .
'</td><td class="valuefieldcreate">';
2435 $absolute_discount = $soc->getAvailableDiscounts();
2439 $backtopage = $_SERVER[
"PHP_SELF"] .
'?socid=' . $thirdparty->id .
'&action=' . $action .
'&origin=' . urlencode((
string) (
GETPOST(
'origin'))) .
'&originid=' . urlencode((
string) (
GETPOSTINT(
'originid')));
2440 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
2446 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'DatePropal') .
'</td><td class="valuefieldcreate">';
2447 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2448 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2452 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>';
2455 print
'<tr class="field_cond_reglement_id"><td class="nowrap">' . $langs->trans(
'PaymentConditionsShort') .
'</td><td>';
2456 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2458 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2462 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">' . $langs->trans(
'PaymentMode') .
'</td><td class="valuefieldcreate">';
2463 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2464 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2469 print
'<tr class="field_fk_account"><td class="titlefieldcreate">' . $langs->trans(
'BankAccount') .
'</td><td class="valuefieldcreate">';
2470 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"') . $form->select_comptes((
int) $fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2475 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">' . $langs->trans(
'Source') .
'</td><td class="valuefieldcreate">';
2476 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2477 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2482 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2483 $shipping_method_id = $soc->shipping_method_id;
2485 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">' . $langs->trans(
'SendingMethod') .
'</td><td class="valuefieldcreate">';
2486 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2487 $form->selectShippingMethod((
string) (GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2491 $formproduct =
null;
2494 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
2496 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">' . $langs->trans(
'Warehouse') .
'</td><td class="valuefieldcreate">';
2497 print
img_picto(
'',
'stock',
'class="pictofixedwidth"') . $formproduct->selectWarehouses((
int) $warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2502 print
'<tr class="field_availability_id"><td class="titlefieldcreate">' . $langs->trans(
'AvailabilityPeriod');
2504 print
' (' . $langs->trans(
'AfterOrder') .
')';
2506 print
'</td><td class="valuefieldcreate">';
2507 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2508 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2512 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">' . $langs->trans(
"DeliveryDate") .
'</td>';
2513 print
'<td class="valuefieldcreate">';
2514 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2516 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2517 $syear =
date(
"Y", $tmpdte);
2518 $smonth =
date(
"m", $tmpdte);
2519 $sday =
date(
"d", $tmpdte);
2520 print $form->selectDate($syear .
"-" . $smonth .
"-" . $sday,
'date_livraison', 0, 0, 0,
"addprop");
2522 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2523 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2528 if (
isModEnabled(
'project') && is_object($formproject)) {
2529 $langs->load(
"projects");
2530 print
'<tr class="field_projectid">';
2531 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2532 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');
2533 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>';
2540 print
'<tr class="field_incoterm_id">';
2541 print
'<td class="titlefieldcreate"><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1) .
'</label></td>';
2542 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2543 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2544 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2549 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td colspan="3">';
2550 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
2554 print
'<tr class="field_model">';
2555 print
'<td class="titlefieldcreate">' . $langs->trans(
"DefaultModel") .
'</td>';
2556 print
'<td class="valuefieldcreate">';
2557 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2560 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2565 print
'<tr class="field_currency">';
2566 print
'<td class="titlefieldcreate">' . $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0) .
'</td>';
2567 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2568 print
img_picto(
'',
'currency',
'class="pictofixedwidth"') . $form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2573 print
'<tr class="field_note_public">';
2574 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePublic') .
'</td>';
2575 print
'<td class="valuefieldcreate">';
2576 $note_public =
GETPOST(
'note_public',
'restricthtml');
2577 if (!GETPOSTISSET(
'note_public') && empty($note_public) && !empty($objectsrc)) {
2578 $note_public = $objectsrc->note_public;
2580 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2581 print $doleditor->Create(1);
2584 if (empty($user->socid)) {
2585 print
'<tr class="field_note_private">';
2586 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePrivate') .
'</td>';
2587 print
'<td class="valuefieldcreate">';
2588 $note_private =
GETPOST(
'note_private',
'restricthtml');
2589 if (!GETPOSTISSET(
'note_private') && empty($note_private) && !empty($objectsrc)) {
2590 $note_private = $objectsrc->note_private;
2592 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2593 print $doleditor->Create(1);
2599 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_add.tpl.php';
2602 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2604 if ($origin ==
'contrat') {
2608 $objectsrc->update_price(1,
'auto', 1);
2611 print
"\n<!-- " . $classname .
" info -->";
2613 print
'<input type="hidden" name="amount" value="' . $objectsrc->total_ht .
'">' .
"\n";
2614 print
'<input type="hidden" name="total" value="' . $objectsrc->total_ttc .
'">' .
"\n";
2615 print
'<input type="hidden" name="tva" value="' . $objectsrc->total_tva .
'">' .
"\n";
2616 print
'<input type="hidden" name="origin" value="' . $objectsrc->element .
'">';
2617 print
'<input type="hidden" name="originid" value="' . $objectsrc->id .
'">';
2619 $newclassname = $classname;
2620 if ($newclassname ==
'Propal') {
2621 $newclassname =
'CommercialProposal';
2622 } elseif ($newclassname ==
'Commande') {
2623 $newclassname =
'Order';
2624 } elseif ($newclassname ==
'Expedition') {
2625 $newclassname =
'Sending';
2626 } elseif ($newclassname ==
'Fichinter') {
2627 $newclassname =
'Intervention';
2630 print
'<tr><td>' . $langs->trans($newclassname) .
'</td><td>' . $objectsrc->getNomUrl(1) .
'</td></tr>';
2631 print
'<tr><td>' . $langs->trans(
'AmountHT') .
'</td><td>' .
price($objectsrc->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td></tr>';
2632 print
'<tr><td>' . $langs->trans(
'AmountVAT') .
'</td><td>' .
price($objectsrc->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2633 if (
$mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2634 print
'<tr><td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2637 if (
$mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2638 print
'<tr><td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2640 print
'<tr><td>' . $langs->trans(
'AmountTTC') .
'</td><td>' .
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2643 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountHT') .
'</td><td>' .
price($objectsrc->multicurrency_total_ht) .
'</td></tr>';
2644 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountVAT') .
'</td><td>' .
price($objectsrc->multicurrency_total_tva) .
"</td></tr>";
2645 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountTTC') .
'</td><td>' .
price($objectsrc->multicurrency_total_ttc) .
"</td></tr>";
2657 print
'<input type="hidden" name="createmode" value="empty">';
2661 print
'<br><table>';
2665 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2666 print
'<td>' . $langs->trans(
"CopyPropalFrom") .
' </td>';
2668 $liste_propal = array();
2669 $liste_propal[0] =
'';
2671 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2672 $sql .=
" FROM " . MAIN_DB_PREFIX .
"propal p";
2673 $sql .=
", " . MAIN_DB_PREFIX .
"societe s";
2674 $sql .=
" WHERE s.rowid = p.fk_soc";
2675 $sql .=
" AND p.entity IN (" .
getEntity(
'propal') .
")";
2676 $sql .=
" AND p.fk_statut <> 0";
2677 $sql .=
" ORDER BY Id";
2679 $resql = $db->query($sql);
2681 $num = $db->num_rows($resql);
2684 $row = $db->fetch_row($resql);
2685 $propalRefAndSocName = $row[1] .
" - " . $row[2];
2686 $liste_propal[$row[0]] = $propalRefAndSocName;
2689 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2695 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2696 print
'<td valign="top" colspan="2">' . $langs->trans(
"CreateEmptyPropal") .
'</td></tr>';
2703 $langs->load(
"bills");
2705 print $form->buttonsSaveCancel(
"CreateDraft");
2711 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2714 $title = $langs->trans(
'ProductsAndServices');
2717 print
'<div class="div-table-responsive-no-min">';
2718 print
'<table class="noborder centpercent">';
2720 $objectsrc->printOriginLinesList();
2737 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
$object->picto, 0,
'',
'', 0,
'', 1);
2742 if ($action ==
'clone') {
2744 $filter =
'(s.client:IN:1,2,3)';
2745 $formquestion = array(
2748 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2749 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2750 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2753 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2756 $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);
2760 if ($action ==
'add_title_line') {
2761 $langs->load(
'subtotals');
2763 $depth_array =
$object->getPossibleLevels($langs);
2765 } elseif ($action ==
'add_subtotal_line') {
2766 $langs->load(
'subtotals');
2768 $titles =
$object->getPossibleTitles();
2772 if ($action ==
'closeas') {
2774 $formquestion = array();
2776 $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)));
2778 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2780 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2785 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2787 if (!empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2788 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2792 $eligibleForDepositGeneration =
true;
2794 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2795 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2796 '@phan-var-force Facture $invoice';
2799 $eligibleForDepositGeneration =
false;
2805 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2806 foreach (
$object->linkedObjects[
'commande'] as $order) {
2807 $order->fetchObjectLinked();
2809 if (array_key_exists(
'facture', $order->linkedObjects)) {
2810 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2811 '@phan-var-force Facture $invoice';
2814 $eligibleForDepositGeneration =
false;
2823 if ($eligibleForDepositGeneration) {
2824 $formquestion[] = array(
2825 'type' =>
'checkbox',
2826 'tdclass' =>
'showonlyifsigned',
2827 'name' =>
'generate_deposit',
2828 'morecss' =>
'margintoponly marginbottomonly',
2829 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2832 $formquestion[] = array(
2834 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2836 'label' => $langs->trans(
'DateInvoice'),
2842 $formquestion[] = array(
2844 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2845 'name' =>
'date_pointoftax',
2846 'label' => $langs->trans(
'DatePointOfTax'),
2852 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2854 $formquestion[] = array(
2856 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2857 'name' =>
'cond_reglement_id',
2858 'label' => $langs->trans(
'PaymentTerm'),
2859 'value' => $paymentTermsSelect
2862 $formquestion[] = array(
2863 'type' =>
'checkbox',
2864 'tdclass' =>
'showonlyifgeneratedeposit',
2865 'name' =>
'validate_generated_deposit',
2866 'morecss' =>
'margintoponly marginbottomonly',
2867 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2870 $formquestion[] = array(
2871 'type' =>
'onecolumn',
2874 let signedValue = ' . $object::STATUS_SIGNED .
';
2876 $(document).ready(function() {
2877 $("[name=generate_deposit]").change(function () {
2878 let $self = $(this);
2879 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2881 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2890 $("#statut").change(function() {
2891 let $target = $(".showonlyifsigned").parent(".tagtr");
2893 if ($(this).val() == signedValue) {
2899 $("[name=generate_deposit]").trigger("change");
2904 $("#statut").trigger("change");
2914 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2915 $notify =
new Notify($db);
2916 $formquestion = array_merge($formquestion, array(
2917 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid, $object)),
2922 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2924 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2926 } elseif ($action ==
'cancel') {
2928 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2929 } elseif ($action ==
'delete') {
2931 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2932 } elseif ($action ==
'reopen') {
2934 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2935 } elseif ($action ==
'ask_deleteline') {
2937 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2938 } elseif ($action ==
'ask_subtotal_deleteline') {
2940 $langs->load(
"subtotals");
2941 $title =
"DeleteSubtotalLine";
2942 $question =
"ConfirmDeleteSubtotalLine";
2943 if (
GETPOST(
'type') ==
'title') {
2944 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2945 $title =
"DeleteTitleLine";
2946 $question =
"ConfirmDeleteTitleLine";
2948 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2949 } elseif ($action ==
'validate') {
2954 $ref = substr(
$object->ref, 1, 4);
2955 if ($ref ==
'PROV' || $ref ==
'') {
2956 $numref =
$object->getNextNumRef($soc);
2957 if (empty($numref)) {
2962 $numref = (string)
$object->ref;
2965 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2967 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2968 $notify =
new Notify($db);
2970 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid, $object);
2975 foreach (
$object->lines as $line) {
2976 $res = $line->fetch_product();
2978 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2984 if ($nbMandated > 0) {
2986 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2989 $text .=
'<div><span class="clearboth nowraponall warning">' .
img_warning() . $langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate") .
'</span></div>';
2994 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2999 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
3000 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
3001 if (empty($reshook)) {
3002 $formconfirm .= $hookmanager->resPrint;
3003 } elseif ($reshook > 0) {
3004 $formconfirm = $hookmanager->resPrint;
3013 $linkback =
'<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
3015 $morehtmlref =
'<div class="refidno">';
3017 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client, $object, $usercancreate,
'string',
'', 0, 1);
3018 $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);
3020 $morehtmlref .=
'<br>' . $soc->getNomUrl(1,
'customer');
3022 $morehtmlref .=
' (<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?socid=' . $soc->id .
'&search_societe=' . urlencode($soc->name) .
'">' . $langs->trans(
"OtherProposals") .
'</a>)';
3026 $langs->load(
"projects");
3027 $morehtmlref .=
'<br>';
3028 if ($usercancreate) {
3029 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
3030 if ($action !=
'classify') {
3031 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
3033 $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');
3035 if (!empty(
$object->fk_project)) {
3037 $proj->fetch(
$object->fk_project);
3038 $morehtmlref .= $proj->getNomUrl(1);
3040 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
3045 $morehtmlref .=
'</div>';
3048 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
3051 $parameters = array();
3053 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters, $object, $action);
3054 if (empty($reshook)) {
3055 print
'<div class="fichecenter">';
3056 print
'<div class="fichehalfleft">';
3057 print
'<div class="underbanner clearboth"></div>';
3059 print
'<table class="border tableforfield centpercent">';
3063 $filterabsolutediscount =
"fk_facture_source IS NULL";
3064 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3066 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3067 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3070 print
'<tr><td class="titlefieldmax45">' . $langs->trans(
'Discounts') .
'</td><td>';
3072 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3073 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3074 $absolute_discount =
price2num($absolute_discount,
'MT');
3075 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3081 $backtopage = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id;
3082 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
3098 print $form->editfieldkey(
"DatePropal",
'date',
'', $object, (
int) $editenable);
3099 print
'</td><td class="valuefield">';
3100 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3101 print
'<form name="editdate" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3102 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3103 print
'<input type="hidden" name="action" value="setdate">';
3104 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3105 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3106 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3120 print
'<table class="nobordernopadding centpercent"><tr><td>';
3121 print $langs->trans(
'DateEndPropal');
3123 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3124 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>';
3126 print
'</tr></table>';
3127 print
'</td><td class="valuefield">';
3128 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3129 print
'<form name="editecheance" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3130 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3131 print
'<input type="hidden" name="action" value="setecheance">';
3132 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3133 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3134 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3137 if (!empty(
$object->fin_validite)) {
3151 print
'<table class="nobordernopadding centpercent"><tr><td>';
3152 print $langs->trans(
'PaymentConditionsShort');
3154 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3155 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>';
3157 print
'</tr></table>';
3158 print
'</td><td class="valuefield">';
3159 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3160 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3162 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3168 print
'<tr class="field_mode_reglement_id">';
3170 print
'<table class="nobordernopadding centpercent"><tr><td>';
3171 print $langs->trans(
'PaymentMode');
3173 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3174 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>';
3176 print
'</tr></table>';
3177 print
'</td><td class="valuefieldcreate">';
3178 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3179 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3181 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'none');
3187 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3188 print
'</td><td class="valuefieldedit">';
3189 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, $usercancreate && $caneditfield,
'datepicker');
3194 print
'<tr class="fielddeliverydelay"><td>';
3195 print
'<table class="nobordernopadding centpercent"><tr><td>';
3197 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod') .
' (' . $langs->trans(
'AfterOrder') .
')');
3199 print $langs->trans(
'AvailabilityPeriod');
3202 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3203 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>';
3205 print
'</tr></table>';
3206 print
'</td><td class="valuefield">';
3207 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3208 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'availability_id', 1);
3210 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'none', 1);
3219 print
'<table class="nobordernopadding centpercent"><tr><td>';
3220 print $langs->trans(
'SendingMethod');
3222 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3223 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>';
3225 print
'</tr></table>';
3226 print
'</td><td class="valuefield">';
3227 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3228 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3230 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'none');
3238 $langs->load(
'stocks');
3239 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
3241 print
'<tr class="field_warehouse_id"><td>';
3242 $editenable = $usercancreate;
3243 print $form->editfieldkey(
"Warehouse",
'warehouse',
'', $object, $editenable);
3244 print
'</td><td class="valuefieldcreate">';
3245 if ($action ==
'editwarehouse') {
3246 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3248 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'none');
3256 print
'<table class="nobordernopadding centpercent"><tr><td>';
3257 print $langs->trans(
'Source');
3259 if ($action !=
'editdemandreason' && $usercancreate) {
3260 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>';
3262 print
'</tr></table>';
3263 print
'</td><td class="valuefield">';
3264 if ($action ==
'editdemandreason' && $usercancreate) {
3265 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3267 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'none');
3272 if ($soc->outstanding_limit) {
3275 print $langs->trans(
'OutstandingBill');
3276 print
'</td><td class="valuefield">';
3277 $arrayoutstandingbills = $soc->getOutstandingBills();
3278 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
3279 print
price($arrayoutstandingbills[
'opened']) .
' / ';
3280 print
price($soc->outstanding_limit, 0, $langs, 1, -1, -1, $conf->currency);
3288 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3289 print $langs->trans(
'BankAccount');
3291 if ($action !=
'editbankaccount' && $usercancreate) {
3292 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>';
3294 print
'</tr></table>';
3295 print
'</td><td class="valuefield">';
3296 if ($action ==
'editbankaccount') {
3297 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3299 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'none');
3306 $tmparray =
$object->getTotalWeightVolume();
3307 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3308 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3310 print
'<tr><td>' . $langs->trans(
"CalculatedWeight") .
'</td>';
3311 print
'<td class="valuefield">';
3316 print
'<tr><td>' . $langs->trans(
"CalculatedVolume") .
'</td>';
3317 print
'<td class="valuefield">';
3326 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3327 print $langs->trans(
'IncotermLabel');
3328 print
'<td><td class="right">';
3329 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3330 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' .
img_edit() .
'</a>';
3334 print
'</td></tr></table>';
3336 print
'<td class="valuefield">';
3337 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3338 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3340 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3348 print
'<table class="nobordernopadding centpercent"><tr><td>';
3349 print $langs->trans(
"Categories");
3350 print
'<td><td class="right">';
3351 if ($usercancreate) {
3352 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=edittags&token='.
newToken().
'">'.
img_edit().
'</a>';
3356 print
'</td></tr></table>';
3359 if ($action ==
'edittags') {
3360 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'">';
3361 print
'<input type="hidden" name="action" value="settags">';
3362 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3363 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
3364 print
'<input type="submit" class="button valignmiddle smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
3367 print $form->showCategories(
$object->id, Categorie::TYPE_PROPOSAL, 1);
3373 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3378 print
'<div class="fichehalfright">';
3379 print
'<div class="underbanner clearboth"></div>';
3381 print
'<table class="border tableforfield centpercent">';
3383 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_currency_amount.tpl.php';
3386 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3387 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3389 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3394 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3395 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3397 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3401 if (
$mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3403 print
'<td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td>';
3404 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3408 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3413 if (
$mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3415 print
'<td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td>';
3416 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3420 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3426 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3427 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3429 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3437 $formmargin->displayMarginInfos($object);
3443 print
'<div class="clearboth"></div><br>';
3446 $blocname =
'contacts';
3447 $title = $langs->trans(
'ContactsAddresses');
3448 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3452 $blocname =
'notes';
3453 $title = $langs->trans(
'Notes');
3454 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3462 $result =
$object->getLinesArray();
3466 global $inputalsopricewithtax;
3467 $inputalsopricewithtax = 1;
3469 print
' <form name="addproduct" id="addproduct" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="POST">
3470 <input type="hidden" name="token" value="' .
newToken() .
'">
3471 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline') .
'">
3472 <input type="hidden" name="mode" value="">
3473 <input type="hidden" name="page_y" value="">
3474 <input type="hidden" name="backtopage" value="' . $backtopage .
'">
3475 <input type="hidden" name="id" value="' .
$object->id .
'">
3480 include DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_ajaxrow.tpl.php';
3482 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3486 print
'<div class="div-table-responsive-no-min">';
3488 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3497 if ($action !=
'editline') {
3498 $parameters = array();
3499 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3503 if (empty($reshook)) {
3507 $parameters = array();
3508 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters, $object, $action);
3527 if ($action !=
'presend') {
3528 $numlines = count(
$object->lines);
3529 print
'<div class="tabsAction">';
3531 $parameters = array();
3532 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3534 if (empty($reshook)) {
3535 if ($action !=
'editline') {
3539 $langs->load(
'subtotals');
3541 $url_button = array();
3543 $url_button[] = array(
3544 'lang' =>
'subtotals',
3546 'perm' => (
bool) $usercancreate,
3547 'label' => $langs->trans(
'AddTitleLine'),
3548 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_title_line&token=' .
newToken()
3551 $url_button[] = array(
3552 'lang' =>
'subtotals',
3554 'perm' => (
bool) $usercancreate,
3555 'label' => $langs->trans(
'AddSubtotalLine'),
3556 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_subtotal_line&token=' .
newToken()
3559 print
dolGetButtonAction(
'', $langs->trans(
'Subtotal'),
'default', $url_button,
'',
true);
3566 if ($usercanvalidate) {
3567 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>';
3569 print
'<a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
'Validate') .
'</a>';
3579 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=modif&token=' .
newToken() .
'">' . $langs->trans(
'Modify') .
'</a>';
3584 if ($usercanreopen) {
3585 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=reopen&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen') .
'"';
3586 print
'>' . $langs->trans(
'ReOpen') .
'</a>';
3588 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ReOpen") .
'</a>';
3593 if (empty($user->socid)) {
3595 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'', $usercansend);
3599 $arrayforbutaction = array();
3602 $arrayforbutaction[] = array(
3605 'perm' => $usercancreateorder,
3606 'label' =>
'AddOrder',
3607 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3617 $arrayforbutaction[] = array(
3620 'perm' => $usercancreatepurchaseorder,
3621 'label' =>
'AddPurchaseOrder',
3622 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3632 $arrayforbutaction[] = array(
3633 'lang' =>
'interventions',
3635 'perm' => $usercancreateintervention,
3636 'label' =>
'AddIntervention',
3637 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3647 $arrayforbutaction[] = array(
3648 'lang' =>
'contracts',
3650 'perm' => $usercancreatecontract,
3651 'label' =>
'AddContract',
3652 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3664 $arrayforbutaction[] = [
3665 'lang' =>
'invoice',
3667 'perm' => $usercancreateinvoice,
3668 'label' =>
'CreateBill',
3669 'url' =>
'/compta/facture/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((int)
$object->id) .
'&socid=' . ((int)
$object->socid),
3676 $actionButtonsParameters = [
3677 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3678 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3681 if ($numlines > 0) {
3682 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3684 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3688 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3689 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3690 if ($usercanclose) {
3691 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=classifybilled&token=' .
newToken() .
'&socid=' .
$object->socid .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3693 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3701 if ($usercanclose) {
3702 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3703 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3705 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'"';
3706 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3712 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token=' .
newToken() .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3713 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3719 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=cancel&token=' .
newToken() .
'">' . $langs->trans(
"CancelPropal") .
'</a>';
3723 if ($usercancreate) {
3724 print
'<a class="butAction" href="' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id .
'&socid=' .
$object->socid .
'&action=clone&token=' .
newToken() .
'&object=' .
$object->element .
'">' . $langs->trans(
"ToClone") .
'</a>';
3728 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' .
newToken(),
'delete', $usercandelete);
3736 if (
GETPOST(
'modelselected')) {
3737 $action =
'presend';
3740 if ($action !=
'presend') {
3741 print
'<div class="fichecenter"><div class="fichehalfleft">';
3742 print
'<a name="builddoc"></a>';
3748 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3749 $genallowed = $usercanread;
3750 $delallowed = $usercancreate;
3751 $tooltipAfterComboOfModels =
'';
3753 $tooltipAfterComboOfModels = $langs->trans(
"AccordingToYourSetupTheFileWillBeConcatenated",
getDolGlobalString(
'MAIN_INFO_PROPAL_TERMSOFSALE'));
3756 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);
3759 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'propal'), 1);
3760 $linktoelem = $tmparray[
'linktoelem'];
3761 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3762 print $htmltoenteralink;
3764 $compatibleImportElementsList =
false;
3766 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3768 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, $compatibleImportElementsList);
3774 print
'<br><!-- Link to sign -->';
3775 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3776 print showOnlineSignatureUrl(
'proposal',
$object->ref, $object) .
'<br>';
3779 print
'</div><div class="fichehalfright">';
3783 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/comm/propal/messaging.php?id=' .
$object->id);
3784 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT .
'/comm/propal/agenda.php?id=' .
$object->id);
3787 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3789 $somethingshown = $formactions->showactions($object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3791 print
'</div></div>';
3795 $modelmail =
'propal_send';
3796 $defaulttopic =
'SendPropalRef';
3797 $diroutput = $conf->propal->multidir_output[
$object->entity ?? $conf->entity];
3798 $trackid =
'pro' .
$object->id;
3800 include DOL_DOCUMENT_ROOT .
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage a WYSIWYG editor.
static createDepositFromOrigin(CommonObject $origin, $date, $payment_terms_id, User $user, $notrigger=0, $autoValidateDeposit=false, $overrideFields=array())
Creates a deposit from a proposal or an order by grouping lines by VAT rates.
const TYPE_DEPOSIT
Deposit invoice.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage the table of subscription to notifications.
Class ProductCombination Used to represent the relation between a product and one of its variants.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
Class to manage projects.
Class to manage proposals.
const STATUS_DRAFT
Draft status.
const STATUS_SIGNED
Signed quote.
const STATUS_NOTSIGNED
Not signed quote.
const STATUS_BILLED
Billed or processed quote.
const STATUS_CANCELED
Canceled status.
const STATUS_VALIDATED
Validated status.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
getWarningDelay($module, $parmlevel1, $parmlevel2='')
Return a warning delay You can use it like this: if (getWarningDelay('module', 'paramlevel1')) It rep...
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
getDictionaryValue($tablename, $field, $id, $checkentity=false, $rowidfield='rowid')
Return the value of a filed into a dictionary for the record $id.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
propal_prepare_head($object)
Prepare array with list of tabs.
if(getDolGlobalString( 'TAKEPOS_SHOW_CUSTOMER')) print $langs trans('Date')." left Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.