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 .
')';
723 $line_price_base_type = $lines[$i]->getPriceBaseType();
724 $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, $line_price_base_type, (
float) $lines[$i]->subprice_ttc, $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);
735 if ($result > 0 && $lines[$i]->product_type == 9) {
736 $fk_parent_line = $result;
741 $parameters = array(
'objFrom' => $srcobject);
742 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
763 if (
GETPOST(
'contactid') > 0) {
772 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
775 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
779 $categories =
GETPOST(
'categories',
'array');
780 if (method_exists($object,
'setCategories')) {
781 $object->setCategories($categories);
790 $outputlangs = $langs;
793 $newlang =
GETPOST(
'lang_id',
'aZ09');
796 $newlang =
$object->thirdparty->default_lang;
798 if (!empty($newlang)) {
800 $outputlangs->setDefaultLang($newlang);
805 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
811 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
824 } elseif ($action ==
'classifybilled' && $usercanclose) {
828 $result =
$object->classifyBilled($user, 0,
'');
839 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
842 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
844 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
845 $locationTarget =
'';
859 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
864 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
867 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
868 && !empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
870 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
873 $forceFields = array();
875 if (GETPOSTISSET(
'date_pointoftax')) {
883 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
894 $ret = $deposit->fetch($deposit->id);
895 $outputlangs = $langs;
899 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
900 $outputlangs->load(
'products');
903 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
910 if ($locationTarget) {
911 header(
'Location: ' . $locationTarget);
923 } elseif ($action ==
'confirm_reopen' && $usercanreopen && !
GETPOST(
'cancel',
'alpha')) {
930 $result =
$object->reopen($user, $newstatus);
947 $fromElement =
GETPOST(
'fromelement');
948 $fromElementid =
GETPOST(
'fromelementid');
949 $importLines =
GETPOST(
'line_checkbox');
951 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
952 if ($fromElement ==
'commande') {
953 dol_include_once(
'/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
954 $lineClassName =
'OrderLine';
955 } elseif ($fromElement ==
'propal') {
956 dol_include_once(
'/comm/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
957 $lineClassName =
'PropaleLigne';
958 } elseif ($fromElement ==
'facture') {
959 dol_include_once(
'/compta/' . $fromElement .
'/class/' . $fromElement .
'.class.php');
960 $lineClassName =
'FactureLigne';
962 $lineClassName =
null;
964 $nextRang = count(
$object->lines) + 1;
967 foreach ($importLines as $lineId) {
968 $lineId = intval($lineId);
969 $originLine =
new $lineClassName(
$db);
970 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
971 $originLine->fetch_optionals();
972 $desc = $originLine->desc;
973 $pu_ht = $originLine->subprice;
974 $qty = $originLine->qty;
975 $txtva = $originLine->tva_tx;
976 $txlocaltax1 = $originLine->localtax1_tx;
977 $txlocaltax2 = $originLine->localtax2_tx;
978 $fk_product = $originLine->fk_product;
979 $remise_percent = $originLine->remise_percent;
981 $date_end = $originLine->date_end;
982 $fk_code_ventilation = 0;
983 $info_bits = $originLine->info_bits;
984 $fk_remise_except = $originLine->fk_remise_except;
985 $price_base_type =
'HT';
987 $type = $originLine->product_type;
989 $special_code = $originLine->special_code;
990 $origin = $originLine->element;
991 $origin_id = $originLine->id;
993 $fk_fournprice = $originLine->fk_fournprice;
994 $pa_ht = $originLine->pa_ht;
995 $label = $originLine->label;
996 $array_options = $originLine->array_options;
997 $situation_percent = 100;
999 $fk_unit = $originLine->fk_unit;
1000 $pu_ht_devise = $originLine->multicurrency_subprice;
1002 $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);
1018 } elseif ($action ==
'addline' &&
GETPOST(
'updateallvatlinesblock',
'alpha') &&
GETPOST(
'vatforblocklines',
'alpha') !==
'' && $usercancreate) {
1019 $tx_tva =
GETPOST(
'vatforblocklines') ?
GETPOST(
'vatforblocklines') : 0;
1020 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'tva', $tx_tva);
1024 } elseif ($action ==
'addline' &&
GETPOST(
'updatealldiscountlinesblock',
'alpha') &&
GETPOST(
'discountforblocklines',
'alpha') !==
'' && $usercancreate) {
1025 $discount =
GETPOST(
'discountforblocklines') ?
GETPOST(
'discountforblocklines') : 0;
1026 $result =
$object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'discount', $discount);
1032 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1035 $actiontypecode =
'AC_EMAIL';
1036 $triggersendname =
'PROPAL_SENTBYMAIL';
1037 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
1038 $trackid =
'pro' .
$object->id;
1039 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1043 if ($action ==
'modif' && $usercancreate) {
1044 $result =
$object->setDraft($user);
1051 $outputlangs = $langs;
1054 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1055 $outputlangs->setDefaultLang($newlang);
1061 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1063 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
1072 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
1076 foreach (
$object->lines as $key => $line) {
1077 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1080 if ($line->product_type == 1) {
1082 $line_price_base_type = $line->getPriceBaseType();
1083 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1084 $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);
1088 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
1090 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
1091 $vat_rate = str_replace(
'*',
'', $vat_rate);
1094 foreach (
$object->lines as $key => $line) {
1095 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1099 $line_price_base_type = $line->getPriceBaseType();
1100 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1101 $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);
1104 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
1106 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
1107 $remise_percent = str_replace(
'*',
'', $remise_percent);
1108 foreach (
$object->lines as $key => $line) {
1109 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1112 $tvatx = $line->tva_tx;
1113 if (!empty($line->vat_src_code)) {
1114 $tvatx .=
' (' . $line->vat_src_code .
')';
1117 $line_price_base_type = $line->getPriceBaseType();
1118 $line_pu = ($line_price_base_type ===
'TTC') ? (
float) $line->subprice_ttc : (float) $line->subprice;
1119 $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);
1122 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'' && $usercancreate) {
1124 $margin_rate = (
GETPOST(
'marginforalllines',
'alpha') ?
GETPOST(
'marginforalllines',
'alpha') : 0);
1125 foreach (
$object->lines as $key => $line) {
1126 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1129 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
1131 $prod->fetch($line->fk_product);
1132 if (
$prod->price_min > $subprice) {
1133 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1134 $price_price_min =
price(
$prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1135 setEventMessages(
$prod->ref .
' - ' .
$prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1138 if ($line->subprice <> 0) {
1139 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1141 $multicurrency_subprice = 0;
1144 $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);
1161 } elseif ($action ==
'confirm_addtextline' && $usercancreate) {
1164 $langs->load(
'subtotals');
1166 $desc =
GETPOST(
'subtotaltextcontent',
'restricthtml');
1169 $result =
$object->addSubtotalLine($langs, $desc, 0, array());
1180 $outputlangs = $langs;
1181 $newlang =
GETPOST(
'lang_id',
'alpha');
1183 $newlang =
$object->thirdparty->default_lang;
1185 if (!empty($newlang)) {
1187 $outputlangs->setDefaultLang($newlang);
1190 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1195 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1197 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
1200 $langs->load(
'subtotals');
1202 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
1203 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
1205 $subtotal_options = array();
1207 foreach (Propal::$TITLE_OPTIONS as $option) {
1208 $value =
GETPOST($option,
'alphanohtml');
1210 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1215 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1226 $outputlangs = $langs;
1227 $newlang =
GETPOST(
'lang_id',
'alpha');
1229 $newlang =
$object->thirdparty->default_lang;
1231 if (!empty($newlang)) {
1233 $outputlangs->setDefaultLang($newlang);
1236 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1241 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1243 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
1246 $langs->load(
'subtotals');
1248 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
1249 foreach (
$object->lines as $line) {
1250 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
1251 $desc = $line->desc;
1252 $depth = -$line->qty;
1256 $subtotal_options = array();
1258 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1259 $value =
GETPOST($option,
'alphanohtml');
1261 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1266 if (isset($desc) && isset($depth)) {
1267 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1270 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
1279 $outputlangs = $langs;
1280 $newlang =
GETPOST(
'lang_id',
'alpha');
1282 $newlang =
$object->thirdparty->default_lang;
1284 if (!empty($newlang)) {
1286 $outputlangs->setDefaultLang($newlang);
1289 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1294 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' . $id);
1296 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && !
GETPOST(
'markforalllines',
'alpha') && $usercancreate) {
1300 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1303 $price_ht_devise =
'';
1305 $price_ttc_devise =
'';
1309 if (
GETPOST(
'price_ht') !==
'') {
1312 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1315 if (
GETPOST(
'price_ttc') !==
'') {
1318 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1319 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1322 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1323 if ($prod_entry_mode ==
'free') {
1329 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1334 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1337 $remise_percent = (GETPOSTISSET(
'remise_percent' . $predef) ?
price2num(
GETPOST(
'remise_percent' . $predef,
'alpha'),
'', 2) : 0);
1338 if (empty($remise_percent)) {
1339 $remise_percent = 0;
1343 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1344 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1346 if (is_array($extralabelsline)) {
1348 foreach ($extralabelsline as $key => $value) {
1349 unset($_POST[
"options_" . $key]);
1353 $price_to_test_sign = ($price_ht ? $price_ht : $price_ttc);
1355 if ((empty($idprod) || $idprod < 0) && ($price_to_test_sign < 0) && ($qty < 0)) {
1356 $langs->load(
"errors");
1357 setEventMessages($langs->trans(
'ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv(
'UnitPriceHT'), $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1360 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1361 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1365 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1366 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1370 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1373 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1374 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1378 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1379 if ($combinations =
GETPOST(
'combinations',
'array:alphanohtml')) {
1383 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1384 $idprod = $res->fk_product_child;
1386 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1392 if (!$error && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1400 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1409 if (!empty($idprod) && $idprod > 0) {
1411 $prod->fetch($idprod);
1423 $pu_ht =
$prod->price;
1424 $pu_ttc =
$prod->price_ttc;
1425 $price_min =
$prod->price_min;
1426 $price_min_ttc =
$prod->price_min_ttc;
1427 $price_base_type =
$prod->price_base_type;
1431 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1433 $filter = array(
't.fk_product' => (
string)
$prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1436 $pricebycustomerexist =
false;
1437 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1440 if (count($prodcustprice->lines) > 0) {
1441 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1442 foreach ($prodcustprice->lines as $k => $custprice_line) {
1443 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1444 $pricebycustomerexist =
true;
1445 $pu_ht =
price($custprice_line->price);
1446 $pu_ttc =
price($custprice_line->price_ttc);
1447 $price_min =
price($custprice_line->price_min);
1448 $price_min_ttc =
price($custprice_line->price_min_ttc);
1449 $price_base_type = $custprice_line->price_base_type;
1466 if (!$pricebycustomerexist && !empty(
$object->thirdparty->price_level)) {
1467 $pu_ht =
$prod->multiprices[
$object->thirdparty->price_level];
1468 $pu_ttc =
$prod->multiprices_ttc[
$object->thirdparty->price_level];
1469 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
1470 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1471 $price_base_type =
$prod->multiprices_base_type[
$object->thirdparty->price_level];
1473 if (isset(
$prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1474 $tva_tx =
$prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1476 if (isset(
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1477 $tva_npr =
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1482 $pu_ht =
$prod->multiprices[
$object->thirdparty->price_level];
1483 $pu_ttc =
$prod->multiprices_ttc[
$object->thirdparty->price_level];
1484 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
1485 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1486 $price_base_type =
$prod->multiprices_base_type[
$object->thirdparty->price_level];
1488 if (isset(
$prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1489 $tva_tx =
$prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1491 if (isset(
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1492 $tva_npr =
$prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1497 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1501 $filter = array(
't.fk_product' => (
string)
$prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1503 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1506 if (count($prodcustprice->lines) > 0) {
1507 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1508 foreach ($prodcustprice->lines as $k => $custprice_line) {
1509 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1510 $pu_ht =
price($custprice_line->price);
1511 $pu_ttc =
price($custprice_line->price_ttc);
1512 $price_min =
price($custprice_line->price_min);
1513 $price_min_ttc =
price($custprice_line->price_min_ttc);
1514 $price_base_type = $custprice_line->price_base_type;
1532 if (
$prod->prices_by_qty[0]) {
1537 foreach (
$prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1538 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1542 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1543 $pu_ht = $priceforthequantityarray[
'unitprice'];
1545 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1553 if (
$prod->prices_by_qty[
$object->thirdparty->price_level]) {
1558 foreach (
$prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1559 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1563 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1564 $pu_ht = $priceforthequantityarray[
'unitprice'];
1566 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1574 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1575 $tmpprodvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string)
$prod->tva_tx));
1580 if (!empty($price_ht) || (
string) $price_ht ===
'0') {
1581 $pu_ht = (float)
price2num($price_ht,
'MU');
1582 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1583 $price_base_type =
'HT';
1584 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1585 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1586 $pu_ttc_devise = (float)
price2num((
float) $pu_ht_devise * (1 + ((float) $tmpvat / 100)),
'MU');
1589 $price_base_type =
'HT';
1590 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1591 $pu_ttc = (float)
price2num($price_ttc,
'MU');
1592 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1593 $price_base_type =
'TTC';
1594 } elseif (!empty($price_ttc_devise) || (
string) $price_ttc_devise ===
'0') {
1595 $pu_ttc_devise = (float)
price2num($price_ttc_devise,
'MU');
1596 $pu_ht_devise = (float)
price2num((
float) $pu_ttc_devise / (1 + ((float) $tmpvat / 100)),
'MU');
1599 $price_base_type =
'TTC';
1600 } elseif ($tmpvat != $tmpprodvat) {
1602 if ($price_base_type !=
'HT') {
1603 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1605 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1613 $outputlangs = $langs;
1615 if (
GETPOST(
'lang_id',
'aZ09')) {
1616 $newlang =
GETPOST(
'lang_id',
'aZ09');
1618 if (empty($newlang)) {
1619 $newlang =
$object->thirdparty->default_lang;
1621 if (!empty($newlang)) {
1623 $outputlangs->setDefaultLang($newlang);
1626 $desc = (!empty(
$prod->multilangs[$outputlangs->defaultlang][
"description"])) ?
$prod->multilangs[$outputlangs->defaultlang][
"description"] :
$prod->
description;
1628 $desc =
$prod->description;
1644 $outputlangs = $langs;
1646 if (
GETPOST(
'lang_id',
'alpha')) {
1647 $newlang =
GETPOST(
'lang_id',
'alpha');
1649 if (empty($newlang)) {
1650 $newlang =
$object->thirdparty->default_lang;
1652 if (!empty($newlang)) {
1654 $outputlangs->setDefaultLang($newlang);
1655 $outputlangs->load(
'products');
1657 if (!empty(
$prod->customcode)) {
1658 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode") .
': ' .
$prod->customcode;
1660 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1663 if (!empty(
$prod->country_code)) {
1664 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry(
$prod->country_code,
'',
$db, $outputlangs, 0);
1667 if (!empty(
$prod->customcode)) {
1668 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode") .
': ' .
$prod->customcode;
1670 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1673 if (!empty(
$prod->country_code)) {
1674 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin") .
': ' .
getCountry(
$prod->country_code,
'',
$db, $langs, 0);
1681 $type =
$prod->type;
1682 $fk_unit =
$prod->fk_unit;
1686 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1687 $tva_tx = str_replace(
'*',
'', $tva_tx);
1688 if (empty($tva_tx)) {
1691 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1694 $fk_unit =
GETPOST(
'units',
'alpha');
1695 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1696 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1698 if ($pu_ttc && !$pu_ht) {
1699 $price_base_type =
'TTC';
1713 $fournprice = (int) (
GETPOST(
'fournprice' . $predef) ?
GETPOST(
'fournprice' . $predef) :
'');
1714 $buyingprice =
price2num((
GETPOST(
'buying_price' . $predef) !=
'' ?
GETPOST(
'buying_price' . $predef) :
''),
'', 2);
1720 $pu_equivalent = $pu_ht;
1721 $pu_equivalent_ttc = $pu_ttc;
1722 $currency_tx =
$object->multicurrency_tx;
1726 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1727 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1729 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
1730 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1750 if ($usermustrespectpricemin) {
1751 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1752 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1755 } 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') {
1756 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1764 $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);
1776 $outputlangs = $langs;
1777 $newlang =
GETPOST(
'lang_id',
'alpha');
1779 $newlang =
$object->thirdparty->default_lang;
1781 if (!empty($newlang)) {
1783 $outputlangs->setDefaultLang($newlang);
1785 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1788 unset($_POST[
'prod_entry_mode']);
1790 unset($_POST[
'qty']);
1791 unset($_POST[
'type']);
1792 unset($_POST[
'remise_percent']);
1793 unset($_POST[
'price_ht']);
1794 unset($_POST[
'multicurrency_price_ht']);
1795 unset($_POST[
'price_ttc']);
1796 unset($_POST[
'tva_tx']);
1797 unset($_POST[
'product_ref']);
1798 unset($_POST[
'product_label']);
1799 unset($_POST[
'product_desc']);
1800 unset($_POST[
'fournprice']);
1801 unset($_POST[
'buying_price']);
1802 unset($_POST[
'np_marginRate']);
1803 unset($_POST[
'np_markRate']);
1804 unset($_POST[
'dp_desc']);
1805 unset($_POST[
'idprod']);
1806 unset($_POST[
'units']);
1808 unset($_POST[
'date_starthour']);
1809 unset($_POST[
'date_startmin']);
1810 unset($_POST[
'date_startsec']);
1811 unset($_POST[
'date_startday']);
1812 unset($_POST[
'date_startmonth']);
1813 unset($_POST[
'date_startyear']);
1814 unset($_POST[
'date_endhour']);
1815 unset($_POST[
'date_endmin']);
1816 unset($_POST[
'date_endsec']);
1817 unset($_POST[
'date_endday']);
1818 unset($_POST[
'date_endmonth']);
1819 unset($_POST[
'date_endyear']);
1821 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
1830 } elseif ($action ==
'addline' && $usercancreate && (
1831 (
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'') ||
1832 (
GETPOST(
'submitforallmark',
'alpha') &&
GETPOST(
'markforalllines',
'alpha') !==
'')
1836 $margin_rate = GETPOSTISSET(
'marginforalllines') ?
GETPOST(
'marginforalllines',
'int') :
'';
1837 $mark_rate = GETPOSTISSET(
'markforalllines') ?
GETPOST(
'markforalllines',
'int') :
'';
1838 foreach (
$object->lines as &$line) {
1839 if ($line->subprice > 0) {
1840 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1843 $subprice_multicurrency = $line->subprice;
1844 if (is_numeric($margin_rate) && $margin_rate > 0) {
1845 $line->subprice = (float)
price2num((
float) $line->pa_ht * (1 + (float) $margin_rate / 100),
'MU');
1846 } elseif (is_numeric($mark_rate) && $mark_rate > 0) {
1847 $line->subprice = (float) ($line->pa_ht / (1 - ((
float) $mark_rate / 100)));
1849 $line->subprice = (float) $line->pa_ht;
1852 if ($line->fk_product > 0) {
1854 $res =
$prod->fetch($line->fk_product);
1856 if (
$prod->price_min > $line->subprice) {
1857 $price_subprice =
price($line->subprice, 0, $outlangs, 1, -1, -1,
'auto');
1858 $price_price_min =
price(
$prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1859 setEventMessages(
$prod->ref .
' - ' .
$prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1869 $multicurrency_subprice = (float) $line->subprice * $line->multicurrency_subprice / $subprice_multicurrency;
1871 $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);
1874 if (is_numeric($margin_rate) && empty($mark_rate)) {
1875 $line->marge_tx = $margin_rate;
1876 } elseif (is_numeric($mark_rate) && empty($margin_rate)) {
1877 $line->marque_tx = $mark_rate;
1879 $line->total_ht = $line->qty * (float) $line->subprice;
1880 $line->total_tva = $line->tva_tx * $line->qty * (float) $line->subprice;
1881 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $line->subprice;
1883 $line->multicurrency_total_ht = $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1884 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1885 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1887 $line->multicurrency_subprice = $multicurrency_subprice;
1893 } elseif ($action ==
'updatetitleline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1896 $langs->load(
'subtotals');
1898 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1901 $subtotal_options = array();
1903 foreach (Propal::$TITLE_OPTIONS as $option) {
1904 $value =
GETPOST($option,
'alphanohtml');
1906 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1911 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1922 $outputlangs = $langs;
1923 $newlang =
GETPOST(
'lang_id',
'alpha');
1925 $newlang =
$object->thirdparty->default_lang;
1927 if (!empty($newlang)) {
1929 $outputlangs->setDefaultLang($newlang);
1932 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1937 } elseif ($action ==
'updatetextline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1940 $langs->load(
'subtotals');
1942 $desc =
GETPOST(
'line_desc',
'restricthtml');
1945 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, 0, array());
1956 $outputlangs = $langs;
1957 $newlang =
GETPOST(
'lang_id',
'alpha');
1959 $newlang =
$object->thirdparty->default_lang;
1961 if (!empty($newlang)) {
1963 $outputlangs->setDefaultLang($newlang);
1966 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1971 } elseif ($action ==
'updatesubtotalline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1974 $langs->load(
'subtotals');
1976 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1979 $subtotal_options = array();
1981 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1982 $value =
GETPOST($option,
'alphanohtml');
1984 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1989 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1997 $outputlangs = $langs;
1998 $newlang =
GETPOST(
'lang_id',
'alpha');
2000 $newlang =
$object->thirdparty->default_lang;
2002 if (!empty($newlang)) {
2004 $outputlangs->setDefaultLang($newlang);
2007 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2012 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
2020 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
2025 $vat_rate = (
GETPOST(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : 0);
2026 $vat_rate = str_replace(
'*',
'', $vat_rate);
2033 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
2043 if (empty($remise_percent)) {
2044 $remise_percent = 0;
2048 $pu_equivalent = $pu_ht;
2049 $pu_equivalent_ttc = $pu_ttc;
2051 $currency_tx =
$object->multicurrency_tx;
2055 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
2056 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
2058 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'' && !empty((
float) $currency_tx)) {
2059 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
2074 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
2075 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
2077 if (is_array($extralabelsline)) {
2079 foreach ($extralabelsline as $key => $value) {
2080 unset($_POST[
"options_" . $key]);
2094 $price_base_type =
'HT';
2095 if (empty($pu_ht) && !empty($pu_ttc)) {
2097 $price_base_type =
'TTC';
2098 } elseif (!empty($pu_ht) && !empty($pu_ttc)) {
2099 foreach (
$object->lines as $line_obj) {
2101 if ($line_obj->wasEnteredIncludingTax()) {
2103 $price_base_type =
'TTC';
2112 if (!empty($productid)) {
2114 $res = $product->fetch($productid);
2116 $type = $product->type;
2120 $price_min = $product->price_min;
2122 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
2124 $price_min_ttc = $product->price_min_ttc;
2126 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
2133 if ($usermustrespectpricemin) {
2134 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
2135 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
2138 $action =
'editline';
2139 } 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') {
2140 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
2143 $action =
'editline';
2148 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
2152 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
2160 if (!$user->hasRight(
'margins',
'creer')) {
2161 foreach (
$object->lines as &$line) {
2163 $fournprice = $line->fk_fournprice;
2164 $buyingprice = (
string) $line->pa_ht;
2172 $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);
2179 $outputlangs = $langs;
2182 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
2183 $outputlangs->setDefaultLang($newlang);
2189 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2192 unset($_POST[
'qty']);
2193 unset($_POST[
'type']);
2194 unset($_POST[
'productid']);
2195 unset($_POST[
'remise_percent']);
2196 unset($_POST[
'price_ht']);
2197 unset($_POST[
'multicurrency_price_ht']);
2198 unset($_POST[
'price_ttc']);
2199 unset($_POST[
'tva_tx']);
2200 unset($_POST[
'product_ref']);
2201 unset($_POST[
'product_label']);
2202 unset($_POST[
'product_desc']);
2203 unset($_POST[
'fournprice']);
2204 unset($_POST[
'buying_price']);
2206 unset($_POST[
'date_starthour']);
2207 unset($_POST[
'date_startmin']);
2208 unset($_POST[
'date_startsec']);
2209 unset($_POST[
'date_startday']);
2210 unset($_POST[
'date_startmonth']);
2211 unset($_POST[
'date_startyear']);
2212 unset($_POST[
'date_endhour']);
2213 unset($_POST[
'date_endmin']);
2214 unset($_POST[
'date_endsec']);
2215 unset($_POST[
'date_endday']);
2216 unset($_POST[
'date_endmonth']);
2217 unset($_POST[
'date_endyear']);
2224 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
2225 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
2227 } elseif ($action ==
'classin' && $usercancreate) {
2230 } elseif ($action ==
'setavailability' && $usercancreate) {
2233 } elseif ($action ==
'setdemandreason' && $usercancreate) {
2236 } elseif ($action ==
'setconditions' && $usercancreate) {
2239 } elseif ($action ==
'setmode' && $usercancreate) {
2242 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
2244 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
2245 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
2248 } elseif ($action ==
'setbankaccount' && $usercancreate) {
2251 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
2254 } elseif ($action ==
'setwarehouse' && $usercancreate) {
2257 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
2260 $attribute_name =
GETPOST(
'attribute',
'aZ09');
2263 $result = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
2269 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
2276 $action =
'edit_extras';
2281 if ($action ==
'addcontact' && $usercancreate) {
2286 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2290 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2293 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2294 $langs->load(
"errors");
2295 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
2300 } elseif ($action ==
'swapstatut' && $usercancreate) {
2302 if (
$object->fetch($id) > 0) {
2307 } elseif ($action ==
'deletecontact' && $usercancreate) {
2310 $result =
$object->delete_contact($lineid);
2313 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
2323 $permissiontoadd = $usercancreate;
2324 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
2341$title =
$object->ref .
" - " . $langs->trans(
'Card');
2342if ($action ==
'create') {
2343 $title = $langs->trans(
"NewPropal");
2345$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
2352if ($action ==
'create') {
2359 $res = $soc->fetch($socid);
2362 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2363 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2364 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2370 if (!empty($origin) && !empty($originid)) {
2372 $element = $subelement = $origin;
2374 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2375 $element = $regs[1];
2376 $subelement = $regs[2];
2379 if ($element ==
'project') {
2380 $projectid = $originid;
2384 $project->fetch($projectid);
2385 if ($project->socid > 0) {
2387 $soc->fetch($project->socid);
2391 if ($element ==
'order' || $element ==
'commande') {
2392 $element = $subelement =
'commande';
2394 if ($element ==
'propal') {
2395 $element =
'comm/propal';
2396 $subelement =
'propal';
2398 if ($element ==
'contract') {
2399 $element = $subelement =
'contrat';
2401 if ($element ==
'shipping') {
2402 $element = $subelement =
'expedition';
2407 $classname = ucfirst($subelement);
2408 $objectsrc =
new $classname(
$db);
2409 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
2411 $objectsrc->fetch($originid);
2412 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2413 $objectsrc->fetch_lines();
2415 $objectsrc->fetch_thirdparty();
2417 $projectid = (int) $objectsrc->fk_project;
2418 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
2420 $soc = $objectsrc->thirdparty;
2422 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2423 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2424 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : -1));
2427 $objectsrc->fetch_optionals();
2428 $object->array_options = $objectsrc->array_options;
2431 if (!empty($objectsrc->multicurrency_code)) {
2432 $currency_code = $objectsrc->multicurrency_code;
2434 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2435 $currency_tx = $objectsrc->multicurrency_tx;
2443 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
2444 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
2445 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
2446 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
2447 $shipping_method_id = $soc->shipping_method_id;
2448 $warehouse_id = !empty($soc->fk_warehouse) ? $soc->fk_warehouse : $warehouse_id;
2449 $remise_percent = $soc->remise_percent;
2451 if (
isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
2452 $currency_code = $soc->multicurrency_code;
2457 if (!
GETPOST(
'changecompany')) {
2458 if (GETPOSTISSET(
'cond_reglement_id')) {
2459 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2461 if (GETPOSTISSET(
'deposit_percent')) {
2464 if (GETPOSTISSET(
'mode_reglement_id')) {
2465 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2467 if (GETPOSTISSET(
'fk_account')) {
2470 if (GETPOSTISSET(
'shipping_method_id')) {
2471 $shipping_method_id =
GETPOSTINT(
'shipping_method_id');
2475 if ($soc->fk_warehouse > 0) {
2476 $warehouse_id = $soc->fk_warehouse;
2483 $warehouse_id = $user->fk_warehouse;
2487 print
'<form name="addprop" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
2488 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2489 print
'<input type="hidden" name="action" value="add">';
2490 print
'<input type="hidden" name="changecompany" value="0">';
2491 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
2492 if ($origin !=
'project' && $originid) {
2493 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
2494 print
'<input type="hidden" name="originid" value="' . $originid .
'">';
2495 if ($origin ==
'contrat' && !empty($renewal)) {
2496 print
'<input type="hidden" name="renewal" value="' . $renewal .
'">';
2498 } elseif ($origin ==
'project' && !empty($projectid)) {
2499 print
'<input type="hidden" name="projectid" value="' . $projectid .
'">';
2505 $parameters = array();
2507 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters, $object, $action);
2508 if (empty($reshook)) {
2509 print
'<table class="border centpercent">';
2515 print
'<tr class="field_socid">';
2517 print
'<td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Customer') .
'</td>';
2518 $shipping_method_id = 0;
2522 print
'<td class="valuefieldcreate">';
2523 print $soc->getNomUrl(1,
'customer');
2524 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
2526 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2527 $shipping_method_id = $soc->shipping_method_id;
2530 print
'<td class="valuefieldcreate">';
2531 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2532 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2533 print $form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2537 $(document).ready(function() {
2538 $("#socid").change(function() {
2539 console.log("We have changed the company - Reload page");
2540 var socid = $(this).val();
2542 $("input[name=action]").val("create");
2543 $("input[name=changecompany]").val("1");
2544 $("form[name=addprop]").submit();
2549 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>';
2552 print
'</tr>' .
"\n";
2556 print
'<tr class="field_ref_client"><td class="titlefieldcreate">';
2557 print $form->textwithpicto($langs->trans(
'RefCustomer'), $langs->trans(
'RefOfOnCustomerSide', $langs->transnoentitiesnoconv(
"Proposal")));
2558 print
'</td><td class="valuefieldcreate">';
2559 print
'<input type="text" name="ref_client" value="' . (!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')) .
'"></td>';
2565 print
'<tr class="field_contactid"><td class="titlefieldcreate">' . $langs->trans(
"DefaultContact") .
'</td><td class="valuefieldcreate">';
2566 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2568 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2572 print
'<tr class="field_discount_info"><td class="titlefieldcreate">' . $langs->trans(
'Discounts') .
'</td><td class="valuefieldcreate">';
2574 $absolute_discount = $soc->getAvailableDiscounts();
2578 $backtopage = $_SERVER[
"PHP_SELF"] .
'?socid=' . $thirdparty->id .
'&action=' . $action .
'&origin=' . urlencode((
string) (
GETPOST(
'origin'))) .
'&originid=' . urlencode((
string) (
GETPOSTINT(
'originid')));
2579 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
2585 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Date') .
'</td><td class="valuefieldcreate">';
2586 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2587 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2591 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>';
2594 print
'<tr class="field_cond_reglement_id"><td class="nowrap">' . $langs->trans(
'PaymentConditionsShort') .
'</td><td>';
2595 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2597 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2601 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">' . $langs->trans(
'PaymentMode') .
'</td><td class="valuefieldcreate">';
2602 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2603 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2608 print
'<tr class="field_fk_account"><td class="titlefieldcreate">' . $langs->trans(
'BankAccount') .
'</td><td class="valuefieldcreate">';
2609 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"') . $form->select_comptes((
int) $fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2614 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">' . $langs->trans(
'Source') .
'</td><td class="valuefieldcreate">';
2615 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2616 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2621 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2622 $shipping_method_id = $soc->shipping_method_id;
2624 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">' . $langs->trans(
'SendingMethod') .
'</td><td class="valuefieldcreate">';
2625 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2626 $form->selectShippingMethod((
string) $shipping_method_id,
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2630 $formproduct =
null;
2633 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
2635 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">' . $langs->trans(
'Warehouse') .
'</td><td class="valuefieldcreate">';
2636 print
img_picto(
'',
'stock',
'class="pictofixedwidth"') . $formproduct->selectWarehouses((
int) $warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2641 print
'<tr class="field_availability_id"><td class="titlefieldcreate">' . $langs->trans(
'AvailabilityPeriod');
2643 print
' (' . $langs->trans(
'AfterOrder') .
')';
2645 print
'</td><td class="valuefieldcreate">';
2646 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2647 print $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx', 1);
2651 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">' . $langs->trans(
"DeliveryDate") .
'</td>';
2652 print
'<td class="valuefieldcreate">';
2653 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2655 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2656 $syear =
date(
"Y", $tmpdte);
2657 $smonth =
date(
"m", $tmpdte);
2658 $sday =
date(
"d", $tmpdte);
2659 print $form->selectDate($syear .
"-" . $smonth .
"-" . $sday,
'date_livraison', 0, 0, 0,
"addprop");
2661 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2662 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2667 if (
isModEnabled(
'project') && is_object($formproject)) {
2668 $langs->load(
"projects");
2669 print
'<tr class="field_projectid">';
2670 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2671 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');
2672 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>';
2679 print
'<tr class="field_incoterm_id">';
2680 print
'<td class="titlefieldcreate"><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1) .
'</label></td>';
2681 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2682 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2683 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2688 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td colspan="3">';
2689 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
2693 include_once DOL_DOCUMENT_ROOT .
'/core/modules/propale/modules_propale.php';
2695 if (is_array($list) && count($list) > 0) {
2696 print
'<tr class="field_model">';
2697 print
'<td class="titlefieldcreate">' . $langs->trans(
"DefaultModel") .
'</td>';
2698 print
'<td class="valuefieldcreate">';
2699 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2701 print $form->selectarray(
'model', $list, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2707 print
'<tr class="field_currency">';
2708 print
'<td class="titlefieldcreate">' . $form->editfieldkey(
'Currency',
'multicurrency_code',
'', $object, 0) .
'</td>';
2709 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2710 print
img_picto(
'',
'currency',
'class="pictofixedwidth"') . $form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2715 print
'<tr class="field_note_public">';
2716 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePublic') .
'</td>';
2717 print
'<td class="valuefieldcreate">';
2718 $note_public =
GETPOST(
'note_public',
'restricthtml');
2719 if (!GETPOSTISSET(
'note_public') && empty($note_public) && !empty($objectsrc)) {
2720 $note_public = $objectsrc->note_public;
2722 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2723 print $doleditor->Create(1);
2726 if (empty($user->socid)) {
2727 print
'<tr class="field_note_private">';
2728 print
'<td class="titlefieldcreate tdtop">' . $langs->trans(
'NotePrivate') .
'</td>';
2729 print
'<td class="valuefieldcreate">';
2730 $note_private =
GETPOST(
'note_private',
'restricthtml');
2731 if (!GETPOSTISSET(
'note_private') && empty($note_private) && !empty($objectsrc)) {
2732 $note_private = $objectsrc->note_private;
2734 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2735 print $doleditor->Create(1);
2741 if (
getDolGlobalInt(
'THIRDPARTY_PROPAGATE_EXTRAFIELDS_TO_PROPAL') && $socid > 0) {
2742 $thirdpartytopropagateextrafieldsfrom = $soc;
2744 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_add.tpl.php';
2747 if (!empty($origin) && !empty($originid) && is_object($objectsrc) && !empty($classname)) {
2749 if ($origin ==
'contrat') {
2751 $objectsrc->update_price(1,
'auto', 1);
2754 print
"\n<!-- " . $classname .
" info -->";
2756 print
'<input type="hidden" name="amount" value="' . $objectsrc->total_ht .
'">' .
"\n";
2757 print
'<input type="hidden" name="total" value="' . $objectsrc->total_ttc .
'">' .
"\n";
2758 print
'<input type="hidden" name="tva" value="' . $objectsrc->total_tva .
'">' .
"\n";
2759 print
'<input type="hidden" name="origin" value="' . $objectsrc->element .
'">';
2760 print
'<input type="hidden" name="originid" value="' . $objectsrc->id .
'">';
2762 $newclassname = $classname;
2763 if ($newclassname ==
'Propal') {
2764 $newclassname =
'CommercialProposal';
2765 } elseif ($newclassname ==
'Commande') {
2766 $newclassname =
'Order';
2767 } elseif ($newclassname ==
'Expedition') {
2768 $newclassname =
'Sending';
2769 } elseif ($newclassname ==
'Fichinter') {
2770 $newclassname =
'Intervention';
2773 print
'<tr><td>' . $langs->trans($newclassname) .
'</td><td>' . $objectsrc->getNomUrl(1) .
'</td></tr>';
2774 print
'<tr><td>' . $langs->trans(
'AmountHT') .
'</td><td>' .
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td></tr>';
2775 print
'<tr><td>' . $langs->trans(
'AmountVAT') .
'</td><td>' .
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2776 if (
$mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2777 print
'<tr><td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2780 if (
$mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2781 print
'<tr><td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td><td>' .
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2783 print
'<tr><td>' . $langs->trans(
'AmountTTC') .
'</td><td>' .
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
"</td></tr>";
2786 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountHT') .
'</td><td>' .
price($objectsrc->multicurrency_total_ht) .
'</td></tr>';
2787 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountVAT') .
'</td><td>' .
price($objectsrc->multicurrency_total_tva) .
"</td></tr>";
2788 print
'<tr><td>' . $langs->trans(
'MulticurrencyAmountTTC') .
'</td><td>' .
price($objectsrc->multicurrency_total_ttc) .
"</td></tr>";
2800 print
'<input type="hidden" name="createmode" value="empty">';
2804 print
'<br><table>';
2808 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2809 print
'<td>' . $langs->trans(
"CopyPropalFrom") .
' </td>';
2811 $liste_propal = array();
2812 $liste_propal[0] =
'';
2814 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2815 $sql .=
" FROM " . MAIN_DB_PREFIX .
"propal p";
2816 $sql .=
", " . MAIN_DB_PREFIX .
"societe s";
2817 $sql .=
" WHERE s.rowid = p.fk_soc";
2818 $sql .=
" AND p.entity IN (" .
getEntity(
'propal') .
")";
2819 $sql .=
" AND p.fk_statut <> 0";
2820 $sql .=
" ORDER BY Id";
2822 $resql =
$db->query($sql);
2824 $num =
$db->num_rows($resql);
2827 $row =
$db->fetch_row($resql);
2828 $propalRefAndSocName = $row[1] .
" - " . $row[2];
2829 $liste_propal[$row[0]] = $propalRefAndSocName;
2832 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2838 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2839 print
'<td valign="top" colspan="2">' . $langs->trans(
"CreateEmptyPropal") .
'</td></tr>';
2846 $langs->load(
"bills");
2848 print $form->buttonsSaveCancel(
"CreateDraft");
2854 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2857 $title = $langs->trans(
'ProductsAndServices');
2860 print
'<div class="div-table-responsive-no-min">';
2861 print
'<table class="noborder centpercent">';
2863 $objectsrc->printOriginLinesList();
2880 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
$object->picto, 0,
'',
'', 0,
'', 1);
2885 if ($action ==
'clone') {
2887 $filter =
'(s.client:IN:1,2,3)';
2888 $formquestion = array(
2891 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2892 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2893 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2896 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2899 $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);
2903 if ($action ==
'add_title_line') {
2904 $langs->load(
'subtotals');
2906 $depth_array =
$object->getPossibleLevels($langs);
2908 } elseif ($action ==
'add_subtotal_line') {
2909 $langs->load(
'subtotals');
2911 $titles =
$object->getPossibleTitles();
2913 } elseif ($action ==
'add_text_line') {
2914 $langs->load(
'subtotals');
2919 if ($action ==
'closeas') {
2921 $formquestion = array();
2923 $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)));
2925 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2927 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2932 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2934 if (!empty($deposit_percent_from_payment_terms) &&
isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2935 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2939 $eligibleForDepositGeneration =
true;
2941 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2942 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2943 '@phan-var-force Facture $invoice';
2946 $eligibleForDepositGeneration =
false;
2952 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2953 foreach (
$object->linkedObjects[
'commande'] as $order) {
2954 $order->fetchObjectLinked();
2956 if (array_key_exists(
'facture', $order->linkedObjects)) {
2957 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2958 '@phan-var-force Facture $invoice';
2961 $eligibleForDepositGeneration =
false;
2970 if ($eligibleForDepositGeneration) {
2971 $formquestion[] = array(
2972 'type' =>
'checkbox',
2973 'tdclass' =>
'showonlyifsigned',
2974 'name' =>
'generate_deposit',
2975 'morecss' =>
'margintoponly marginbottomonly',
2976 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2979 $formquestion[] = array(
2981 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2983 'label' => $langs->trans(
'DateInvoice'),
2989 $formquestion[] = array(
2991 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2992 'name' =>
'date_pointoftax',
2993 'label' => $langs->trans(
'DatePointOfTax'),
2999 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
3001 $formquestion[] = array(
3003 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
3004 'name' =>
'cond_reglement_id',
3005 'label' => $langs->trans(
'PaymentTerm'),
3006 'value' => $paymentTermsSelect
3009 $formquestion[] = array(
3010 'type' =>
'checkbox',
3011 'tdclass' =>
'showonlyifgeneratedeposit',
3012 'name' =>
'validate_generated_deposit',
3013 'morecss' =>
'margintoponly marginbottomonly',
3014 'label' => $langs->trans(
'ValidateGeneratedDeposit')
3017 $formquestion[] = array(
3018 'type' =>
'onecolumn',
3021 let signedValue = ' . $object::STATUS_SIGNED .
';
3023 $(document).ready(function() {
3024 $("[name=generate_deposit]").change(function () {
3025 let $self = $(this);
3026 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
3028 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
3037 $("#statut").change(function() {
3038 let $target = $(".showonlyifsigned").parent(".tagtr");
3040 if ($(this).val() == signedValue) {
3046 $("[name=generate_deposit]").trigger("change");
3051 $("#statut").trigger("change");
3061 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
3063 $formquestion = array_merge($formquestion, array(
3064 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid, $object)),
3069 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
3071 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
3073 } elseif ($action ==
'cancel') {
3075 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
3076 } elseif ($action ==
'delete') {
3078 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
3079 } elseif ($action ==
'reopen') {
3081 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
3082 } elseif ($action ==
'ask_deleteline') {
3084 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
3085 } elseif ($action ==
'ask_subtotal_deleteline') {
3087 $langs->load(
"subtotals");
3088 $title =
"DeleteSubtotalLine";
3089 $question =
"ConfirmDeleteSubtotalLine";
3090 if (
GETPOST(
'type') ==
'title') {
3091 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
3092 $title =
"DeleteTitleLine";
3093 $question =
"ConfirmDeleteTitleLine";
3095 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
3096 } elseif ($action ==
'validate') {
3101 $ref = substr(
$object->ref, 1, 4);
3102 if ($ref ==
'PROV' || $ref ==
'') {
3103 $numref =
$object->getNextNumRef($soc);
3104 if (empty($numref)) {
3112 $text = $langs->trans(
'ConfirmValidateProp', $numref);
3114 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
3117 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid, $object);
3122 foreach (
$object->lines as $line) {
3123 $res = $line->fetch_product();
3125 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
3131 if ($nbMandated > 0) {
3133 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
3136 $text .=
'<div><span class="clearboth nowraponall warning">' .
img_warning() . $langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate") .
'</span></div>';
3141 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
3146 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
3147 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
3148 if (empty($reshook)) {
3149 $formconfirm .= $hookmanager->resPrint;
3150 } elseif ($reshook > 0) {
3151 $formconfirm = $hookmanager->resPrint;
3160 $linkback =
'<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
3162 $morehtmlref =
'<div class="refidno">';
3164 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client, $object, $usercancreate,
'string',
'', 0, 1);
3165 $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);
3167 $morehtmlref .=
'<br>' . $soc->getNomUrl(1,
'customer');
3169 $morehtmlref .=
' (<a href="' . DOL_URL_ROOT .
'/comm/propal/list.php?socid=' . ((int) $soc->id) .
'">' . $langs->trans(
"OtherProposals") .
'</a>)';
3173 $langs->load(
"projects");
3174 $morehtmlref .=
'<br>';
3175 if ($usercancreate) {
3176 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
3177 if ($action !=
'classify') {
3178 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
3180 $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');
3182 if (!empty(
$object->fk_project)) {
3184 $proj->fetch(
$object->fk_project);
3185 $morehtmlref .= $proj->getNomUrl(1);
3187 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
3192 $morehtmlref .=
'</div>';
3195 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
3198 $parameters = array();
3200 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters, $object, $action);
3201 if (empty($reshook)) {
3202 print
'<div class="fichecenter">';
3203 print
'<div class="fichehalfleft">';
3204 print
'<div class="underbanner clearboth"></div>';
3206 print
'<table class="border tableforfield centpercent">';
3210 $filterabsolutediscount =
"fk_facture_source IS NULL";
3211 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3213 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3214 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3217 print
'<tr><td class="titlefieldmax45">' . $langs->trans(
'Discounts') .
'</td><td>';
3219 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3220 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3221 $absolute_discount =
price2num($absolute_discount,
'MT');
3222 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3228 $backtopage = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id;
3229 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_discounts.tpl.php';
3245 print $form->editfieldkey(
"DatePropal",
'date',
'', $object, (
int) $editenable);
3246 print
'</td><td class="valuefield">';
3247 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3248 print
'<form name="editdate" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3249 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3250 print
'<input type="hidden" name="action" value="setdate">';
3251 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3252 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3253 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3267 print
'<table class="nobordernopadding centpercent"><tr><td>';
3268 print $langs->trans(
'DateEndPropal');
3270 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3271 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>';
3273 print
'</tr></table>';
3274 print
'</td><td class="valuefield">';
3275 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3276 print
'<form name="editecheance" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3277 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3278 print
'<input type="hidden" name="action" value="setecheance">';
3279 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
3280 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3281 print
'<input type="submit" class="button button-edit" value="' . $langs->trans(
'Modify') .
'">';
3284 if (!empty(
$object->fin_validite)) {
3298 print
'<table class="nobordernopadding centpercent"><tr><td>';
3299 print $langs->trans(
'PaymentConditionsShort');
3301 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3302 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>';
3304 print
'</tr></table>';
3305 print
'</td><td class="valuefield">';
3306 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3307 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3309 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3315 print
'<tr class="field_mode_reglement_id">';
3317 print
'<table class="nobordernopadding centpercent"><tr><td>';
3318 print $langs->trans(
'PaymentMode');
3320 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3321 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>';
3323 print
'</tr></table>';
3324 print
'</td><td class="valuefieldcreate">';
3325 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3326 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3328 $form->form_modes_reglement($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->mode_reglement_id,
'none');
3333 print
'<tr class="fielddeliverydelay"><td>';
3334 print
'<table class="nobordernopadding centpercent"><tr><td>';
3336 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod') .
' (' . $langs->trans(
'AfterOrder') .
')');
3338 print $langs->trans(
'AvailabilityPeriod');
3341 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3342 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>';
3344 print
'</tr></table>';
3345 print
'</td><td class="valuefield">';
3346 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3347 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'availability_id', $langs->trans(
"Delay"));
3349 $form->form_availability($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->availability_id,
'none', 1);
3357 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3358 print
'</td><td class="valuefieldedit">';
3359 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date, $object, $usercancreate && $caneditfield,
'datepicker');
3366 print
'<table class="nobordernopadding centpercent"><tr><td>';
3367 print $langs->trans(
'SendingMethod');
3369 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3370 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>';
3372 print
'</tr></table>';
3373 print
'</td><td class="valuefield">';
3374 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3375 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3377 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->shipping_method_id,
'none');
3385 $langs->load(
'stocks');
3386 require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
3388 print
'<tr class="field_warehouse_id"><td>';
3389 $editenable = $usercancreate;
3390 print $form->editfieldkey(
"Warehouse",
'warehouse',
'', $object, $editenable);
3391 print
'</td><td class="valuefieldcreate">';
3392 if ($action ==
'editwarehouse') {
3393 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3395 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->warehouse_id,
'none');
3403 print
'<table class="nobordernopadding centpercent"><tr><td>';
3404 print $langs->trans(
'Source');
3406 if ($action !=
'editdemandreason' && $usercancreate) {
3407 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>';
3409 print
'</tr></table>';
3410 print
'</td><td class="valuefield">';
3411 if ($action ==
'editdemandreason' && $usercancreate) {
3412 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3414 $form->formInputReason($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->demand_reason_id,
'none');
3419 if ($soc->outstanding_limit) {
3422 print $langs->trans(
'OutstandingBill');
3423 print
'</td><td class="valuefield">';
3424 $arrayoutstandingbills = $soc->getOutstandingBills();
3425 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
3426 print
price($arrayoutstandingbills[
'opened']) .
' / ';
3427 print
price($soc->outstanding_limit, 0, $langs, 1, -1, -1,
$conf->currency);
3435 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3436 print $langs->trans(
'BankAccount');
3438 if ($action !=
'editbankaccount' && $usercancreate) {
3439 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>';
3441 print
'</tr></table>';
3442 print
'</td><td class="valuefield">';
3443 if ($action ==
'editbankaccount') {
3444 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3446 $form->formSelectAccount($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, (
string)
$object->fk_account,
'none');
3453 $tmparray =
$object->getTotalWeightVolume();
3454 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3455 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3457 print
'<tr><td>' . $langs->trans(
"CalculatedWeight") .
'</td>';
3458 print
'<td class="valuefield">';
3463 print
'<tr><td>' . $langs->trans(
"CalculatedVolume") .
'</td>';
3464 print
'<td class="valuefield">';
3473 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3474 print $langs->trans(
'IncotermLabel');
3475 print
'<td><td class="right">';
3476 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3477 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' .
img_edit() .
'</a>';
3481 print
'</td></tr></table>';
3483 print
'<td class="valuefield">';
3484 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3485 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3487 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3495 print
'<table class="nobordernopadding centpercent"><tr><td>';
3496 print $langs->trans(
"Categories");
3497 print
'<td><td class="right">';
3498 if ($usercancreate) {
3499 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=edittags&token='.
newToken().
'">'.
img_edit().
'</a>';
3503 print
'</td></tr></table>';
3506 if ($action ==
'edittags') {
3507 print
'<form method="POST" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'">';
3508 print
'<input type="hidden" name="action" value="settags">';
3509 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3510 print $form->selectCategories(Categorie::TYPE_PROPOSAL,
'categories', $object);
3511 print
'<input type="submit" class="button valignmiddle smallpaddingimp" value="'.$langs->trans(
"Modify").
'">';
3514 print $form->showCategories(
$object->id, Categorie::TYPE_PROPOSAL, 1);
3520 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3525 print
'<div class="fichehalfright">';
3526 print
'<div class="underbanner clearboth"></div>';
3528 print
'<table class="border tableforfield centpercent">';
3530 include DOL_DOCUMENT_ROOT .
'/core/tpl/object_currency_amount.tpl.php';
3533 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3534 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3536 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3541 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3542 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3544 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3548 if (
$mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3550 print
'<td>' . $langs->transcountry(
"AmountLT1",
$mysoc->country_code) .
'</td>';
3551 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3555 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3560 if (
$mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3562 print
'<td>' . $langs->transcountry(
"AmountLT2",
$mysoc->country_code) .
'</td>';
3563 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3567 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3573 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3574 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3576 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3584 $formmargin->displayMarginInfos($object);
3590 print
'<div class="clearboth"></div><br>';
3593 $blocname =
'contacts';
3594 $title = $langs->trans(
'ContactsAddresses');
3595 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3599 $blocname =
'notes';
3600 $title = $langs->trans(
'Notes');
3601 include DOL_DOCUMENT_ROOT .
'/core/tpl/bloc_showhide.tpl.php';
3609 $result =
$object->getLinesArray();
3613 global $inputalsopricewithtax;
3614 $inputalsopricewithtax = 1;
3616 print
' <form name="addproduct" id="addproduct" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="POST">
3617 <input type="hidden" name="token" value="' .
newToken() .
'">
3618 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline') .
'">
3619 <input type="hidden" name="mode" value="">
3620 <input type="hidden" name="page_y" value="">
3621 <input type="hidden" name="backtopage" value="' . $backtopage .
'">
3622 <input type="hidden" name="id" value="' .
$object->id .
'">
3627 include DOL_DOCUMENT_ROOT .
'/core/tpl/subtotal_ajaxrow.tpl.php';
3629 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3633 print
'<div class="div-table-responsive-no-min">';
3635 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3644 if ($action !=
'editline') {
3645 $parameters = array();
3646 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3650 if (empty($reshook)) {
3654 $parameters = array();
3655 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters, $object, $action);
3674 if ($action !=
'presend') {
3675 $numlines = count(
$object->lines);
3676 print
'<div class="tabsAction">';
3678 $parameters = array();
3679 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3681 if (empty($reshook)) {
3682 if ($action !=
'editline') {
3686 $langs->load(
'subtotals');
3688 $url_button = array();
3690 $url_button[] = array(
3691 'lang' =>
'subtotals',
3693 'perm' => (
bool) $usercancreate,
3694 'label' => $langs->trans(
'AddTitleLine'),
3695 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_title_line&token=' .
newToken()
3698 $url_button[] = array(
3699 'lang' =>
'subtotals',
3701 'perm' => (
bool) $usercancreate,
3702 'label' => $langs->trans(
'AddSubtotalLine'),
3703 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_subtotal_line&token=' .
newToken()
3706 $url_button[] = array(
3707 'lang' =>
'subtotals',
3709 'perm' => (
bool) $usercancreate,
3710 'label' => $langs->trans(
'AddTextLine'),
3711 'url' =>
'/comm/propal/card.php?id=' .
$object->id .
'&action=add_text_line&token=' .
newToken()
3714 print
dolGetButtonAction(
'', $langs->trans(
'SubTotal'),
'default', $url_button,
'',
true);
3721 if ($usercanvalidate) {
3722 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>';
3724 print
'<a class="butActionRefused classfortooltip" href="#">' . $langs->trans(
'Validate') .
'</a>';
3734 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=modif&token=' .
newToken() .
'">' . $langs->trans(
'Modify') .
'</a>';
3739 if ($usercanreopen) {
3740 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=reopen&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen') .
'"';
3741 print
'>' . $langs->trans(
'ReOpen') .
'</a>';
3743 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ReOpen") .
'</a>';
3748 if (empty($user->socid)) {
3750 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'', $usercansend);
3754 $arrayforbutaction = array();
3757 $arrayforbutaction[] = array(
3760 'perm' => $usercancreateorder,
3761 'label' =>
'AddOrder',
3762 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3772 $arrayforbutaction[] = array(
3775 'perm' => $usercancreatepurchaseorder,
3776 'label' =>
'AddPurchaseOrder',
3777 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3787 $arrayforbutaction[] = array(
3788 'lang' =>
'interventions',
3790 'perm' => $usercancreateintervention,
3791 'label' =>
'AddIntervention',
3792 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3802 $arrayforbutaction[] = array(
3803 'lang' =>
'contracts',
3805 'perm' => $usercancreatecontract,
3806 'label' =>
'AddContract',
3807 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3819 $arrayforbutaction[] = [
3820 'lang' =>
'invoice',
3822 'perm' => $usercancreateinvoice,
3823 'label' =>
'CreateBill',
3824 'url' =>
'/compta/facture/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((int)
$object->id) .
'&socid=' . ((int)
$object->socid),
3831 $actionButtonsParameters = [
3832 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3833 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3836 if ($numlines > 0) {
3837 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3839 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3843 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3844 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3845 if ($usercanclose) {
3846 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=classifybilled&token=' .
newToken() .
'&socid=' .
$object->socid .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3848 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'">' . $langs->trans(
"ClassifyBilled") .
'</a>';
3856 if ($usercanclose) {
3857 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3858 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3860 print
'<a class="butActionRefused classfortooltip" href="#" title="' . $langs->trans(
"NotEnoughPermissions") .
'"';
3861 print
'>' . $langs->trans(
'SetAcceptedRefused') .
'</a>';
3867 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token=' .
newToken() .
'&action=closeas&token=' .
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3868 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3874 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=cancel&token=' .
newToken() .
'">' . $langs->trans(
"CancelPropal") .
'</a>';
3878 if ($usercancreate) {
3879 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>';
3883 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=delete&token=' .
newToken(),
'delete', $usercandelete);
3891 if (
GETPOST(
'modelselected')) {
3892 $action =
'presend';
3895 if ($action !=
'presend') {
3896 print
'<div class="fichecenter"><div class="fichehalfleft">';
3897 print
'<a name="builddoc"></a>';
3903 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3904 $genallowed = $usercanread;
3905 $delallowed = $usercancreate;
3906 $tooltipAfterComboOfModels =
'';
3908 $tooltipAfterComboOfModels = $langs->trans(
"AccordingToYourSetupTheFileWillBeConcatenated",
getDolGlobalString(
'MAIN_INFO_PROPAL_TERMSOFSALE'));
3911 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);
3914 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'propal'), 1);
3915 $linktoelem = $tmparray[
'linktoelem'];
3916 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3917 print $htmltoenteralink;
3919 $compatibleImportElementsList =
false;
3921 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3923 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, $compatibleImportElementsList);
3929 print
'<br><!-- Link to sign -->';
3930 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3931 print showOnlineSignatureUrl(
'proposal',
$object->ref, $object) .
'<br>';
3934 print
'</div><div class="fichehalfright">';
3938 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/comm/propal/messaging.php?id=' .
$object->id);
3939 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT .
'/comm/propal/agenda.php?id=' .
$object->id);
3942 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3944 $somethingshown = $formactions->showactions($object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3946 print
'</div></div>';
3950 $modelmail =
'propal_send';
3951 $defaulttopic =
'SendPropalRef';
3953 $trackid =
'pro' .
$object->id;
3955 include DOL_DOCUMENT_ROOT .
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage a WYSIWYG editor.
static createDepositFromOrigin(CommonObject $origin, $date, $payment_terms_id, User $user, $notrigger=0, $autoValidateDeposit=false, $overrideFields=array())
Creates a deposit from a proposal or an order by grouping lines by VAT rates.
const TYPE_DEPOSIT
Deposit invoice.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage the table of subscription to notifications.
Class ProductCombination Used to represent the relation between a product and one of its variants.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
Class to manage projects.
Class to manage proposals.
const STATUS_DRAFT
Draft status.
const STATUS_SIGNED
Signed quote.
const STATUS_NOTSIGNED
Not signed quote.
const STATUS_BILLED
Billed or processed quote.
const STATUS_CANCELED
Canceled status.
const STATUS_VALIDATED
Validated status.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
$date_start
Variables from include:
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
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.
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.
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.
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...
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.
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.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
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.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
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
propal_prepare_head($object)
Prepare array with list of tabs.
print $langs trans('Date')." left Ref Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right Paid right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.