47require
'../../main.inc.php';
57require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
58require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formother.class.php';
59require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formfile.class.php';
60require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formpropal.class.php';
61require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formmargin.class.php';
62require_once DOL_DOCUMENT_ROOT .
'/comm/propal/class/propal.class.php';
63require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
64require_once DOL_DOCUMENT_ROOT .
'/core/modules/propale/modules_propale.php';
65require_once DOL_DOCUMENT_ROOT .
'/core/lib/propal.lib.php';
66require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
67require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
68require_once DOL_DOCUMENT_ROOT .
'/core/class/doleditor.class.php';
70 require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
71 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
75 require_once DOL_DOCUMENT_ROOT .
'/variants/class/ProductCombination.class.php';
80$langs->loadLangs(array(
'companies',
'propal',
'compta',
'bills',
'orders',
'products',
'sendings',
'other'));
82 $langs->load(
'incoterm');
85 $langs->load(
'margins');
90$array_options = array();
95$action =
GETPOST(
'action',
'aZ09');
96$cancel =
GETPOST(
'cancel',
'alpha');
97$origin =
GETPOST(
'origin',
'alpha');
100$confirm =
GETPOST(
'confirm',
'alpha');
101$backtopage =
GETPOST(
'backtopage',
'alpha');
115$extrafields->fetch_name_optionals_label(
$object->table_element);
118if ($id > 0 || !empty($ref)) {
119 $ret =
$object->fetch($id, $ref);
121 $ret =
$object->fetch_thirdparty();
122 if ($ret > 0 && isset(
$object->fk_project)) {
123 $ret =
$object->fetchProject();
133$hookmanager->initHooks(array(
'propalcard',
'globalcard'));
135$usercanread = $user->hasRight(
"propal",
"lire");
136$usercancreate = $user->hasRight(
"propal",
"creer");
137$usercandelete = $user->hasRight(
"propal",
"supprimer");
139$usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'close')));
140$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'validate')));
143$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
144$usercancreateorder = ($user->hasRight(
'commande',
'creer') == 1);
145$usercancreateinvoice = ($user->hasRight(
'facture',
'creer') == 1);
146$usercancreatecontract = ($user->hasRight(
'contrat',
'creer') == 1);
147$usercancreateintervention = ($user->hasRight(
'ficheinter',
'creer') == 1);
148$usercancreatepurchaseorder = ($user->hasRight(
'fournisseur',
'commande',
'creer') || $user->hasRight(
'supplier_order',
'creer'));
149$usercanreopen = ((!
getDolGlobalBool(
'MAIN_USE_ADVANCED_PERMS') && $usercanclose) || (
getDolGlobalBool(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'reopen')));
151 $usercanreopen =
false;
154$permissiontoadd = $usercancreate;
155$permissionnote = $usercancreate;
156$permissiondellink = $usercancreate;
157$permissiontoedit = $usercancreate;
158$permissiontoeditextra = $permissiontoadd;
159if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
161 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
164$price_base_type =
null;
165$shipping_method_id =
null;
169if (!empty($user->socid)) {
170 $socid = $user->socid;
179$parameters = array(
'socid' => $socid);
180$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
184if (empty($reshook)) {
185 $backurlforlist =
dolBuildUrl(DOL_URL_ROOT .
'/comm/propal/list.php');
187 if (empty($backtopage) || ($cancel && empty($id))) {
188 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
189 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
190 $backtopage = $backurlforlist;
192 $backtopage =
dolBuildUrl(DOL_URL_ROOT .
'/comm/propal/card.php', [
'id' => ((!empty($id) && $id > 0) ? $id :
'__ID__')]);
198 if (!empty($backtopageforcancel)) {
199 header(
"Location: " . $backtopageforcancel);
201 } elseif (!empty($backtopage)) {
202 header(
"Location: " . $backtopage);
208 include DOL_DOCUMENT_ROOT .
'/core/actions_setnotes.inc.php';
210 include DOL_DOCUMENT_ROOT .
'/core/actions_dellink.inc.php';
212 include DOL_DOCUMENT_ROOT .
'/core/actions_lineupdown.inc.php';
215 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
217 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'IdThirdParty')),
null,
'errors');
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);
292 $langs->load(
"errors");
295 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
297 $result =
$object->delete($user);
299 header(
'Location: ' .
dolBuildUrl(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");
323 $outputlangs = $langs;
326 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
327 $outputlangs->setDefaultLang($newlang);
329 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
331 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $usercancreate) {
336 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'));
341 $outputlangs = $langs;
347 $newlang =
$object->thirdparty->default_lang;
349 if (!empty($newlang)) {
351 $outputlangs->setDefaultLang($newlang);
352 $outputlangs->load(
'products');
356 $result =
$object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
359 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
366 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
369 $result =
$object->valid($user);
371 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
382 $outputlangs = $langs;
385 $newlang =
GETPOST(
'lang_id',
'aZ09');
388 $newlang =
$object->thirdparty->default_lang;
390 if (!empty($newlang)) {
392 $outputlangs->setDefaultLang($newlang);
396 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
398 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
401 $langs->load(
"errors");
402 if (count(
$object->errors) > 0) {
408 } elseif ($action ==
'setdate' && $usercancreate) {
413 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
417 $result =
$object->set_date($user, $datep);
418 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
419 $datev = $datep + (
$object->duree_validite * 24 * 3600);
420 $result =
$object->set_echeance($user, $datev, 1);
425 $outputlangs = $langs;
428 $newlang =
GETPOST(
'lang_id',
'aZ09');
431 $newlang =
$object->thirdparty->default_lang;
433 if (!empty($newlang)) {
435 $outputlangs->setDefaultLang($newlang);
443 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
446 } elseif ($action ==
'setecheance' && $usercancreate) {
450 $outputlangs = $langs;
453 $newlang =
GETPOST(
'lang_id',
'aZ09');
456 $newlang =
$object->thirdparty->default_lang;
458 if (!empty($newlang)) {
460 $outputlangs->setDefaultLang($newlang);
468 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
473 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
478 } elseif ($action ==
'setref_client' && $usercancreate) {
484 } elseif ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $usercancreate) {
490 } elseif ($action ==
'settags' &&
isModEnabled(
'category') && $usercancreate) {
495 } elseif ($action ==
'add' && $usercancreate) {
505 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
509 if (empty($duration)) {
510 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
516 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
531 $object->delivery_date = $date_delivery;
537 $object->duree_validite = $duration;
547 $object->user_author_id = $user->id;
553 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
563 $object->delivery_date = $date_delivery;
578 $object->user_author_id = $user->id;
582 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
589 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
593 $ret = $extrafields->setOptionalsFromPost(
null, $object);
601 if ($origin && $originid) {
603 $element = $subelement = $origin;
605 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
607 $subelement = $regs[2];
611 if ($element ==
'order') {
612 $element = $subelement =
'commande';
614 if ($element ==
'propal') {
615 $element =
'comm/propal';
616 $subelement =
'propal';
618 if ($element ==
'contract') {
619 $element = $subelement =
'contrat';
621 if ($element ==
'inter') {
622 $element = $subelement =
'fichinter';
624 if ($element ==
'shipping') {
625 $element = $subelement =
'expedition';
629 if (($origin !=
'contrat' || $renewal !=
'true') && !
getDolGlobalInt(
'CONTRACT_NEW_CONTRACT_ON_RENEWAL')) {
631 $object->origin_id = $originid;
637 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
644 $classname = ucfirst($subelement);
645 $srcobject =
new $classname(
$db);
646 '@phan-var-force Commande|Propal|Contrat|Fichinter|Expedition $srcobject';
649 dol_syslog(
"Try to find source object origin=" .
$object->origin .
" originid=" .
$object->origin_id .
" to add lines");
650 $result = $srcobject->fetch(
$object->origin_id);
653 $lines = $srcobject->lines;
654 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
655 $srcobject->fetch_lines();
656 $lines = $srcobject->lines;
660 $num = count($lines);
661 for ($i = 0; $i < $num; $i++) {
662 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
663 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
666 $product_type = ($lines[$i]->product_type ? (int) $lines[$i]->product_type : 0);
670 if ($lines[$i]->date_debut_prevue) {
673 if ($lines[$i]->date_debut_reel) {
676 if ($lines[$i]->date_start) {
682 if ($lines[$i]->date_fin_prevue) {
683 $date_end = $lines[$i]->date_fin_prevue;
685 if ($lines[$i]->date_fin_reel) {
686 $date_end = $lines[$i]->date_fin_reel;
688 if ($lines[$i]->date_end) {
689 $date_end = $lines[$i]->date_end;
693 if ($origin ==
'contrat' && $renewal ==
'true') {
694 if ($lines[$i]->date_start && $lines[$i]->date_end) {
695 $duration = $lines[$i]->date_end - $lines[$i]->date_start;
702 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
707 if (method_exists($lines[$i],
'fetch_optionals')) {
708 $lines[$i]->fetch_optionals();
709 $array_options = $lines[$i]->array_options;
712 $tva_tx = $lines[$i]->tva_tx;
713 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
714 $tva_tx .=
' (' . $lines[$i]->vat_src_code .
')';
717 $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);
728 if ($result > 0 && $lines[$i]->product_type == 9) {
729 $fk_parent_line = $result;
734 $parameters = array(
'objFrom' => $srcobject);
735 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
756 if (
GETPOST(
'contactid') > 0) {
765 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
768 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
772 $categories =
GETPOST(
'categories',
'array');
773 if (method_exists($object,
'setCategories')) {
774 $object->setCategories($categories);
783 $outputlangs = $langs;
786 $newlang =
GETPOST(
'lang_id',
'aZ09');
789 $newlang =
$object->thirdparty->default_lang;
791 if (!empty($newlang)) {
793 $outputlangs->setDefaultLang($newlang);
798 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
804 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
817 } elseif ($action ==
'classifybilled' && $usercanclose) {
821 $result =
$object->classifyBilled($user, 0,
'');
832 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
835 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
837 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
838 $locationTarget =
'';
852 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
857 $deposit_percent_from_payment_terms = getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
860 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
861 && !empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
863 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
866 $forceFields = array();
868 if (GETPOSTISSET(
'date_pointoftax')) {
876 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
887 $ret = $deposit->fetch($deposit->id);
888 $outputlangs = $langs;
892 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
893 $outputlangs->load(
'products');
896 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
903 if ($locationTarget) {
904 header(
'Location: ' . $locationTarget);
916 } elseif ($action ==
'confirm_reopen' && $usercanreopen && !
GETPOST(
'cancel',
'alpha')) {
923 $result =
$object->reopen($user, $newstatus);
940 $fromElement =
GETPOST(
'fromelement');
941 $fromElementid =
GETPOST(
'fromelementid');
942 $importLines =
GETPOST(
'line_checkbox');
944 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
945 if ($fromElement ==
'commande') {
946 dol_include_once(
'/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
947 $lineClassName =
'OrderLine';
948 } elseif ($fromElement ==
'propal') {
949 dol_include_once(
'/comm/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
950 $lineClassName =
'PropaleLigne';
951 } elseif ($fromElement ==
'facture') {
952 dol_include_once(
'/compta/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
953 $lineClassName =
'FactureLigne';
955 $lineClassName =
null;
957 $nextRang = count(
$object->lines) + 1;
960 foreach ($importLines as $lineId) {
961 $lineId = intval($lineId);
962 $originLine =
new $lineClassName(
$db);
963 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
964 $originLine->fetch_optionals();
965 $desc = $originLine->desc;
966 $pu_ht = $originLine->subprice;
967 $qty = $originLine->qty;
968 $txtva = $originLine->tva_tx;
969 $txlocaltax1 = $originLine->localtax1_tx;
970 $txlocaltax2 = $originLine->localtax2_tx;
971 $fk_product = $originLine->fk_product;
972 $remise_percent = $originLine->remise_percent;
974 $date_end = $originLine->date_end;
975 $fk_code_ventilation = 0;
976 $info_bits = $originLine->info_bits;
977 $fk_remise_except = $originLine->fk_remise_except;
978 $price_base_type =
'HT';
980 $type = $originLine->product_type;
982 $special_code = $originLine->special_code;
983 $origin = $originLine->element;
984 $origin_id = $originLine->id;
986 $fk_fournprice = $originLine->fk_fournprice;
987 $pa_ht = $originLine->pa_ht;
988 $label = $originLine->label;
989 $array_options = $originLine->array_options;
990 $situation_percent = 100;
992 $fk_unit = $originLine->fk_unit;
993 $pu_ht_devise = $originLine->multicurrency_subprice;
995 $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);
1011 } elseif ($action ==
'addline' &&
GETPOST(
'updateallvatlinesblock',
'alpha') &&
GETPOST(
'vatforblocklines',
'alpha') !==
'' && $usercancreate) {
1012 $tx_tva =
GETPOST(
'vatforblocklines') ?
GETPOST(
'vatforblocklines') : 0;
1013 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'tva', $tx_tva);
1017 } elseif ($action ==
'addline' &&
GETPOST(
'updatealldiscountlinesblock',
'alpha') &&
GETPOST(
'discountforblocklines',
'alpha') !==
'' && $usercancreate) {
1018 $discount =
GETPOST(
'discountforblocklines') ?
GETPOST(
'discountforblocklines') : 0;
1019 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'discount', $discount);
1025 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1028 $actiontypecode =
'AC_EMAIL';
1029 $triggersendname =
'PROPAL_SENTBYMAIL';
1030 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
1031 $trackid =
'pro' .
$object->id;
1032 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1036 if ($action ==
'modif' && $usercancreate) {
1037 $result =
$object->setDraft($user);
1044 $outputlangs = $langs;
1047 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1048 $outputlangs->setDefaultLang($newlang);
1054 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1056 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
1065 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
1069 foreach (
$object->lines as $key => $line) {
1070 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1073 if ($line->product_type == 1) {
1075 $line_price_base_type = $line->wasEnteredIncludingTax() ?
'TTC' :
'HT';
1076 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1077 $result =
$object->updateline($line->id, $line_pu, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->desc, $line_price_base_type, $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $alldate_start, $alldate_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
1081 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
1083 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
1084 $vat_rate = str_replace(
'*',
'', $vat_rate);
1087 foreach (
$object->lines as $key => $line) {
1088 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1092 $line_price_base_type = $line->wasEnteredIncludingTax() ?
'TTC' :
'HT';
1093 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1094 $result =
$object->updateline($line->id, $line_pu, $line->qty, $line->remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $line->desc, $line_price_base_type, $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
1097 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
1099 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
1100 $remise_percent = str_replace(
'*',
'', $remise_percent);
1101 foreach (
$object->lines as $key => $line) {
1102 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1105 $tvatx = $line->tva_tx;
1106 if (!empty($line->vat_src_code)) {
1107 $tvatx .=
' (' . $line->vat_src_code .
')';
1110 $line_price_base_type = $line->wasEnteredIncludingTax() ?
'TTC' :
'HT';
1111 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1112 $result =
$object->updateline($line->id, $line_pu, $line->qty, (
float) $remise_percent, $tvatx, $line->localtax1_tx, $line->localtax2_tx, $line->desc, $line_price_base_type, $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
1115 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'' && $usercancreate) {
1117 $margin_rate = (
GETPOST(
'marginforalllines',
'alpha') ?
GETPOST(
'marginforalllines',
'alpha') : 0);
1118 foreach (
$object->lines as $key => $line) {
1119 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1122 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
1124 $prod->fetch($line->fk_product);
1125 if (
$prod->price_min > $subprice) {
1126 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1127 $price_price_min =
price(
$prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1128 setEventMessages(
$prod->ref .
' - ' .
$prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1131 if ($line->subprice <> 0) {
1132 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1134 $multicurrency_subprice = 0;
1137 $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);
1154 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
1157 $langs->load(
'subtotals');
1159 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
1160 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
1162 $subtotal_options = array();
1164 foreach (Propal::$TITLE_OPTIONS as $option) {
1165 $value =
GETPOST($option,
'alphanohtml');
1167 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1172 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1183 $outputlangs = $langs;
1184 $newlang =
GETPOST(
'lang_id',
'alpha');
1186 $newlang =
$object->thirdparty->default_lang;
1188 if (!empty($newlang)) {
1190 $outputlangs->setDefaultLang($newlang);
1193 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1198 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1200 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
1203 $langs->load(
'subtotals');
1205 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
1206 foreach (
$object->lines as $line) {
1207 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
1208 $desc = $line->desc;
1209 $depth = -$line->qty;
1213 $subtotal_options = array();
1215 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1216 $value =
GETPOST($option,
'alphanohtml');
1218 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1223 if (isset($desc) && isset($depth)) {
1224 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1227 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
1236 $outputlangs = $langs;
1237 $newlang =
GETPOST(
'lang_id',
'alpha');
1239 $newlang =
$object->thirdparty->default_lang;
1241 if (!empty($newlang)) {
1243 $outputlangs->setDefaultLang($newlang);
1246 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1251 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1253 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && !
GETPOST(
'markforalllines',
'alpha') && $usercancreate) {
1257 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1260 $price_ht_devise =
'';
1262 $price_ttc_devise =
'';
1266 if (
GETPOST(
'price_ht') !==
'') {
1269 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1272 if (
GETPOST(
'price_ttc') !==
'') {
1275 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1276 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1279 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1280 if ($prod_entry_mode ==
'free') {
1286 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1291 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1294 $remise_percent = (GETPOSTISSET(
'remise_percent' . $predef) ?
price2num(
GETPOST(
'remise_percent' . $predef,
'alpha'),
'', 2) : 0);
1295 if (empty($remise_percent)) {
1296 $remise_percent = 0;
1300 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1301 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1303 if (is_array($extralabelsline)) {
1305 foreach ($extralabelsline as $key => $value) {
1306 unset($_POST[
"options_" . $key]);
1310 $price_to_test_sign = ($price_ht ? $price_ht : $price_ttc);
1312 if ((empty($idprod) || $idprod < 0) && ($price_to_test_sign < 0) && ($qty < 0)) {
1313 $langs->load(
"errors");
1314 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1317 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1318 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1322 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1323 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1327 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1330 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1331 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1335 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1336 if ($combinations =
GETPOST(
'combinations',
'array:alphanohtml')) {
1340 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1341 $idprod = $res->fk_product_child;
1343 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1349 if (!$error && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1357 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1366 if (!empty($idprod) && $idprod > 0) {
1368 $prod->fetch($idprod);
1380 $pu_ht =
$prod->price;
1381 $pu_ttc =
$prod->price_ttc;
1382 $price_min =
$prod->price_min;
1383 $price_min_ttc =
$prod->price_min_ttc;
1384 $price_base_type =
$prod->price_base_type;
1388 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1390 $filter = array(
't.fk_product' => (
string)
$prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1393 $pricebycustomerexist =
false;
1394 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1397 if (count($prodcustprice->lines) > 0) {
1398 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1399 foreach ($prodcustprice->lines as $k => $custprice_line) {
1400 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1401 $pricebycustomerexist =
true;
1402 $pu_ht =
price($custprice_line->price);
1403 $pu_ttc =
price($custprice_line->price_ttc);
1404 $price_min =
price($custprice_line->price_min);
1405 $price_min_ttc =
price($custprice_line->price_min_ttc);
1406 $price_base_type = $custprice_line->price_base_type;
1423 if (!$pricebycustomerexist && !empty(
$object->thirdparty->price_level)) {
1424 $pu_ht =
$prod->multiprices[
$object->thirdparty->price_level];
1425 $pu_ttc =
$prod->multiprices_ttc[
$object->thirdparty->price_level];
1426 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
1427 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1428 $price_base_type =
$prod->multiprices_base_type[
$object->thirdparty->price_level];
1430 if (isset(
$prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1431 $tva_tx =
$prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1433 if (isset(
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1434 $tva_npr =
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1439 $pu_ht =
$prod->multiprices[
$object->thirdparty->price_level];
1440 $pu_ttc =
$prod->multiprices_ttc[
$object->thirdparty->price_level];
1441 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
1442 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1443 $price_base_type =
$prod->multiprices_base_type[
$object->thirdparty->price_level];
1445 if (isset(
$prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1446 $tva_tx =
$prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1448 if (isset(
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1449 $tva_npr =
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1454 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1458 $filter = array(
't.fk_product' => (
string)
$prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1460 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1463 if (count($prodcustprice->lines) > 0) {
1464 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1465 foreach ($prodcustprice->lines as $k => $custprice_line) {
1466 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1467 $pu_ht =
price($custprice_line->price);
1468 $pu_ttc =
price($custprice_line->price_ttc);
1469 $price_min =
price($custprice_line->price_min);
1470 $price_min_ttc =
price($custprice_line->price_min_ttc);
1471 $price_base_type = $custprice_line->price_base_type;
1489 if (
$prod->prices_by_qty[0]) {
1494 foreach (
$prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1495 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1499 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1500 $pu_ht = $priceforthequantityarray[
'unitprice'];
1502 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1510 if (
$prod->prices_by_qty[
$object->thirdparty->price_level]) {
1515 foreach (
$prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1516 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1520 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1521 $pu_ht = $priceforthequantityarray[
'unitprice'];
1523 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1531 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1532 $tmpprodvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string)
$prod->tva_tx));
1537 if (!empty($price_ht) || (
string) $price_ht ===
'0') {
1538 $pu_ht = (float)
price2num($price_ht,
'MU');
1539 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1540 $price_base_type =
'HT';
1541 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1542 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1543 $pu_ttc_devise = (float)
price2num((
float) $pu_ht_devise * (1 + ((float) $tmpvat / 100)),
'MU');
1546 $price_base_type =
'HT';
1547 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1548 $pu_ttc = (float)
price2num($price_ttc,
'MU');
1549 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1550 $price_base_type =
'TTC';
1551 } elseif (!empty($price_ttc_devise) || (
string) $price_ttc_devise ===
'0') {
1552 $pu_ttc_devise = (float)
price2num($price_ttc_devise,
'MU');
1553 $pu_ht_devise = (float)
price2num((
float) $pu_ttc_devise / (1 + ((float) $tmpvat / 100)),
'MU');
1556 $price_base_type =
'TTC';
1557 } elseif ($tmpvat != $tmpprodvat) {
1559 if ($price_base_type !=
'HT') {
1560 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1562 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1570 $outputlangs = $langs;
1572 if (
GETPOST(
'lang_id',
'aZ09')) {
1573 $newlang =
GETPOST(
'lang_id',
'aZ09');
1575 if (empty($newlang)) {
1576 $newlang =
$object->thirdparty->default_lang;
1578 if (!empty($newlang)) {
1580 $outputlangs->setDefaultLang($newlang);
1583 $desc = (!empty(
$prod->multilangs[$outputlangs->defaultlang][
"description"])) ?
$prod->multilangs[$outputlangs->defaultlang][
"description"] :
$prod->
description;
1585 $desc =
$prod->description;
1601 $outputlangs = $langs;
1603 if (
GETPOST(
'lang_id',
'alpha')) {
1604 $newlang =
GETPOST(
'lang_id',
'alpha');
1606 if (empty($newlang)) {
1607 $newlang =
$object->thirdparty->default_lang;
1609 if (!empty($newlang)) {
1611 $outputlangs->setDefaultLang($newlang);
1612 $outputlangs->load(
'products');
1614 if (!empty(
$prod->customcode)) {
1615 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode") .
': ' .
$prod->customcode;
1617 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1620 if (!empty(
$prod->country_code)) {
1621 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry(
$prod->country_code,
'',
$db, $outputlangs, 0);
1624 if (!empty(
$prod->customcode)) {
1625 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode") .
': ' .
$prod->customcode;
1627 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1630 if (!empty(
$prod->country_code)) {
1631 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry(
$prod->country_code,
'',
$db, $langs, 0);
1638 $type =
$prod->type;
1639 $fk_unit =
$prod->fk_unit;
1643 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1644 $tva_tx = str_replace(
'*',
'', $tva_tx);
1645 if (empty($tva_tx)) {
1648 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1651 $fk_unit =
GETPOST(
'units',
'alpha');
1652 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1653 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1655 if ($pu_ttc && !$pu_ht) {
1656 $price_base_type =
'TTC';
1670 $fournprice = (int) (
GETPOST(
'fournprice' . $predef) ?
GETPOST(
'fournprice' . $predef) :
'');
1671 $buyingprice =
price2num((
GETPOST(
'buying_price' . $predef) !=
'' ?
GETPOST(
'buying_price' . $predef) :
''),
'', 2);
1677 $pu_equivalent = $pu_ht;
1678 $pu_equivalent_ttc = $pu_ttc;
1679 $currency_tx =
$object->multicurrency_tx;
1683 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1684 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1686 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1687 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1707 if ($usermustrespectpricemin) {
1708 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1709 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1712 } 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') {
1713 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1721 $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);
1733 $outputlangs = $langs;
1734 $newlang =
GETPOST(
'lang_id',
'alpha');
1736 $newlang =
$object->thirdparty->default_lang;
1738 if (!empty($newlang)) {
1740 $outputlangs->setDefaultLang($newlang);
1742 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1745 unset($_POST[
'prod_entry_mode']);
1747 unset($_POST[
'qty']);
1748 unset($_POST[
'type']);
1749 unset($_POST[
'remise_percent']);
1750 unset($_POST[
'price_ht']);
1751 unset($_POST[
'multicurrency_price_ht']);
1752 unset($_POST[
'price_ttc']);
1753 unset($_POST[
'tva_tx']);
1754 unset($_POST[
'product_ref']);
1755 unset($_POST[
'product_label']);
1756 unset($_POST[
'product_desc']);
1757 unset($_POST[
'fournprice']);
1758 unset($_POST[
'buying_price']);
1759 unset($_POST[
'np_marginRate']);
1760 unset($_POST[
'np_markRate']);
1761 unset($_POST[
'dp_desc']);
1762 unset($_POST[
'idprod']);
1763 unset($_POST[
'units']);
1765 unset($_POST[
'date_starthour']);
1766 unset($_POST[
'date_startmin']);
1767 unset($_POST[
'date_startsec']);
1768 unset($_POST[
'date_startday']);
1769 unset($_POST[
'date_startmonth']);
1770 unset($_POST[
'date_startyear']);
1771 unset($_POST[
'date_endhour']);
1772 unset($_POST[
'date_endmin']);
1773 unset($_POST[
'date_endsec']);
1774 unset($_POST[
'date_endday']);
1775 unset($_POST[
'date_endmonth']);
1776 unset($_POST[
'date_endyear']);
1784 } elseif ($action ==
'addline' && $usercancreate && (
1785 (
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'') ||
1786 (
GETPOST(
'submitforallmark',
'alpha') &&
GETPOST(
'markforalllines',
'alpha') !==
'')
1790 $margin_rate = GETPOSTISSET(
'marginforalllines') ?
GETPOST(
'marginforalllines',
'int') :
'';
1791 $mark_rate = GETPOSTISSET(
'markforalllines') ?
GETPOST(
'markforalllines',
'int') :
'';
1792 foreach (
$object->lines as &$line) {
1793 if ($line->subprice > 0) {
1794 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1797 $subprice_multicurrency = $line->subprice;
1798 if (is_numeric($margin_rate) && $margin_rate > 0) {
1799 $line->subprice = (float)
price2num((
float) $line->pa_ht * (1 + (float) $margin_rate / 100),
'MU');
1800 } elseif (is_numeric($mark_rate) && $mark_rate > 0) {
1801 $line->subprice = (float) ($line->pa_ht / (1 - ((
float) $mark_rate / 100)));
1803 $line->subprice = (float) $line->pa_ht;
1807 $res =
$prod->fetch($line->fk_product);
1809 if (
$prod->price_min > $line->subprice) {
1810 $price_subprice =
price($line->subprice, 0, $outlangs, 1, -1, -1,
'auto');
1811 $price_price_min =
price(
$prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1812 setEventMessages(
$prod->ref .
' - ' .
$prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1821 $multicurrency_subprice = (float) $line->subprice * $line->multicurrency_subprice / $subprice_multicurrency;
1823 $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);
1826 if (is_numeric($margin_rate) && empty($mark_rate)) {
1827 $line->marge_tx = $margin_rate;
1828 } elseif (is_numeric($mark_rate) && empty($margin_rate)) {
1829 $line->marque_tx = $mark_rate;
1831 $line->total_ht = $line->qty * (float) $line->subprice;
1832 $line->total_tva = $line->tva_tx * $line->qty * (float) $line->subprice;
1833 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $line->subprice;
1835 $line->multicurrency_total_ht = $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1836 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1837 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1839 $line->multicurrency_subprice = $multicurrency_subprice;
1845 } elseif ($action ==
'updatetitleline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1848 $langs->load(
'subtotals');
1850 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1853 $subtotal_options = array();
1855 foreach (Propal::$TITLE_OPTIONS as $option) {
1856 $value =
GETPOST($option,
'alphanohtml');
1858 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1863 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1874 $outputlangs = $langs;
1875 $newlang =
GETPOST(
'lang_id',
'alpha');
1877 $newlang =
$object->thirdparty->default_lang;
1879 if (!empty($newlang)) {
1881 $outputlangs->setDefaultLang($newlang);
1884 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1889 } elseif ($action ==
'updatesubtotalline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1892 $langs->load(
'subtotals');
1894 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1897 $subtotal_options = array();
1899 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1900 $value =
GETPOST($option,
'alphanohtml');
1902 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1907 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1915 $outputlangs = $langs;
1916 $newlang =
GETPOST(
'lang_id',
'alpha');
1918 $newlang =
$object->thirdparty->default_lang;
1920 if (!empty($newlang)) {
1922 $outputlangs->setDefaultLang($newlang);
1925 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1930 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1938 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1943 $vat_rate = (
GETPOST(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : 0);
1944 $vat_rate = str_replace(
'*',
'', $vat_rate);
1951 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
1961 if (empty($remise_percent)) {
1962 $remise_percent = 0;
1966 $pu_equivalent = $pu_ht;
1967 $pu_equivalent_ttc = $pu_ttc;
1969 $currency_tx =
$object->multicurrency_tx;
1973 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1974 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1976 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1977 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1992 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1993 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1995 if (is_array($extralabelsline)) {
1997 foreach ($extralabelsline as $key => $value) {
1998 unset($_POST[
"options_" . $key]);
2012 $price_base_type =
'HT';
2013 if (empty($pu_ht) && !empty($pu_ttc)) {
2015 $price_base_type =
'TTC';
2016 } elseif (!empty($pu_ht) && !empty($pu_ttc)) {
2017 foreach (
$object->lines as $line_obj) {
2019 if ($line_obj->wasEnteredIncludingTax()) {
2021 $price_base_type =
'TTC';
2030 if (!empty($productid)) {
2032 $res = $product->fetch($productid);
2034 $type = $product->type;
2038 $price_min = $product->price_min;
2040 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
2042 $price_min_ttc = $product->price_min_ttc;
2044 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
2051 if ($usermustrespectpricemin) {
2052 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
2053 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
2056 $action =
'editline';
2057 } 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') {
2058 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
2061 $action =
'editline';
2066 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2070 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
2078 if (!$user->hasRight(
'margins',
'creer')) {
2079 foreach (
$object->lines as &$line) {
2081 $fournprice = $line->fk_fournprice;
2082 $buyingprice = (
string) $line->pa_ht;
2090 $result =
$object->updateline(
GETPOSTINT(
'lineid'), (
float) $pu, (
float) $qty, (
float) $remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $description, $price_base_type, $info_bits, $special_code,
GETPOSTINT(
'fk_parent_line'), 0, (
int) $fournprice, $buyingprice, $label, $type,
$date_start, $date_end, $array_options,
GETPOSTINT(
"units"), (
float) $pu_ht_devise);
2097 $outputlangs = $langs;
2100 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
2101 $outputlangs->setDefaultLang($newlang);
2107 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2110 unset($_POST[
'qty']);
2111 unset($_POST[
'type']);
2112 unset($_POST[
'productid']);
2113 unset($_POST[
'remise_percent']);
2114 unset($_POST[
'price_ht']);
2115 unset($_POST[
'multicurrency_price_ht']);
2116 unset($_POST[
'price_ttc']);
2117 unset($_POST[
'tva_tx']);
2118 unset($_POST[
'product_ref']);
2119 unset($_POST[
'product_label']);
2120 unset($_POST[
'product_desc']);
2121 unset($_POST[
'fournprice']);
2122 unset($_POST[
'buying_price']);
2124 unset($_POST[
'date_starthour']);
2125 unset($_POST[
'date_startmin']);
2126 unset($_POST[
'date_startsec']);
2127 unset($_POST[
'date_startday']);
2128 unset($_POST[
'date_startmonth']);
2129 unset($_POST[
'date_startyear']);
2130 unset($_POST[
'date_endhour']);
2131 unset($_POST[
'date_endmin']);
2132 unset($_POST[
'date_endsec']);
2133 unset($_POST[
'date_endday']);
2134 unset($_POST[
'date_endmonth']);
2135 unset($_POST[
'date_endyear']);
2142 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
2143 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
2145 } elseif ($action ==
'classin' && $usercancreate) {
2148 } elseif ($action ==
'setavailability' && $usercancreate) {
2151 } elseif ($action ==
'setdemandreason' && $usercancreate) {
2154 } elseif ($action ==
'setconditions' && $usercancreate) {
2157 } elseif ($action ==
'setmode' && $usercancreate) {
2160 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
2162 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
2163 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
2166 } elseif ($action ==
'setbankaccount' && $usercancreate) {
2169 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
2172 } elseif ($action ==
'setwarehouse' && $usercancreate) {
2175 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
2178 $attribute_name =
GETPOST(
'attribute',
'aZ09');
2181 $result = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
2187 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
2194 $action =
'edit_extras';
2199 if ($action ==
'addcontact' && $usercancreate) {
2204 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2208 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2211 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2212 $langs->load(
"errors");
2213 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
2218 } elseif ($action ==
'swapstatut' && $usercancreate) {
2220 if (
$object->fetch($id) > 0) {
2225 } elseif ($action ==
'deletecontact' && $usercancreate) {
2228 $result =
$object->delete_contact($lineid);
2231 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2241 $permissiontoadd = $usercancreate;
2242 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
2259$title =
$object->ref .
" - " . $langs->trans(
'Card');
2260if ($action ==
'create') {
2261 $title = $langs->trans(
"NewPropal");
2263$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
2270if ($action ==
'create') {
2277 $res = $soc->fetch($socid);
2280 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2281 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2282 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2288 if (!empty($origin) && !empty($originid)) {
2290 $element = $subelement = $origin;
2292 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2293 $element = $regs[1];
2294 $subelement = $regs[2];
2297 if ($element ==
'project') {
2298 $projectid = $originid;
2302 $project->fetch($projectid);
2303 if ($project->socid > 0) {
2305 $soc->fetch($project->socid);
2309 if ($element ==
'order' || $element ==
'commande') {
2310 $element = $subelement =
'commande';
2312 if ($element ==
'propal') {
2313 $element =
'comm/propal';
2314 $subelement =
'propal';
2316 if ($element ==
'contract') {
2317 $element = $subelement =
'contrat';
2319 if ($element ==
'shipping') {
2320 $element = $subelement =
'expedition';
2325 $classname = ucfirst($subelement);
2326 $objectsrc =
new $classname(
$db);
2327 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
2329 $objectsrc->fetch($originid);
2330 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2331 $objectsrc->fetch_lines();
2333 $objectsrc->fetch_thirdparty();
2335 $projectid = (int) $objectsrc->fk_project;
2336 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
2338 $soc = $objectsrc->thirdparty;
2340 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2341 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2342 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : -1));
2345 $objectsrc->fetch_optionals();
2346 $object->array_options = $objectsrc->array_options;
2349 if (!empty($objectsrc->multicurrency_code)) {
2350 $currency_code = $objectsrc->multicurrency_code;
2352 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2353 $currency_tx = $objectsrc->multicurrency_tx;
2361 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
2362 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
2363 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
2364 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
2365 $shipping_method_id = $soc->shipping_method_id;
2366 $warehouse_id = !empty($soc->fk_warehouse) ? $soc->fk_warehouse : $warehouse_id;
2367 $remise_percent = $soc->remise_percent;
2369 if (
isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
2370 $currency_code = $soc->multicurrency_code;
2375 if (!
GETPOST(
'changecompany')) {
2376 if (GETPOSTISSET(
'cond_reglement_id')) {
2377 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2379 if (GETPOSTISSET(
'deposit_percent')) {
2382 if (GETPOSTISSET(
'mode_reglement_id')) {
2383 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2385 if (GETPOSTISSET(
'fk_account')) {
2390 if ($soc->fk_warehouse > 0) {
2391 $warehouse_id = $soc->fk_warehouse;
2398 $warehouse_id = $user->fk_warehouse;
2402 print
'<form name="addprop" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
2403 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
2404 print
'<input type="hidden" name="action" value="add">';
2405 print
'<input type="hidden" name="changecompany" value="0">';
2406 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
2407 if ($origin !=
'project' && $originid) {
2408 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
2409 print
'<input type="hidden" name="originid" value="' . $originid .
'">';
2410 if ($origin ==
'contrat' && !empty($renewal)) {
2411 print
'<input type="hidden" name="renewal" value="' . $renewal .
'">';
2413 } elseif ($origin ==
'project' && !empty($projectid)) {
2414 print
'<input type="hidden" name="projectid" value="' . $projectid .
'">';
2420 $parameters = array();
2422 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters, $object, $action);
2423 if (empty($reshook)) {
2424 print
'<table class="border centpercent">';
2430 print
'<tr class="field_socid">';
2432 print
'<td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Customer') .
'</td>';
2433 $shipping_method_id = 0;
2437 print
'<td class="valuefieldcreate">';
2438 print $soc->getNomUrl(1,
'customer');
2439 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
2441 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2442 $shipping_method_id = $soc->shipping_method_id;
2445 print
'<td class="valuefieldcreate">';
2446 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2447 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2448 print $form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2452 $(document).ready(function() {
2453 $("#socid").change(function() {
2454 console.log("We have changed the company - Reload page");
2455 var socid = $(this).val();
2457 $("input[name=action]").val("create");
2458 $("input[name=changecompany]").val("1");
2459 $("form[name=addprop]").submit();
2464 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>';
2467 print
'</tr>' .
"\n";
2471 print
'<tr class="field_ref_client"><td class="titlefieldcreate">';
2472 print $form->textwithpicto($langs->trans(
'RefCustomer'), $langs->trans(
'RefOfOnCustomerSide', $langs->transnoentitiesnoconv(
"Proposal")));
2473 print
'</td><td class="valuefieldcreate">';
2474 print
'<input type="text" name="ref_client" value="' . (!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')) .
'"></td>';
2480 print
'<tr class="field_contactid"><td class="titlefieldcreate">' . $langs->trans(
"DefaultContact") .
'</td><td class="valuefieldcreate">';
2481 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2483 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2487 print
'<tr class="field_discount_info"><td class="titlefieldcreate">' . $langs->trans(
'Discounts') .
'</td><td class="valuefieldcreate">';
2489 $absolute_discount = $soc->getAvailableDiscounts();
2493 $backtopage = $_SERVER[
"PHP_SELF"] .
'?socid=' . $thirdparty->id .
'&action=' . $action .
'&origin=' . urlencode((
string) (
GETPOST(
'origin'))) .
'&originid=' . urlencode((
string) (
GETPOSTINT(
'originid')));
2494 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
2500 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Date') .
'</td><td class="valuefieldcreate">';
2501 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2502 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2506 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>';
2509 print
'<tr class="field_cond_reglement_id"><td class="nowrap">' . $langs->trans(
'PaymentConditionsShort') .
'</td><td>';
2510 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2512 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2516 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">' . $langs->trans(
'PaymentMode') .
'</td><td class="valuefieldcreate">';
2517 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2518 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2523 print
'<tr class="field_fk_account"><td class="titlefieldcreate">' . $langs->trans(
'BankAccount') .
'</td><td class="valuefieldcreate">';
2524 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"') . $form->select_comptes((
int) $fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2529 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">' . $langs->trans(
'Source') .
'</td><td class="valuefieldcreate">';
2530 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2531 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2536 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2537 $shipping_method_id = $soc->shipping_method_id;
2539 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">' . $langs->trans(
'SendingMethod') .
'</td><td class="valuefieldcreate">';
2540 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2541 $form->selectShippingMethod((
string) (GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2545 $formproduct =
null;
2548 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
2550 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">' . $langs->trans(
'Warehouse') .
'</td><td class="valuefieldcreate">';
2551 print
img_picto(
'',
'stock',
'class="pictofixedwidth"') . $formproduct->selectWarehouses((
int) $warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2556 print
'<tr class="field_availability_id"><td class="titlefieldcreate">' . $langs->trans(
'AvailabilityPeriod');
2558 print
' (' . $langs->trans(
'AfterOrder') .
')';
2560 print
'</td><td class="valuefieldcreate">';
2561 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2562 print $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx', 1);
2566 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">' . $langs->trans(
"DeliveryDate") .
'</td>';
2567 print
'<td class="valuefieldcreate">';
2568 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2570 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2571 $syear =
date(
"Y", $tmpdte);
2572 $smonth =
date(
"m", $tmpdte);
2573 $sday =
date(
"d", $tmpdte);
2574 print $form->selectDate($syear .
"-" . $smonth .
"-" . $sday,
'date_livraison', 0, 0, 0,
"addprop");
2576 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2577 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2582 if (
isModEnabled(
'project') && is_object($formproject)) {
2583 $langs->load(
"projects");
2584 print
'<tr class="field_projectid">';
2585 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2586 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');
2587 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>';
2594 print
'<tr class="field_incoterm_id">';
2595 print
'<td class="titlefieldcreate"><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1) .
'</label></td>';
2596 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2597 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2598 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2603 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td colspan="3">';
2604 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
2608 include_once DOL_DOCUMENT_ROOT .
'/core/modules/propale/modules_propale.php';
2610 if (is_array($list) && count($list) > 0) {
2611 print
'<tr class="field_model">';
2612 print
'<td class="titlefieldcreate">' . $langs->trans(
"DefaultModel") .
'</td>';
2613 print
'<td class="valuefieldcreate">';
2614 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2616 print $form->selectarray(
'model', $list, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2622 print
'<tr class="field_currency">';
2623 print
'<td class="titlefieldcreate">' . $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0) .
'</td>';
2624 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2625 print
img_picto(
'',
'currency',
'class="pictofixedwidth"') . $form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2630 print
'<tr class="field_note_public">';
2631 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePublic') .
'</td>';
2632 print
'<td class="valuefieldcreate">';
2633 $note_public =
GETPOST(
'note_public',
'restricthtml');
2634 if (!GETPOSTISSET(
'note_public') && empty($note_public) && !empty($objectsrc)) {
2635 $note_public = $objectsrc->note_public;
2637 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2638 print $doleditor->Create(1);
2641 if (empty($user->socid)) {
2642 print
'<tr class="field_note_private">';
2643 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePrivate') .
'</td>';
2644 print
'<td class="valuefieldcreate">';
2645 $note_private =
GETPOST(
'note_private',
'restricthtml');
2646 if (!GETPOSTISSET(
'note_private') && empty($note_private) && !empty($objectsrc)) {
2647 $note_private = $objectsrc->note_private;
2649 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2650 print $doleditor->Create(1);
2656 if (
getDolGlobalInt(
'THIRDPARTY_PROPAGATE_EXTRAFIELDS_TO_PROPAL') && $socid > 0) {
2657 $thirdpartytopropagateextrafieldsfrom = $soc;
2659 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_add.tpl.php';
2662 if (!empty($origin) && !empty($originid) && is_object($objectsrc) && !empty($classname)) {
2664 if ($origin ==
'contrat') {
2666 $objectsrc->update_price(1,
'auto', 1);
2669 print
"\n<!-- " . $classname .
" info -->";
2671 print
'<input type="hidden" name="amount" value="' . $objectsrc->total_ht .
'">' .
"\n";
2672 print
'<input type="hidden" name="total" value="' . $objectsrc->total_ttc .
'">' .
"\n";
2673 print
'<input type="hidden" name="tva" value="' . $objectsrc->total_tva .
'">' .
"\n";
2674 print
'<input type="hidden" name="origin" value="' . $objectsrc->element .
'">';
2675 print
'<input type="hidden" name="originid" value="' . $objectsrc->id .
'">';
2677 $newclassname = $classname;
2678 if ($newclassname ==
'Propal') {
2679 $newclassname =
'CommercialProposal';
2680 } elseif ($newclassname ==
'Commande') {
2681 $newclassname =
'Order';
2682 } elseif ($newclassname ==
'Expedition') {
2683 $newclassname =
'Sending';
2684 } elseif ($newclassname ==
'Fichinter') {
2685 $newclassname =
'Intervention';
2688 print
'<tr><td>' . $langs->trans($newclassname) .
'</td><td>' . $objectsrc->getNomUrl(1) .
'</td></tr>';
2689 print
'<tr><td>' . $langs->trans(
'AmountHT') .
'</td><td>' .
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td></tr>';
2690 print
'<tr><td>' . $langs->trans(
'AmountVAT') .
'</td><td>' .
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2691 if (
$mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2692 print
'<tr><td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2695 if (
$mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2696 print
'<tr><td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2698 print
'<tr><td>' . $langs->trans(
'AmountTTC') .
'</td><td>' .
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2701 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountHT') .
'</td><td>' .
price($objectsrc->multicurrency_total_ht) .
'</td></tr>';
2702 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountVAT') .
'</td><td>' .
price($objectsrc->multicurrency_total_tva) .
"</td></tr>";
2703 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountTTC') .
'</td><td>' .
price($objectsrc->multicurrency_total_ttc) .
"</td></tr>";
2715 print
'<input type="hidden" name="createmode" value="empty">';
2719 print
'<br><table>';
2723 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2724 print
'<td>' . $langs->trans(
"CopyPropalFrom") .
' </td>';
2726 $liste_propal = array();
2727 $liste_propal[0] =
'';
2729 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2730 $sql .=
" FROM " . MAIN_DB_PREFIX .
"propal p";
2731 $sql .=
", " . MAIN_DB_PREFIX .
"societe s";
2732 $sql .=
" WHERE s.rowid = p.fk_soc";
2733 $sql .=
" AND p.entity IN (" .
getEntity(
'propal') .
")";
2734 $sql .=
" AND p.fk_statut <> 0";
2735 $sql .=
" ORDER BY Id";
2737 $resql =
$db->query($sql);
2739 $num =
$db->num_rows($resql);
2742 $row =
$db->fetch_row($resql);
2743 $propalRefAndSocName = $row[1] .
" - " . $row[2];
2744 $liste_propal[$row[0]] = $propalRefAndSocName;
2747 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2753 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2754 print
'<td valign="top" colspan="2">' . $langs->trans(
"CreateEmptyPropal") .
'</td></tr>';
2761 $langs->load(
"bills");
2763 print $form->buttonsSaveCancel(
"CreateDraft");
2769 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2772 $title = $langs->trans(
'ProductsAndServices');
2775 print
'<div class="div-table-responsive-no-min">';
2776 print
'<table class="noborder centpercent">';
2778 $objectsrc->printOriginLinesList();
2795 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
$object->picto, 0,
'',
'', 0,
'', 1);
2800 if ($action ==
'clone') {
2802 $filter =
'(s.client:IN:1,2,3)';
2803 $formquestion = array(
2806 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2807 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2808 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2811 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2814 $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);
2818 if ($action ==
'add_title_line') {
2819 $langs->load(
'subtotals');
2821 $depth_array =
$object->getPossibleLevels($langs);
2823 } elseif ($action ==
'add_subtotal_line') {
2824 $langs->load(
'subtotals');
2826 $titles =
$object->getPossibleTitles();
2830 if ($action ==
'closeas') {
2832 $formquestion = array();
2834 $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)));
2836 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2838 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2843 $deposit_percent_from_payment_terms = getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2845 if (!empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2846 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2850 $eligibleForDepositGeneration =
true;
2852 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2853 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2854 '@phan-var-force Facture $invoice';
2857 $eligibleForDepositGeneration =
false;
2863 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2864 foreach (
$object->linkedObjects[
'commande'] as $order) {
2865 $order->fetchObjectLinked();
2867 if (array_key_exists(
'facture', $order->linkedObjects)) {
2868 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2869 '@phan-var-force Facture $invoice';
2872 $eligibleForDepositGeneration =
false;
2881 if ($eligibleForDepositGeneration) {
2882 $formquestion[] = array(
2883 'type' =>
'checkbox',
2884 'tdclass' =>
'showonlyifsigned',
2885 'name' =>
'generate_deposit',
2886 'morecss' =>
'margintoponly marginbottomonly',
2887 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2890 $formquestion[] = array(
2892 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2894 'label' => $langs->trans(
'DateInvoice'),
2900 $formquestion[] = array(
2902 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2903 'name' =>
'date_pointoftax',
2904 'label' => $langs->trans(
'DatePointOfTax'),
2910 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2912 $formquestion[] = array(
2914 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2915 'name' =>
'cond_reglement_id',
2916 'label' => $langs->trans(
'PaymentTerm'),
2917 'value' => $paymentTermsSelect
2920 $formquestion[] = array(
2921 'type' =>
'checkbox',
2922 'tdclass' =>
'showonlyifgeneratedeposit',
2923 'name' =>
'validate_generated_deposit',
2924 'morecss' =>
'margintoponly marginbottomonly',
2925 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2928 $formquestion[] = array(
2929 'type' =>
'onecolumn',
2932 let signedValue = ' . $object::STATUS_SIGNED .
';
2934 $(document).ready(function() {
2935 $("[name=generate_deposit]").change(function () {
2936 let $self = $(this);
2937 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2939 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2948 $("#statut").change(function() {
2949 let $target = $(".showonlyifsigned").parent(".tagtr");
2951 if ($(this).val() == signedValue) {
2957 $("[name=generate_deposit]").trigger("change");
2962 $("#statut").trigger("change");
2972 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2974 $formquestion = array_merge($formquestion, array(
2975 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid, $object)),
2980 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2982 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2984 } elseif ($action ==
'cancel') {
2986 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2987 } elseif ($action ==
'delete') {
2989 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2990 } elseif ($action ==
'reopen') {
2992 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2993 } elseif ($action ==
'ask_deleteline') {
2995 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2996 } elseif ($action ==
'ask_subtotal_deleteline') {
2998 $langs->load(
"subtotals");
2999 $title =
"DeleteSubtotalLine";
3000 $question =
"ConfirmDeleteSubtotalLine";
3001 if (
GETPOST(
'type') ==
'title') {
3002 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
3003 $title =
"DeleteTitleLine";
3004 $question =
"ConfirmDeleteTitleLine";
3006 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
3007 } elseif ($action ==
'validate') {
3012 $ref = substr(
$object->ref, 1, 4);
3013 if ($ref ==
'PROV' || $ref ==
'') {
3014 $numref =
$object->getNextNumRef($soc);
3015 if (empty($numref)) {
3023 $text = $langs->trans(
'ConfirmValidateProp', $numref);
3025 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
3028 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid, $object);
3033 foreach (
$object->lines as $line) {
3034 $res = $line->fetch_product();
3036 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
3042 if ($nbMandated > 0) {
3044 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
3047 $text .=
'<div><span class="clearboth nowraponall warning">' .
img_warning() . $langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate") .
'</span></div>';
3052 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
3057 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
3058 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
3059 if (empty($reshook)) {
3060 $formconfirm .= $hookmanager->resPrint;
3061 } elseif ($reshook > 0) {
3062 $formconfirm = $hookmanager->resPrint;
3071 $linkback =
'<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
3073 $morehtmlref =
'<div class="refidno">';
3075 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client, $object, $usercancreate,
'string',
'', 0, 1);
3076 $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);
3078 $morehtmlref .=
'<br>' . $soc->getNomUrl(1,
'customer');
3080 $morehtmlref .=
' (<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?socid=' . $soc->id .
'&search_societe=' . urlencode($soc->name) .
'">' . $langs->trans(
"OtherProposals") .
'</a>)';
3084 $langs->load(
"projects");
3085 $morehtmlref .=
'<br>';
3086 if ($usercancreate) {
3087 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
3088 if ($action !=
'classify') {
3089 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' . newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
3091 $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');
3093 if (!empty(
$object->fk_project)) {
3095 $proj->fetch(
$object->fk_project);
3096 $morehtmlref .= $proj->getNomUrl(1);
3098 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
3103 $morehtmlref .=
'</div>';
3106 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
3109 $parameters = array();
3111 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters, $object, $action);
3112 if (empty($reshook)) {
3113 print
'<div class="fichecenter">';
3114 print
'<div class="fichehalfleft">';
3115 print
'<div class="underbanner clearboth"></div>';
3117 print
'<table class="border tableforfield centpercent">';
3121 $filterabsolutediscount =
"fk_facture_source IS NULL";
3122 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3124 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3125 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3128 print
'<tr><td class="titlefieldmax45">' . $langs->trans(
'Discounts') .
'</td><td>';
3130 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3131 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3132 $absolute_discount =
price2num($absolute_discount,
'MT');
3133 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3139 $backtopage = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id;
3140 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
3156 print $form->editfieldkey(
"DatePropal",
'date',
'', $object, (
int) $editenable);
3157 print
'</td><td class="valuefield">';
3158 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3159 print
'<form name="editdate" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3160 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
3161 print
'<input type="hidden" name="action" value="setdate">';
3162 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3163 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3164 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3178 print
'<table class="nobordernopadding centpercent"><tr><td>';
3179 print $langs->trans(
'DateEndPropal');
3181 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3182 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>';
3184 print
'</tr></table>';
3185 print
'</td><td class="valuefield">';
3186 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3187 print
'<form name="editecheance" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3188 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
3189 print
'<input type="hidden" name="action" value="setecheance">';
3190 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3191 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3192 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3195 if (!empty(
$object->fin_validite)) {
3209 print
'<table class="nobordernopadding centpercent"><tr><td>';
3210 print $langs->trans(
'PaymentConditionsShort');
3212 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3213 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>';
3215 print
'</tr></table>';
3216 print
'</td><td class="valuefield">';
3217 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3218 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3220 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3226 print
'<tr class="field_mode_reglement_id">';
3228 print
'<table class="nobordernopadding centpercent"><tr><td>';
3229 print $langs->trans(
'PaymentMode');
3231 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3232 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>';
3234 print
'</tr></table>';
3235 print
'</td><td class="valuefieldcreate">';
3236 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3237 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3239 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'none');
3244 print
'<tr class="fielddeliverydelay"><td>';
3245 print
'<table class="nobordernopadding centpercent"><tr><td>';
3247 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod') .
' (' . $langs->trans(
'AfterOrder') .
')');
3249 print $langs->trans(
'AvailabilityPeriod');
3252 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3253 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>';
3255 print
'</tr></table>';
3256 print
'</td><td class="valuefield">';
3257 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3258 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'availability_id', $langs->trans(
"Delay"));
3260 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'none', 1);
3268 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3269 print
'</td><td class="valuefieldedit">';
3270 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, $usercancreate && $caneditfield,
'datepicker');
3277 print
'<table class="nobordernopadding centpercent"><tr><td>';
3278 print $langs->trans(
'SendingMethod');
3280 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3281 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>';
3283 print
'</tr></table>';
3284 print
'</td><td class="valuefield">';
3285 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3286 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3288 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'none');
3296 $langs->load(
'stocks');
3297 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
3299 print
'<tr class="field_warehouse_id"><td>';
3300 $editenable = $usercancreate;
3301 print $form->editfieldkey(
"Warehouse",
'warehouse',
'', $object, $editenable);
3302 print
'</td><td class="valuefieldcreate">';
3303 if ($action ==
'editwarehouse') {
3304 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3306 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'none');
3314 print
'<table class="nobordernopadding centpercent"><tr><td>';
3315 print $langs->trans(
'Source');
3317 if ($action !=
'editdemandreason' && $usercancreate) {
3318 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>';
3320 print
'</tr></table>';
3321 print
'</td><td class="valuefield">';
3322 if ($action ==
'editdemandreason' && $usercancreate) {
3323 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3325 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'none');
3330 if ($soc->outstanding_limit) {
3333 print $langs->trans(
'OutstandingBill');
3334 print
'</td><td class="valuefield">';
3335 $arrayoutstandingbills = $soc->getOutstandingBills();
3336 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
3337 print
price($arrayoutstandingbills[
'opened']) .
' / ';
3338 print
price($soc->outstanding_limit, 0, $langs, 1, -1, -1,
$conf->currency);
3346 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3347 print $langs->trans(
'BankAccount');
3349 if ($action !=
'editbankaccount' && $usercancreate) {
3350 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>';
3352 print
'</tr></table>';
3353 print
'</td><td class="valuefield">';
3354 if ($action ==
'editbankaccount') {
3355 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3357 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'none');
3364 $tmparray =
$object->getTotalWeightVolume();
3365 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3366 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3368 print
'<tr><td>' . $langs->trans(
"CalculatedWeight") .
'</td>';
3369 print
'<td class="valuefield">';
3374 print
'<tr><td>' . $langs->trans(
"CalculatedVolume") .
'</td>';
3375 print
'<td class="valuefield">';
3384 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3385 print $langs->trans(
'IncotermLabel');
3386 print
'<td><td class="right">';
3387 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3388 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id .
'&action=editincoterm&token=' . newToken() .
'">' .
img_edit() .
'</a>';
3392 print
'</td></tr></table>';
3394 print
'<td class="valuefield">';
3395 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3396 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3398 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3406 print
'<table class="nobordernopadding centpercent"><tr><td>';
3407 print $langs->trans(
"Categories");
3408 print
'<td><td class="right">';
3409 if ($usercancreate) {
3410 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=edittags&token='.newToken().
'">'.
img_edit().
'</a>';
3414 print
'</td></tr></table>';
3417 if ($action ==
'edittags') {
3418 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'">';
3419 print
'<input type="hidden" name="action" value="settags">';
3420 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3421 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
3422 print
'<input type="submit" class="button valignmiddle smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
3425 print $form->showCategories(
$object->id, Categorie::TYPE_PROPOSAL, 1);
3431 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3436 print
'<div class="fichehalfright">';
3437 print
'<div class="underbanner clearboth"></div>';
3439 print
'<table class="border tableforfield centpercent">';
3441 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_currency_amount.tpl.php';
3444 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3445 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3447 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3452 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3453 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3455 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3459 if (
$mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3461 print
'<td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td>';
3462 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3466 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3471 if (
$mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3473 print
'<td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td>';
3474 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3478 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3484 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3485 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3487 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3495 $formmargin->displayMarginInfos($object);
3501 print
'<div class="clearboth"></div><br>';
3504 $blocname =
'contacts';
3505 $title = $langs->trans(
'ContactsAddresses');
3506 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3510 $blocname =
'notes';
3511 $title = $langs->trans(
'Notes');
3512 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3520 $result =
$object->getLinesArray();
3524 global $inputalsopricewithtax;
3525 $inputalsopricewithtax = 1;
3527 print
' <form name="addproduct" id="addproduct" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="POST">
3528 <input type="hidden" name="token" value="' . newToken() .
'">
3529 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline') .
'">
3530 <input type="hidden" name="mode" value="">
3531 <input type="hidden" name="page_y" value="">
3532 <input type="hidden" name="backtopage" value="' . $backtopage .
'">
3533 <input type="hidden" name="id" value="' .
$object->id .
'">
3538 include DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_ajaxrow.tpl.php';
3540 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3544 print
'<div class="div-table-responsive-no-min">';
3546 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3555 if ($action !=
'editline') {
3556 $parameters = array();
3557 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3561 if (empty($reshook)) {
3565 $parameters = array();
3566 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters, $object, $action);
3585 if ($action !=
'presend') {
3586 $numlines = count(
$object->lines);
3587 print
'<div class="tabsAction">';
3589 $parameters = array();
3590 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3592 if (empty($reshook)) {
3593 if ($action !=
'editline') {
3597 $langs->load(
'subtotals');
3599 $url_button = array();
3601 $url_button[] = array(
3602 'lang' =>
'subtotals',
3604 'perm' => (
bool) $usercancreate,
3605 'label' => $langs->trans(
'AddTitleLine'),
3606 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_title_line&token=' . newToken()
3609 $url_button[] = array(
3610 'lang' =>
'subtotals',
3612 'perm' => (
bool) $usercancreate,
3613 'label' => $langs->trans(
'AddSubtotalLine'),
3614 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_subtotal_line&token=' . newToken()
3617 print dolGetButtonAction(
'', $langs->trans(
'Subtotal'),
'default', $url_button,
'',
true);
3624 if ($usercanvalidate) {
3625 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>';
3627 print
'<a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
'Validate') .
'</a>';
3637 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=modif&token=' . newToken() .
'">' . $langs->trans(
'Modify') .
'</a>';
3642 if ($usercanreopen) {
3643 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=reopen&token=' . newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen') .
'"';
3644 print
'>' . $langs->trans(
'ReOpen') .
'</a>';
3646 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ReOpen") .
'</a>';
3651 if (empty($user->socid)) {
3653 print dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' . newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'', $usercansend);
3657 $arrayforbutaction = array();
3660 $arrayforbutaction[] = array(
3663 'perm' => $usercancreateorder,
3664 'label' =>
'AddOrder',
3665 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3675 $arrayforbutaction[] = array(
3678 'perm' => $usercancreatepurchaseorder,
3679 'label' =>
'AddPurchaseOrder',
3680 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3690 $arrayforbutaction[] = array(
3691 'lang' =>
'interventions',
3693 'perm' => $usercancreateintervention,
3694 'label' =>
'AddIntervention',
3695 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3705 $arrayforbutaction[] = array(
3706 'lang' =>
'contracts',
3708 'perm' => $usercancreatecontract,
3709 'label' =>
'AddContract',
3710 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3722 $arrayforbutaction[] = [
3723 'lang' =>
'invoice',
3725 'perm' => $usercancreateinvoice,
3726 'label' =>
'CreateBill',
3727 'url' =>
'/compta/facture/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((int)
$object->id) .
'&socid=' . ((int)
$object->socid),
3734 $actionButtonsParameters = [
3735 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3736 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3739 if ($numlines > 0) {
3740 print dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3742 print dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3746 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3747 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3748 if ($usercanclose) {
3749 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=classifybilled&token=' . newToken() .
'&socid=' .
$object->socid .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3751 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3759 if ($usercanclose) {
3760 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=closeas&token=' . newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3761 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3763 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'"';
3764 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3770 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token=' . newToken() .
'&action=closeas&token=' . newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3771 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3777 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=cancel&token=' . newToken() .
'">' . $langs->trans(
"CancelPropal") .
'</a>';
3781 if ($usercancreate) {
3782 print
'<a class="butAction butActionClone" href="' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id .
'&socid=' .
$object->socid .
'&action=clone&token=' . newToken() .
'&object=' .
$object->element .
'">' . $langs->trans(
"ToClone") .
'</a>';
3786 print dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' . newToken(),
'delete', $usercandelete);
3794 if (
GETPOST(
'modelselected')) {
3795 $action =
'presend';
3798 if ($action !=
'presend') {
3799 print
'<div class="fichecenter"><div class="fichehalfleft">';
3800 print
'<a name="builddoc"></a>';
3806 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3807 $genallowed = $usercanread;
3808 $delallowed = $usercancreate;
3809 $tooltipAfterComboOfModels =
'';
3811 $tooltipAfterComboOfModels = $langs->trans(
"AccordingToYourSetupTheFileWillBeConcatenated",
getDolGlobalString(
'MAIN_INFO_PROPAL_TERMSOFSALE'));
3814 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);
3817 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'propal'), 1);
3818 $linktoelem = $tmparray[
'linktoelem'];
3819 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3820 print $htmltoenteralink;
3822 $compatibleImportElementsList =
false;
3824 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3826 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, $compatibleImportElementsList);
3832 print
'<br><!-- Link to sign -->';
3833 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3834 print showOnlineSignatureUrl(
'proposal',
$object->ref, $object) .
'<br>';
3837 print
'</div><div class="fichehalfright">';
3841 $morehtmlcenter = dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/comm/propal/messaging.php?id=' .
$object->id);
3842 $morehtmlcenter .= dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT .
'/comm/propal/agenda.php?id=' .
$object->id);
3845 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3847 $somethingshown = $formactions->showactions($object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3849 print
'</div></div>';
3853 $modelmail =
'propal_send';
3854 $defaulttopic =
'SendPropalRef';
3856 $trackid =
'pro' .
$object->id;
3858 include DOL_DOCUMENT_ROOT .
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage a WYSIWYG editor.
static createDepositFromOrigin(CommonObject $origin, $date, $payment_terms_id, User $user, $notrigger=0, $autoValidateDeposit=false, $overrideFields=array())
Creates a deposit from a proposal or an order by grouping lines by VAT rates.
const TYPE_DEPOSIT
Deposit invoice.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage the table of subscription to notifications.
Class ProductCombination Used to represent the relation between a product and one of its variants.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
Class to manage projects.
Class to manage proposals.
const STATUS_DRAFT
Draft status.
const STATUS_SIGNED
Signed quote.
const STATUS_NOTSIGNED
Not signed quote.
const STATUS_BILLED
Billed or processed quote.
const STATUS_CANCELED
Canceled status.
const STATUS_VALIDATED
Validated status.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
$date_start
Variables from include:
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
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.
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 '.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
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.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
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.
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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
propal_prepare_head($object)
Prepare array with list of tabs.
print $langs trans('Date')." left Ref Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right Paid right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.