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');
1783 } elseif ($line->fk_product) {
1788 $multicurrency_subprice = (float) $line->subprice * $line->multicurrency_subprice / $subprice_multicurrency;
1790 $result =
$object->updateline($line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $multicurrency_subprice);
1793 if (is_numeric($margin_rate) && empty($mark_rate)) {
1794 $line->marge_tx = $margin_rate;
1795 } elseif (is_numeric($mark_rate) && empty($margin_rate)) {
1796 $line->marque_tx = $mark_rate;
1798 $line->total_ht = $line->qty * (float) $line->subprice;
1799 $line->total_tva = $line->tva_tx * $line->qty * (float) $line->subprice;
1800 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $line->subprice;
1802 $line->multicurrency_total_ht = $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1803 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1804 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1806 $line->multicurrency_subprice = $multicurrency_subprice;
1811 } elseif ($action ==
'updatetitleline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1814 $langs->load(
'subtotals');
1816 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1819 $subtotal_options = array();
1821 foreach (Propal::$TITLE_OPTIONS as $option) {
1822 $value =
GETPOST($option,
'alphanohtml');
1824 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1829 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1840 $outputlangs = $langs;
1841 $newlang =
GETPOST(
'lang_id',
'alpha');
1843 $newlang =
$object->thirdparty->default_lang;
1845 if (!empty($newlang)) {
1846 $outputlangs =
new Translate(
"", $conf);
1847 $outputlangs->setDefaultLang($newlang);
1850 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1855 } elseif ($action ==
'updatesubtotalline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1858 $langs->load(
'subtotals');
1860 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1863 $subtotal_options = array();
1865 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1866 $value =
GETPOST($option,
'alphanohtml');
1868 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1873 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1881 $outputlangs = $langs;
1882 $newlang =
GETPOST(
'lang_id',
'alpha');
1884 $newlang =
$object->thirdparty->default_lang;
1886 if (!empty($newlang)) {
1887 $outputlangs =
new Translate(
"", $conf);
1888 $outputlangs->setDefaultLang($newlang);
1891 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1896 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1904 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1909 $vat_rate = (
GETPOST(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : 0);
1910 $vat_rate = str_replace(
'*',
'', $vat_rate);
1917 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
1927 if (empty($remise_percent)) {
1928 $remise_percent = 0;
1932 $pu_equivalent = $pu_ht;
1933 $pu_equivalent_ttc = $pu_ttc;
1935 $currency_tx =
$object->multicurrency_tx;
1939 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1940 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1942 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1943 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1958 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1959 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1961 if (is_array($extralabelsline)) {
1963 foreach ($extralabelsline as $key => $value) {
1964 unset($_POST[
"options_" . $key]);
1975 $price_base_type =
'HT';
1976 if (empty($pu) && !empty($pu_ttc)) {
1978 $price_base_type =
'TTC';
1983 if (!empty($productid)) {
1985 $res = $product->fetch($productid);
1987 $type = $product->type;
1991 $price_min = $product->price_min;
1993 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1995 $price_min_ttc = $product->price_min_ttc;
1997 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
2004 if ($usermustrespectpricemin) {
2005 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
2006 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2009 $action =
'editline';
2010 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - (
float) $remise_percent / 100)) < (
float)
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
2011 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2014 $action =
'editline';
2019 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2023 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
2031 if (!$user->hasRight(
'margins',
'creer')) {
2032 foreach (
$object->lines as &$line) {
2034 $fournprice = $line->fk_fournprice;
2035 $buyingprice = (string) $line->pa_ht;
2043 $result =
$object->updateline(
GETPOSTINT(
'lineid'), (
float) $pu, (
float) $qty, $remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $description, $price_base_type, $info_bits, $special_code,
GETPOSTINT(
'fk_parent_line'), 0, (
int) $fournprice, $buyingprice, $label, $type, $date_start, $date_end, $array_options,
GETPOSTINT(
"units"), (
float) $pu_ht_devise);
2050 $outputlangs = $langs;
2052 $outputlangs =
new Translate(
"", $conf);
2053 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
2054 $outputlangs->setDefaultLang($newlang);
2060 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2063 unset($_POST[
'qty']);
2064 unset($_POST[
'type']);
2065 unset($_POST[
'productid']);
2066 unset($_POST[
'remise_percent']);
2067 unset($_POST[
'price_ht']);
2068 unset($_POST[
'multicurrency_price_ht']);
2069 unset($_POST[
'price_ttc']);
2070 unset($_POST[
'tva_tx']);
2071 unset($_POST[
'product_ref']);
2072 unset($_POST[
'product_label']);
2073 unset($_POST[
'product_desc']);
2074 unset($_POST[
'fournprice']);
2075 unset($_POST[
'buying_price']);
2077 unset($_POST[
'date_starthour']);
2078 unset($_POST[
'date_startmin']);
2079 unset($_POST[
'date_startsec']);
2080 unset($_POST[
'date_startday']);
2081 unset($_POST[
'date_startmonth']);
2082 unset($_POST[
'date_startyear']);
2083 unset($_POST[
'date_endhour']);
2084 unset($_POST[
'date_endmin']);
2085 unset($_POST[
'date_endsec']);
2086 unset($_POST[
'date_endday']);
2087 unset($_POST[
'date_endmonth']);
2088 unset($_POST[
'date_endyear']);
2095 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
2096 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
2098 } elseif ($action ==
'classin' && $usercancreate) {
2101 } elseif ($action ==
'setavailability' && $usercancreate) {
2104 } elseif ($action ==
'setdemandreason' && $usercancreate) {
2107 } elseif ($action ==
'setconditions' && $usercancreate) {
2110 } elseif ($action ==
'setmode' && $usercancreate) {
2113 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
2115 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
2116 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
2119 } elseif ($action ==
'setbankaccount' && $usercancreate) {
2122 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
2125 } elseif ($action ==
'setwarehouse' && $usercancreate) {
2128 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
2131 $attribute_name =
GETPOST(
'attribute',
'aZ09');
2134 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
2139 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
2146 $action =
'edit_extras';
2151 if ($action ==
'addcontact' && $usercancreate) {
2155 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2159 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2162 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2163 $langs->load(
"errors");
2164 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
2169 } elseif ($action ==
'swapstatut' && $usercancreate) {
2171 if (
$object->fetch($id) > 0) {
2176 } elseif ($action ==
'deletecontact' && $usercancreate) {
2179 $result =
$object->delete_contact($lineid);
2182 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2191 $upload_dir = !empty($conf->propal->multidir_output[
$object->entity ?? $conf->entity]) ? $conf->propal->multidir_output[
$object->entity ?? $conf->entity] : $conf->propal->dir_output;
2192 $permissiontoadd = $usercancreate;
2193 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
2201$form =
new Form($db);
2210$title =
$object->ref .
" - " . $langs->trans(
'Card');
2211if ($action ==
'create') {
2212 $title = $langs->trans(
"NewPropal");
2214$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
2221if ($action ==
'create') {
2228 $res = $soc->fetch($socid);
2231 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2232 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2233 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2239 if (!empty($origin) && !empty($originid)) {
2241 $element = $subelement = $origin;
2243 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2244 $element = $regs[1];
2245 $subelement = $regs[2];
2248 if ($element ==
'project') {
2249 $projectid = $originid;
2253 $project->fetch($projectid);
2254 if ($project->socid > 0) {
2256 $soc->fetch($project->socid);
2260 if ($element ==
'order' || $element ==
'commande') {
2261 $element = $subelement =
'commande';
2263 if ($element ==
'propal') {
2264 $element =
'comm/propal';
2265 $subelement =
'propal';
2267 if ($element ==
'contract') {
2268 $element = $subelement =
'contrat';
2270 if ($element ==
'shipping') {
2271 $element = $subelement =
'expedition';
2276 $classname = ucfirst($subelement);
2277 $objectsrc =
new $classname($db);
2278 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
2280 $objectsrc->fetch($originid);
2281 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2282 $objectsrc->fetch_lines();
2284 $objectsrc->fetch_thirdparty();
2286 $projectid = (int) $objectsrc->fk_project;
2287 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
2289 $soc = $objectsrc->thirdparty;
2291 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2292 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2293 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : -1));
2296 $objectsrc->fetch_optionals();
2297 $object->array_options = $objectsrc->array_options;
2300 if (!empty($objectsrc->multicurrency_code)) {
2301 $currency_code = $objectsrc->multicurrency_code;
2303 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2304 $currency_tx = $objectsrc->multicurrency_tx;
2312 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
2313 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
2314 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
2315 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
2316 $shipping_method_id = $soc->shipping_method_id;
2317 $warehouse_id = !empty($soc->fk_warehouse) ? $soc->fk_warehouse : $warehouse_id;
2318 $remise_percent = $soc->remise_percent;
2320 if (
isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
2321 $currency_code = $soc->multicurrency_code;
2326 if (!
GETPOST(
'changecompany')) {
2327 if (GETPOSTISSET(
'cond_reglement_id')) {
2328 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2330 if (GETPOSTISSET(
'deposit_percent')) {
2333 if (GETPOSTISSET(
'mode_reglement_id')) {
2334 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2336 if (GETPOSTISSET(
'fk_account')) {
2339 if (GETPOSTISSET(
'shipping_method_id')) {
2340 $shipping_method_id =
GETPOSTINT(
'shipping_method_id');
2344 if ($soc->fk_warehouse > 0) {
2345 $warehouse_id = $soc->fk_warehouse;
2352 $warehouse_id = $user->fk_warehouse;
2356 print
'<form name="addprop" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
2357 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2358 print
'<input type="hidden" name="action" value="add">';
2359 print
'<input type="hidden" name="changecompany" value="0">';
2360 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
2361 if ($origin !=
'project' && $originid) {
2362 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
2363 print
'<input type="hidden" name="originid" value="' . $originid .
'">';
2364 if ($origin ==
'contrat' && !empty($renewal)) {
2365 print
'<input type="hidden" name="renewal" value="' . $renewal .
'">';
2367 } elseif ($origin ==
'project' && !empty($projectid)) {
2368 print
'<input type="hidden" name="projectid" value="' . $projectid .
'">';
2374 $parameters = array();
2376 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters, $object, $action);
2377 if (empty($reshook)) {
2378 print
'<table class="border centpercent">';
2381 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Ref') .
'</td><td class="valuefieldcreate">' . $langs->trans(
"Draft") .
'</td></tr>';
2384 print
'<tr class="field_ref_client"><td class="titlefieldcreate">' . $langs->trans(
'RefCustomer') .
'</td><td class="valuefieldcreate">';
2385 print
'<input type="text" name="ref_client" value="' . (!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')) .
'"></td>';
2389 print
'<tr class="field_socid">';
2391 print
'<td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Customer') .
'</td>';
2392 $shipping_method_id = 0;
2396 print
'<td class="valuefieldcreate">';
2397 print $soc->getNomUrl(1,
'customer');
2398 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
2400 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2401 $shipping_method_id = $soc->shipping_method_id;
2404 print
'<td class="valuefieldcreate">';
2405 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2406 print
img_picto(
'',
'company',
'class="pictofixedwidth"') . $form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2410 $(document).ready(function() {
2411 $("#socid").change(function() {
2412 console.log("We have changed the company - Reload page");
2413 var socid = $(this).val();
2415 $("input[name=action]").val("create");
2416 $("input[name=changecompany]").val("1");
2417 $("form[name=addprop]").submit();
2422 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>';
2425 print
'</tr>' .
"\n";
2429 print
'<tr class="field_contactid"><td class="titlefieldcreate">' . $langs->trans(
"DefaultContact") .
'</td><td class="valuefieldcreate">';
2430 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2432 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2436 print
'<tr class="field_discount_info"><td class="titlefieldcreate">' . $langs->trans(
'Discounts') .
'</td><td class="valuefieldcreate">';
2438 $absolute_discount = $soc->getAvailableDiscounts();
2442 $backtopage = $_SERVER[
"PHP_SELF"] .
'?socid=' . $thirdparty->id .
'&action=' . $action .
'&origin=' . urlencode((
string) (
GETPOST(
'origin'))) .
'&originid=' . urlencode((
string) (
GETPOSTINT(
'originid')));
2443 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
2449 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'DatePropal') .
'</td><td class="valuefieldcreate">';
2450 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2451 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2455 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>';
2458 print
'<tr class="field_cond_reglement_id"><td class="nowrap">' . $langs->trans(
'PaymentConditionsShort') .
'</td><td>';
2459 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2461 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2465 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">' . $langs->trans(
'PaymentMode') .
'</td><td class="valuefieldcreate">';
2466 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2467 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2472 print
'<tr class="field_fk_account"><td class="titlefieldcreate">' . $langs->trans(
'BankAccount') .
'</td><td class="valuefieldcreate">';
2473 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"') . $form->select_comptes((
int) $fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2478 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">' . $langs->trans(
'Source') .
'</td><td class="valuefieldcreate">';
2479 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2480 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2485 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2486 $shipping_method_id = $soc->shipping_method_id;
2488 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">' . $langs->trans(
'SendingMethod') .
'</td><td class="valuefieldcreate">';
2489 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2490 $form->selectShippingMethod((
string) $shipping_method_id,
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2494 $formproduct =
null;
2497 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
2499 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">' . $langs->trans(
'Warehouse') .
'</td><td class="valuefieldcreate">';
2500 print
img_picto(
'',
'stock',
'class="pictofixedwidth"') . $formproduct->selectWarehouses((
int) $warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2505 print
'<tr class="field_availability_id"><td class="titlefieldcreate">' . $langs->trans(
'AvailabilityPeriod');
2507 print
' (' . $langs->trans(
'AfterOrder') .
')';
2509 print
'</td><td class="valuefieldcreate">';
2510 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2511 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2515 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">' . $langs->trans(
"DeliveryDate") .
'</td>';
2516 print
'<td class="valuefieldcreate">';
2517 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2519 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2520 $syear =
date(
"Y", $tmpdte);
2521 $smonth =
date(
"m", $tmpdte);
2522 $sday =
date(
"d", $tmpdte);
2523 print $form->selectDate($syear .
"-" . $smonth .
"-" . $sday,
'date_livraison', 0, 0, 0,
"addprop");
2525 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2526 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2531 if (
isModEnabled(
'project') && is_object($formproject)) {
2532 $langs->load(
"projects");
2533 print
'<tr class="field_projectid">';
2534 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2535 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');
2536 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>';
2543 print
'<tr class="field_incoterm_id">';
2544 print
'<td class="titlefieldcreate"><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1) .
'</label></td>';
2545 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2546 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2547 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2552 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td colspan="3">';
2553 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
2557 print
'<tr class="field_model">';
2558 print
'<td class="titlefieldcreate">' . $langs->trans(
"DefaultModel") .
'</td>';
2559 print
'<td class="valuefieldcreate">';
2560 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2563 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2568 print
'<tr class="field_currency">';
2569 print
'<td class="titlefieldcreate">' . $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0) .
'</td>';
2570 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2571 print
img_picto(
'',
'currency',
'class="pictofixedwidth"') . $form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2576 print
'<tr class="field_note_public">';
2577 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePublic') .
'</td>';
2578 print
'<td class="valuefieldcreate">';
2579 $note_public =
GETPOST(
'note_public',
'restricthtml');
2580 if (!GETPOSTISSET(
'note_public') && empty($note_public) && !empty($objectsrc)) {
2581 $note_public = $objectsrc->note_public;
2583 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2584 print $doleditor->Create(1);
2587 if (empty($user->socid)) {
2588 print
'<tr class="field_note_private">';
2589 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePrivate') .
'</td>';
2590 print
'<td class="valuefieldcreate">';
2591 $note_private =
GETPOST(
'note_private',
'restricthtml');
2592 if (!GETPOSTISSET(
'note_private') && empty($note_private) && !empty($objectsrc)) {
2593 $note_private = $objectsrc->note_private;
2595 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2596 print $doleditor->Create(1);
2602 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_add.tpl.php';
2605 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2607 if ($origin ==
'contrat') {
2611 $objectsrc->update_price(1,
'auto', 1);
2614 print
"\n<!-- " . $classname .
" info -->";
2616 print
'<input type="hidden" name="amount" value="' . $objectsrc->total_ht .
'">' .
"\n";
2617 print
'<input type="hidden" name="total" value="' . $objectsrc->total_ttc .
'">' .
"\n";
2618 print
'<input type="hidden" name="tva" value="' . $objectsrc->total_tva .
'">' .
"\n";
2619 print
'<input type="hidden" name="origin" value="' . $objectsrc->element .
'">';
2620 print
'<input type="hidden" name="originid" value="' . $objectsrc->id .
'">';
2622 $newclassname = $classname;
2623 if ($newclassname ==
'Propal') {
2624 $newclassname =
'CommercialProposal';
2625 } elseif ($newclassname ==
'Commande') {
2626 $newclassname =
'Order';
2627 } elseif ($newclassname ==
'Expedition') {
2628 $newclassname =
'Sending';
2629 } elseif ($newclassname ==
'Fichinter') {
2630 $newclassname =
'Intervention';
2633 print
'<tr><td>' . $langs->trans($newclassname) .
'</td><td>' . $objectsrc->getNomUrl(1) .
'</td></tr>';
2634 print
'<tr><td>' . $langs->trans(
'AmountHT') .
'</td><td>' .
price($objectsrc->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td></tr>';
2635 print
'<tr><td>' . $langs->trans(
'AmountVAT') .
'</td><td>' .
price($objectsrc->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2636 if (
$mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2637 print
'<tr><td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2640 if (
$mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2641 print
'<tr><td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2643 print
'<tr><td>' . $langs->trans(
'AmountTTC') .
'</td><td>' .
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2646 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountHT') .
'</td><td>' .
price($objectsrc->multicurrency_total_ht) .
'</td></tr>';
2647 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountVAT') .
'</td><td>' .
price($objectsrc->multicurrency_total_tva) .
"</td></tr>";
2648 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountTTC') .
'</td><td>' .
price($objectsrc->multicurrency_total_ttc) .
"</td></tr>";
2660 print
'<input type="hidden" name="createmode" value="empty">';
2664 print
'<br><table>';
2668 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2669 print
'<td>' . $langs->trans(
"CopyPropalFrom") .
' </td>';
2671 $liste_propal = array();
2672 $liste_propal[0] =
'';
2674 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2675 $sql .=
" FROM " . MAIN_DB_PREFIX .
"propal p";
2676 $sql .=
", " . MAIN_DB_PREFIX .
"societe s";
2677 $sql .=
" WHERE s.rowid = p.fk_soc";
2678 $sql .=
" AND p.entity IN (" .
getEntity(
'propal') .
")";
2679 $sql .=
" AND p.fk_statut <> 0";
2680 $sql .=
" ORDER BY Id";
2682 $resql = $db->query($sql);
2684 $num = $db->num_rows($resql);
2687 $row = $db->fetch_row($resql);
2688 $propalRefAndSocName = $row[1] .
" - " . $row[2];
2689 $liste_propal[$row[0]] = $propalRefAndSocName;
2692 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2698 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2699 print
'<td valign="top" colspan="2">' . $langs->trans(
"CreateEmptyPropal") .
'</td></tr>';
2706 $langs->load(
"bills");
2708 print $form->buttonsSaveCancel(
"CreateDraft");
2714 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2717 $title = $langs->trans(
'ProductsAndServices');
2720 print
'<div class="div-table-responsive-no-min">';
2721 print
'<table class="noborder centpercent">';
2723 $objectsrc->printOriginLinesList();
2740 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
$object->picto, 0,
'',
'', 0,
'', 1);
2745 if ($action ==
'clone') {
2747 $filter =
'(s.client:IN:1,2,3)';
2748 $formquestion = array(
2751 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2752 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2753 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2756 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2759 $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);
2763 if ($action ==
'add_title_line') {
2764 $langs->load(
'subtotals');
2766 $depth_array =
$object->getPossibleLevels($langs);
2768 } elseif ($action ==
'add_subtotal_line') {
2769 $langs->load(
'subtotals');
2771 $titles =
$object->getPossibleTitles();
2775 if ($action ==
'closeas') {
2777 $formquestion = array();
2779 $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)));
2781 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2783 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2788 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2790 if (!empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2791 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2795 $eligibleForDepositGeneration =
true;
2797 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2798 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2799 '@phan-var-force Facture $invoice';
2802 $eligibleForDepositGeneration =
false;
2808 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2809 foreach (
$object->linkedObjects[
'commande'] as $order) {
2810 $order->fetchObjectLinked();
2812 if (array_key_exists(
'facture', $order->linkedObjects)) {
2813 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2814 '@phan-var-force Facture $invoice';
2817 $eligibleForDepositGeneration =
false;
2826 if ($eligibleForDepositGeneration) {
2827 $formquestion[] = array(
2828 'type' =>
'checkbox',
2829 'tdclass' =>
'showonlyifsigned',
2830 'name' =>
'generate_deposit',
2831 'morecss' =>
'margintoponly marginbottomonly',
2832 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2835 $formquestion[] = array(
2837 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2839 'label' => $langs->trans(
'DateInvoice'),
2845 $formquestion[] = array(
2847 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2848 'name' =>
'date_pointoftax',
2849 'label' => $langs->trans(
'DatePointOfTax'),
2855 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2857 $formquestion[] = array(
2859 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2860 'name' =>
'cond_reglement_id',
2861 'label' => $langs->trans(
'PaymentTerm'),
2862 'value' => $paymentTermsSelect
2865 $formquestion[] = array(
2866 'type' =>
'checkbox',
2867 'tdclass' =>
'showonlyifgeneratedeposit',
2868 'name' =>
'validate_generated_deposit',
2869 'morecss' =>
'margintoponly marginbottomonly',
2870 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2873 $formquestion[] = array(
2874 'type' =>
'onecolumn',
2877 let signedValue = ' . $object::STATUS_SIGNED .
';
2879 $(document).ready(function() {
2880 $("[name=generate_deposit]").change(function () {
2881 let $self = $(this);
2882 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2884 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2893 $("#statut").change(function() {
2894 let $target = $(".showonlyifsigned").parent(".tagtr");
2896 if ($(this).val() == signedValue) {
2902 $("[name=generate_deposit]").trigger("change");
2907 $("#statut").trigger("change");
2917 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2918 $notify =
new Notify($db);
2919 $formquestion = array_merge($formquestion, array(
2920 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid, $object)),
2925 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2927 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2929 } elseif ($action ==
'cancel') {
2931 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2932 } elseif ($action ==
'delete') {
2934 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2935 } elseif ($action ==
'reopen') {
2937 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2938 } elseif ($action ==
'ask_deleteline') {
2940 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2941 } elseif ($action ==
'ask_subtotal_deleteline') {
2943 $langs->load(
"subtotals");
2944 $title =
"DeleteSubtotalLine";
2945 $question =
"ConfirmDeleteSubtotalLine";
2946 if (
GETPOST(
'type') ==
'title') {
2947 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2948 $title =
"DeleteTitleLine";
2949 $question =
"ConfirmDeleteTitleLine";
2951 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2952 } elseif ($action ==
'validate') {
2957 $ref = substr(
$object->ref, 1, 4);
2958 if ($ref ==
'PROV' || $ref ==
'') {
2959 $numref =
$object->getNextNumRef($soc);
2960 if (empty($numref)) {
2965 $numref = (string)
$object->ref;
2968 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2970 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2971 $notify =
new Notify($db);
2973 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid, $object);
2978 foreach (
$object->lines as $line) {
2979 $res = $line->fetch_product();
2981 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2987 if ($nbMandated > 0) {
2989 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2992 $text .=
'<div><span class="clearboth nowraponall warning">' .
img_warning() . $langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate") .
'</span></div>';
2997 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
3002 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
3003 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
3004 if (empty($reshook)) {
3005 $formconfirm .= $hookmanager->resPrint;
3006 } elseif ($reshook > 0) {
3007 $formconfirm = $hookmanager->resPrint;
3016 $linkback =
'<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
3018 $morehtmlref =
'<div class="refidno">';
3020 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client, $object, $usercancreate,
'string',
'', 0, 1);
3021 $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);
3023 $morehtmlref .=
'<br>' . $soc->getNomUrl(1,
'customer');
3025 $morehtmlref .=
' (<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?socid=' . ((int) $soc->id) .
'">' . $langs->trans(
"OtherProposals") .
'</a>)';
3029 $langs->load(
"projects");
3030 $morehtmlref .=
'<br>';
3031 if ($usercancreate) {
3032 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
3033 if ($action !=
'classify') {
3034 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
3036 $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');
3038 if (!empty(
$object->fk_project)) {
3040 $proj->fetch(
$object->fk_project);
3041 $morehtmlref .= $proj->getNomUrl(1);
3043 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
3048 $morehtmlref .=
'</div>';
3051 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
3054 $parameters = array();
3056 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters, $object, $action);
3057 if (empty($reshook)) {
3058 print
'<div class="fichecenter">';
3059 print
'<div class="fichehalfleft">';
3060 print
'<div class="underbanner clearboth"></div>';
3062 print
'<table class="border tableforfield centpercent">';
3066 $filterabsolutediscount =
"fk_facture_source IS NULL";
3067 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3069 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3070 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3073 print
'<tr><td class="titlefieldmax45">' . $langs->trans(
'Discounts') .
'</td><td>';
3075 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3076 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3077 $absolute_discount =
price2num($absolute_discount,
'MT');
3078 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3084 $backtopage = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id;
3085 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
3101 print $form->editfieldkey(
"DatePropal",
'date',
'', $object, (
int) $editenable);
3102 print
'</td><td class="valuefield">';
3103 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3104 print
'<form name="editdate" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3105 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3106 print
'<input type="hidden" name="action" value="setdate">';
3107 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3108 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3109 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3123 print
'<table class="nobordernopadding centpercent"><tr><td>';
3124 print $langs->trans(
'DateEndPropal');
3126 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3127 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>';
3129 print
'</tr></table>';
3130 print
'</td><td class="valuefield">';
3131 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3132 print
'<form name="editecheance" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3133 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3134 print
'<input type="hidden" name="action" value="setecheance">';
3135 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3136 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3137 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3140 if (!empty(
$object->fin_validite)) {
3154 print
'<table class="nobordernopadding centpercent"><tr><td>';
3155 print $langs->trans(
'PaymentConditionsShort');
3157 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3158 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>';
3160 print
'</tr></table>';
3161 print
'</td><td class="valuefield">';
3162 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3163 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3165 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3171 print
'<tr class="field_mode_reglement_id">';
3173 print
'<table class="nobordernopadding centpercent"><tr><td>';
3174 print $langs->trans(
'PaymentMode');
3176 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3177 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>';
3179 print
'</tr></table>';
3180 print
'</td><td class="valuefieldcreate">';
3181 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3182 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3184 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'none');
3190 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3191 print
'</td><td class="valuefieldedit">';
3192 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, $usercancreate && $caneditfield,
'datepicker');
3197 print
'<tr class="fielddeliverydelay"><td>';
3198 print
'<table class="nobordernopadding centpercent"><tr><td>';
3200 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod') .
' (' . $langs->trans(
'AfterOrder') .
')');
3202 print $langs->trans(
'AvailabilityPeriod');
3205 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3206 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>';
3208 print
'</tr></table>';
3209 print
'</td><td class="valuefield">';
3210 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3211 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'availability_id', 1);
3213 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'none', 1);
3222 print
'<table class="nobordernopadding centpercent"><tr><td>';
3223 print $langs->trans(
'SendingMethod');
3225 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3226 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>';
3228 print
'</tr></table>';
3229 print
'</td><td class="valuefield">';
3230 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3231 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3233 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'none');
3241 $langs->load(
'stocks');
3242 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
3244 print
'<tr class="field_warehouse_id"><td>';
3245 $editenable = $usercancreate;
3246 print $form->editfieldkey(
"Warehouse",
'warehouse',
'', $object, $editenable);
3247 print
'</td><td class="valuefieldcreate">';
3248 if ($action ==
'editwarehouse') {
3249 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3251 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'none');
3259 print
'<table class="nobordernopadding centpercent"><tr><td>';
3260 print $langs->trans(
'Source');
3262 if ($action !=
'editdemandreason' && $usercancreate) {
3263 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>';
3265 print
'</tr></table>';
3266 print
'</td><td class="valuefield">';
3267 if ($action ==
'editdemandreason' && $usercancreate) {
3268 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3270 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'none');
3275 if ($soc->outstanding_limit) {
3278 print $langs->trans(
'OutstandingBill');
3279 print
'</td><td class="valuefield">';
3280 $arrayoutstandingbills = $soc->getOutstandingBills();
3281 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
3282 print
price($arrayoutstandingbills[
'opened']) .
' / ';
3283 print
price($soc->outstanding_limit, 0, $langs, 1, -1, -1, $conf->currency);
3291 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3292 print $langs->trans(
'BankAccount');
3294 if ($action !=
'editbankaccount' && $usercancreate) {
3295 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>';
3297 print
'</tr></table>';
3298 print
'</td><td class="valuefield">';
3299 if ($action ==
'editbankaccount') {
3300 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3302 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'none');
3309 $tmparray =
$object->getTotalWeightVolume();
3310 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3311 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3313 print
'<tr><td>' . $langs->trans(
"CalculatedWeight") .
'</td>';
3314 print
'<td class="valuefield">';
3319 print
'<tr><td>' . $langs->trans(
"CalculatedVolume") .
'</td>';
3320 print
'<td class="valuefield">';
3329 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3330 print $langs->trans(
'IncotermLabel');
3331 print
'<td><td class="right">';
3332 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3333 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' .
img_edit() .
'</a>';
3337 print
'</td></tr></table>';
3339 print
'<td class="valuefield">';
3340 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3341 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3343 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3351 print
'<table class="nobordernopadding centpercent"><tr><td>';
3352 print $langs->trans(
"Categories");
3353 print
'<td><td class="right">';
3354 if ($usercancreate) {
3355 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=edittags&token='.
newToken().
'">'.
img_edit().
'</a>';
3359 print
'</td></tr></table>';
3362 if ($action ==
'edittags') {
3363 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'">';
3364 print
'<input type="hidden" name="action" value="settags">';
3365 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3366 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
3367 print
'<input type="submit" class="button valignmiddle smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
3370 print $form->showCategories(
$object->id, Categorie::TYPE_PROPOSAL, 1);
3376 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3381 print
'<div class="fichehalfright">';
3382 print
'<div class="underbanner clearboth"></div>';
3384 print
'<table class="border tableforfield centpercent">';
3386 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_currency_amount.tpl.php';
3389 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3390 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3392 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3397 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3398 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3400 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3404 if (
$mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3406 print
'<td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td>';
3407 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3411 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3416 if (
$mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3418 print
'<td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td>';
3419 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3423 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3429 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3430 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3432 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3440 $formmargin->displayMarginInfos($object);
3446 print
'<div class="clearboth"></div><br>';
3449 $blocname =
'contacts';
3450 $title = $langs->trans(
'ContactsAddresses');
3451 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3455 $blocname =
'notes';
3456 $title = $langs->trans(
'Notes');
3457 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3465 $result =
$object->getLinesArray();
3469 global $inputalsopricewithtax;
3470 $inputalsopricewithtax = 1;
3472 print
' <form name="addproduct" id="addproduct" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="POST">
3473 <input type="hidden" name="token" value="' .
newToken() .
'">
3474 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline') .
'">
3475 <input type="hidden" name="mode" value="">
3476 <input type="hidden" name="page_y" value="">
3477 <input type="hidden" name="backtopage" value="' . $backtopage .
'">
3478 <input type="hidden" name="id" value="' .
$object->id .
'">
3483 include DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_ajaxrow.tpl.php';
3485 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3489 print
'<div class="div-table-responsive-no-min">';
3491 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3500 if ($action !=
'editline') {
3501 $parameters = array();
3502 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3506 if (empty($reshook)) {
3510 $parameters = array();
3511 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters, $object, $action);
3530 if ($action !=
'presend') {
3531 $numlines = count(
$object->lines);
3532 print
'<div class="tabsAction">';
3534 $parameters = array();
3535 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3537 if (empty($reshook)) {
3538 if ($action !=
'editline') {
3542 $langs->load(
'subtotals');
3544 $url_button = array();
3546 $url_button[] = array(
3547 'lang' =>
'subtotals',
3549 'perm' => (
bool) $usercancreate,
3550 'label' => $langs->trans(
'AddTitleLine'),
3551 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_title_line&token=' .
newToken()
3554 $url_button[] = array(
3555 'lang' =>
'subtotals',
3557 'perm' => (
bool) $usercancreate,
3558 'label' => $langs->trans(
'AddSubtotalLine'),
3559 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_subtotal_line&token=' .
newToken()
3562 print
dolGetButtonAction(
'', $langs->trans(
'Subtotal'),
'default', $url_button,
'',
true);
3569 if ($usercanvalidate) {
3570 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>';
3572 print
'<a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
'Validate') .
'</a>';
3582 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=modif&token=' .
newToken() .
'">' . $langs->trans(
'Modify') .
'</a>';
3587 if ($usercanreopen) {
3588 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=reopen&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen') .
'"';
3589 print
'>' . $langs->trans(
'ReOpen') .
'</a>';
3591 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ReOpen") .
'</a>';
3596 if (empty($user->socid)) {
3598 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'', $usercansend);
3602 $arrayforbutaction = array();
3605 $arrayforbutaction[] = array(
3608 'perm' => $usercancreateorder,
3609 'label' =>
'AddOrder',
3610 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3620 $arrayforbutaction[] = array(
3623 'perm' => $usercancreatepurchaseorder,
3624 'label' =>
'AddPurchaseOrder',
3625 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3635 $arrayforbutaction[] = array(
3636 'lang' =>
'interventions',
3638 'perm' => $usercancreateintervention,
3639 'label' =>
'AddIntervention',
3640 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3650 $arrayforbutaction[] = array(
3651 'lang' =>
'contracts',
3653 'perm' => $usercancreatecontract,
3654 'label' =>
'AddContract',
3655 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3667 $arrayforbutaction[] = [
3668 'lang' =>
'invoice',
3670 'perm' => $usercancreateinvoice,
3671 'label' =>
'CreateBill',
3672 'url' =>
'/compta/facture/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((int)
$object->id) .
'&socid=' . ((int)
$object->socid),
3679 $actionButtonsParameters = [
3680 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3681 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3684 if ($numlines > 0) {
3685 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3687 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3691 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3692 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3693 if ($usercanclose) {
3694 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=classifybilled&token=' .
newToken() .
'&socid=' .
$object->socid .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3696 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3704 if ($usercanclose) {
3705 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3706 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3708 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'"';
3709 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3715 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token=' .
newToken() .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3716 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3722 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=cancel&token=' .
newToken() .
'">' . $langs->trans(
"CancelPropal") .
'</a>';
3726 if ($usercancreate) {
3727 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>';
3731 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' .
newToken(),
'delete', $usercandelete);
3739 if (
GETPOST(
'modelselected')) {
3740 $action =
'presend';
3743 if ($action !=
'presend') {
3744 print
'<div class="fichecenter"><div class="fichehalfleft">';
3745 print
'<a name="builddoc"></a>';
3751 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3752 $genallowed = $usercanread;
3753 $delallowed = $usercancreate;
3754 $tooltipAfterComboOfModels =
'';
3756 $tooltipAfterComboOfModels = $langs->trans(
"AccordingToYourSetupTheFileWillBeConcatenated",
getDolGlobalString(
'MAIN_INFO_PROPAL_TERMSOFSALE'));
3759 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);
3762 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'propal'), 1);
3763 $linktoelem = $tmparray[
'linktoelem'];
3764 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3765 print $htmltoenteralink;
3767 $compatibleImportElementsList =
false;
3769 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3771 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, $compatibleImportElementsList);
3777 print
'<br><!-- Link to sign -->';
3778 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3779 print showOnlineSignatureUrl(
'proposal',
$object->ref, $object) .
'<br>';
3782 print
'</div><div class="fichehalfright">';
3786 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/comm/propal/messaging.php?id=' .
$object->id);
3787 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT .
'/comm/propal/agenda.php?id=' .
$object->id);
3790 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3792 $somethingshown = $formactions->showactions($object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3794 print
'</div></div>';
3798 $modelmail =
'propal_send';
3799 $defaulttopic =
'SendPropalRef';
3800 $diroutput = $conf->propal->multidir_output[
$object->entity ?? $conf->entity];
3801 $trackid =
'pro' .
$object->id;
3803 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.