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 && !empty($lines[$i]->extraparams)) {
734 $newline->id = $result;
735 $newline->extraparams = $lines[$i]->extraparams;
736 $newline->setExtraParameters();
740 if ($result > 0 && $lines[$i]->product_type == 9) {
741 $fk_parent_line = $result;
746 $parameters = array(
'objFrom' => $srcobject);
747 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
768 if (
GETPOST(
'contactid') > 0) {
777 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
780 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
784 $categories =
GETPOST(
'categories',
'array');
785 if (method_exists($object,
'setCategories')) {
786 $object->setCategories($categories);
795 $outputlangs = $langs;
798 $newlang =
GETPOST(
'lang_id',
'aZ09');
801 $newlang =
$object->thirdparty->default_lang;
803 if (!empty($newlang)) {
805 $outputlangs->setDefaultLang($newlang);
810 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
816 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
829 } elseif ($action ==
'classifybilled' && $usercanclose) {
833 $result =
$object->classifyBilled($user, 0,
'');
844 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
847 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
849 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
850 $locationTarget =
'';
864 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
869 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
872 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
873 && !empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
875 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
878 $forceFields = array();
888 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
899 $ret = $deposit->fetch($deposit->id);
900 $outputlangs = $langs;
904 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
905 $outputlangs->load(
'products');
908 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
915 if ($locationTarget) {
916 header(
'Location: ' . $locationTarget);
928 } elseif ($action ==
'confirm_reopen' && $usercanreopen && !
GETPOST(
'cancel',
'alpha')) {
935 $result =
$object->reopen($user, $newstatus);
952 $fromElement =
GETPOST(
'fromelement');
953 $fromElementid =
GETPOST(
'fromelementid');
954 $importLines =
GETPOST(
'line_checkbox');
956 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && preg_match(
'/^[a-zA-Z]+$/', $fromElement) && !empty($fromElementid)) {
957 if ($fromElement ==
'commande') {
958 dol_include_once(
'/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
959 $lineClassName =
'OrderLine';
960 } elseif ($fromElement ==
'propal') {
961 dol_include_once(
'/comm/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
962 $lineClassName =
'PropaleLigne';
963 } elseif ($fromElement ==
'facture') {
964 dol_include_once(
'/compta/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
965 $lineClassName =
'FactureLigne';
967 $lineClassName =
null;
969 $nextRang = count(
$object->lines) + 1;
972 foreach ($importLines as $lineId) {
973 $lineId = intval($lineId);
974 $originLine =
new $lineClassName(
$db);
975 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
976 $originLine->fetch_optionals();
977 $desc = $originLine->desc;
978 $pu_ht = $originLine->subprice;
979 $qty = $originLine->qty;
980 $txtva = $originLine->tva_tx;
981 $txlocaltax1 = $originLine->localtax1_tx;
982 $txlocaltax2 = $originLine->localtax2_tx;
983 $fk_product = $originLine->fk_product;
984 $remise_percent = $originLine->remise_percent;
986 $date_end = $originLine->date_end;
987 $fk_code_ventilation = 0;
988 $info_bits = $originLine->info_bits;
989 $fk_remise_except = $originLine->fk_remise_except;
990 $price_base_type =
'HT';
992 $type = $originLine->product_type;
994 $special_code = $originLine->special_code;
995 $origin = $originLine->element;
996 $origin_id = $originLine->id;
998 $fk_fournprice = $originLine->fk_fournprice;
999 $pa_ht = $originLine->pa_ht;
1000 $label = $originLine->label;
1001 $array_options = $originLine->array_options;
1002 $situation_percent = 100;
1004 $fk_unit = $originLine->fk_unit;
1005 $pu_ht_devise = $originLine->multicurrency_subprice;
1007 $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);
1023 } elseif ($action ==
'addline' &&
GETPOST(
'updateallvatlinesblock',
'alpha') &&
GETPOST(
'vatforblocklines',
'alpha') !==
'' && $usercancreate) {
1024 $tx_tva =
GETPOST(
'vatforblocklines') ?
GETPOST(
'vatforblocklines') : 0;
1025 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'tva', $tx_tva);
1029 } elseif ($action ==
'addline' &&
GETPOST(
'updatealldiscountlinesblock',
'alpha') &&
GETPOST(
'discountforblocklines',
'alpha') !==
'' && $usercancreate) {
1030 $discount =
GETPOST(
'discountforblocklines') ?
GETPOST(
'discountforblocklines') : 0;
1031 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'discount', $discount);
1037 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1040 $actiontypecode =
'AC_EMAIL';
1041 $triggersendname =
'PROPAL_SENTBYMAIL';
1042 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
1043 $trackid =
'pro' .
$object->id;
1044 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1048 if ($action ==
'modif' && $usercancreate) {
1049 $result =
$object->setDraft($user);
1056 $outputlangs = $langs;
1059 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1060 $outputlangs->setDefaultLang($newlang);
1066 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1068 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
1077 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
1081 foreach (
$object->lines as $key => $line) {
1082 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1085 if ($line->product_type == 1) {
1087 $line_price_base_type = $line->wasEnteredIncludingTax() ?
'TTC' :
'HT';
1088 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1089 $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);
1093 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
1095 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
1096 $vat_rate = str_replace(
'*',
'', $vat_rate);
1099 foreach (
$object->lines as $key => $line) {
1100 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1104 $line_price_base_type = $line->wasEnteredIncludingTax() ?
'TTC' :
'HT';
1105 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1106 $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);
1109 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
1111 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
1112 $remise_percent = str_replace(
'*',
'', $remise_percent);
1113 foreach (
$object->lines as $key => $line) {
1114 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1117 $tvatx = $line->tva_tx;
1118 if (!empty($line->vat_src_code)) {
1119 $tvatx .=
' (' . $line->vat_src_code .
')';
1122 $line_price_base_type = $line->wasEnteredIncludingTax() ?
'TTC' :
'HT';
1123 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1124 $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);
1127 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'' && $usercancreate) {
1129 $margin_rate = (
GETPOST(
'marginforalllines',
'alpha') ?
GETPOST(
'marginforalllines',
'alpha') : 0);
1130 foreach (
$object->lines as $key => $line) {
1131 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1134 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
1136 $prod->fetch($line->fk_product);
1137 if (
$prod->price_min > $subprice) {
1138 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1139 $price_price_min =
price(
$prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1140 setEventMessages(
$prod->ref .
' - ' .
$prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1143 if ($line->subprice <> 0) {
1144 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1146 $multicurrency_subprice = 0;
1149 $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);
1166 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
1169 $langs->load(
'subtotals');
1171 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
1172 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
1174 $subtotal_options = array();
1176 foreach (Propal::$TITLE_OPTIONS as $option) {
1177 $value =
GETPOST($option,
'alphanohtml');
1179 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1184 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1195 $outputlangs = $langs;
1196 $newlang =
GETPOST(
'lang_id',
'alpha');
1198 $newlang =
$object->thirdparty->default_lang;
1200 if (!empty($newlang)) {
1202 $outputlangs->setDefaultLang($newlang);
1205 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1210 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1212 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
1215 $langs->load(
'subtotals');
1217 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
1218 foreach (
$object->lines as $line) {
1219 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
1220 $desc = $line->desc;
1221 $depth = -$line->qty;
1225 $subtotal_options = array();
1227 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1228 $value =
GETPOST($option,
'alphanohtml');
1230 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1235 if (isset($desc) && isset($depth)) {
1236 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1239 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
1248 $outputlangs = $langs;
1249 $newlang =
GETPOST(
'lang_id',
'alpha');
1251 $newlang =
$object->thirdparty->default_lang;
1253 if (!empty($newlang)) {
1255 $outputlangs->setDefaultLang($newlang);
1258 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1263 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1265 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && !
GETPOST(
'markforalllines',
'alpha') && $usercancreate) {
1272 $price_ht_devise =
'';
1274 $price_ttc_devise =
'';
1278 if (
GETPOST(
'price_ht') !==
'') {
1281 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1284 if (
GETPOST(
'price_ttc') !==
'') {
1287 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1288 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1291 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1292 if ($prod_entry_mode ==
'free') {
1298 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1303 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1307 if (empty($remise_percent)) {
1308 $remise_percent = 0;
1312 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1313 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1315 if (is_array($extralabelsline)) {
1317 foreach ($extralabelsline as $key => $value) {
1318 unset($_POST[
"options_" . $key]);
1322 $price_to_test_sign = ($price_ht ? $price_ht : $price_ttc);
1324 if ((empty($idprod) || $idprod < 0) && ($price_to_test_sign < 0) && ($qty < 0)) {
1325 $langs->load(
"errors");
1326 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1329 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1330 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1334 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1335 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1339 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1342 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1343 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1347 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1348 if ($combinations =
GETPOST(
'combinations',
'array:alphanohtml')) {
1352 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1353 $idprod = $res->fk_product_child;
1355 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1361 if (!$error && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1369 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1378 if (!empty($idprod) && $idprod > 0) {
1380 $prod->fetch($idprod);
1392 $pu_ht =
$prod->price;
1393 $pu_ttc =
$prod->price_ttc;
1394 $price_min =
$prod->price_min;
1395 $price_min_ttc =
$prod->price_min_ttc;
1396 $price_base_type =
$prod->price_base_type;
1400 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1402 $filter = array(
't.fk_product' => (
string)
$prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1405 $pricebycustomerexist =
false;
1406 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1409 if (count($prodcustprice->lines) > 0) {
1410 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1411 foreach ($prodcustprice->lines as $k => $custprice_line) {
1412 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1413 $pricebycustomerexist =
true;
1414 $pu_ht =
price($custprice_line->price);
1415 $pu_ttc =
price($custprice_line->price_ttc);
1416 $price_min =
price($custprice_line->price_min);
1417 $price_min_ttc =
price($custprice_line->price_min_ttc);
1418 $price_base_type = $custprice_line->price_base_type;
1435 if (!$pricebycustomerexist && !empty(
$object->thirdparty->price_level)) {
1436 $pu_ht =
$prod->multiprices[
$object->thirdparty->price_level];
1437 $pu_ttc =
$prod->multiprices_ttc[
$object->thirdparty->price_level];
1438 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
1439 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1440 $price_base_type =
$prod->multiprices_base_type[
$object->thirdparty->price_level];
1442 if (isset(
$prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1443 $tva_tx =
$prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1445 if (isset(
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1446 $tva_npr =
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1451 $pu_ht =
$prod->multiprices[
$object->thirdparty->price_level];
1452 $pu_ttc =
$prod->multiprices_ttc[
$object->thirdparty->price_level];
1453 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
1454 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1455 $price_base_type =
$prod->multiprices_base_type[
$object->thirdparty->price_level];
1457 if (isset(
$prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1458 $tva_tx =
$prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1460 if (isset(
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1461 $tva_npr =
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1466 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1470 $filter = array(
't.fk_product' => (
string)
$prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1472 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1475 if (count($prodcustprice->lines) > 0) {
1476 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1477 foreach ($prodcustprice->lines as $k => $custprice_line) {
1478 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1479 $pu_ht =
price($custprice_line->price);
1480 $pu_ttc =
price($custprice_line->price_ttc);
1481 $price_min =
price($custprice_line->price_min);
1482 $price_min_ttc =
price($custprice_line->price_min_ttc);
1483 $price_base_type = $custprice_line->price_base_type;
1501 if (
$prod->prices_by_qty[0]) {
1506 foreach (
$prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1507 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1511 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1512 $pu_ht = $priceforthequantityarray[
'unitprice'];
1514 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1522 if (!empty(
$object->thirdparty->price_level)) {
1524 $pu_ht =
$prod->multiprices[
$object->thirdparty->price_level];
1525 $pu_ttc =
$prod->multiprices_ttc[
$object->thirdparty->price_level];
1526 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
1527 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1528 $price_base_type = (empty(
$prod->multiprices_base_type[
$object->thirdparty->price_level]) ?
'HT' :
$prod->multiprices_base_type[
$object->thirdparty->price_level]);
1530 if (isset(
$prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1531 $tva_tx =
$prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1533 if (isset(
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1534 $tva_npr =
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1538 if (!empty(
$object->thirdparty->price_level) && !empty(
$prod->prices_by_qty[
$object->thirdparty->price_level])) {
1543 foreach (
$prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1544 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1548 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1549 $pu_ht = $priceforthequantityarray[
'unitprice'];
1551 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1559 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1560 $tmpprodvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string)
$prod->tva_tx));
1565 if (!empty($price_ht) || (
string) $price_ht ===
'0') {
1566 $pu_ht = (float)
price2num($price_ht,
'MU');
1567 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1568 $price_base_type =
'HT';
1569 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1570 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1571 $pu_ttc_devise = (float)
price2num((
float) $pu_ht_devise * (1 + ((float) $tmpvat / 100)),
'MU');
1574 $price_base_type =
'HT';
1575 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1576 $pu_ttc = (float)
price2num($price_ttc,
'MU');
1577 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1578 $price_base_type =
'TTC';
1579 } elseif (!empty($price_ttc_devise) || (
string) $price_ttc_devise ===
'0') {
1580 $pu_ttc_devise = (float)
price2num($price_ttc_devise,
'MU');
1581 $pu_ht_devise = (float)
price2num((
float) $pu_ttc_devise / (1 + ((float) $tmpvat / 100)),
'MU');
1584 $price_base_type =
'TTC';
1585 } elseif ($tmpvat != $tmpprodvat) {
1587 if ($price_base_type !=
'HT') {
1588 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1590 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1598 $outputlangs = $langs;
1600 if (
GETPOST(
'lang_id',
'aZ09')) {
1601 $newlang =
GETPOST(
'lang_id',
'aZ09');
1603 if (empty($newlang)) {
1604 $newlang =
$object->thirdparty->default_lang;
1606 if (!empty($newlang)) {
1608 $outputlangs->setDefaultLang($newlang);
1611 $desc = (!empty(
$prod->multilangs[$outputlangs->defaultlang][
"description"])) ?
$prod->multilangs[$outputlangs->defaultlang][
"description"] :
$prod->
description;
1613 $desc =
$prod->description;
1629 $outputlangs = $langs;
1631 if (
GETPOST(
'lang_id',
'alpha')) {
1632 $newlang =
GETPOST(
'lang_id',
'alpha');
1634 if (empty($newlang)) {
1635 $newlang =
$object->thirdparty->default_lang;
1637 if (!empty($newlang)) {
1639 $outputlangs->setDefaultLang($newlang);
1640 $outputlangs->load(
'products');
1642 if (!empty(
$prod->customcode)) {
1643 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode") .
': ' .
$prod->customcode;
1645 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1648 if (!empty(
$prod->country_code)) {
1649 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry(
$prod->country_code,
'',
$db, $outputlangs, 0);
1652 if (!empty(
$prod->customcode)) {
1653 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode") .
': ' .
$prod->customcode;
1655 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1658 if (!empty(
$prod->country_code)) {
1659 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry(
$prod->country_code,
'',
$db, $langs, 0);
1666 $type =
$prod->type;
1667 $fk_unit =
$prod->fk_unit;
1671 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1672 $tva_tx = str_replace(
'*',
'', $tva_tx);
1673 if (empty($tva_tx)) {
1676 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1679 $fk_unit =
GETPOST(
'units',
'alpha');
1680 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1681 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1683 if ($pu_ttc && !$pu_ht) {
1684 $price_base_type =
'TTC';
1698 $fournprice = (int) (
GETPOST(
'fournprice' . $predef) ?
GETPOST(
'fournprice' . $predef) :
'');
1699 $buyingprice =
price2num((
GETPOST(
'buying_price' . $predef) !=
'' ?
GETPOST(
'buying_price' . $predef) :
''),
'', 2);
1705 $pu_equivalent = $pu_ht;
1706 $pu_equivalent_ttc = $pu_ttc;
1707 $currency_tx =
$object->multicurrency_tx;
1711 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1712 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1714 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1715 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1735 if ($usermustrespectpricemin) {
1736 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1737 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1740 } 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') {
1741 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1749 $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);
1761 $outputlangs = $langs;
1762 $newlang =
GETPOST(
'lang_id',
'alpha');
1764 $newlang =
$object->thirdparty->default_lang;
1766 if (!empty($newlang)) {
1768 $outputlangs->setDefaultLang($newlang);
1770 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1773 unset($_POST[
'prod_entry_mode']);
1775 unset($_POST[
'qty']);
1776 unset($_POST[
'type']);
1777 unset($_POST[
'remise_percent']);
1778 unset($_POST[
'price_ht']);
1779 unset($_POST[
'multicurrency_price_ht']);
1780 unset($_POST[
'price_ttc']);
1781 unset($_POST[
'tva_tx']);
1782 unset($_POST[
'product_ref']);
1783 unset($_POST[
'product_label']);
1784 unset($_POST[
'product_desc']);
1785 unset($_POST[
'fournprice']);
1786 unset($_POST[
'buying_price']);
1787 unset($_POST[
'np_marginRate']);
1788 unset($_POST[
'np_markRate']);
1789 unset($_POST[
'dp_desc']);
1790 unset($_POST[
'idprod']);
1791 unset($_POST[
'units']);
1793 unset($_POST[
'date_starthour']);
1794 unset($_POST[
'date_startmin']);
1795 unset($_POST[
'date_startsec']);
1796 unset($_POST[
'date_startday']);
1797 unset($_POST[
'date_startmonth']);
1798 unset($_POST[
'date_startyear']);
1799 unset($_POST[
'date_endhour']);
1800 unset($_POST[
'date_endmin']);
1801 unset($_POST[
'date_endsec']);
1802 unset($_POST[
'date_endday']);
1803 unset($_POST[
'date_endmonth']);
1804 unset($_POST[
'date_endyear']);
1812 } elseif ($action ==
'addline' && $usercancreate && (
1813 (
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'') ||
1814 (
GETPOST(
'submitforallmark',
'alpha') &&
GETPOST(
'markforalllines',
'alpha') !==
'')
1818 $margin_rate =
GETPOSTISSET(
'marginforalllines') ?
GETPOST(
'marginforalllines',
'int') :
'';
1820 foreach (
$object->lines as &$line) {
1821 if ($line->subprice > 0) {
1822 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1825 $subprice_multicurrency = $line->subprice;
1826 if (is_numeric($margin_rate) && $margin_rate > 0) {
1827 $line->subprice = (float)
price2num((
float) $line->pa_ht * (1 + (float) $margin_rate / 100),
'MU');
1828 } elseif (is_numeric($mark_rate) && $mark_rate > 0) {
1829 $line->subprice = (float) ($line->pa_ht / (1 - ((
float) $mark_rate / 100)));
1831 $line->subprice = (float) $line->pa_ht;
1834 if ($line->fk_product > 0) {
1836 $res =
$prod->fetch($line->fk_product);
1838 if (
$prod->price_min > $line->subprice) {
1839 $price_subprice =
price($line->subprice, 0, $outlangs, 1, -1, -1,
'auto');
1840 $price_price_min =
price(
$prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1841 setEventMessages(
$prod->ref .
' - ' .
$prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1851 $multicurrency_subprice = (float) $line->subprice * $line->multicurrency_subprice / $subprice_multicurrency;
1853 $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);
1856 if (is_numeric($margin_rate) && empty($mark_rate)) {
1857 $line->marge_tx = $margin_rate;
1858 } elseif (is_numeric($mark_rate) && empty($margin_rate)) {
1859 $line->marque_tx = $mark_rate;
1861 $line->total_ht = $line->qty * (float) $line->subprice;
1862 $line->total_tva = $line->tva_tx * $line->qty * (float) $line->subprice;
1863 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $line->subprice;
1865 $line->multicurrency_total_ht = $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1866 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1867 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1869 $line->multicurrency_subprice = $multicurrency_subprice;
1875 } elseif ($action ==
'updatetitleline' &&
GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1878 $langs->load(
'subtotals');
1880 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1883 $subtotal_options = array();
1885 foreach (Propal::$TITLE_OPTIONS as $option) {
1886 $value =
GETPOST($option,
'alphanohtml');
1888 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1893 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1904 $outputlangs = $langs;
1905 $newlang =
GETPOST(
'lang_id',
'alpha');
1907 $newlang =
$object->thirdparty->default_lang;
1909 if (!empty($newlang)) {
1911 $outputlangs->setDefaultLang($newlang);
1914 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1919 } elseif ($action ==
'updatesubtotalline' &&
GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1922 $langs->load(
'subtotals');
1924 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1927 $subtotal_options = array();
1929 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1930 $value =
GETPOST($option,
'alphanohtml');
1932 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1937 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1945 $outputlangs = $langs;
1946 $newlang =
GETPOST(
'lang_id',
'alpha');
1948 $newlang =
$object->thirdparty->default_lang;
1950 if (!empty($newlang)) {
1952 $outputlangs->setDefaultLang($newlang);
1955 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1960 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1968 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1973 $vat_rate = (
GETPOST(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : 0);
1974 $vat_rate = str_replace(
'*',
'', $vat_rate);
1981 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
1991 if (empty($remise_percent)) {
1992 $remise_percent = 0;
1996 $pu_equivalent = $pu_ht;
1997 $pu_equivalent_ttc = $pu_ttc;
1999 $currency_tx =
$object->multicurrency_tx;
2003 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
2004 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
2006 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
2007 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
2022 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
2023 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
2025 if (is_array($extralabelsline)) {
2027 foreach ($extralabelsline as $key => $value) {
2028 unset($_POST[
"options_" . $key]);
2042 $price_base_type =
'HT';
2043 if (empty($pu_ht) && !empty($pu_ttc)) {
2045 $price_base_type =
'TTC';
2046 } elseif (!empty($pu_ht) && !empty($pu_ttc)) {
2047 foreach (
$object->lines as $line_obj) {
2049 if ($line_obj->wasEnteredIncludingTax()) {
2051 $price_base_type =
'TTC';
2060 if (!empty($productid)) {
2062 $res = $product->fetch($productid);
2064 $type = $product->type;
2068 $price_min = $product->price_min;
2070 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
2072 $price_min_ttc = $product->price_min_ttc;
2074 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
2081 if ($usermustrespectpricemin) {
2082 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
2083 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
2086 $action =
'editline';
2087 } 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') {
2088 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
2091 $action =
'editline';
2096 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2100 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
2108 if (!$user->hasRight(
'margins',
'creer')) {
2109 foreach (
$object->lines as &$line) {
2111 $fournprice = $line->fk_fournprice;
2112 $buyingprice = (
string) $line->pa_ht;
2120 $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);
2127 $outputlangs = $langs;
2130 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
2131 $outputlangs->setDefaultLang($newlang);
2137 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2140 unset($_POST[
'qty']);
2141 unset($_POST[
'type']);
2142 unset($_POST[
'productid']);
2143 unset($_POST[
'remise_percent']);
2144 unset($_POST[
'price_ht']);
2145 unset($_POST[
'multicurrency_price_ht']);
2146 unset($_POST[
'price_ttc']);
2147 unset($_POST[
'tva_tx']);
2148 unset($_POST[
'product_ref']);
2149 unset($_POST[
'product_label']);
2150 unset($_POST[
'product_desc']);
2151 unset($_POST[
'fournprice']);
2152 unset($_POST[
'buying_price']);
2154 unset($_POST[
'date_starthour']);
2155 unset($_POST[
'date_startmin']);
2156 unset($_POST[
'date_startsec']);
2157 unset($_POST[
'date_startday']);
2158 unset($_POST[
'date_startmonth']);
2159 unset($_POST[
'date_startyear']);
2160 unset($_POST[
'date_endhour']);
2161 unset($_POST[
'date_endmin']);
2162 unset($_POST[
'date_endsec']);
2163 unset($_POST[
'date_endday']);
2164 unset($_POST[
'date_endmonth']);
2165 unset($_POST[
'date_endyear']);
2172 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
2173 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
2175 } elseif ($action ==
'classin' && $usercancreate) {
2178 } elseif ($action ==
'setavailability' && $usercancreate) {
2181 } elseif ($action ==
'setdemandreason' && $usercancreate) {
2184 } elseif ($action ==
'setconditions' && $usercancreate) {
2187 } elseif ($action ==
'setmode' && $usercancreate) {
2190 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
2192 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
2193 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
2196 } elseif ($action ==
'setbankaccount' && $usercancreate) {
2199 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
2202 } elseif ($action ==
'setwarehouse' && $usercancreate) {
2205 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
2208 $attribute_name =
GETPOST(
'attribute',
'aZ09');
2211 $result = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
2217 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
2224 $action =
'edit_extras';
2229 if ($action ==
'addcontact' && $usercancreate) {
2234 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2238 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2241 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2242 $langs->load(
"errors");
2243 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
2248 } elseif ($action ==
'swapstatut' && $usercancreate) {
2250 if (
$object->fetch($id) > 0) {
2255 } elseif ($action ==
'deletecontact' && $usercancreate) {
2258 $result =
$object->delete_contact($lineid);
2261 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2271 $permissiontoadd = $usercancreate;
2272 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
2289$title =
$object->ref .
" - " . $langs->trans(
'Card');
2290if ($action ==
'create') {
2291 $title = $langs->trans(
"NewPropal");
2293$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
2300if ($action ==
'create') {
2307 $res = $soc->fetch($socid);
2310 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2311 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2312 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2318 if (!empty($origin) && !empty($originid)) {
2320 $element = $subelement = $origin;
2322 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2323 $element = $regs[1];
2324 $subelement = $regs[2];
2327 if ($element ==
'project') {
2328 $projectid = $originid;
2332 $project->fetch($projectid);
2333 if ($project->socid > 0) {
2335 $soc->fetch($project->socid);
2339 if ($element ==
'order' || $element ==
'commande') {
2340 $element = $subelement =
'commande';
2342 if ($element ==
'propal') {
2343 $element =
'comm/propal';
2344 $subelement =
'propal';
2346 if ($element ==
'contract') {
2347 $element = $subelement =
'contrat';
2349 if ($element ==
'shipping') {
2350 $element = $subelement =
'expedition';
2355 $classname = ucfirst($subelement);
2356 $objectsrc =
new $classname(
$db);
2357 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
2359 $objectsrc->fetch($originid);
2360 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2361 $objectsrc->fetch_lines();
2363 $objectsrc->fetch_thirdparty();
2365 $projectid = (int) $objectsrc->fk_project;
2366 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
2368 $soc = $objectsrc->thirdparty;
2370 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2371 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2372 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : -1));
2375 $objectsrc->fetch_optionals();
2376 $object->array_options = $objectsrc->array_options;
2379 if (!empty($objectsrc->multicurrency_code)) {
2380 $currency_code = $objectsrc->multicurrency_code;
2382 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2383 $currency_tx = $objectsrc->multicurrency_tx;
2391 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
2392 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
2393 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
2394 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
2395 $shipping_method_id = $soc->shipping_method_id;
2396 $warehouse_id = !empty($soc->fk_warehouse) ? $soc->fk_warehouse : $warehouse_id;
2397 $remise_percent = $soc->remise_percent;
2399 if (
isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
2400 $currency_code = $soc->multicurrency_code;
2405 if (!
GETPOST(
'changecompany')) {
2407 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2413 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2419 $shipping_method_id =
GETPOSTINT(
'shipping_method_id');
2423 if ($soc->fk_warehouse > 0) {
2424 $warehouse_id = $soc->fk_warehouse;
2431 $warehouse_id = $user->fk_warehouse;
2435 print
'<form name="addprop" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
2436 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2437 print
'<input type="hidden" name="action" value="add">';
2438 print
'<input type="hidden" name="changecompany" value="0">';
2439 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
2440 if ($origin !=
'project' && $originid) {
2441 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
2442 print
'<input type="hidden" name="originid" value="' . $originid .
'">';
2443 if ($origin ==
'contrat' && !empty($renewal)) {
2444 print
'<input type="hidden" name="renewal" value="' . $renewal .
'">';
2446 } elseif ($origin ==
'project' && !empty($projectid)) {
2447 print
'<input type="hidden" name="projectid" value="' . $projectid .
'">';
2453 $parameters = array();
2455 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters, $object, $action);
2456 if (empty($reshook)) {
2457 print
'<table class="border centpercent">';
2463 print
'<tr class="field_socid">';
2465 print
'<td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Customer') .
'</td>';
2466 $shipping_method_id = 0;
2469 print
'<td class="valuefieldcreate">';
2470 print $soc->getNomUrl(1,
'customer');
2471 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
2473 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2474 $shipping_method_id = $soc->shipping_method_id;
2477 print
'<td class="valuefieldcreate">';
2478 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2479 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2480 print $form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2484 $(document).ready(function() {
2485 $("#socid").change(function() {
2486 console.log("We have changed the company - Reload page");
2487 var socid = $(this).val();
2489 $("input[name=action]").val("create");
2490 $("input[name=changecompany]").val("1");
2491 $("form[name=addprop]").submit();
2496 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>';
2499 print
'</tr>' .
"\n";
2503 print
'<tr class="field_ref_client"><td class="titlefieldcreate">';
2504 print $form->textwithpicto($langs->trans(
'RefCustomer'), $langs->trans(
'RefOfOnCustomerSide', $langs->transnoentitiesnoconv(
"Proposal")));
2505 print
'</td><td class="valuefieldcreate">';
2506 print
'<input type="text" name="ref_client" value="' . (!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')) .
'"></td>';
2512 print
'<tr class="field_contactid"><td class="titlefieldcreate">' . $langs->trans(
"DefaultContact") .
'</td><td class="valuefieldcreate">';
2513 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2515 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2519 print
'<tr class="field_discount_info"><td class="titlefieldcreate">' . $langs->trans(
'Discounts') .
'</td><td class="valuefieldcreate">';
2521 $absolute_discount = $soc->getAvailableDiscounts();
2525 $backtopage = $_SERVER[
"PHP_SELF"] .
'?socid=' . $thirdparty->id .
'&action=' . $action .
'&origin=' . urlencode((
string) (
GETPOST(
'origin'))) .
'&originid=' . urlencode((
string) (
GETPOSTINT(
'originid')));
2526 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
2532 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Date') .
'</td><td class="valuefieldcreate">';
2533 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2534 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2538 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>';
2541 print
'<tr class="field_cond_reglement_id"><td class="nowrap">' . $langs->trans(
'PaymentConditionsShort') .
'</td><td>';
2542 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2544 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2548 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">' . $langs->trans(
'PaymentMode') .
'</td><td class="valuefieldcreate">';
2549 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2550 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2555 print
'<tr class="field_fk_account"><td class="titlefieldcreate">' . $langs->trans(
'BankAccount') .
'</td><td class="valuefieldcreate">';
2556 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"') . $form->select_comptes((
int) $fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2561 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">' . $langs->trans(
'Source') .
'</td><td class="valuefieldcreate">';
2562 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2563 $form->selectInputReason((
GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2568 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2569 $shipping_method_id = $soc->shipping_method_id;
2571 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">' . $langs->trans(
'SendingMethod') .
'</td><td class="valuefieldcreate">';
2572 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2573 $form->selectShippingMethod((
string) $shipping_method_id,
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2577 $formproduct =
null;
2580 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
2582 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">' . $langs->trans(
'Warehouse') .
'</td><td class="valuefieldcreate">';
2583 print
img_picto(
'',
'stock',
'class="pictofixedwidth"') . $formproduct->selectWarehouses((
int) $warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2588 print
'<tr class="field_availability_id"><td class="titlefieldcreate">' . $langs->trans(
'AvailabilityPeriod');
2590 print
' (' . $langs->trans(
'AfterOrder') .
')';
2592 print
'</td><td class="valuefieldcreate">';
2593 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2594 print $form->selectAvailabilityDelay((
GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx', 1);
2598 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">' . $langs->trans(
"DeliveryDate") .
'</td>';
2599 print
'<td class="valuefieldcreate">';
2600 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2602 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2603 $syear =
date(
"Y", $tmpdte);
2604 $smonth =
date(
"m", $tmpdte);
2605 $sday =
date(
"d", $tmpdte);
2606 print $form->selectDate($syear .
"-" . $smonth .
"-" . $sday,
'date_livraison', 0, 0, 0,
"addprop");
2608 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2609 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2614 if (
isModEnabled(
'project') && is_object($formproject)) {
2615 $langs->load(
"projects");
2616 print
'<tr class="field_projectid">';
2617 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2618 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');
2619 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>';
2626 print
'<tr class="field_incoterm_id">';
2627 print
'<td class="titlefieldcreate"><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1) .
'</label></td>';
2628 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2629 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2630 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2635 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td colspan="3">';
2636 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
2640 include_once DOL_DOCUMENT_ROOT .
'/core/modules/propale/modules_propale.php';
2642 if (is_array($list) && count($list) > 0) {
2643 print
'<tr class="field_model">';
2644 print
'<td class="titlefieldcreate">' . $langs->trans(
"DefaultModel") .
'</td>';
2645 print
'<td class="valuefieldcreate">';
2646 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2648 print $form->selectarray(
'model', $list, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2654 print
'<tr class="field_currency">';
2655 print
'<td class="titlefieldcreate">' . $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0) .
'</td>';
2656 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2657 print
img_picto(
'',
'currency',
'class="pictofixedwidth"') . $form->selectMultiCurrency(((
GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2662 print
'<tr class="field_note_public">';
2663 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePublic') .
'</td>';
2664 print
'<td class="valuefieldcreate">';
2665 $note_public =
GETPOST(
'note_public',
'restricthtml');
2666 if (!
GETPOSTISSET(
'note_public') && empty($note_public) && !empty($objectsrc)) {
2667 $note_public = $objectsrc->note_public;
2669 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2670 print $doleditor->Create(1);
2673 if (empty($user->socid)) {
2674 print
'<tr class="field_note_private">';
2675 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePrivate') .
'</td>';
2676 print
'<td class="valuefieldcreate">';
2677 $note_private =
GETPOST(
'note_private',
'restricthtml');
2678 if (!
GETPOSTISSET(
'note_private') && empty($note_private) && !empty($objectsrc)) {
2679 $note_private = $objectsrc->note_private;
2681 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2682 print $doleditor->Create(1);
2688 if (
getDolGlobalInt(
'THIRDPARTY_PROPAGATE_EXTRAFIELDS_TO_PROPAL') && $socid > 0) {
2689 $thirdpartytopropagateextrafieldsfrom = $soc;
2691 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_add.tpl.php';
2694 if (!empty($origin) && !empty($originid) && is_object($objectsrc) && !empty($classname)) {
2696 if ($origin ==
'contrat') {
2698 $objectsrc->update_price(1,
'auto', 1);
2701 print
"\n<!-- " . $classname .
" info -->";
2703 print
'<input type="hidden" name="amount" value="' . $objectsrc->total_ht .
'">' .
"\n";
2704 print
'<input type="hidden" name="total" value="' . $objectsrc->total_ttc .
'">' .
"\n";
2705 print
'<input type="hidden" name="tva" value="' . $objectsrc->total_tva .
'">' .
"\n";
2706 print
'<input type="hidden" name="origin" value="' . $objectsrc->element .
'">';
2707 print
'<input type="hidden" name="originid" value="' . $objectsrc->id .
'">';
2709 $newclassname = $classname;
2710 if ($newclassname ==
'Propal') {
2711 $newclassname =
'CommercialProposal';
2712 } elseif ($newclassname ==
'Commande') {
2713 $newclassname =
'Order';
2714 } elseif ($newclassname ==
'Expedition') {
2715 $newclassname =
'Sending';
2716 } elseif ($newclassname ==
'Fichinter') {
2717 $newclassname =
'Intervention';
2720 print
'<tr><td>' . $langs->trans($newclassname) .
'</td><td>' . $objectsrc->getNomUrl(1) .
'</td></tr>';
2721 print
'<tr><td>' . $langs->trans(
'AmountHT') .
'</td><td>' .
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td></tr>';
2722 print
'<tr><td>' . $langs->trans(
'AmountVAT') .
'</td><td>' .
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2723 if (
$mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2724 print
'<tr><td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2727 if (
$mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2728 print
'<tr><td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2730 print
'<tr><td>' . $langs->trans(
'AmountTTC') .
'</td><td>' .
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2733 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
'</td></tr>';
2734 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
"</td></tr>";
2735 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc, 0, $langs, 1, -1, -1, $objectsrc->multicurrency_code).
"</td></tr>";
2747 print
'<input type="hidden" name="createmode" value="empty">';
2751 print
'<br><table>';
2755 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2756 print
'<td>' . $langs->trans(
"CopyPropalFrom") .
' </td>';
2758 $liste_propal = array();
2759 $liste_propal[0] =
'';
2761 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2762 $sql .=
" FROM " . MAIN_DB_PREFIX .
"propal p";
2763 $sql .=
", " . MAIN_DB_PREFIX .
"societe s";
2764 $sql .=
" WHERE s.rowid = p.fk_soc";
2765 $sql .=
" AND p.entity IN (" .
getEntity(
'propal') .
")";
2766 $sql .=
" AND p.fk_statut <> 0";
2767 $sql .=
" ORDER BY Id";
2769 $resql =
$db->query($sql);
2771 $num =
$db->num_rows($resql);
2774 $row =
$db->fetch_row($resql);
2775 $propalRefAndSocName = $row[1] .
" - " . $row[2];
2776 $liste_propal[$row[0]] = $propalRefAndSocName;
2779 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2785 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2786 print
'<td valign="top" colspan="2">' . $langs->trans(
"CreateEmptyPropal") .
'</td></tr>';
2793 $langs->load(
"bills");
2795 print $form->buttonsSaveCancel(
"CreateDraft");
2801 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2804 $title = $langs->trans(
'ProductsAndServices');
2807 print
'<div class="div-table-responsive-no-min">';
2808 print
'<table class="noborder centpercent">';
2810 $objectsrc->printOriginLinesList();
2827 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
$object->picto, 0,
'',
'', 0,
'', 1);
2832 if ($action ==
'clone') {
2834 $filter =
'(s.client:IN:1,2,3)';
2835 $formquestion = array(
2838 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2839 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2840 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2843 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2846 $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);
2850 if ($action ==
'add_title_line') {
2851 $langs->load(
'subtotals');
2853 $depth_array =
$object->getPossibleLevels($langs);
2855 } elseif ($action ==
'add_subtotal_line') {
2856 $langs->load(
'subtotals');
2858 $titles =
$object->getPossibleTitles();
2862 if ($action ==
'closeas') {
2864 $formquestion = array();
2866 $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)));
2868 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2870 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2875 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2877 if (!empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2878 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2882 $eligibleForDepositGeneration =
true;
2884 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2885 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2886 '@phan-var-force Facture $invoice';
2889 $eligibleForDepositGeneration =
false;
2895 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2896 foreach (
$object->linkedObjects[
'commande'] as $order) {
2897 $order->fetchObjectLinked();
2899 if (array_key_exists(
'facture', $order->linkedObjects)) {
2900 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2901 '@phan-var-force Facture $invoice';
2904 $eligibleForDepositGeneration =
false;
2913 if ($eligibleForDepositGeneration) {
2914 $formquestion[] = array(
2915 'type' =>
'checkbox',
2916 'tdclass' =>
'showonlyifsigned',
2917 'name' =>
'generate_deposit',
2918 'morecss' =>
'margintoponly marginbottomonly',
2919 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2922 $formquestion[] = array(
2924 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2926 'label' => $langs->trans(
'DateInvoice'),
2932 $formquestion[] = array(
2934 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2935 'name' =>
'date_pointoftax',
2936 'label' => $langs->trans(
'DatePointOfTax'),
2942 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2944 $formquestion[] = array(
2946 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2947 'name' =>
'cond_reglement_id',
2948 'label' => $langs->trans(
'PaymentTerm'),
2949 'value' => $paymentTermsSelect
2952 $formquestion[] = array(
2953 'type' =>
'checkbox',
2954 'tdclass' =>
'showonlyifgeneratedeposit',
2955 'name' =>
'validate_generated_deposit',
2956 'morecss' =>
'margintoponly marginbottomonly',
2957 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2960 $formquestion[] = array(
2961 'type' =>
'onecolumn',
2964 let signedValue = ' . $object::STATUS_SIGNED .
';
2966 $(document).ready(function() {
2967 $("[name=generate_deposit]").change(function () {
2968 let $self = $(this);
2969 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2971 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2980 $("#statut").change(function() {
2981 let $target = $(".showonlyifsigned").parent(".tagtr");
2983 if ($(this).val() == signedValue) {
2989 $("[name=generate_deposit]").trigger("change");
2994 $("#statut").trigger("change");
3004 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
3006 $formquestion = array_merge($formquestion, array(
3007 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid, $object)),
3012 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
3014 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
3016 } elseif ($action ==
'cancel') {
3018 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
3019 } elseif ($action ==
'delete') {
3021 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
3022 } elseif ($action ==
'reopen') {
3024 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
3025 } elseif ($action ==
'ask_deleteline') {
3027 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
3028 } elseif ($action ==
'ask_subtotal_deleteline') {
3030 $langs->load(
"subtotals");
3031 $title =
"DeleteSubtotalLine";
3032 $question =
"ConfirmDeleteSubtotalLine";
3033 if (
GETPOST(
'type') ==
'title') {
3034 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
3035 $title =
"DeleteTitleLine";
3036 $question =
"ConfirmDeleteTitleLine";
3038 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
3039 } elseif ($action ==
'validate') {
3044 $ref = substr(
$object->ref, 1, 4);
3045 if ($ref ==
'PROV' || $ref ==
'') {
3046 $numref =
$object->getNextNumRef($soc);
3047 if (empty($numref)) {
3055 $text = $langs->trans(
'ConfirmValidateProp', $numref);
3057 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
3060 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid, $object);
3065 foreach (
$object->lines as $line) {
3066 $res = $line->fetch_product();
3068 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
3074 if ($nbMandated > 0) {
3076 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
3079 $text .=
'<div><span class="clearboth nowraponall warning">' .
img_warning() . $langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate") .
'</span></div>';
3084 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
3089 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
3090 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
3091 if (empty($reshook)) {
3092 $formconfirm .= $hookmanager->resPrint;
3093 } elseif ($reshook > 0) {
3094 $formconfirm = $hookmanager->resPrint;
3103 $linkback =
'<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
3105 $morehtmlref =
'<div class="refidno">';
3107 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client, $object, $usercancreate,
'string',
'', 0, 1);
3108 $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);
3110 $morehtmlref .=
'<br>' . $soc->getNomUrl(1,
'customer');
3112 $morehtmlref .=
' (<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?socid=' . ((int) $soc->id) .
'">' . $langs->trans(
"OtherProposals") .
'</a>)';
3116 $langs->load(
"projects");
3117 $morehtmlref .=
'<br>';
3118 if ($usercancreate) {
3119 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
3120 if ($action !=
'classify') {
3121 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
3123 $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');
3125 if (!empty(
$object->fk_project)) {
3127 $proj->fetch(
$object->fk_project);
3128 $morehtmlref .= $proj->getNomUrl(1);
3130 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
3135 $morehtmlref .=
'</div>';
3138 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
3141 $parameters = array();
3143 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters, $object, $action);
3144 if (empty($reshook)) {
3145 print
'<div class="fichecenter">';
3146 print
'<div class="fichehalfleft">';
3147 print
'<div class="underbanner clearboth"></div>';
3149 print
'<table class="border tableforfield centpercent">';
3153 $filterabsolutediscount =
"fk_facture_source IS NULL";
3154 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3156 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3157 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3160 print
'<tr><td class="titlefieldmax45">' . $langs->trans(
'Discounts') .
'</td><td>';
3162 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3163 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3164 $absolute_discount =
price2num($absolute_discount,
'MT');
3165 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3171 $backtopage = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id;
3172 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
3188 print $form->editfieldkey(
"DatePropal",
'date',
'', $object, (
int) $editenable);
3189 print
'</td><td class="valuefield">';
3190 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3191 print
'<form name="editdate" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3192 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3193 print
'<input type="hidden" name="action" value="setdate">';
3194 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3195 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3196 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3210 print
'<table class="nobordernopadding centpercent"><tr><td>';
3211 print $langs->trans(
'DateEndPropal');
3213 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3214 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>';
3216 print
'</tr></table>';
3217 print
'</td><td class="valuefield">';
3218 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3219 print
'<form name="editecheance" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3220 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3221 print
'<input type="hidden" name="action" value="setecheance">';
3222 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3223 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3224 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3227 if (!empty(
$object->fin_validite)) {
3241 print
'<table class="nobordernopadding centpercent"><tr><td>';
3242 print $langs->trans(
'PaymentConditionsShort');
3244 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3245 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>';
3247 print
'</tr></table>';
3248 print
'</td><td class="valuefield">';
3249 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3250 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3252 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3258 print
'<tr class="field_mode_reglement_id">';
3260 print
'<table class="nobordernopadding centpercent"><tr><td>';
3261 print $langs->trans(
'PaymentMode');
3263 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3264 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>';
3266 print
'</tr></table>';
3267 print
'</td><td class="valuefieldcreate">';
3268 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3269 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3271 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'none');
3276 print
'<tr class="fielddeliverydelay"><td>';
3277 print
'<table class="nobordernopadding centpercent"><tr><td>';
3279 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod') .
' (' . $langs->trans(
'AfterOrder') .
')');
3281 print $langs->trans(
'AvailabilityPeriod');
3284 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3285 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>';
3287 print
'</tr></table>';
3288 print
'</td><td class="valuefield">';
3289 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3290 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'availability_id', $langs->trans(
"Delay"));
3292 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'none', 1);
3300 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3301 print
'</td><td class="valuefieldedit">';
3302 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, $usercancreate && $caneditfield,
'datepicker');
3309 print
'<table class="nobordernopadding centpercent"><tr><td>';
3310 print $langs->trans(
'SendingMethod');
3312 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3313 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>';
3315 print
'</tr></table>';
3316 print
'</td><td class="valuefield">';
3317 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3318 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3320 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'none');
3328 $langs->load(
'stocks');
3329 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
3331 print
'<tr class="field_warehouse_id"><td>';
3332 $editenable = $usercancreate;
3333 print $form->editfieldkey(
"Warehouse",
'warehouse',
'', $object, $editenable);
3334 print
'</td><td class="valuefieldcreate">';
3335 if ($action ==
'editwarehouse') {
3336 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3338 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'none');
3346 print
'<table class="nobordernopadding centpercent"><tr><td>';
3347 print $langs->trans(
'Source');
3349 if ($action !=
'editdemandreason' && $usercancreate) {
3350 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>';
3352 print
'</tr></table>';
3353 print
'</td><td class="valuefield">';
3354 if ($action ==
'editdemandreason' && $usercancreate) {
3355 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3357 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'none');
3362 if ($soc->outstanding_limit) {
3365 print $langs->trans(
'OutstandingBill');
3366 print
'</td><td class="valuefield">';
3367 $arrayoutstandingbills = $soc->getOutstandingBills();
3368 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
3369 print
price($arrayoutstandingbills[
'opened']) .
' / ';
3370 print
price($soc->outstanding_limit, 0, $langs, 1, -1, -1,
$conf->currency);
3378 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3379 print $langs->trans(
'BankAccount');
3381 if ($action !=
'editbankaccount' && $usercancreate) {
3382 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>';
3384 print
'</tr></table>';
3385 print
'</td><td class="valuefield">';
3386 if ($action ==
'editbankaccount') {
3387 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3389 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'none');
3396 $tmparray =
$object->getTotalWeightVolume();
3397 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3398 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3400 print
'<tr><td>' . $langs->trans(
"CalculatedWeight") .
'</td>';
3401 print
'<td class="valuefield">';
3406 print
'<tr><td>' . $langs->trans(
"CalculatedVolume") .
'</td>';
3407 print
'<td class="valuefield">';
3416 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3417 print $langs->trans(
'IncotermLabel');
3418 print
'<td><td class="right">';
3419 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3420 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' .
img_edit() .
'</a>';
3424 print
'</td></tr></table>';
3426 print
'<td class="valuefield">';
3427 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3428 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3430 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3438 print
'<table class="nobordernopadding centpercent"><tr><td>';
3439 print $langs->trans(
"Categories");
3440 print
'<td><td class="right">';
3441 if ($usercancreate) {
3442 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=edittags&token='.
newToken().
'">'.
img_edit().
'</a>';
3446 print
'</td></tr></table>';
3449 if ($action ==
'edittags') {
3450 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'">';
3451 print
'<input type="hidden" name="action" value="settags">';
3452 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3453 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
3454 print
'<input type="submit" class="button valignmiddle smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
3457 print $form->showCategories(
$object->id, Categorie::TYPE_PROPOSAL, 1);
3463 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3468 print
'<div class="fichehalfright">';
3469 print
'<div class="underbanner clearboth"></div>';
3471 print
'<table class="border tableforfield centpercent">';
3473 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_currency_amount.tpl.php';
3476 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3477 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3479 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3484 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3485 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3487 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3491 if (
$mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3493 print
'<td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td>';
3494 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3498 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3503 if (
$mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3505 print
'<td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td>';
3506 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3510 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3516 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3517 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3519 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3527 $formmargin->displayMarginInfos($object);
3533 print
'<div class="clearboth"></div><br>';
3536 $blocname =
'contacts';
3537 $title = $langs->trans(
'ContactsAddresses');
3538 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3542 $blocname =
'notes';
3543 $title = $langs->trans(
'Notes');
3544 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3552 $result =
$object->getLinesArray();
3556 global $inputalsopricewithtax;
3557 $inputalsopricewithtax = 1;
3559 print
' <form name="addproduct" id="addproduct" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="POST">
3560 <input type="hidden" name="token" value="' .
newToken() .
'">
3561 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline') .
'">
3562 <input type="hidden" name="mode" value="">
3563 <input type="hidden" name="page_y" value="">
3564 <input type="hidden" name="backtopage" value="' . $backtopage .
'">
3565 <input type="hidden" name="id" value="' .
$object->id .
'">
3570 include DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_ajaxrow.tpl.php';
3572 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3576 print
'<div class="div-table-responsive-no-min">';
3578 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3587 if ($action !=
'editline') {
3588 $parameters = array();
3589 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3593 if (empty($reshook)) {
3597 $parameters = array();
3598 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters, $object, $action);
3617 if ($action !=
'presend') {
3618 $numlines = count(
$object->lines);
3619 print
'<div class="tabsAction">';
3621 $parameters = array();
3622 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3624 if (empty($reshook)) {
3625 if ($action !=
'editline') {
3629 $langs->load(
'subtotals');
3631 $url_button = array();
3633 $url_button[] = array(
3634 'lang' =>
'subtotals',
3636 'perm' => (
bool) $usercancreate,
3637 'label' => $langs->trans(
'AddTitleLine'),
3638 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_title_line&token=' .
newToken()
3641 $url_button[] = array(
3642 'lang' =>
'subtotals',
3644 'perm' => (
bool) $usercancreate,
3645 'label' => $langs->trans(
'AddSubtotalLine'),
3646 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_subtotal_line&token=' .
newToken()
3649 print
dolGetButtonAction(
'', $langs->trans(
'SubTotal'),
'default', $url_button,
'',
true);
3656 if ($usercanvalidate) {
3657 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>';
3659 print
'<a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
'Validate') .
'</a>';
3669 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=modif&token=' .
newToken() .
'">' . $langs->trans(
'Modify') .
'</a>';
3674 if ($usercanreopen) {
3675 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=reopen&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen') .
'"';
3676 print
'>' . $langs->trans(
'ReOpen') .
'</a>';
3678 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ReOpen") .
'</a>';
3683 if (empty($user->socid)) {
3685 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'', $usercansend);
3689 $arrayforbutaction = array();
3692 $arrayforbutaction[] = array(
3695 'perm' => $usercancreateorder,
3696 'label' =>
'AddOrder',
3697 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3707 $arrayforbutaction[] = array(
3710 'perm' => $usercancreatepurchaseorder,
3711 'label' =>
'AddPurchaseOrder',
3712 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id)
3722 $arrayforbutaction[] = array(
3723 'lang' =>
'interventions',
3725 'perm' => $usercancreateintervention,
3726 'label' =>
'AddIntervention',
3727 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3737 $arrayforbutaction[] = array(
3738 'lang' =>
'contracts',
3740 'perm' => $usercancreatecontract,
3741 'label' =>
'AddContract',
3742 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3754 $arrayforbutaction[] = [
3755 'lang' =>
'invoice',
3757 'perm' => $usercancreateinvoice,
3758 'label' =>
'CreateBill',
3759 'url' =>
'/compta/facture/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((int)
$object->id) .
'&socid=' . ((int)
$object->socid),
3766 $actionButtonsParameters = [
3767 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3768 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3771 if ($numlines > 0) {
3772 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3774 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3778 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3779 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3780 if ($usercanclose) {
3781 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=classifybilled&token=' .
newToken() .
'&socid=' .
$object->socid .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3783 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3791 if ($usercanclose) {
3792 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3793 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3795 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'"';
3796 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3802 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token=' .
newToken() .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3803 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3809 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=cancel&token=' .
newToken() .
'">' . $langs->trans(
"CancelPropal") .
'</a>';
3813 if ($usercancreate) {
3814 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>';
3818 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' .
newToken(),
'delete', $usercandelete);
3826 if (
GETPOST(
'modelselected')) {
3827 $action =
'presend';
3830 if ($action !=
'presend') {
3831 print
'<div class="fichecenter"><div class="fichehalfleft">';
3832 print
'<a name="builddoc"></a>';
3838 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3839 $genallowed = $usercanread;
3840 $delallowed = $usercancreate;
3841 $tooltipAfterComboOfModels =
'';
3843 $tooltipAfterComboOfModels = $langs->trans(
"AccordingToYourSetupTheFileWillBeConcatenated",
getDolGlobalString(
'MAIN_INFO_PROPAL_TERMSOFSALE'));
3846 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);
3849 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'propal'), 1);
3850 $linktoelem = $tmparray[
'linktoelem'];
3851 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3852 print $htmltoenteralink;
3854 $compatibleImportElementsList =
false;
3856 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3858 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, $compatibleImportElementsList);
3864 print
'<br><!-- Link to sign -->';
3865 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3866 print showOnlineSignatureUrl(
'proposal',
$object->ref, $object) .
'<br>';
3869 print
'</div><div class="fichehalfright">';
3873 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/comm/propal/messaging.php?id=' .
$object->id);
3874 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT .
'/comm/propal/agenda.php?id=' .
$object->id);
3877 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3879 $somethingshown = $formactions->showactions($object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3881 print
'</div></div>';
3885 $modelmail =
'propal_send';
3886 $defaulttopic =
'SendPropalRef';
3888 $trackid =
'pro' .
$object->id;
3890 include DOL_DOCUMENT_ROOT .
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage a WYSIWYG editor.
static createDepositFromOrigin(CommonObject $origin, $date, $payment_terms_id, User $user, $notrigger=0, $autoValidateDeposit=false, $overrideFields=array())
Creates a deposit from a proposal or an order by grouping lines by VAT rates.
const TYPE_DEPOSIT
Deposit invoice.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage the table of subscription to notifications.
Class ProductCombination Used to represent the relation between a product and one of its variants.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
Class to manage projects.
Class to manage proposals.
const STATUS_DRAFT
Draft status.
const STATUS_SIGNED
Signed quote.
const STATUS_NOTSIGNED
Not signed quote.
const STATUS_BILLED
Billed or processed quote.
const STATUS_CANCELED
Canceled status.
const STATUS_VALIDATED
Validated status.
Class to manage commercial proposal lines.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
$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, $nodie=0, $mode='')
Check permissions of a user to show a page and an object.