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');
222 '@phan-var-force Propal $objectutil';
234 $date_delivery_old = $objectutil->delivery_date;
235 if (!empty($date_delivery_old) && !empty($date_delivery)) {
246 $difference = $date_delivery - $old_date_delivery;
247 if ($difference != 0) {
248 $objectutil->delivery_date = $date_delivery;
249 foreach ($objectutil->lines as $line) {
250 if (isset($line->date_start)) {
251 $line->date_start += $difference;
253 if (isset($line->date_end)) {
254 $line->date_end += $difference;
261 $result = $objectutil->createFromClone($user, $socid, (
GETPOSTISSET(
'entity') ?
GETPOSTINT(
'entity') : null), (
GETPOST(
'update_prices') ==
'on'), (
GETPOST(
'update_desc') ==
'on'));
263 $warningMsgLineList = array();
265 foreach ($objectutil->lines as $line) {
266 if (!is_object($line->product)) {
267 $line->fetch_product();
269 if (is_object($line->product) && $line->product->id > 0) {
270 if (empty($line->product->status)) {
271 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
275 if (!empty($warningMsgLineList)) {
279 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
'?id=' . $result);
282 if (count($objectutil->errors) > 0) {
289 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanclose) {
291 $result =
$object->setCancel($user);
296 $langs->load(
"errors");
299 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
301 $result =
$object->delete($user);
303 header(
'Location: ' .
dolBuildUrl(DOL_URL_ROOT .
'/comm/propal/list.php', [
'restore_lastsearch_values' => 1]));
306 $langs->load(
"errors");
309 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
311 $result =
$object->deleteLine($lineid);
316 $langs->load(
"errors");
327 $outputlangs = $langs;
330 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
331 $outputlangs->setDefaultLang($newlang);
333 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
335 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $usercancreate) {
340 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'));
345 $outputlangs = $langs;
351 $newlang =
$object->thirdparty->default_lang;
353 if (!empty($newlang)) {
355 $outputlangs->setDefaultLang($newlang);
356 $outputlangs->load(
'products');
360 $result =
$object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
363 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
370 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
373 $result =
$object->valid($user);
375 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
386 $outputlangs = $langs;
389 $newlang =
GETPOST(
'lang_id',
'aZ09');
392 $newlang =
$object->thirdparty->default_lang;
394 if (!empty($newlang)) {
396 $outputlangs->setDefaultLang($newlang);
400 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
402 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
405 $langs->load(
"errors");
406 if (count(
$object->errors) > 0) {
412 } elseif ($action ==
'setdate' && $usercancreate) {
417 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
421 $result =
$object->set_date($user, $datep);
422 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
423 $datev = $datep + (
$object->duree_validite * 24 * 3600);
424 $result =
$object->set_echeance($user, $datev, 1);
429 $outputlangs = $langs;
432 $newlang =
GETPOST(
'lang_id',
'aZ09');
435 $newlang =
$object->thirdparty->default_lang;
437 if (!empty($newlang)) {
439 $outputlangs->setDefaultLang($newlang);
447 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
450 } elseif ($action ==
'setecheance' && $usercancreate) {
454 $outputlangs = $langs;
457 $newlang =
GETPOST(
'lang_id',
'aZ09');
460 $newlang =
$object->thirdparty->default_lang;
462 if (!empty($newlang)) {
464 $outputlangs->setDefaultLang($newlang);
472 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
477 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
482 } elseif ($action ==
'setref_client' && $usercancreate) {
488 } elseif ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $usercancreate) {
494 } elseif ($action ==
'settags' &&
isModEnabled(
'category') && $usercancreate) {
499 } elseif ($action ==
'add' && $usercancreate) {
509 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
513 if (empty($duration)) {
514 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
520 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
535 $object->delivery_date = $date_delivery;
541 $object->duree_validite = $duration;
551 $object->user_author_id = $user->id;
557 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
567 $object->delivery_date = $date_delivery;
582 $object->user_author_id = $user->id;
586 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
593 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
597 $ret = $extrafields->setOptionalsFromPost(
null, $object);
605 if ($origin && $originid) {
607 $element = $subelement = $origin;
609 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
611 $subelement = $regs[2];
615 if ($element ==
'order') {
616 $element = $subelement =
'commande';
618 if ($element ==
'propal') {
619 $element =
'comm/propal';
620 $subelement =
'propal';
622 if ($element ==
'contract') {
623 $element = $subelement =
'contrat';
625 if ($element ==
'inter') {
626 $element = $subelement =
'fichinter';
628 if ($element ==
'shipping') {
629 $element = $subelement =
'expedition';
633 if (($origin !=
'contrat' || $renewal !=
'true') && !
getDolGlobalInt(
'CONTRACT_NEW_CONTRACT_ON_RENEWAL')) {
635 $object->origin_id = $originid;
641 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
648 $classname = ucfirst($subelement);
649 $srcobject =
new $classname(
$db);
650 '@phan-var-force Commande|Propal|Contrat|Fichinter|Expedition $srcobject';
653 dol_syslog(
"Try to find source object origin=" .
$object->origin .
" originid=" .
$object->origin_id .
" to add lines");
654 $result = $srcobject->fetch(
$object->origin_id);
657 $lines = $srcobject->lines;
658 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
659 $srcobject->fetch_lines();
660 $lines = $srcobject->lines;
664 $num = count($lines);
665 for ($i = 0; $i < $num; $i++) {
666 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
667 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
670 $product_type = ($lines[$i]->product_type ? (int) $lines[$i]->product_type : 0);
674 if ($lines[$i]->date_debut_prevue) {
677 if ($lines[$i]->date_debut_reel) {
680 if ($lines[$i]->date_start) {
686 if ($lines[$i]->date_fin_prevue) {
687 $date_end = $lines[$i]->date_fin_prevue;
689 if ($lines[$i]->date_fin_reel) {
690 $date_end = $lines[$i]->date_fin_reel;
692 if ($lines[$i]->date_end) {
693 $date_end = $lines[$i]->date_end;
697 if ($origin ==
'contrat' && $renewal ==
'true') {
698 if ($lines[$i]->date_start && $lines[$i]->date_end) {
699 $duration = $lines[$i]->date_end - $lines[$i]->date_start;
706 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
711 if (method_exists($lines[$i],
'fetch_optionals')) {
712 $lines[$i]->fetch_optionals();
713 $array_options = $lines[$i]->array_options;
716 $tva_tx = $lines[$i]->tva_tx;
717 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
718 $tva_tx .=
' (' . $lines[$i]->vat_src_code .
')';
721 $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);
732 if ($result > 0 && $lines[$i]->product_type == 9) {
733 $fk_parent_line = $result;
738 $parameters = array(
'objFrom' => $srcobject);
739 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
760 if (
GETPOST(
'contactid') > 0) {
769 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
772 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
776 $categories =
GETPOST(
'categories',
'array');
777 if (method_exists($object,
'setCategories')) {
778 $object->setCategories($categories);
787 $outputlangs = $langs;
790 $newlang =
GETPOST(
'lang_id',
'aZ09');
793 $newlang =
$object->thirdparty->default_lang;
795 if (!empty($newlang)) {
797 $outputlangs->setDefaultLang($newlang);
802 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
808 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
821 } elseif ($action ==
'classifybilled' && $usercanclose) {
825 $result =
$object->classifyBilled($user, 0,
'');
836 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
839 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
841 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
842 $locationTarget =
'';
856 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
861 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
864 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
865 && !empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
867 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
870 $forceFields = array();
880 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
891 $ret = $deposit->fetch($deposit->id);
892 $outputlangs = $langs;
896 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
897 $outputlangs->load(
'products');
900 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
907 if ($locationTarget) {
908 header(
'Location: ' . $locationTarget);
920 } elseif ($action ==
'confirm_reopen' && $usercanreopen && !
GETPOST(
'cancel',
'alpha')) {
927 $result =
$object->reopen($user, $newstatus);
944 $fromElement =
GETPOST(
'fromelement');
945 $fromElementid =
GETPOST(
'fromelementid');
946 $importLines =
GETPOST(
'line_checkbox');
948 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && preg_match(
'/^[a-zA-Z]+$/', $fromElement) && !empty($fromElementid)) {
949 if ($fromElement ==
'commande') {
950 dol_include_once(
'/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
951 $lineClassName =
'OrderLine';
952 } elseif ($fromElement ==
'propal') {
953 dol_include_once(
'/comm/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
954 $lineClassName =
'PropaleLigne';
955 } elseif ($fromElement ==
'facture') {
956 dol_include_once(
'/compta/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
957 $lineClassName =
'FactureLigne';
959 $lineClassName =
null;
961 $nextRang = count(
$object->lines) + 1;
964 foreach ($importLines as $lineId) {
965 $lineId = intval($lineId);
966 $originLine =
new $lineClassName(
$db);
967 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
968 $originLine->fetch_optionals();
969 $desc = $originLine->desc;
970 $pu_ht = $originLine->subprice;
971 $qty = $originLine->qty;
972 $txtva = $originLine->tva_tx;
973 $txlocaltax1 = $originLine->localtax1_tx;
974 $txlocaltax2 = $originLine->localtax2_tx;
975 $fk_product = $originLine->fk_product;
976 $remise_percent = $originLine->remise_percent;
978 $date_end = $originLine->date_end;
979 $fk_code_ventilation = 0;
980 $info_bits = $originLine->info_bits;
981 $fk_remise_except = $originLine->fk_remise_except;
982 $price_base_type =
'HT';
984 $type = $originLine->product_type;
986 $special_code = $originLine->special_code;
987 $origin = $originLine->element;
988 $origin_id = $originLine->id;
990 $fk_fournprice = $originLine->fk_fournprice;
991 $pa_ht = $originLine->pa_ht;
992 $label = $originLine->label;
993 $array_options = $originLine->array_options;
994 $situation_percent = 100;
996 $fk_unit = $originLine->fk_unit;
997 $pu_ht_devise = $originLine->multicurrency_subprice;
999 $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);
1015 } elseif ($action ==
'addline' &&
GETPOST(
'updateallvatlinesblock',
'alpha') &&
GETPOST(
'vatforblocklines',
'alpha') !==
'' && $usercancreate) {
1016 $tx_tva =
GETPOST(
'vatforblocklines') ?
GETPOST(
'vatforblocklines') : 0;
1017 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'tva', $tx_tva);
1021 } elseif ($action ==
'addline' &&
GETPOST(
'updatealldiscountlinesblock',
'alpha') &&
GETPOST(
'discountforblocklines',
'alpha') !==
'' && $usercancreate) {
1022 $discount =
GETPOST(
'discountforblocklines') ?
GETPOST(
'discountforblocklines') : 0;
1023 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'discount', $discount);
1029 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1032 $actiontypecode =
'AC_EMAIL';
1033 $triggersendname =
'PROPAL_SENTBYMAIL';
1034 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
1035 $trackid =
'pro' .
$object->id;
1036 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1040 if ($action ==
'modif' && $usercancreate) {
1041 $result =
$object->setDraft($user);
1048 $outputlangs = $langs;
1051 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1052 $outputlangs->setDefaultLang($newlang);
1058 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1060 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
1069 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
1073 foreach (
$object->lines as $key => $line) {
1074 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1077 if ($line->product_type == 1) {
1079 $line_price_base_type = $line->wasEnteredIncludingTax() ?
'TTC' :
'HT';
1080 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1081 $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);
1085 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
1087 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
1088 $vat_rate = str_replace(
'*',
'', $vat_rate);
1091 foreach (
$object->lines as $key => $line) {
1092 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1096 $line_price_base_type = $line->wasEnteredIncludingTax() ?
'TTC' :
'HT';
1097 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1098 $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);
1101 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
1103 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
1104 $remise_percent = str_replace(
'*',
'', $remise_percent);
1105 foreach (
$object->lines as $key => $line) {
1106 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1109 $tvatx = $line->tva_tx;
1110 if (!empty($line->vat_src_code)) {
1111 $tvatx .=
' (' . $line->vat_src_code .
')';
1114 $line_price_base_type = $line->wasEnteredIncludingTax() ?
'TTC' :
'HT';
1115 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1116 $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);
1119 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'' && $usercancreate) {
1121 $margin_rate = (
GETPOST(
'marginforalllines',
'alpha') ?
GETPOST(
'marginforalllines',
'alpha') : 0);
1122 foreach (
$object->lines as $key => $line) {
1123 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1126 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
1128 $prod->fetch($line->fk_product);
1129 if (
$prod->price_min > $subprice) {
1130 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1131 $price_price_min =
price(
$prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1132 setEventMessages(
$prod->ref .
' - ' .
$prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1135 if ($line->subprice <> 0) {
1136 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1138 $multicurrency_subprice = 0;
1141 $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);
1158 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
1161 $langs->load(
'subtotals');
1163 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
1164 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
1166 $subtotal_options = array();
1168 foreach (Propal::$TITLE_OPTIONS as $option) {
1169 $value =
GETPOST($option,
'alphanohtml');
1171 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1176 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1187 $outputlangs = $langs;
1188 $newlang =
GETPOST(
'lang_id',
'alpha');
1190 $newlang =
$object->thirdparty->default_lang;
1192 if (!empty($newlang)) {
1194 $outputlangs->setDefaultLang($newlang);
1197 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1202 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1204 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
1207 $langs->load(
'subtotals');
1209 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
1210 foreach (
$object->lines as $line) {
1211 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
1212 $desc = $line->desc;
1213 $depth = -$line->qty;
1217 $subtotal_options = array();
1219 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1220 $value =
GETPOST($option,
'alphanohtml');
1222 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1227 if (isset($desc) && isset($depth)) {
1228 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1231 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
1240 $outputlangs = $langs;
1241 $newlang =
GETPOST(
'lang_id',
'alpha');
1243 $newlang =
$object->thirdparty->default_lang;
1245 if (!empty($newlang)) {
1247 $outputlangs->setDefaultLang($newlang);
1250 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1255 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1257 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && !
GETPOST(
'markforalllines',
'alpha') && $usercancreate) {
1264 $price_ht_devise =
'';
1266 $price_ttc_devise =
'';
1270 if (
GETPOST(
'price_ht') !==
'') {
1273 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1276 if (
GETPOST(
'price_ttc') !==
'') {
1279 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1280 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1283 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1284 if ($prod_entry_mode ==
'free') {
1290 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1295 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1299 if (empty($remise_percent)) {
1300 $remise_percent = 0;
1304 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1305 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1307 if (is_array($extralabelsline)) {
1309 foreach ($extralabelsline as $key => $value) {
1310 unset($_POST[
"options_" . $key]);
1314 $price_to_test_sign = ($price_ht ? $price_ht : $price_ttc);
1316 if ((empty($idprod) || $idprod < 0) && ($price_to_test_sign < 0) && ($qty < 0)) {
1317 $langs->load(
"errors");
1318 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1321 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1322 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1326 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1327 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1331 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1334 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1335 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1339 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1340 if ($combinations =
GETPOST(
'combinations',
'array:alphanohtml')) {
1344 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1345 $idprod = $res->fk_product_child;
1347 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1353 if (!$error && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1361 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1370 if (!empty($idprod) && $idprod > 0) {
1372 $prod->fetch($idprod);
1384 $pu_ht =
$prod->price;
1385 $pu_ttc =
$prod->price_ttc;
1386 $price_min =
$prod->price_min;
1387 $price_min_ttc =
$prod->price_min_ttc;
1388 $price_base_type =
$prod->price_base_type;
1392 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1394 $filter = array(
't.fk_product' => (
string)
$prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1397 $pricebycustomerexist =
false;
1398 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1401 if (count($prodcustprice->lines) > 0) {
1402 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1403 foreach ($prodcustprice->lines as $k => $custprice_line) {
1404 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1405 $pricebycustomerexist =
true;
1406 $pu_ht =
price($custprice_line->price);
1407 $pu_ttc =
price($custprice_line->price_ttc);
1408 $price_min =
price($custprice_line->price_min);
1409 $price_min_ttc =
price($custprice_line->price_min_ttc);
1410 $price_base_type = $custprice_line->price_base_type;
1427 if (!$pricebycustomerexist && !empty(
$object->thirdparty->price_level)) {
1428 $pu_ht =
$prod->multiprices[
$object->thirdparty->price_level];
1429 $pu_ttc =
$prod->multiprices_ttc[
$object->thirdparty->price_level];
1430 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
1431 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1432 $price_base_type =
$prod->multiprices_base_type[
$object->thirdparty->price_level];
1434 if (isset(
$prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1435 $tva_tx =
$prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1437 if (isset(
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1438 $tva_npr =
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1443 $pu_ht =
$prod->multiprices[
$object->thirdparty->price_level];
1444 $pu_ttc =
$prod->multiprices_ttc[
$object->thirdparty->price_level];
1445 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
1446 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1447 $price_base_type =
$prod->multiprices_base_type[
$object->thirdparty->price_level];
1449 if (isset(
$prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1450 $tva_tx =
$prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1452 if (isset(
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1453 $tva_npr =
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1458 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1462 $filter = array(
't.fk_product' => (
string)
$prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1464 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1467 if (count($prodcustprice->lines) > 0) {
1468 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1469 foreach ($prodcustprice->lines as $k => $custprice_line) {
1470 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1471 $pu_ht =
price($custprice_line->price);
1472 $pu_ttc =
price($custprice_line->price_ttc);
1473 $price_min =
price($custprice_line->price_min);
1474 $price_min_ttc =
price($custprice_line->price_min_ttc);
1475 $price_base_type = $custprice_line->price_base_type;
1493 if (
$prod->prices_by_qty[0]) {
1498 foreach (
$prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1499 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1503 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1504 $pu_ht = $priceforthequantityarray[
'unitprice'];
1506 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1514 if (
$prod->prices_by_qty[
$object->thirdparty->price_level]) {
1519 foreach (
$prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1520 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1524 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1525 $pu_ht = $priceforthequantityarray[
'unitprice'];
1527 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1535 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1536 $tmpprodvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string)
$prod->tva_tx));
1541 if (!empty($price_ht) || (
string) $price_ht ===
'0') {
1542 $pu_ht = (float)
price2num($price_ht,
'MU');
1543 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1544 $price_base_type =
'HT';
1545 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1546 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1547 $pu_ttc_devise = (float)
price2num((
float) $pu_ht_devise * (1 + ((float) $tmpvat / 100)),
'MU');
1550 $price_base_type =
'HT';
1551 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1552 $pu_ttc = (float)
price2num($price_ttc,
'MU');
1553 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1554 $price_base_type =
'TTC';
1555 } elseif (!empty($price_ttc_devise) || (
string) $price_ttc_devise ===
'0') {
1556 $pu_ttc_devise = (float)
price2num($price_ttc_devise,
'MU');
1557 $pu_ht_devise = (float)
price2num((
float) $pu_ttc_devise / (1 + ((float) $tmpvat / 100)),
'MU');
1560 $price_base_type =
'TTC';
1561 } elseif ($tmpvat != $tmpprodvat) {
1563 if ($price_base_type !=
'HT') {
1564 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1566 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1574 $outputlangs = $langs;
1576 if (
GETPOST(
'lang_id',
'aZ09')) {
1577 $newlang =
GETPOST(
'lang_id',
'aZ09');
1579 if (empty($newlang)) {
1580 $newlang =
$object->thirdparty->default_lang;
1582 if (!empty($newlang)) {
1584 $outputlangs->setDefaultLang($newlang);
1587 $desc = (!empty(
$prod->multilangs[$outputlangs->defaultlang][
"description"])) ?
$prod->multilangs[$outputlangs->defaultlang][
"description"] :
$prod->
description;
1589 $desc =
$prod->description;
1605 $outputlangs = $langs;
1607 if (
GETPOST(
'lang_id',
'alpha')) {
1608 $newlang =
GETPOST(
'lang_id',
'alpha');
1610 if (empty($newlang)) {
1611 $newlang =
$object->thirdparty->default_lang;
1613 if (!empty($newlang)) {
1615 $outputlangs->setDefaultLang($newlang);
1616 $outputlangs->load(
'products');
1618 if (!empty(
$prod->customcode)) {
1619 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode") .
': ' .
$prod->customcode;
1621 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1624 if (!empty(
$prod->country_code)) {
1625 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry(
$prod->country_code,
'',
$db, $outputlangs, 0);
1628 if (!empty(
$prod->customcode)) {
1629 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode") .
': ' .
$prod->customcode;
1631 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1634 if (!empty(
$prod->country_code)) {
1635 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry(
$prod->country_code,
'',
$db, $langs, 0);
1642 $type =
$prod->type;
1643 $fk_unit =
$prod->fk_unit;
1647 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1648 $tva_tx = str_replace(
'*',
'', $tva_tx);
1649 if (empty($tva_tx)) {
1652 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1655 $fk_unit =
GETPOST(
'units',
'alpha');
1656 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1657 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1659 if ($pu_ttc && !$pu_ht) {
1660 $price_base_type =
'TTC';
1674 $fournprice = (int) (
GETPOST(
'fournprice' . $predef) ?
GETPOST(
'fournprice' . $predef) :
'');
1675 $buyingprice =
price2num((
GETPOST(
'buying_price' . $predef) !=
'' ?
GETPOST(
'buying_price' . $predef) :
''),
'', 2);
1681 $pu_equivalent = $pu_ht;
1682 $pu_equivalent_ttc = $pu_ttc;
1683 $currency_tx =
$object->multicurrency_tx;
1687 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1688 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1690 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1691 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1711 if ($usermustrespectpricemin) {
1712 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1713 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1716 } 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') {
1717 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1725 $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);
1737 $outputlangs = $langs;
1738 $newlang =
GETPOST(
'lang_id',
'alpha');
1740 $newlang =
$object->thirdparty->default_lang;
1742 if (!empty($newlang)) {
1744 $outputlangs->setDefaultLang($newlang);
1746 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1749 unset($_POST[
'prod_entry_mode']);
1751 unset($_POST[
'qty']);
1752 unset($_POST[
'type']);
1753 unset($_POST[
'remise_percent']);
1754 unset($_POST[
'price_ht']);
1755 unset($_POST[
'multicurrency_price_ht']);
1756 unset($_POST[
'price_ttc']);
1757 unset($_POST[
'tva_tx']);
1758 unset($_POST[
'product_ref']);
1759 unset($_POST[
'product_label']);
1760 unset($_POST[
'product_desc']);
1761 unset($_POST[
'fournprice']);
1762 unset($_POST[
'buying_price']);
1763 unset($_POST[
'np_marginRate']);
1764 unset($_POST[
'np_markRate']);
1765 unset($_POST[
'dp_desc']);
1766 unset($_POST[
'idprod']);
1767 unset($_POST[
'units']);
1769 unset($_POST[
'date_starthour']);
1770 unset($_POST[
'date_startmin']);
1771 unset($_POST[
'date_startsec']);
1772 unset($_POST[
'date_startday']);
1773 unset($_POST[
'date_startmonth']);
1774 unset($_POST[
'date_startyear']);
1775 unset($_POST[
'date_endhour']);
1776 unset($_POST[
'date_endmin']);
1777 unset($_POST[
'date_endsec']);
1778 unset($_POST[
'date_endday']);
1779 unset($_POST[
'date_endmonth']);
1780 unset($_POST[
'date_endyear']);
1788 } elseif ($action ==
'addline' && $usercancreate && (
1789 (
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'') ||
1790 (
GETPOST(
'submitforallmark',
'alpha') &&
GETPOST(
'markforalllines',
'alpha') !==
'')
1794 $margin_rate =
GETPOSTISSET(
'marginforalllines') ?
GETPOST(
'marginforalllines',
'int') :
'';
1796 foreach (
$object->lines as &$line) {
1797 if ($line->subprice > 0) {
1798 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1801 $subprice_multicurrency = $line->subprice;
1802 if (is_numeric($margin_rate) && $margin_rate > 0) {
1803 $line->subprice = (float)
price2num((
float) $line->pa_ht * (1 + (float) $margin_rate / 100),
'MU');
1804 } elseif (is_numeric($mark_rate) && $mark_rate > 0) {
1805 $line->subprice = (float) ($line->pa_ht / (1 - ((
float) $mark_rate / 100)));
1807 $line->subprice = (float) $line->pa_ht;
1810 if ($line->fk_product > 0) {
1812 $res =
$prod->fetch($line->fk_product);
1814 if (
$prod->price_min > $line->subprice) {
1815 $price_subprice =
price($line->subprice, 0, $outlangs, 1, -1, -1,
'auto');
1816 $price_price_min =
price(
$prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1817 setEventMessages(
$prod->ref .
' - ' .
$prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1827 $multicurrency_subprice = (float) $line->subprice * $line->multicurrency_subprice / $subprice_multicurrency;
1829 $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);
1832 if (is_numeric($margin_rate) && empty($mark_rate)) {
1833 $line->marge_tx = $margin_rate;
1834 } elseif (is_numeric($mark_rate) && empty($margin_rate)) {
1835 $line->marque_tx = $mark_rate;
1837 $line->total_ht = $line->qty * (float) $line->subprice;
1838 $line->total_tva = $line->tva_tx * $line->qty * (float) $line->subprice;
1839 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $line->subprice;
1841 $line->multicurrency_total_ht = $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1842 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1843 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1845 $line->multicurrency_subprice = $multicurrency_subprice;
1851 } elseif ($action ==
'updatetitleline' &&
GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1854 $langs->load(
'subtotals');
1856 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1859 $subtotal_options = array();
1861 foreach (Propal::$TITLE_OPTIONS as $option) {
1862 $value =
GETPOST($option,
'alphanohtml');
1864 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1869 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1880 $outputlangs = $langs;
1881 $newlang =
GETPOST(
'lang_id',
'alpha');
1883 $newlang =
$object->thirdparty->default_lang;
1885 if (!empty($newlang)) {
1887 $outputlangs->setDefaultLang($newlang);
1890 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1895 } elseif ($action ==
'updatesubtotalline' &&
GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1898 $langs->load(
'subtotals');
1900 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1903 $subtotal_options = array();
1905 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1906 $value =
GETPOST($option,
'alphanohtml');
1908 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1913 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1921 $outputlangs = $langs;
1922 $newlang =
GETPOST(
'lang_id',
'alpha');
1924 $newlang =
$object->thirdparty->default_lang;
1926 if (!empty($newlang)) {
1928 $outputlangs->setDefaultLang($newlang);
1931 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1936 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1944 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1949 $vat_rate = (
GETPOST(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : 0);
1950 $vat_rate = str_replace(
'*',
'', $vat_rate);
1957 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
1967 if (empty($remise_percent)) {
1968 $remise_percent = 0;
1972 $pu_equivalent = $pu_ht;
1973 $pu_equivalent_ttc = $pu_ttc;
1975 $currency_tx =
$object->multicurrency_tx;
1979 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1980 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1982 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1983 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1998 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1999 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
2001 if (is_array($extralabelsline)) {
2003 foreach ($extralabelsline as $key => $value) {
2004 unset($_POST[
"options_" . $key]);
2018 $price_base_type =
'HT';
2019 if (empty($pu_ht) && !empty($pu_ttc)) {
2021 $price_base_type =
'TTC';
2022 } elseif (!empty($pu_ht) && !empty($pu_ttc)) {
2023 foreach (
$object->lines as $line_obj) {
2025 if ($line_obj->wasEnteredIncludingTax()) {
2027 $price_base_type =
'TTC';
2036 if (!empty($productid)) {
2038 $res = $product->fetch($productid);
2040 $type = $product->type;
2044 $price_min = $product->price_min;
2046 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
2048 $price_min_ttc = $product->price_min_ttc;
2050 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
2057 if ($usermustrespectpricemin) {
2058 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
2059 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
2062 $action =
'editline';
2063 } 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') {
2064 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
2067 $action =
'editline';
2072 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2076 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
2084 if (!$user->hasRight(
'margins',
'creer')) {
2085 foreach (
$object->lines as &$line) {
2087 $fournprice = $line->fk_fournprice;
2088 $buyingprice = (
string) $line->pa_ht;
2096 $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);
2103 $outputlangs = $langs;
2106 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
2107 $outputlangs->setDefaultLang($newlang);
2113 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2116 unset($_POST[
'qty']);
2117 unset($_POST[
'type']);
2118 unset($_POST[
'productid']);
2119 unset($_POST[
'remise_percent']);
2120 unset($_POST[
'price_ht']);
2121 unset($_POST[
'multicurrency_price_ht']);
2122 unset($_POST[
'price_ttc']);
2123 unset($_POST[
'tva_tx']);
2124 unset($_POST[
'product_ref']);
2125 unset($_POST[
'product_label']);
2126 unset($_POST[
'product_desc']);
2127 unset($_POST[
'fournprice']);
2128 unset($_POST[
'buying_price']);
2130 unset($_POST[
'date_starthour']);
2131 unset($_POST[
'date_startmin']);
2132 unset($_POST[
'date_startsec']);
2133 unset($_POST[
'date_startday']);
2134 unset($_POST[
'date_startmonth']);
2135 unset($_POST[
'date_startyear']);
2136 unset($_POST[
'date_endhour']);
2137 unset($_POST[
'date_endmin']);
2138 unset($_POST[
'date_endsec']);
2139 unset($_POST[
'date_endday']);
2140 unset($_POST[
'date_endmonth']);
2141 unset($_POST[
'date_endyear']);
2148 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
2149 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
2151 } elseif ($action ==
'classin' && $usercancreate) {
2154 } elseif ($action ==
'setavailability' && $usercancreate) {
2157 } elseif ($action ==
'setdemandreason' && $usercancreate) {
2160 } elseif ($action ==
'setconditions' && $usercancreate) {
2163 } elseif ($action ==
'setmode' && $usercancreate) {
2166 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
2168 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
2169 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
2172 } elseif ($action ==
'setbankaccount' && $usercancreate) {
2175 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
2178 } elseif ($action ==
'setwarehouse' && $usercancreate) {
2181 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
2184 $attribute_name =
GETPOST(
'attribute',
'aZ09');
2187 $result = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
2193 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
2200 $action =
'edit_extras';
2205 if ($action ==
'addcontact' && $usercancreate) {
2210 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2214 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2217 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2218 $langs->load(
"errors");
2219 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
2224 } elseif ($action ==
'swapstatut' && $usercancreate) {
2226 if (
$object->fetch($id) > 0) {
2231 } elseif ($action ==
'deletecontact' && $usercancreate) {
2234 $result =
$object->delete_contact($lineid);
2237 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2247 $permissiontoadd = $usercancreate;
2248 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
2265$title =
$object->ref .
" - " . $langs->trans(
'Card');
2266if ($action ==
'create') {
2267 $title = $langs->trans(
"NewPropal");
2269$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
2276if ($action ==
'create') {
2283 $res = $soc->fetch($socid);
2286 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2287 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2288 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2294 if (!empty($origin) && !empty($originid)) {
2296 $element = $subelement = $origin;
2298 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2299 $element = $regs[1];
2300 $subelement = $regs[2];
2303 if ($element ==
'project') {
2304 $projectid = $originid;
2308 $project->fetch($projectid);
2309 if ($project->socid > 0) {
2311 $soc->fetch($project->socid);
2315 if ($element ==
'order' || $element ==
'commande') {
2316 $element = $subelement =
'commande';
2318 if ($element ==
'propal') {
2319 $element =
'comm/propal';
2320 $subelement =
'propal';
2322 if ($element ==
'contract') {
2323 $element = $subelement =
'contrat';
2325 if ($element ==
'shipping') {
2326 $element = $subelement =
'expedition';
2331 $classname = ucfirst($subelement);
2332 $objectsrc =
new $classname(
$db);
2333 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
2335 $objectsrc->fetch($originid);
2336 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2337 $objectsrc->fetch_lines();
2339 $objectsrc->fetch_thirdparty();
2341 $projectid = (int) $objectsrc->fk_project;
2342 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
2344 $soc = $objectsrc->thirdparty;
2346 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2347 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2348 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : -1));
2351 $objectsrc->fetch_optionals();
2352 $object->array_options = $objectsrc->array_options;
2355 if (!empty($objectsrc->multicurrency_code)) {
2356 $currency_code = $objectsrc->multicurrency_code;
2358 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2359 $currency_tx = $objectsrc->multicurrency_tx;
2367 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
2368 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
2369 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
2370 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
2371 $shipping_method_id = $soc->shipping_method_id;
2372 $warehouse_id = !empty($soc->fk_warehouse) ? $soc->fk_warehouse : $warehouse_id;
2373 $remise_percent = $soc->remise_percent;
2375 if (
isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
2376 $currency_code = $soc->multicurrency_code;
2381 if (!
GETPOST(
'changecompany')) {
2383 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2389 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2395 $shipping_method_id =
GETPOSTINT(
'shipping_method_id');
2399 if ($soc->fk_warehouse > 0) {
2400 $warehouse_id = $soc->fk_warehouse;
2407 $warehouse_id = $user->fk_warehouse;
2411 print
'<form name="addprop" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
2412 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2413 print
'<input type="hidden" name="action" value="add">';
2414 print
'<input type="hidden" name="changecompany" value="0">';
2415 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
2416 if ($origin !=
'project' && $originid) {
2417 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
2418 print
'<input type="hidden" name="originid" value="' . $originid .
'">';
2419 if ($origin ==
'contrat' && !empty($renewal)) {
2420 print
'<input type="hidden" name="renewal" value="' . $renewal .
'">';
2422 } elseif ($origin ==
'project' && !empty($projectid)) {
2423 print
'<input type="hidden" name="projectid" value="' . $projectid .
'">';
2429 $parameters = array();
2431 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters, $object, $action);
2432 if (empty($reshook)) {
2433 print
'<table class="border centpercent">';
2439 print
'<tr class="field_socid">';
2441 print
'<td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Customer') .
'</td>';
2442 $shipping_method_id = 0;
2445 print
'<td class="valuefieldcreate">';
2446 print $soc->getNomUrl(1,
'customer');
2447 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
2449 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2450 $shipping_method_id = $soc->shipping_method_id;
2453 print
'<td class="valuefieldcreate">';
2454 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2455 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2456 print $form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2460 $(document).ready(function() {
2461 $("#socid").change(function() {
2462 console.log("We have changed the company - Reload page");
2463 var socid = $(this).val();
2465 $("input[name=action]").val("create");
2466 $("input[name=changecompany]").val("1");
2467 $("form[name=addprop]").submit();
2472 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>';
2475 print
'</tr>' .
"\n";
2479 print
'<tr class="field_ref_client"><td class="titlefieldcreate">';
2480 print $form->textwithpicto($langs->trans(
'RefCustomer'), $langs->trans(
'RefOfOnCustomerSide', $langs->transnoentitiesnoconv(
"Proposal")));
2481 print
'</td><td class="valuefieldcreate">';
2482 print
'<input type="text" name="ref_client" value="' . (!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')) .
'"></td>';
2488 print
'<tr class="field_contactid"><td class="titlefieldcreate">' . $langs->trans(
"DefaultContact") .
'</td><td class="valuefieldcreate">';
2489 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2491 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2495 print
'<tr class="field_discount_info"><td class="titlefieldcreate">' . $langs->trans(
'Discounts') .
'</td><td class="valuefieldcreate">';
2497 $absolute_discount = $soc->getAvailableDiscounts();
2501 $backtopage = $_SERVER[
"PHP_SELF"] .
'?socid=' . $thirdparty->id .
'&action=' . $action .
'&origin=' . urlencode((
string) (
GETPOST(
'origin'))) .
'&originid=' . urlencode((
string) (
GETPOSTINT(
'originid')));
2502 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
2508 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Date') .
'</td><td class="valuefieldcreate">';
2509 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2510 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2514 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>';
2517 print
'<tr class="field_cond_reglement_id"><td class="nowrap">' . $langs->trans(
'PaymentConditionsShort') .
'</td><td>';
2518 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2520 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2524 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">' . $langs->trans(
'PaymentMode') .
'</td><td class="valuefieldcreate">';
2525 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2526 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2531 print
'<tr class="field_fk_account"><td class="titlefieldcreate">' . $langs->trans(
'BankAccount') .
'</td><td class="valuefieldcreate">';
2532 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"') . $form->select_comptes((
int) $fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2537 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">' . $langs->trans(
'Source') .
'</td><td class="valuefieldcreate">';
2538 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2539 $form->selectInputReason((
GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2544 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2545 $shipping_method_id = $soc->shipping_method_id;
2547 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">' . $langs->trans(
'SendingMethod') .
'</td><td class="valuefieldcreate">';
2548 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2549 $form->selectShippingMethod((
string) $shipping_method_id,
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2553 $formproduct =
null;
2556 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
2558 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">' . $langs->trans(
'Warehouse') .
'</td><td class="valuefieldcreate">';
2559 print
img_picto(
'',
'stock',
'class="pictofixedwidth"') . $formproduct->selectWarehouses((
int) $warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2564 print
'<tr class="field_availability_id"><td class="titlefieldcreate">' . $langs->trans(
'AvailabilityPeriod');
2566 print
' (' . $langs->trans(
'AfterOrder') .
')';
2568 print
'</td><td class="valuefieldcreate">';
2569 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2570 print $form->selectAvailabilityDelay((
GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx', 1);
2574 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">' . $langs->trans(
"DeliveryDate") .
'</td>';
2575 print
'<td class="valuefieldcreate">';
2576 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2578 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2579 $syear =
date(
"Y", $tmpdte);
2580 $smonth =
date(
"m", $tmpdte);
2581 $sday =
date(
"d", $tmpdte);
2582 print $form->selectDate($syear .
"-" . $smonth .
"-" . $sday,
'date_livraison', 0, 0, 0,
"addprop");
2584 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2585 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2590 if (
isModEnabled(
'project') && is_object($formproject)) {
2591 $langs->load(
"projects");
2592 print
'<tr class="field_projectid">';
2593 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2594 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');
2595 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>';
2602 print
'<tr class="field_incoterm_id">';
2603 print
'<td class="titlefieldcreate"><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1) .
'</label></td>';
2604 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2605 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2606 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2611 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td colspan="3">';
2612 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
2616 include_once DOL_DOCUMENT_ROOT .
'/core/modules/propale/modules_propale.php';
2618 if (is_array($list) && count($list) > 0) {
2619 print
'<tr class="field_model">';
2620 print
'<td class="titlefieldcreate">' . $langs->trans(
"DefaultModel") .
'</td>';
2621 print
'<td class="valuefieldcreate">';
2622 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2624 print $form->selectarray(
'model', $list, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2630 print
'<tr class="field_currency">';
2631 print
'<td class="titlefieldcreate">' . $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0) .
'</td>';
2632 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2633 print
img_picto(
'',
'currency',
'class="pictofixedwidth"') . $form->selectMultiCurrency(((
GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2638 print
'<tr class="field_note_public">';
2639 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePublic') .
'</td>';
2640 print
'<td class="valuefieldcreate">';
2641 $note_public =
GETPOST(
'note_public',
'restricthtml');
2642 if (!
GETPOSTISSET(
'note_public') && empty($note_public) && !empty($objectsrc)) {
2643 $note_public = $objectsrc->note_public;
2645 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2646 print $doleditor->Create(1);
2649 if (empty($user->socid)) {
2650 print
'<tr class="field_note_private">';
2651 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePrivate') .
'</td>';
2652 print
'<td class="valuefieldcreate">';
2653 $note_private =
GETPOST(
'note_private',
'restricthtml');
2654 if (!
GETPOSTISSET(
'note_private') && empty($note_private) && !empty($objectsrc)) {
2655 $note_private = $objectsrc->note_private;
2657 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2658 print $doleditor->Create(1);
2664 if (
getDolGlobalInt(
'THIRDPARTY_PROPAGATE_EXTRAFIELDS_TO_PROPAL') && $socid > 0) {
2665 $thirdpartytopropagateextrafieldsfrom = $soc;
2667 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_add.tpl.php';
2670 if (!empty($origin) && !empty($originid) && is_object($objectsrc) && !empty($classname)) {
2672 if ($origin ==
'contrat') {
2674 $objectsrc->update_price(1,
'auto', 1);
2677 print
"\n<!-- " . $classname .
" info -->";
2679 print
'<input type="hidden" name="amount" value="' . $objectsrc->total_ht .
'">' .
"\n";
2680 print
'<input type="hidden" name="total" value="' . $objectsrc->total_ttc .
'">' .
"\n";
2681 print
'<input type="hidden" name="tva" value="' . $objectsrc->total_tva .
'">' .
"\n";
2682 print
'<input type="hidden" name="origin" value="' . $objectsrc->element .
'">';
2683 print
'<input type="hidden" name="originid" value="' . $objectsrc->id .
'">';
2685 $newclassname = $classname;
2686 if ($newclassname ==
'Propal') {
2687 $newclassname =
'CommercialProposal';
2688 } elseif ($newclassname ==
'Commande') {
2689 $newclassname =
'Order';
2690 } elseif ($newclassname ==
'Expedition') {
2691 $newclassname =
'Sending';
2692 } elseif ($newclassname ==
'Fichinter') {
2693 $newclassname =
'Intervention';
2696 print
'<tr><td>' . $langs->trans($newclassname) .
'</td><td>' . $objectsrc->getNomUrl(1) .
'</td></tr>';
2697 print
'<tr><td>' . $langs->trans(
'AmountHT') .
'</td><td>' .
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td></tr>';
2698 print
'<tr><td>' . $langs->trans(
'AmountVAT') .
'</td><td>' .
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2699 if (
$mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2700 print
'<tr><td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2703 if (
$mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2704 print
'<tr><td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2706 print
'<tr><td>' . $langs->trans(
'AmountTTC') .
'</td><td>' .
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2709 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
'</td></tr>';
2710 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
"</td></tr>";
2711 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
"</td></tr>";
2723 print
'<input type="hidden" name="createmode" value="empty">';
2727 print
'<br><table>';
2731 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2732 print
'<td>' . $langs->trans(
"CopyPropalFrom") .
' </td>';
2734 $liste_propal = array();
2735 $liste_propal[0] =
'';
2737 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2738 $sql .=
" FROM " . MAIN_DB_PREFIX .
"propal p";
2739 $sql .=
", " . MAIN_DB_PREFIX .
"societe s";
2740 $sql .=
" WHERE s.rowid = p.fk_soc";
2741 $sql .=
" AND p.entity IN (" .
getEntity(
'propal') .
")";
2742 $sql .=
" AND p.fk_statut <> 0";
2743 $sql .=
" ORDER BY Id";
2745 $resql =
$db->query($sql);
2747 $num =
$db->num_rows($resql);
2750 $row =
$db->fetch_row($resql);
2751 $propalRefAndSocName = $row[1] .
" - " . $row[2];
2752 $liste_propal[$row[0]] = $propalRefAndSocName;
2755 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2761 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2762 print
'<td valign="top" colspan="2">' . $langs->trans(
"CreateEmptyPropal") .
'</td></tr>';
2769 $langs->load(
"bills");
2771 print $form->buttonsSaveCancel(
"CreateDraft");
2777 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2780 $title = $langs->trans(
'ProductsAndServices');
2783 print
'<div class="div-table-responsive-no-min">';
2784 print
'<table class="noborder centpercent">';
2786 $objectsrc->printOriginLinesList();
2803 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
$object->picto, 0,
'',
'', 0,
'', 1);
2808 if ($action ==
'clone') {
2810 $filter =
'(s.client:IN:1,2,3)';
2811 $formquestion = array(
2814 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2815 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2816 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2819 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2822 $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);
2826 if ($action ==
'add_title_line') {
2827 $langs->load(
'subtotals');
2829 $depth_array =
$object->getPossibleLevels($langs);
2831 } elseif ($action ==
'add_subtotal_line') {
2832 $langs->load(
'subtotals');
2834 $titles =
$object->getPossibleTitles();
2838 if ($action ==
'closeas') {
2840 $formquestion = array();
2842 $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)));
2844 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2846 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2851 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2853 if (!empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2854 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2858 $eligibleForDepositGeneration =
true;
2860 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2861 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2862 '@phan-var-force Facture $invoice';
2865 $eligibleForDepositGeneration =
false;
2871 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2872 foreach (
$object->linkedObjects[
'commande'] as $order) {
2873 $order->fetchObjectLinked();
2875 if (array_key_exists(
'facture', $order->linkedObjects)) {
2876 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2877 '@phan-var-force Facture $invoice';
2880 $eligibleForDepositGeneration =
false;
2889 if ($eligibleForDepositGeneration) {
2890 $formquestion[] = array(
2891 'type' =>
'checkbox',
2892 'tdclass' =>
'showonlyifsigned',
2893 'name' =>
'generate_deposit',
2894 'morecss' =>
'margintoponly marginbottomonly',
2895 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2898 $formquestion[] = array(
2900 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2902 'label' => $langs->trans(
'DateInvoice'),
2908 $formquestion[] = array(
2910 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2911 'name' =>
'date_pointoftax',
2912 'label' => $langs->trans(
'DatePointOfTax'),
2918 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2920 $formquestion[] = array(
2922 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2923 'name' =>
'cond_reglement_id',
2924 'label' => $langs->trans(
'PaymentTerm'),
2925 'value' => $paymentTermsSelect
2928 $formquestion[] = array(
2929 'type' =>
'checkbox',
2930 'tdclass' =>
'showonlyifgeneratedeposit',
2931 'name' =>
'validate_generated_deposit',
2932 'morecss' =>
'margintoponly marginbottomonly',
2933 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2936 $formquestion[] = array(
2937 'type' =>
'onecolumn',
2940 let signedValue = ' . $object::STATUS_SIGNED .
';
2942 $(document).ready(function() {
2943 $("[name=generate_deposit]").change(function () {
2944 let $self = $(this);
2945 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2947 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2956 $("#statut").change(function() {
2957 let $target = $(".showonlyifsigned").parent(".tagtr");
2959 if ($(this).val() == signedValue) {
2965 $("[name=generate_deposit]").trigger("change");
2970 $("#statut").trigger("change");
2980 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2982 $formquestion = array_merge($formquestion, array(
2983 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid, $object)),
2988 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2990 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2992 } elseif ($action ==
'cancel') {
2994 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2995 } elseif ($action ==
'delete') {
2997 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2998 } elseif ($action ==
'reopen') {
3000 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
3001 } elseif ($action ==
'ask_deleteline') {
3003 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
3004 } elseif ($action ==
'ask_subtotal_deleteline') {
3006 $langs->load(
"subtotals");
3007 $title =
"DeleteSubtotalLine";
3008 $question =
"ConfirmDeleteSubtotalLine";
3009 if (
GETPOST(
'type') ==
'title') {
3010 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
3011 $title =
"DeleteTitleLine";
3012 $question =
"ConfirmDeleteTitleLine";
3014 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
3015 } elseif ($action ==
'validate') {
3020 $ref = substr(
$object->ref, 1, 4);
3021 if ($ref ==
'PROV' || $ref ==
'') {
3022 $numref =
$object->getNextNumRef($soc);
3023 if (empty($numref)) {
3031 $text = $langs->trans(
'ConfirmValidateProp', $numref);
3033 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
3036 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid, $object);
3041 foreach (
$object->lines as $line) {
3042 $res = $line->fetch_product();
3044 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
3050 if ($nbMandated > 0) {
3052 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
3055 $text .=
'<div><span class="clearboth nowraponall warning">' .
img_warning() . $langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate") .
'</span></div>';
3060 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
3065 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
3066 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
3067 if (empty($reshook)) {
3068 $formconfirm .= $hookmanager->resPrint;
3069 } elseif ($reshook > 0) {
3070 $formconfirm = $hookmanager->resPrint;
3079 $linkback =
'<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
3081 $morehtmlref =
'<div class="refidno">';
3083 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client, $object, $usercancreate,
'string',
'', 0, 1);
3084 $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);
3086 $morehtmlref .=
'<br>' . $soc->getNomUrl(1,
'customer');
3088 $morehtmlref .=
' (<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?socid=' . ((int) $soc->id) .
'">' . $langs->trans(
"OtherProposals") .
'</a>)';
3092 $langs->load(
"projects");
3093 $morehtmlref .=
'<br>';
3094 if ($usercancreate) {
3095 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
3096 if ($action !=
'classify') {
3097 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
3099 $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');
3101 if (!empty(
$object->fk_project)) {
3103 $proj->fetch(
$object->fk_project);
3104 $morehtmlref .= $proj->getNomUrl(1);
3106 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
3111 $morehtmlref .=
'</div>';
3114 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
3117 $parameters = array();
3119 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters, $object, $action);
3120 if (empty($reshook)) {
3121 print
'<div class="fichecenter">';
3122 print
'<div class="fichehalfleft">';
3123 print
'<div class="underbanner clearboth"></div>';
3125 print
'<table class="border tableforfield centpercent">';
3129 $filterabsolutediscount =
"fk_facture_source IS NULL";
3130 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3132 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3133 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3136 print
'<tr><td class="titlefieldmax45">' . $langs->trans(
'Discounts') .
'</td><td>';
3138 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3139 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3140 $absolute_discount =
price2num($absolute_discount,
'MT');
3141 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3147 $backtopage = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id;
3148 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
3164 print $form->editfieldkey(
"DatePropal",
'date',
'', $object, (
int) $editenable);
3165 print
'</td><td class="valuefield">';
3166 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3167 print
'<form name="editdate" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3168 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3169 print
'<input type="hidden" name="action" value="setdate">';
3170 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3171 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3172 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3186 print
'<table class="nobordernopadding centpercent"><tr><td>';
3187 print $langs->trans(
'DateEndPropal');
3189 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3190 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>';
3192 print
'</tr></table>';
3193 print
'</td><td class="valuefield">';
3194 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3195 print
'<form name="editecheance" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3196 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3197 print
'<input type="hidden" name="action" value="setecheance">';
3198 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3199 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3200 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3203 if (!empty(
$object->fin_validite)) {
3217 print
'<table class="nobordernopadding centpercent"><tr><td>';
3218 print $langs->trans(
'PaymentConditionsShort');
3220 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3221 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>';
3223 print
'</tr></table>';
3224 print
'</td><td class="valuefield">';
3225 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3226 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3228 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3234 print
'<tr class="field_mode_reglement_id">';
3236 print
'<table class="nobordernopadding centpercent"><tr><td>';
3237 print $langs->trans(
'PaymentMode');
3239 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3240 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>';
3242 print
'</tr></table>';
3243 print
'</td><td class="valuefieldcreate">';
3244 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3245 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3247 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'none');
3252 print
'<tr class="fielddeliverydelay"><td>';
3253 print
'<table class="nobordernopadding centpercent"><tr><td>';
3255 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod') .
' (' . $langs->trans(
'AfterOrder') .
')');
3257 print $langs->trans(
'AvailabilityPeriod');
3260 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3261 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>';
3263 print
'</tr></table>';
3264 print
'</td><td class="valuefield">';
3265 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3266 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'availability_id', $langs->trans(
"Delay"));
3268 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'none', 1);
3276 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3277 print
'</td><td class="valuefieldedit">';
3278 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, $usercancreate && $caneditfield,
'datepicker');
3285 print
'<table class="nobordernopadding centpercent"><tr><td>';
3286 print $langs->trans(
'SendingMethod');
3288 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3289 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>';
3291 print
'</tr></table>';
3292 print
'</td><td class="valuefield">';
3293 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3294 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3296 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'none');
3304 $langs->load(
'stocks');
3305 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
3307 print
'<tr class="field_warehouse_id"><td>';
3308 $editenable = $usercancreate;
3309 print $form->editfieldkey(
"Warehouse",
'warehouse',
'', $object, $editenable);
3310 print
'</td><td class="valuefieldcreate">';
3311 if ($action ==
'editwarehouse') {
3312 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3314 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'none');
3322 print
'<table class="nobordernopadding centpercent"><tr><td>';
3323 print $langs->trans(
'Source');
3325 if ($action !=
'editdemandreason' && $usercancreate) {
3326 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>';
3328 print
'</tr></table>';
3329 print
'</td><td class="valuefield">';
3330 if ($action ==
'editdemandreason' && $usercancreate) {
3331 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3333 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'none');
3338 if ($soc->outstanding_limit) {
3341 print $langs->trans(
'OutstandingBill');
3342 print
'</td><td class="valuefield">';
3343 $arrayoutstandingbills = $soc->getOutstandingBills();
3344 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
3345 print
price($arrayoutstandingbills[
'opened']) .
' / ';
3346 print
price($soc->outstanding_limit, 0, $langs, 1, -1, -1,
$conf->currency);
3354 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3355 print $langs->trans(
'BankAccount');
3357 if ($action !=
'editbankaccount' && $usercancreate) {
3358 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>';
3360 print
'</tr></table>';
3361 print
'</td><td class="valuefield">';
3362 if ($action ==
'editbankaccount') {
3363 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3365 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'none');
3372 $tmparray =
$object->getTotalWeightVolume();
3373 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3374 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3376 print
'<tr><td>' . $langs->trans(
"CalculatedWeight") .
'</td>';
3377 print
'<td class="valuefield">';
3382 print
'<tr><td>' . $langs->trans(
"CalculatedVolume") .
'</td>';
3383 print
'<td class="valuefield">';
3392 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3393 print $langs->trans(
'IncotermLabel');
3394 print
'<td><td class="right">';
3395 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3396 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' .
img_edit() .
'</a>';
3400 print
'</td></tr></table>';
3402 print
'<td class="valuefield">';
3403 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3404 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3406 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3414 print
'<table class="nobordernopadding centpercent"><tr><td>';
3415 print $langs->trans(
"Categories");
3416 print
'<td><td class="right">';
3417 if ($usercancreate) {
3418 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=edittags&token='.
newToken().
'">'.
img_edit().
'</a>';
3422 print
'</td></tr></table>';
3425 if ($action ==
'edittags') {
3426 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'">';
3427 print
'<input type="hidden" name="action" value="settags">';
3428 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3429 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
3430 print
'<input type="submit" class="button valignmiddle smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
3433 print $form->showCategories(
$object->id, Categorie::TYPE_PROPOSAL, 1);
3439 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3444 print
'<div class="fichehalfright">';
3445 print
'<div class="underbanner clearboth"></div>';
3447 print
'<table class="border tableforfield centpercent">';
3449 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_currency_amount.tpl.php';
3452 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3453 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3455 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3460 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3461 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3463 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3467 if (
$mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3469 print
'<td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td>';
3470 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3474 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3479 if (
$mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3481 print
'<td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td>';
3482 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3486 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3492 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3493 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3495 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3503 $formmargin->displayMarginInfos($object);
3509 print
'<div class="clearboth"></div><br>';
3512 $blocname =
'contacts';
3513 $title = $langs->trans(
'ContactsAddresses');
3514 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3518 $blocname =
'notes';
3519 $title = $langs->trans(
'Notes');
3520 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3528 $result =
$object->getLinesArray();
3532 global $inputalsopricewithtax;
3533 $inputalsopricewithtax = 1;
3535 print
' <form name="addproduct" id="addproduct" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="POST">
3536 <input type="hidden" name="token" value="' .
newToken() .
'">
3537 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline') .
'">
3538 <input type="hidden" name="mode" value="">
3539 <input type="hidden" name="page_y" value="">
3540 <input type="hidden" name="backtopage" value="' . $backtopage .
'">
3541 <input type="hidden" name="id" value="' .
$object->id .
'">
3546 include DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_ajaxrow.tpl.php';
3548 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3552 print
'<div class="div-table-responsive-no-min">';
3554 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3563 if ($action !=
'editline') {
3564 $parameters = array();
3565 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3569 if (empty($reshook)) {
3573 $parameters = array();
3574 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters, $object, $action);
3593 if ($action !=
'presend') {
3594 $numlines = count(
$object->lines);
3595 print
'<div class="tabsAction">';
3597 $parameters = array();
3598 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3600 if (empty($reshook)) {
3601 if ($action !=
'editline') {
3605 $langs->load(
'subtotals');
3607 $url_button = array();
3609 $url_button[] = array(
3610 'lang' =>
'subtotals',
3612 'perm' => (
bool) $usercancreate,
3613 'label' => $langs->trans(
'AddTitleLine'),
3614 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_title_line&token=' .
newToken()
3617 $url_button[] = array(
3618 'lang' =>
'subtotals',
3620 'perm' => (
bool) $usercancreate,
3621 'label' => $langs->trans(
'AddSubtotalLine'),
3622 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_subtotal_line&token=' .
newToken()
3625 print
dolGetButtonAction(
'', $langs->trans(
'SubTotal'),
'default', $url_button,
'',
true);
3632 if ($usercanvalidate) {
3633 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>';
3635 print
'<a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
'Validate') .
'</a>';
3645 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=modif&token=' .
newToken() .
'">' . $langs->trans(
'Modify') .
'</a>';
3650 if ($usercanreopen) {
3651 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=reopen&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen') .
'"';
3652 print
'>' . $langs->trans(
'ReOpen') .
'</a>';
3654 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ReOpen") .
'</a>';
3659 if (empty($user->socid)) {
3661 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'', $usercansend);
3665 $arrayforbutaction = array();
3668 $arrayforbutaction[] = array(
3671 'perm' => $usercancreateorder,
3672 'label' =>
'AddOrder',
3673 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3683 $arrayforbutaction[] = array(
3686 'perm' => $usercancreatepurchaseorder,
3687 'label' =>
'AddPurchaseOrder',
3688 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3698 $arrayforbutaction[] = array(
3699 'lang' =>
'interventions',
3701 'perm' => $usercancreateintervention,
3702 'label' =>
'AddIntervention',
3703 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3713 $arrayforbutaction[] = array(
3714 'lang' =>
'contracts',
3716 'perm' => $usercancreatecontract,
3717 'label' =>
'AddContract',
3718 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3730 $arrayforbutaction[] = [
3731 'lang' =>
'invoice',
3733 'perm' => $usercancreateinvoice,
3734 'label' =>
'CreateBill',
3735 'url' =>
'/compta/facture/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((int)
$object->id) .
'&socid=' . ((int)
$object->socid),
3742 $actionButtonsParameters = [
3743 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3744 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3747 if ($numlines > 0) {
3748 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3750 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3754 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3755 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3756 if ($usercanclose) {
3757 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=classifybilled&token=' .
newToken() .
'&socid=' .
$object->socid .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3759 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3767 if ($usercanclose) {
3768 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3769 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3771 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'"';
3772 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3778 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token=' .
newToken() .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3779 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3785 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=cancel&token=' .
newToken() .
'">' . $langs->trans(
"CancelPropal") .
'</a>';
3789 if ($usercancreate) {
3790 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>';
3794 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' .
newToken(),
'delete', $usercandelete);
3802 if (
GETPOST(
'modelselected')) {
3803 $action =
'presend';
3806 if ($action !=
'presend') {
3807 print
'<div class="fichecenter"><div class="fichehalfleft">';
3808 print
'<a name="builddoc"></a>';
3814 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3815 $genallowed = $usercanread;
3816 $delallowed = $usercancreate;
3817 $tooltipAfterComboOfModels =
'';
3819 $tooltipAfterComboOfModels = $langs->trans(
"AccordingToYourSetupTheFileWillBeConcatenated",
getDolGlobalString(
'MAIN_INFO_PROPAL_TERMSOFSALE'));
3822 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);
3825 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'propal'), 1);
3826 $linktoelem = $tmparray[
'linktoelem'];
3827 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3828 print $htmltoenteralink;
3830 $compatibleImportElementsList =
false;
3832 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3834 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, $compatibleImportElementsList);
3840 print
'<br><!-- Link to sign -->';
3841 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3842 print showOnlineSignatureUrl(
'proposal',
$object->ref, $object) .
'<br>';
3845 print
'</div><div class="fichehalfright">';
3849 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/comm/propal/messaging.php?id=' .
$object->id);
3850 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT .
'/comm/propal/agenda.php?id=' .
$object->id);
3853 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3855 $somethingshown = $formactions->showactions($object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3857 print
'</div></div>';
3861 $modelmail =
'propal_send';
3862 $defaulttopic =
'SendPropalRef';
3864 $trackid =
'pro' .
$object->id;
3866 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.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
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.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
getWarningDelay($module, $parmlevel1, $parmlevel2='')
Return a warning delay You can use it like this: if (getWarningDelay('module', 'paramlevel1')) It rep...
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
getDictionaryValue($tablename, $field, $id, $checkentity=false, $rowidfield='rowid')
Return the value of a filed into a dictionary for the record $id.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
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.