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 && !empty($lines[$i]->extraparams)) {
721 $newline->id = $result;
722 $newline->extraparams = $lines[$i]->extraparams;
723 $newline->setExtraParameters();
727 if ($result > 0 && $lines[$i]->product_type == 9) {
728 $fk_parent_line = $result;
733 $parameters = array(
'objFrom' => $srcobject);
734 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
755 if (
GETPOST(
'contactid') > 0) {
764 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
767 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
771 $categories =
GETPOST(
'categories',
'array');
772 if (method_exists($object,
'setCategories')) {
773 $object->setCategories($categories);
782 $outputlangs = $langs;
785 $newlang =
GETPOST(
'lang_id',
'aZ09');
788 $newlang =
$object->thirdparty->default_lang;
790 if (!empty($newlang)) {
792 $outputlangs->setDefaultLang($newlang);
797 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
803 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
816 } elseif ($action ==
'classifybilled' && $usercanclose) {
820 $result =
$object->classifyBilled($user, 0,
'');
831 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
834 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
836 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
837 $locationTarget =
'';
851 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
856 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
859 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
860 && !empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
862 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
865 $forceFields = array();
867 if (GETPOSTISSET(
'date_pointoftax')) {
875 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
886 $ret = $deposit->fetch($deposit->id);
887 $outputlangs = $langs;
891 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
892 $outputlangs->load(
'products');
895 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
902 if ($locationTarget) {
903 header(
'Location: ' . $locationTarget);
915 } elseif ($action ==
'confirm_reopen' && $usercanreopen && !
GETPOST(
'cancel',
'alpha')) {
922 $result =
$object->reopen($user, $newstatus);
939 $fromElement =
GETPOST(
'fromelement');
940 $fromElementid =
GETPOST(
'fromelementid');
941 $importLines =
GETPOST(
'line_checkbox');
943 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && preg_match(
'/^[a-zA-Z]+$/', $fromElement) && !empty($fromElementid)) {
944 if ($fromElement ==
'commande') {
945 dol_include_once(
'/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
946 $lineClassName =
'OrderLine';
947 } elseif ($fromElement ==
'propal') {
948 dol_include_once(
'/comm/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
949 $lineClassName =
'PropaleLigne';
950 } elseif ($fromElement ==
'facture') {
951 dol_include_once(
'/compta/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
952 $lineClassName =
'FactureLigne';
954 $lineClassName =
null;
956 $nextRang = count(
$object->lines) + 1;
959 foreach ($importLines as $lineId) {
960 $lineId = intval($lineId);
961 $originLine =
new $lineClassName($db);
962 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
963 $originLine->fetch_optionals();
964 $desc = $originLine->desc;
965 $pu_ht = $originLine->subprice;
966 $qty = $originLine->qty;
967 $txtva = $originLine->tva_tx;
968 $txlocaltax1 = $originLine->localtax1_tx;
969 $txlocaltax2 = $originLine->localtax2_tx;
970 $fk_product = $originLine->fk_product;
971 $remise_percent = $originLine->remise_percent;
972 $date_start = $originLine->date_start;
973 $date_end = $originLine->date_end;
974 $fk_code_ventilation = 0;
975 $info_bits = $originLine->info_bits;
976 $fk_remise_except = $originLine->fk_remise_except;
977 $price_base_type =
'HT';
979 $type = $originLine->product_type;
981 $special_code = $originLine->special_code;
982 $origin = $originLine->element;
983 $origin_id = $originLine->id;
985 $fk_fournprice = $originLine->fk_fournprice;
986 $pa_ht = $originLine->pa_ht;
987 $label = $originLine->label;
988 $array_options = $originLine->array_options;
989 $situation_percent = 100;
991 $fk_unit = $originLine->fk_unit;
992 $pu_ht_devise = $originLine->multicurrency_subprice;
994 $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);
1010 } elseif ($action ==
'addline' &&
GETPOST(
'updateallvatlinesblock',
'alpha') &&
GETPOST(
'vatforblocklines',
'alpha') !==
'' && $usercancreate) {
1011 $tx_tva =
GETPOST(
'vatforblocklines') ?
GETPOST(
'vatforblocklines') : 0;
1012 $object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'tva', $tx_tva);
1013 } elseif ($action ==
'addline' &&
GETPOST(
'updatealldiscountlinesblock',
'alpha') &&
GETPOST(
'discountforblocklines',
'alpha') !==
'' && $usercancreate) {
1014 $discount =
GETPOST(
'discountforblocklines') ?
GETPOST(
'discountforblocklines') : 0;
1015 $object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'discount', $discount);
1018 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1021 $actiontypecode =
'AC_OTH_AUTO';
1022 $triggersendname =
'PROPAL_SENTBYMAIL';
1023 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
1024 $trackid =
'pro' .
$object->id;
1025 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1029 if ($action ==
'modif' && $usercancreate) {
1030 $result =
$object->setDraft($user);
1037 $outputlangs = $langs;
1039 $outputlangs =
new Translate(
"", $conf);
1040 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1041 $outputlangs->setDefaultLang($newlang);
1047 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1049 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
1058 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
1062 foreach (
$object->lines as $key => $line) {
1063 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1066 if ($line->product_type == 1) {
1067 $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);
1071 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
1073 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
1074 $vat_rate = str_replace(
'*',
'', $vat_rate);
1077 foreach (
$object->lines as $key => $line) {
1078 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1081 $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);
1084 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
1086 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
1087 $remise_percent = str_replace(
'*',
'', $remise_percent);
1088 foreach (
$object->lines as $key => $line) {
1089 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1092 $tvatx = $line->tva_tx;
1093 if (!empty($line->vat_src_code)) {
1094 $tvatx .=
' (' . $line->vat_src_code .
')';
1096 $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);
1099 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'' && $usercancreate) {
1101 $margin_rate = (
GETPOST(
'marginforalllines',
'alpha') ?
GETPOST(
'marginforalllines',
'alpha') : 0);
1102 foreach (
$object->lines as $key => $line) {
1103 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1106 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
1108 $prod->fetch($line->fk_product);
1109 if ($prod->price_min > $subprice) {
1110 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1111 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1112 setEventMessages($prod->ref .
' - ' . $prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1115 if ($line->subprice <> 0) {
1116 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1118 $multicurrency_subprice = 0;
1121 $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);
1138 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
1141 $langs->load(
'subtotals');
1143 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
1144 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
1146 $subtotal_options = array();
1148 foreach (Propal::$TITLE_OPTIONS as $option) {
1149 $value =
GETPOST($option,
'alphanohtml');
1151 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1156 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1167 $outputlangs = $langs;
1168 $newlang =
GETPOST(
'lang_id',
'alpha');
1170 $newlang =
$object->thirdparty->default_lang;
1172 if (!empty($newlang)) {
1173 $outputlangs =
new Translate(
"", $conf);
1174 $outputlangs->setDefaultLang($newlang);
1177 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1182 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1184 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
1187 $langs->load(
'subtotals');
1189 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
1190 foreach (
$object->lines as $line) {
1191 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
1192 $desc = $line->desc;
1193 $depth = -$line->qty;
1197 $subtotal_options = array();
1199 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1200 $value =
GETPOST($option,
'alphanohtml');
1202 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1207 if (isset($desc) && isset($depth)) {
1208 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1210 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
1213 if (isset($result) && $result >= 0) {
1219 $outputlangs = $langs;
1220 $newlang =
GETPOST(
'lang_id',
'alpha');
1222 $newlang =
$object->thirdparty->default_lang;
1224 if (!empty($newlang)) {
1225 $outputlangs =
new Translate(
"", $conf);
1226 $outputlangs->setDefaultLang($newlang);
1229 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1234 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1236 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && !
GETPOST(
'markforalllines',
'alpha') && $usercancreate) {
1240 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1243 $price_ht_devise =
'';
1245 $price_ttc_devise =
'';
1249 if (
GETPOST(
'price_ht') !==
'') {
1252 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1255 if (
GETPOST(
'price_ttc') !==
'') {
1258 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1259 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1262 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1263 if ($prod_entry_mode ==
'free') {
1269 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1274 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1277 $remise_percent = (GETPOSTISSET(
'remise_percent' . $predef) ?
price2num(
GETPOST(
'remise_percent' . $predef,
'alpha'),
'', 2) : 0);
1278 if (empty($remise_percent)) {
1279 $remise_percent = 0;
1283 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1284 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1286 if (is_array($extralabelsline)) {
1288 foreach ($extralabelsline as $key => $value) {
1289 unset($_POST[
"options_" . $key]);
1293 $price_to_test_sign = ($price_ht ? $price_ht : $price_ttc);
1295 if ((empty($idprod) || $idprod < 0) && ($price_to_test_sign < 0) && ($qty < 0)) {
1296 $langs->load(
"errors");
1297 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1300 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1301 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1305 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1306 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1310 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1313 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1314 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1318 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1319 if ($combinations =
GETPOST(
'combinations',
'array:alphanohtml')) {
1323 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1324 $idprod = $res->fk_product_child;
1326 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1332 if (!$error && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1340 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1349 if (!empty($idprod) && $idprod > 0) {
1351 $prod->fetch($idprod);
1353 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
1363 $pu_ht = $prod->price;
1364 $pu_ttc = $prod->price_ttc;
1365 $price_min = $prod->price_min;
1366 $price_min_ttc = $prod->price_min_ttc;
1367 $price_base_type = $prod->price_base_type;
1371 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1373 $filter = array(
't.fk_product' => (
string) $prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1376 $pricebycustomerexist =
false;
1377 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1380 if (count($prodcustprice->lines) > 0) {
1381 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1382 foreach ($prodcustprice->lines as $k => $custprice_line) {
1383 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1384 $pricebycustomerexist =
true;
1385 $pu_ht =
price($custprice_line->price);
1386 $pu_ttc =
price($custprice_line->price_ttc);
1387 $price_min =
price($custprice_line->price_min);
1388 $price_min_ttc =
price($custprice_line->price_min_ttc);
1389 $price_base_type = $custprice_line->price_base_type;
1406 if (!$pricebycustomerexist && !empty(
$object->thirdparty->price_level)) {
1407 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1408 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1409 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1410 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1411 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1413 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1414 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1416 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1417 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1422 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1423 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1424 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1425 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1426 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1428 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1429 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1431 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1432 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1437 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1441 $filter = array(
't.fk_product' => (
string) $prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1443 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1446 if (count($prodcustprice->lines) > 0) {
1447 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1448 foreach ($prodcustprice->lines as $k => $custprice_line) {
1449 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1450 $pu_ht =
price($custprice_line->price);
1451 $pu_ttc =
price($custprice_line->price_ttc);
1452 $price_min =
price($custprice_line->price_min);
1453 $price_min_ttc =
price($custprice_line->price_min_ttc);
1454 $price_base_type = $custprice_line->price_base_type;
1472 if ($prod->prices_by_qty[0]) {
1477 foreach ($prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1478 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1482 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1483 $pu_ht = $priceforthequantityarray[
'unitprice'];
1485 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1493 if ($prod->prices_by_qty[
$object->thirdparty->price_level]) {
1498 foreach ($prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1499 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1503 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1504 $pu_ht = $priceforthequantityarray[
'unitprice'];
1506 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1514 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1515 $tmpprodvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
1518 if (!empty($price_ht) || (string) $price_ht ===
'0') {
1519 $pu_ht = (float)
price2num($price_ht,
'MU');
1520 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1521 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1522 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1523 $pu_ttc_devise = (float)
price2num((
float) $pu_ht_devise * (1 + ((float) $tmpvat / 100)),
'MU');
1526 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1527 $pu_ttc = (float)
price2num($price_ttc,
'MU');
1528 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1529 } elseif (!empty($price_ttc_devise) || (
string) $price_ttc_devise ===
'0') {
1530 $pu_ttc_devise = (float)
price2num($price_ttc_devise,
'MU');
1531 $pu_ht_devise = (float)
price2num((
float) $pu_ttc_devise / (1 + ((float) $tmpvat / 100)),
'MU');
1534 } elseif ($tmpvat != $tmpprodvat) {
1536 if ($price_base_type !=
'HT') {
1537 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1539 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1547 $outputlangs = $langs;
1549 if (
GETPOST(
'lang_id',
'aZ09')) {
1550 $newlang =
GETPOST(
'lang_id',
'aZ09');
1552 if (empty($newlang)) {
1553 $newlang =
$object->thirdparty->default_lang;
1555 if (!empty($newlang)) {
1556 $outputlangs =
new Translate(
"", $conf);
1557 $outputlangs->setDefaultLang($newlang);
1560 $desc = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1562 $desc = $prod->description;
1574 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1578 $outputlangs = $langs;
1580 if (
GETPOST(
'lang_id',
'alpha')) {
1581 $newlang =
GETPOST(
'lang_id',
'alpha');
1583 if (empty($newlang)) {
1584 $newlang =
$object->thirdparty->default_lang;
1586 if (!empty($newlang)) {
1587 $outputlangs =
new Translate(
"", $conf);
1588 $outputlangs->setDefaultLang($newlang);
1589 $outputlangs->load(
'products');
1591 if (!empty($prod->customcode)) {
1592 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode") .
': ' . $prod->customcode;
1594 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1597 if (!empty($prod->country_code)) {
1598 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry($prod->country_code,
'', $db, $outputlangs, 0);
1601 if (!empty($prod->customcode)) {
1602 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode") .
': ' . $prod->customcode;
1604 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1607 if (!empty($prod->country_code)) {
1608 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry($prod->country_code,
'', $db, $langs, 0);
1615 $type = $prod->type;
1616 $fk_unit = $prod->fk_unit;
1620 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1621 $tva_tx = str_replace(
'*',
'', $tva_tx);
1622 if (empty($tva_tx)) {
1625 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1628 $fk_unit =
GETPOST(
'units',
'alpha');
1629 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1630 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1632 if ($pu_ttc && !$pu_ht) {
1633 $price_base_type =
'TTC';
1647 $fournprice = (int) (
GETPOST(
'fournprice' . $predef) ?
GETPOST(
'fournprice' . $predef) :
'');
1648 $buyingprice =
price2num((
GETPOST(
'buying_price' . $predef) !=
'' ?
GETPOST(
'buying_price' . $predef) :
''),
'', 2);
1654 $pu_equivalent = $pu_ht;
1655 $pu_equivalent_ttc = $pu_ttc;
1656 $currency_tx =
$object->multicurrency_tx;
1660 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1661 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1663 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1664 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1684 if ($usermustrespectpricemin) {
1685 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1686 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1689 } 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') {
1690 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1698 $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);
1710 $outputlangs = $langs;
1711 $newlang =
GETPOST(
'lang_id',
'alpha');
1713 $newlang =
$object->thirdparty->default_lang;
1715 if (!empty($newlang)) {
1716 $outputlangs =
new Translate(
"", $conf);
1717 $outputlangs->setDefaultLang($newlang);
1719 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1722 unset($_POST[
'prod_entry_mode']);
1724 unset($_POST[
'qty']);
1725 unset($_POST[
'type']);
1726 unset($_POST[
'remise_percent']);
1727 unset($_POST[
'price_ht']);
1728 unset($_POST[
'multicurrency_price_ht']);
1729 unset($_POST[
'price_ttc']);
1730 unset($_POST[
'tva_tx']);
1731 unset($_POST[
'product_ref']);
1732 unset($_POST[
'product_label']);
1733 unset($_POST[
'product_desc']);
1734 unset($_POST[
'fournprice']);
1735 unset($_POST[
'buying_price']);
1736 unset($_POST[
'np_marginRate']);
1737 unset($_POST[
'np_markRate']);
1738 unset($_POST[
'dp_desc']);
1739 unset($_POST[
'idprod']);
1740 unset($_POST[
'units']);
1742 unset($_POST[
'date_starthour']);
1743 unset($_POST[
'date_startmin']);
1744 unset($_POST[
'date_startsec']);
1745 unset($_POST[
'date_startday']);
1746 unset($_POST[
'date_startmonth']);
1747 unset($_POST[
'date_startyear']);
1748 unset($_POST[
'date_endhour']);
1749 unset($_POST[
'date_endmin']);
1750 unset($_POST[
'date_endsec']);
1751 unset($_POST[
'date_endday']);
1752 unset($_POST[
'date_endmonth']);
1753 unset($_POST[
'date_endyear']);
1761 } elseif ($action ==
'addline' && $usercancreate && (
1762 (
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'') ||
1763 (
GETPOST(
'submitforallmark',
'alpha') &&
GETPOST(
'markforalllines',
'alpha') !==
''))) {
1766 $margin_rate = GETPOSTISSET(
'marginforalllines') ?
GETPOST(
'marginforalllines',
'int') :
'';
1767 $mark_rate = GETPOSTISSET(
'markforalllines') ?
GETPOST(
'markforalllines',
'int') :
'';
1768 foreach (
$object->lines as &$line)
if ($line->subprice > 0) {
1769 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1772 $subprice_multicurrency = $line->subprice;
1773 if (is_numeric($margin_rate) && $margin_rate > 0) {
1774 $line->subprice = (float)
price2num((
float) $line->pa_ht * (1 + (float) $margin_rate / 100),
'MU');
1775 } elseif (is_numeric($mark_rate) && $mark_rate > 0) {
1776 $line->subprice = (float) ($line->pa_ht / (1 - ((
float) $mark_rate / 100)));
1778 $line->subprice = (float) $line->pa_ht;
1782 $res = $prod->fetch($line->fk_product);
1784 if ($prod->price_min > $line->subprice) {
1785 $price_subprice =
price($line->subprice, 0, $outlangs, 1, -1, -1,
'auto');
1786 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1787 setEventMessages($prod->ref .
' - ' . $prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1791 } elseif ($line->fk_product) {
1796 $multicurrency_subprice = (float) $line->subprice * $line->multicurrency_subprice / $subprice_multicurrency;
1798 $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);
1801 if (is_numeric($margin_rate) && empty($mark_rate)) {
1802 $line->marge_tx = $margin_rate;
1803 } elseif (is_numeric($mark_rate) && empty($margin_rate)) {
1804 $line->marque_tx = $mark_rate;
1806 $line->total_ht = $line->qty * (float) $line->subprice;
1807 $line->total_tva = $line->tva_tx * $line->qty * (float) $line->subprice;
1808 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $line->subprice;
1810 $line->multicurrency_total_ht = $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1811 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1812 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1814 $line->multicurrency_subprice = $multicurrency_subprice;
1819 } elseif ($action ==
'updatetitleline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1822 $langs->load(
'subtotals');
1824 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1827 $subtotal_options = array();
1829 foreach (Propal::$TITLE_OPTIONS as $option) {
1830 $value =
GETPOST($option,
'alphanohtml');
1832 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1837 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1848 $outputlangs = $langs;
1849 $newlang =
GETPOST(
'lang_id',
'alpha');
1851 $newlang =
$object->thirdparty->default_lang;
1853 if (!empty($newlang)) {
1854 $outputlangs =
new Translate(
"", $conf);
1855 $outputlangs->setDefaultLang($newlang);
1858 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1863 } elseif ($action ==
'updatesubtotalline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1866 $langs->load(
'subtotals');
1868 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1871 $subtotal_options = array();
1873 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1874 $value =
GETPOST($option,
'alphanohtml');
1876 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1881 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1889 $outputlangs = $langs;
1890 $newlang =
GETPOST(
'lang_id',
'alpha');
1892 $newlang =
$object->thirdparty->default_lang;
1894 if (!empty($newlang)) {
1895 $outputlangs =
new Translate(
"", $conf);
1896 $outputlangs->setDefaultLang($newlang);
1899 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1904 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1912 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1917 $vat_rate = (
GETPOST(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : 0);
1918 $vat_rate = str_replace(
'*',
'', $vat_rate);
1925 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
1935 if (empty($remise_percent)) {
1936 $remise_percent = 0;
1940 $pu_equivalent = $pu_ht;
1941 $pu_equivalent_ttc = $pu_ttc;
1943 $currency_tx =
$object->multicurrency_tx;
1947 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1948 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1950 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1951 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1966 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1967 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1969 if (is_array($extralabelsline)) {
1971 foreach ($extralabelsline as $key => $value) {
1972 unset($_POST[
"options_" . $key]);
1983 $price_base_type =
'HT';
1984 if (empty($pu) && !empty($pu_ttc)) {
1986 $price_base_type =
'TTC';
1991 if (!empty($productid)) {
1993 $res = $product->fetch($productid);
1995 $type = $product->type;
1999 $price_min = $product->price_min;
2001 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
2003 $price_min_ttc = $product->price_min_ttc;
2005 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
2012 if ($usermustrespectpricemin) {
2013 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
2014 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2017 $action =
'editline';
2018 } 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') {
2019 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
2022 $action =
'editline';
2027 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2031 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
2039 if (!$user->hasRight(
'margins',
'creer')) {
2040 foreach (
$object->lines as &$line) {
2042 $fournprice = $line->fk_fournprice;
2043 $buyingprice = (string) $line->pa_ht;
2051 $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);
2058 $outputlangs = $langs;
2060 $outputlangs =
new Translate(
"", $conf);
2061 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
2062 $outputlangs->setDefaultLang($newlang);
2068 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2071 unset($_POST[
'qty']);
2072 unset($_POST[
'type']);
2073 unset($_POST[
'productid']);
2074 unset($_POST[
'remise_percent']);
2075 unset($_POST[
'price_ht']);
2076 unset($_POST[
'multicurrency_price_ht']);
2077 unset($_POST[
'price_ttc']);
2078 unset($_POST[
'tva_tx']);
2079 unset($_POST[
'product_ref']);
2080 unset($_POST[
'product_label']);
2081 unset($_POST[
'product_desc']);
2082 unset($_POST[
'fournprice']);
2083 unset($_POST[
'buying_price']);
2085 unset($_POST[
'date_starthour']);
2086 unset($_POST[
'date_startmin']);
2087 unset($_POST[
'date_startsec']);
2088 unset($_POST[
'date_startday']);
2089 unset($_POST[
'date_startmonth']);
2090 unset($_POST[
'date_startyear']);
2091 unset($_POST[
'date_endhour']);
2092 unset($_POST[
'date_endmin']);
2093 unset($_POST[
'date_endsec']);
2094 unset($_POST[
'date_endday']);
2095 unset($_POST[
'date_endmonth']);
2096 unset($_POST[
'date_endyear']);
2103 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
2104 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
2106 } elseif ($action ==
'classin' && $usercancreate) {
2109 } elseif ($action ==
'setavailability' && $usercancreate) {
2112 } elseif ($action ==
'setdemandreason' && $usercancreate) {
2115 } elseif ($action ==
'setconditions' && $usercancreate) {
2118 } elseif ($action ==
'setmode' && $usercancreate) {
2121 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
2123 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
2124 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
2127 } elseif ($action ==
'setbankaccount' && $usercancreate) {
2130 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
2133 } elseif ($action ==
'setwarehouse' && $usercancreate) {
2136 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
2139 $attribute_name =
GETPOST(
'attribute',
'aZ09');
2142 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
2147 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
2154 $action =
'edit_extras';
2159 if ($action ==
'addcontact' && $usercancreate) {
2163 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2167 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2170 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2171 $langs->load(
"errors");
2172 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
2177 } elseif ($action ==
'swapstatut' && $usercancreate) {
2179 if (
$object->fetch($id) > 0) {
2184 } elseif ($action ==
'deletecontact' && $usercancreate) {
2187 $result =
$object->delete_contact($lineid);
2190 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2199 $upload_dir = !empty($conf->propal->multidir_output[
$object->entity ?? $conf->entity]) ? $conf->propal->multidir_output[
$object->entity ?? $conf->entity] : $conf->propal->dir_output;
2200 $permissiontoadd = $usercancreate;
2201 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
2209$form =
new Form($db);
2218$title =
$object->ref .
" - " . $langs->trans(
'Card');
2219if ($action ==
'create') {
2220 $title = $langs->trans(
"NewPropal");
2222$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
2229if ($action ==
'create') {
2236 $res = $soc->fetch($socid);
2239 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2240 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2241 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2247 if (!empty($origin) && !empty($originid)) {
2249 $element = $subelement = $origin;
2251 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2252 $element = $regs[1];
2253 $subelement = $regs[2];
2256 if ($element ==
'project') {
2257 $projectid = $originid;
2261 $project->fetch($projectid);
2262 if ($project->socid > 0) {
2264 $soc->fetch($project->socid);
2268 if ($element ==
'order' || $element ==
'commande') {
2269 $element = $subelement =
'commande';
2271 if ($element ==
'propal') {
2272 $element =
'comm/propal';
2273 $subelement =
'propal';
2275 if ($element ==
'contract') {
2276 $element = $subelement =
'contrat';
2278 if ($element ==
'shipping') {
2279 $element = $subelement =
'expedition';
2284 $classname = ucfirst($subelement);
2285 $objectsrc =
new $classname($db);
2286 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
2288 $objectsrc->fetch($originid);
2289 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2290 $objectsrc->fetch_lines();
2292 $objectsrc->fetch_thirdparty();
2294 $projectid = (int) $objectsrc->fk_project;
2295 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
2297 $soc = $objectsrc->thirdparty;
2299 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2300 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2301 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : -1));
2304 $objectsrc->fetch_optionals();
2305 $object->array_options = $objectsrc->array_options;
2308 if (!empty($objectsrc->multicurrency_code)) {
2309 $currency_code = $objectsrc->multicurrency_code;
2311 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2312 $currency_tx = $objectsrc->multicurrency_tx;
2320 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
2321 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
2322 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
2323 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
2324 $shipping_method_id = $soc->shipping_method_id;
2325 $warehouse_id = !empty($soc->fk_warehouse) ? $soc->fk_warehouse : $warehouse_id;
2326 $remise_percent = $soc->remise_percent;
2328 if (
isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
2329 $currency_code = $soc->multicurrency_code;
2334 if (!
GETPOST(
'changecompany')) {
2335 if (GETPOSTISSET(
'cond_reglement_id')) {
2336 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2338 if (GETPOSTISSET(
'deposit_percent')) {
2341 if (GETPOSTISSET(
'mode_reglement_id')) {
2342 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2344 if (GETPOSTISSET(
'fk_account')) {
2347 if (GETPOSTISSET(
'shipping_method_id')) {
2348 $shipping_method_id =
GETPOSTINT(
'shipping_method_id');
2352 if ($soc->fk_warehouse > 0) {
2353 $warehouse_id = $soc->fk_warehouse;
2360 $warehouse_id = $user->fk_warehouse;
2364 print
'<form name="addprop" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
2365 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2366 print
'<input type="hidden" name="action" value="add">';
2367 print
'<input type="hidden" name="changecompany" value="0">';
2368 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
2369 if ($origin !=
'project' && $originid) {
2370 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
2371 print
'<input type="hidden" name="originid" value="' . $originid .
'">';
2372 if ($origin ==
'contrat' && !empty($renewal)) {
2373 print
'<input type="hidden" name="renewal" value="' . $renewal .
'">';
2375 } elseif ($origin ==
'project' && !empty($projectid)) {
2376 print
'<input type="hidden" name="projectid" value="' . $projectid .
'">';
2382 $parameters = array();
2384 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters, $object, $action);
2385 if (empty($reshook)) {
2386 print
'<table class="border centpercent">';
2389 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Ref') .
'</td><td class="valuefieldcreate">' . $langs->trans(
"Draft") .
'</td></tr>';
2392 print
'<tr class="field_ref_client"><td class="titlefieldcreate">' . $langs->trans(
'RefCustomer') .
'</td><td class="valuefieldcreate">';
2393 print
'<input type="text" name="ref_client" value="' . (!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')) .
'"></td>';
2397 print
'<tr class="field_socid">';
2399 print
'<td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Customer') .
'</td>';
2400 $shipping_method_id = 0;
2403 print
'<td class="valuefieldcreate">';
2404 print $soc->getNomUrl(1,
'customer');
2405 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
2407 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2408 $shipping_method_id = $soc->shipping_method_id;
2411 print
'<td class="valuefieldcreate">';
2412 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2413 print
img_picto(
'',
'company',
'class="pictofixedwidth"') . $form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2417 $(document).ready(function() {
2418 $("#socid").change(function() {
2419 console.log("We have changed the company - Reload page");
2420 var socid = $(this).val();
2422 $("input[name=action]").val("create");
2423 $("input[name=changecompany]").val("1");
2424 $("form[name=addprop]").submit();
2429 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>';
2432 print
'</tr>' .
"\n";
2436 print
'<tr class="field_contactid"><td class="titlefieldcreate">' . $langs->trans(
"DefaultContact") .
'</td><td class="valuefieldcreate">';
2437 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2439 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2443 print
'<tr class="field_discount_info"><td class="titlefieldcreate">' . $langs->trans(
'Discounts') .
'</td><td class="valuefieldcreate">';
2445 $absolute_discount = $soc->getAvailableDiscounts();
2449 $backtopage = $_SERVER[
"PHP_SELF"] .
'?socid=' . $thirdparty->id .
'&action=' . $action .
'&origin=' . urlencode((
string) (
GETPOST(
'origin'))) .
'&originid=' . urlencode((
string) (
GETPOSTINT(
'originid')));
2450 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
2456 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'DatePropal') .
'</td><td class="valuefieldcreate">';
2457 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2458 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2462 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>';
2465 print
'<tr class="field_cond_reglement_id"><td class="nowrap">' . $langs->trans(
'PaymentConditionsShort') .
'</td><td>';
2466 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2468 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2472 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">' . $langs->trans(
'PaymentMode') .
'</td><td class="valuefieldcreate">';
2473 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2474 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2479 print
'<tr class="field_fk_account"><td class="titlefieldcreate">' . $langs->trans(
'BankAccount') .
'</td><td class="valuefieldcreate">';
2480 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"') . $form->select_comptes((
int) $fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2485 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">' . $langs->trans(
'Source') .
'</td><td class="valuefieldcreate">';
2486 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2487 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2492 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2493 $shipping_method_id = $soc->shipping_method_id;
2495 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">' . $langs->trans(
'SendingMethod') .
'</td><td class="valuefieldcreate">';
2496 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2497 $form->selectShippingMethod((
string) $shipping_method_id,
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2501 $formproduct =
null;
2504 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
2506 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">' . $langs->trans(
'Warehouse') .
'</td><td class="valuefieldcreate">';
2507 print
img_picto(
'',
'stock',
'class="pictofixedwidth"') . $formproduct->selectWarehouses((
int) $warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2512 print
'<tr class="field_availability_id"><td class="titlefieldcreate">' . $langs->trans(
'AvailabilityPeriod');
2514 print
' (' . $langs->trans(
'AfterOrder') .
')';
2516 print
'</td><td class="valuefieldcreate">';
2517 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2518 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2522 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">' . $langs->trans(
"DeliveryDate") .
'</td>';
2523 print
'<td class="valuefieldcreate">';
2524 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2526 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2527 $syear =
date(
"Y", $tmpdte);
2528 $smonth =
date(
"m", $tmpdte);
2529 $sday =
date(
"d", $tmpdte);
2530 print $form->selectDate($syear .
"-" . $smonth .
"-" . $sday,
'date_livraison', 0, 0, 0,
"addprop");
2532 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2533 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2538 if (
isModEnabled(
'project') && is_object($formproject)) {
2539 $langs->load(
"projects");
2540 print
'<tr class="field_projectid">';
2541 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2542 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');
2543 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>';
2550 print
'<tr class="field_incoterm_id">';
2551 print
'<td class="titlefieldcreate"><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1) .
'</label></td>';
2552 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2553 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2554 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2559 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td colspan="3">';
2560 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
2564 print
'<tr class="field_model">';
2565 print
'<td class="titlefieldcreate">' . $langs->trans(
"DefaultModel") .
'</td>';
2566 print
'<td class="valuefieldcreate">';
2567 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2570 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2575 print
'<tr class="field_currency">';
2576 print
'<td class="titlefieldcreate">' . $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0) .
'</td>';
2577 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2578 print
img_picto(
'',
'currency',
'class="pictofixedwidth"') . $form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2583 print
'<tr class="field_note_public">';
2584 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePublic') .
'</td>';
2585 print
'<td class="valuefieldcreate">';
2586 $note_public =
GETPOST(
'note_public',
'restricthtml');
2587 if (!GETPOSTISSET(
'note_public') && empty($note_public) && !empty($objectsrc)) {
2588 $note_public = $objectsrc->note_public;
2590 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2591 print $doleditor->Create(1);
2594 if (empty($user->socid)) {
2595 print
'<tr class="field_note_private">';
2596 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePrivate') .
'</td>';
2597 print
'<td class="valuefieldcreate">';
2598 $note_private =
GETPOST(
'note_private',
'restricthtml');
2599 if (!GETPOSTISSET(
'note_private') && empty($note_private) && !empty($objectsrc)) {
2600 $note_private = $objectsrc->note_private;
2602 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2603 print $doleditor->Create(1);
2609 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_add.tpl.php';
2612 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2614 if ($origin ==
'contrat') {
2618 $objectsrc->update_price(1,
'auto', 1);
2621 print
"\n<!-- " . $classname .
" info -->";
2623 print
'<input type="hidden" name="amount" value="' . $objectsrc->total_ht .
'">' .
"\n";
2624 print
'<input type="hidden" name="total" value="' . $objectsrc->total_ttc .
'">' .
"\n";
2625 print
'<input type="hidden" name="tva" value="' . $objectsrc->total_tva .
'">' .
"\n";
2626 print
'<input type="hidden" name="origin" value="' . $objectsrc->element .
'">';
2627 print
'<input type="hidden" name="originid" value="' . $objectsrc->id .
'">';
2629 $newclassname = $classname;
2630 if ($newclassname ==
'Propal') {
2631 $newclassname =
'CommercialProposal';
2632 } elseif ($newclassname ==
'Commande') {
2633 $newclassname =
'Order';
2634 } elseif ($newclassname ==
'Expedition') {
2635 $newclassname =
'Sending';
2636 } elseif ($newclassname ==
'Fichinter') {
2637 $newclassname =
'Intervention';
2640 print
'<tr><td>' . $langs->trans($newclassname) .
'</td><td>' . $objectsrc->getNomUrl(1) .
'</td></tr>';
2641 print
'<tr><td>' . $langs->trans(
'AmountHT') .
'</td><td>' .
price($objectsrc->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td></tr>';
2642 print
'<tr><td>' . $langs->trans(
'AmountVAT') .
'</td><td>' .
price($objectsrc->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2643 if (
$mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2644 print
'<tr><td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2647 if (
$mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2648 print
'<tr><td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2650 print
'<tr><td>' . $langs->trans(
'AmountTTC') .
'</td><td>' .
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
"</td></tr>";
2653 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
'</td></tr>';
2654 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
"</td></tr>";
2655 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
"</td></tr>";
2667 print
'<input type="hidden" name="createmode" value="empty">';
2671 print
'<br><table>';
2675 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2676 print
'<td>' . $langs->trans(
"CopyPropalFrom") .
' </td>';
2678 $liste_propal = array();
2679 $liste_propal[0] =
'';
2681 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2682 $sql .=
" FROM " . MAIN_DB_PREFIX .
"propal p";
2683 $sql .=
", " . MAIN_DB_PREFIX .
"societe s";
2684 $sql .=
" WHERE s.rowid = p.fk_soc";
2685 $sql .=
" AND p.entity IN (" .
getEntity(
'propal') .
")";
2686 $sql .=
" AND p.fk_statut <> 0";
2687 $sql .=
" ORDER BY Id";
2689 $resql = $db->query($sql);
2691 $num = $db->num_rows($resql);
2694 $row = $db->fetch_row($resql);
2695 $propalRefAndSocName = $row[1] .
" - " . $row[2];
2696 $liste_propal[$row[0]] = $propalRefAndSocName;
2699 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2705 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2706 print
'<td valign="top" colspan="2">' . $langs->trans(
"CreateEmptyPropal") .
'</td></tr>';
2713 $langs->load(
"bills");
2715 print $form->buttonsSaveCancel(
"CreateDraft");
2721 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2724 $title = $langs->trans(
'ProductsAndServices');
2727 print
'<div class="div-table-responsive-no-min">';
2728 print
'<table class="noborder centpercent">';
2730 $objectsrc->printOriginLinesList();
2747 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
$object->picto, 0,
'',
'', 0,
'', 1);
2752 if ($action ==
'clone') {
2754 $filter =
'(s.client:IN:1,2,3)';
2755 $formquestion = array(
2758 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2759 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2760 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2763 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2766 $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);
2770 if ($action ==
'add_title_line') {
2771 $langs->load(
'subtotals');
2773 $depth_array =
$object->getPossibleLevels($langs);
2775 } elseif ($action ==
'add_subtotal_line') {
2776 $langs->load(
'subtotals');
2778 $titles =
$object->getPossibleTitles();
2782 if ($action ==
'closeas') {
2784 $formquestion = array();
2786 $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)));
2788 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2790 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2795 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2797 if (!empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2798 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2802 $eligibleForDepositGeneration =
true;
2804 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2805 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2806 '@phan-var-force Facture $invoice';
2809 $eligibleForDepositGeneration =
false;
2815 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2816 foreach (
$object->linkedObjects[
'commande'] as $order) {
2817 $order->fetchObjectLinked();
2819 if (array_key_exists(
'facture', $order->linkedObjects)) {
2820 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2821 '@phan-var-force Facture $invoice';
2824 $eligibleForDepositGeneration =
false;
2833 if ($eligibleForDepositGeneration) {
2834 $formquestion[] = array(
2835 'type' =>
'checkbox',
2836 'tdclass' =>
'showonlyifsigned',
2837 'name' =>
'generate_deposit',
2838 'morecss' =>
'margintoponly marginbottomonly',
2839 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2842 $formquestion[] = array(
2844 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2846 'label' => $langs->trans(
'DateInvoice'),
2852 $formquestion[] = array(
2854 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2855 'name' =>
'date_pointoftax',
2856 'label' => $langs->trans(
'DatePointOfTax'),
2862 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2864 $formquestion[] = array(
2866 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2867 'name' =>
'cond_reglement_id',
2868 'label' => $langs->trans(
'PaymentTerm'),
2869 'value' => $paymentTermsSelect
2872 $formquestion[] = array(
2873 'type' =>
'checkbox',
2874 'tdclass' =>
'showonlyifgeneratedeposit',
2875 'name' =>
'validate_generated_deposit',
2876 'morecss' =>
'margintoponly marginbottomonly',
2877 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2880 $formquestion[] = array(
2881 'type' =>
'onecolumn',
2884 let signedValue = ' . $object::STATUS_SIGNED .
';
2886 $(document).ready(function() {
2887 $("[name=generate_deposit]").change(function () {
2888 let $self = $(this);
2889 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2891 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2900 $("#statut").change(function() {
2901 let $target = $(".showonlyifsigned").parent(".tagtr");
2903 if ($(this).val() == signedValue) {
2909 $("[name=generate_deposit]").trigger("change");
2914 $("#statut").trigger("change");
2924 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2925 $notify =
new Notify($db);
2926 $formquestion = array_merge($formquestion, array(
2927 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid, $object)),
2932 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2934 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2936 } elseif ($action ==
'cancel') {
2938 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2939 } elseif ($action ==
'delete') {
2941 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2942 } elseif ($action ==
'reopen') {
2944 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2945 } elseif ($action ==
'ask_deleteline') {
2947 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2948 } elseif ($action ==
'ask_subtotal_deleteline') {
2950 $langs->load(
"subtotals");
2951 $title =
"DeleteSubtotalLine";
2952 $question =
"ConfirmDeleteSubtotalLine";
2953 if (
GETPOST(
'type') ==
'title') {
2954 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2955 $title =
"DeleteTitleLine";
2956 $question =
"ConfirmDeleteTitleLine";
2958 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2959 } elseif ($action ==
'validate') {
2964 $ref = substr(
$object->ref, 1, 4);
2965 if ($ref ==
'PROV' || $ref ==
'') {
2966 $numref =
$object->getNextNumRef($soc);
2967 if (empty($numref)) {
2972 $numref = (string)
$object->ref;
2975 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2977 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2978 $notify =
new Notify($db);
2980 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid, $object);
2985 foreach (
$object->lines as $line) {
2986 $res = $line->fetch_product();
2988 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2994 if ($nbMandated > 0) {
2996 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2999 $text .=
'<div><span class="clearboth nowraponall warning">' .
img_warning() . $langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate") .
'</span></div>';
3004 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
3009 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
3010 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
3011 if (empty($reshook)) {
3012 $formconfirm .= $hookmanager->resPrint;
3013 } elseif ($reshook > 0) {
3014 $formconfirm = $hookmanager->resPrint;
3023 $linkback =
'<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
3025 $morehtmlref =
'<div class="refidno">';
3027 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client, $object, $usercancreate,
'string',
'', 0, 1);
3028 $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);
3030 $morehtmlref .=
'<br>' . $soc->getNomUrl(1,
'customer');
3032 $morehtmlref .=
' (<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?socid=' . ((int) $soc->id) .
'">' . $langs->trans(
"OtherProposals") .
'</a>)';
3036 $langs->load(
"projects");
3037 $morehtmlref .=
'<br>';
3038 if ($usercancreate) {
3039 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
3040 if ($action !=
'classify') {
3041 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
3043 $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');
3045 if (!empty(
$object->fk_project)) {
3047 $proj->fetch(
$object->fk_project);
3048 $morehtmlref .= $proj->getNomUrl(1);
3050 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
3055 $morehtmlref .=
'</div>';
3058 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
3061 $parameters = array();
3063 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters, $object, $action);
3064 if (empty($reshook)) {
3065 print
'<div class="fichecenter">';
3066 print
'<div class="fichehalfleft">';
3067 print
'<div class="underbanner clearboth"></div>';
3069 print
'<table class="border tableforfield centpercent">';
3073 $filterabsolutediscount =
"fk_facture_source IS NULL";
3074 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3076 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3077 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3080 print
'<tr><td class="titlefieldmax45">' . $langs->trans(
'Discounts') .
'</td><td>';
3082 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3083 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3084 $absolute_discount =
price2num($absolute_discount,
'MT');
3085 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3091 $backtopage = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id;
3092 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
3108 print $form->editfieldkey(
"DatePropal",
'date',
'', $object, (
int) $editenable);
3109 print
'</td><td class="valuefield">';
3110 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3111 print
'<form name="editdate" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3112 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3113 print
'<input type="hidden" name="action" value="setdate">';
3114 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3115 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3116 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3130 print
'<table class="nobordernopadding centpercent"><tr><td>';
3131 print $langs->trans(
'DateEndPropal');
3133 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3134 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>';
3136 print
'</tr></table>';
3137 print
'</td><td class="valuefield">';
3138 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3139 print
'<form name="editecheance" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3140 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3141 print
'<input type="hidden" name="action" value="setecheance">';
3142 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3143 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3144 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3147 if (!empty(
$object->fin_validite)) {
3161 print
'<table class="nobordernopadding centpercent"><tr><td>';
3162 print $langs->trans(
'PaymentConditionsShort');
3164 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3165 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>';
3167 print
'</tr></table>';
3168 print
'</td><td class="valuefield">';
3169 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3170 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3172 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3178 print
'<tr class="field_mode_reglement_id">';
3180 print
'<table class="nobordernopadding centpercent"><tr><td>';
3181 print $langs->trans(
'PaymentMode');
3183 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3184 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>';
3186 print
'</tr></table>';
3187 print
'</td><td class="valuefieldcreate">';
3188 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3189 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3191 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'none');
3197 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3198 print
'</td><td class="valuefieldedit">';
3199 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, $usercancreate && $caneditfield,
'datepicker');
3204 print
'<tr class="fielddeliverydelay"><td>';
3205 print
'<table class="nobordernopadding centpercent"><tr><td>';
3207 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod') .
' (' . $langs->trans(
'AfterOrder') .
')');
3209 print $langs->trans(
'AvailabilityPeriod');
3212 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3213 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>';
3215 print
'</tr></table>';
3216 print
'</td><td class="valuefield">';
3217 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3218 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'availability_id', 1);
3220 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'none', 1);
3229 print
'<table class="nobordernopadding centpercent"><tr><td>';
3230 print $langs->trans(
'SendingMethod');
3232 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3233 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>';
3235 print
'</tr></table>';
3236 print
'</td><td class="valuefield">';
3237 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3238 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3240 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'none');
3248 $langs->load(
'stocks');
3249 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
3251 print
'<tr class="field_warehouse_id"><td>';
3252 $editenable = $usercancreate;
3253 print $form->editfieldkey(
"Warehouse",
'warehouse',
'', $object, $editenable);
3254 print
'</td><td class="valuefieldcreate">';
3255 if ($action ==
'editwarehouse') {
3256 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3258 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'none');
3266 print
'<table class="nobordernopadding centpercent"><tr><td>';
3267 print $langs->trans(
'Source');
3269 if ($action !=
'editdemandreason' && $usercancreate) {
3270 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>';
3272 print
'</tr></table>';
3273 print
'</td><td class="valuefield">';
3274 if ($action ==
'editdemandreason' && $usercancreate) {
3275 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3277 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'none');
3282 if ($soc->outstanding_limit) {
3285 print $langs->trans(
'OutstandingBill');
3286 print
'</td><td class="valuefield">';
3287 $arrayoutstandingbills = $soc->getOutstandingBills();
3288 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
3289 print
price($arrayoutstandingbills[
'opened']) .
' / ';
3290 print
price($soc->outstanding_limit, 0, $langs, 1, -1, -1, $conf->currency);
3298 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3299 print $langs->trans(
'BankAccount');
3301 if ($action !=
'editbankaccount' && $usercancreate) {
3302 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>';
3304 print
'</tr></table>';
3305 print
'</td><td class="valuefield">';
3306 if ($action ==
'editbankaccount') {
3307 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3309 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'none');
3316 $tmparray =
$object->getTotalWeightVolume();
3317 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3318 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3320 print
'<tr><td>' . $langs->trans(
"CalculatedWeight") .
'</td>';
3321 print
'<td class="valuefield">';
3326 print
'<tr><td>' . $langs->trans(
"CalculatedVolume") .
'</td>';
3327 print
'<td class="valuefield">';
3336 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3337 print $langs->trans(
'IncotermLabel');
3338 print
'<td><td class="right">';
3339 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3340 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' .
img_edit() .
'</a>';
3344 print
'</td></tr></table>';
3346 print
'<td class="valuefield">';
3347 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3348 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3350 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3358 print
'<table class="nobordernopadding centpercent"><tr><td>';
3359 print $langs->trans(
"Categories");
3360 print
'<td><td class="right">';
3361 if ($usercancreate) {
3362 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=edittags&token='.
newToken().
'">'.
img_edit().
'</a>';
3366 print
'</td></tr></table>';
3369 if ($action ==
'edittags') {
3370 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'">';
3371 print
'<input type="hidden" name="action" value="settags">';
3372 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3373 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
3374 print
'<input type="submit" class="button valignmiddle smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
3377 print $form->showCategories(
$object->id, Categorie::TYPE_PROPOSAL, 1);
3383 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3388 print
'<div class="fichehalfright">';
3389 print
'<div class="underbanner clearboth"></div>';
3391 print
'<table class="border tableforfield centpercent">';
3393 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_currency_amount.tpl.php';
3396 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3397 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3399 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3404 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3405 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3407 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3411 if (
$mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3413 print
'<td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td>';
3414 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3418 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3423 if (
$mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3425 print
'<td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td>';
3426 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3430 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3436 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3437 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
3439 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3447 $formmargin->displayMarginInfos($object);
3453 print
'<div class="clearboth"></div><br>';
3456 $blocname =
'contacts';
3457 $title = $langs->trans(
'ContactsAddresses');
3458 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3462 $blocname =
'notes';
3463 $title = $langs->trans(
'Notes');
3464 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3472 $result =
$object->getLinesArray();
3476 global $inputalsopricewithtax;
3477 $inputalsopricewithtax = 1;
3479 print
' <form name="addproduct" id="addproduct" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="POST">
3480 <input type="hidden" name="token" value="' .
newToken() .
'">
3481 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline') .
'">
3482 <input type="hidden" name="mode" value="">
3483 <input type="hidden" name="page_y" value="">
3484 <input type="hidden" name="backtopage" value="' . $backtopage .
'">
3485 <input type="hidden" name="id" value="' .
$object->id .
'">
3490 include DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_ajaxrow.tpl.php';
3492 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3496 print
'<div class="div-table-responsive-no-min">';
3498 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3507 if ($action !=
'editline') {
3508 $parameters = array();
3509 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3513 if (empty($reshook)) {
3517 $parameters = array();
3518 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters, $object, $action);
3537 if ($action !=
'presend') {
3538 $numlines = count(
$object->lines);
3539 print
'<div class="tabsAction">';
3541 $parameters = array();
3542 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3544 if (empty($reshook)) {
3545 if ($action !=
'editline') {
3549 $langs->load(
'subtotals');
3551 $url_button = array();
3553 $url_button[] = array(
3554 'lang' =>
'subtotals',
3556 'perm' => (
bool) $usercancreate,
3557 'label' => $langs->trans(
'AddTitleLine'),
3558 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_title_line&token=' .
newToken()
3561 $url_button[] = array(
3562 'lang' =>
'subtotals',
3564 'perm' => (
bool) $usercancreate,
3565 'label' => $langs->trans(
'AddSubtotalLine'),
3566 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_subtotal_line&token=' .
newToken()
3569 print
dolGetButtonAction(
'', $langs->trans(
'SubTotal'),
'default', $url_button,
'',
true);
3576 if ($usercanvalidate) {
3577 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>';
3579 print
'<a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
'Validate') .
'</a>';
3589 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=modif&token=' .
newToken() .
'">' . $langs->trans(
'Modify') .
'</a>';
3594 if ($usercanreopen) {
3595 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=reopen&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen') .
'"';
3596 print
'>' . $langs->trans(
'ReOpen') .
'</a>';
3598 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ReOpen") .
'</a>';
3603 if (empty($user->socid)) {
3605 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'', $usercansend);
3609 $arrayforbutaction = array();
3612 $arrayforbutaction[] = array(
3615 'perm' => $usercancreateorder,
3616 'label' =>
'AddOrder',
3617 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3627 $arrayforbutaction[] = array(
3630 'perm' => $usercancreatepurchaseorder,
3631 'label' =>
'AddPurchaseOrder',
3632 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id)
3642 $arrayforbutaction[] = array(
3643 'lang' =>
'interventions',
3645 'perm' => $usercancreateintervention,
3646 'label' =>
'AddIntervention',
3647 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3657 $arrayforbutaction[] = array(
3658 'lang' =>
'contracts',
3660 'perm' => $usercancreatecontract,
3661 'label' =>
'AddContract',
3662 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3674 $arrayforbutaction[] = [
3675 'lang' =>
'invoice',
3677 'perm' => $usercancreateinvoice,
3678 'label' =>
'CreateBill',
3679 'url' =>
'/compta/facture/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((int)
$object->id) .
'&socid=' . ((int)
$object->socid),
3686 $actionButtonsParameters = [
3687 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3688 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3691 if ($numlines > 0) {
3692 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3694 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3698 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3699 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3700 if ($usercanclose) {
3701 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=classifybilled&token=' .
newToken() .
'&socid=' .
$object->socid .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3703 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3711 if ($usercanclose) {
3712 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3713 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3715 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'"';
3716 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3722 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token=' .
newToken() .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3723 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3729 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=cancel&token=' .
newToken() .
'">' . $langs->trans(
"CancelPropal") .
'</a>';
3733 if ($usercancreate) {
3734 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>';
3738 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' .
newToken(),
'delete', $usercandelete);
3746 if (
GETPOST(
'modelselected')) {
3747 $action =
'presend';
3750 if ($action !=
'presend') {
3751 print
'<div class="fichecenter"><div class="fichehalfleft">';
3752 print
'<a name="builddoc"></a>';
3758 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3759 $genallowed = $usercanread;
3760 $delallowed = $usercancreate;
3761 $tooltipAfterComboOfModels =
'';
3763 $tooltipAfterComboOfModels = $langs->trans(
"AccordingToYourSetupTheFileWillBeConcatenated",
getDolGlobalString(
'MAIN_INFO_PROPAL_TERMSOFSALE'));
3766 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);
3769 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'propal'), 1);
3770 $linktoelem = $tmparray[
'linktoelem'];
3771 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3772 print $htmltoenteralink;
3774 $compatibleImportElementsList =
false;
3776 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3778 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, $compatibleImportElementsList);
3784 print
'<br><!-- Link to sign -->';
3785 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3786 print showOnlineSignatureUrl(
'proposal',
$object->ref, $object) .
'<br>';
3789 print
'</div><div class="fichehalfright">';
3793 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/comm/propal/messaging.php?id=' .
$object->id);
3794 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT .
'/comm/propal/agenda.php?id=' .
$object->id);
3797 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3799 $somethingshown = $formactions->showactions($object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3801 print
'</div></div>';
3805 $modelmail =
'propal_send';
3806 $defaulttopic =
'SendPropalRef';
3807 $diroutput = $conf->propal->multidir_output[
$object->entity ?? $conf->entity];
3808 $trackid =
'pro' .
$object->id;
3810 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 commercial proposal lines.
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.