47require
'../../main.inc.php';
48require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
50require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formpropal.class.php';
51require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmargin.class.php';
52require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
53require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/modules/propale/modules_propale.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/lib/propal.lib.php';
56require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
57require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
58require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
59if (isModEnabled(
'project')) {
60 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
61 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
64if (isModEnabled(
'variants')) {
65 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination.class.php';
78$langs->loadLangs(array(
'companies',
'propal',
'compta',
'bills',
'orders',
'products',
'deliveries',
'sendings',
'other'));
79if (isModEnabled(
'incoterm')) {
80 $langs->load(
'incoterm');
82if (isModEnabled(
'margin')) {
83 $langs->load(
'margins');
88$array_options = array();
93$action =
GETPOST(
'action',
'aZ09');
94$cancel =
GETPOST(
'cancel',
'alpha');
95$origin =
GETPOST(
'origin',
'alpha');
97$confirm =
GETPOST(
'confirm',
'alpha');
98$backtopage =
GETPOST(
'backtopage',
'alpha');
113$extrafields->fetch_name_optionals_label(
$object->table_element);
116if ($id > 0 || !empty($ref)) {
117 $ret =
$object->fetch($id, $ref);
119 $ret =
$object->fetch_thirdparty();
120 if ($ret > 0 && isset(
$object->fk_project)) {
121 $ret =
$object->fetchProject();
131$hookmanager->initHooks(array(
'propalcard',
'globalcard'));
133$usercanread = $user->hasRight(
"propal",
"lire");
134$usercancreate = $user->hasRight(
"propal",
"creer");
135$usercandelete = $user->hasRight(
"propal",
"supprimer");
137$usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'close')));
138$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'validate')));
141$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
142$usercancreateorder = ($user->hasRight(
'commande',
'creer') == 1);
143$usercancreateinvoice = ($user->hasRight(
'facture',
'creer') == 1);
144$usercancreatecontract = ($user->hasRight(
'contrat',
'creer') == 1);
145$usercancreateintervention = ($user->hasRight(
'ficheinter',
'creer') == 1);
146$usercancreatepurchaseorder = ($user->hasRight(
'fournisseur',
'commande',
'creer') || $user->hasRight(
'supplier_order',
'creer'));
147$usercanreopen = ((!
getDolGlobalBool(
'MAIN_USE_ADVANCED_PERMS') && $usercanclose) || (
getDolGlobalBool(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'reopen')));
149 $usercanreopen =
false;
152$permissiontoadd = $usercancreate;
153$permissionnote = $usercancreate;
154$permissiondellink = $usercancreate;
155$permissiontoedit = $usercancreate;
156$permissiontoeditextra = $permissiontoadd;
157if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
159 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
162$price_base_type =
null;
163$shipping_method_id =
null;
167if (!empty($user->socid)) {
168 $socid = $user->socid;
177$parameters = array(
'socid' => $socid);
178$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
182if (empty($reshook)) {
183 $backurlforlist = DOL_URL_ROOT.
'/comm/propal/list.php';
185 if (empty($backtopage) || ($cancel && empty($id))) {
186 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
187 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
188 $backtopage = $backurlforlist;
190 $backtopage = DOL_URL_ROOT.
'/comm/propal/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
196 if (!empty($backtopageforcancel)) {
197 header(
"Location: ".$backtopageforcancel);
199 } elseif (!empty($backtopage)) {
200 header(
"Location: ".$backtopage);
206 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
208 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
210 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
212 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
214 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'IdThirdParty')),
null,
'errors');
227 $date_delivery_old =
$object->delivery_date;
228 if (!empty($date_delivery_old) && !empty($date_delivery)) {
239 $difference = $date_delivery - $old_date_delivery;
240 if ($difference != 0) {
241 $object->delivery_date = $date_delivery;
242 foreach (
$object->lines as $line) {
243 if (isset($line->date_start)) {
244 $line->date_start += $difference;
246 if (isset($line->date_end)) {
247 $line->date_end += $difference;
254 $result =
$object->createFromClone($user, $socid, (GETPOSTISSET(
'entity') ?
GETPOSTINT(
'entity') : null), (
GETPOST(
'update_prices') ==
'on'), (
GETPOST(
'update_desc') ==
'on'));
256 $warningMsgLineList = array();
258 foreach (
$object->lines as $line) {
259 if (!is_object($line->product)) {
260 $line->fetch_product();
262 if (is_object($line->product) && $line->product->id > 0) {
263 if (empty($line->product->status)) {
264 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
268 if (!empty($warningMsgLineList)) {
272 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
275 if (count(
$object->errors) > 0) {
282 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanclose) {
284 $result =
$object->setCancel($user);
286 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
289 $langs->load(
"errors");
292 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
294 $result =
$object->delete($user);
296 header(
'Location: '.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1');
299 $langs->load(
"errors");
302 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
304 $result =
$object->deleteLine($lineid);
309 $langs->load(
"errors");
315 $outputlangs = $langs;
318 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
319 $outputlangs->setDefaultLang($newlang);
325 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
328 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
330 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $usercancreate) {
335 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'));
340 $outputlangs = $langs;
346 $newlang =
$object->thirdparty->default_lang;
348 if (!empty($newlang)) {
350 $outputlangs->setDefaultLang($newlang);
351 $outputlangs->load(
'products');
355 $result =
$object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
358 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
365 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
368 $result =
$object->valid($user);
370 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
378 $outputlangs = $langs;
381 $newlang =
GETPOST(
'lang_id',
'aZ09');
384 $newlang =
$object->thirdparty->default_lang;
386 if (!empty($newlang)) {
388 $outputlangs->setDefaultLang($newlang);
392 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
395 $langs->load(
"errors");
396 if (count(
$object->errors) > 0) {
402 } elseif ($action ==
'setdate' && $usercancreate) {
407 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
411 $result =
$object->set_date($user, $datep);
412 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
413 $datev = $datep + (
$object->duree_validite * 24 * 3600);
414 $result =
$object->set_echeance($user, $datev, 1);
419 $outputlangs = $langs;
422 $newlang =
GETPOST(
'lang_id',
'aZ09');
425 $newlang =
$object->thirdparty->default_lang;
427 if (!empty($newlang)) {
429 $outputlangs->setDefaultLang($newlang);
437 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
440 } elseif ($action ==
'setecheance' && $usercancreate) {
444 $outputlangs = $langs;
447 $newlang =
GETPOST(
'lang_id',
'aZ09');
450 $newlang =
$object->thirdparty->default_lang;
452 if (!empty($newlang)) {
454 $outputlangs->setDefaultLang($newlang);
462 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
467 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
472 } elseif ($action ==
'setref_client' && $usercancreate) {
478 } elseif ($action ==
'set_incoterms' && isModEnabled(
'incoterm') && $usercancreate) {
481 } elseif ($action ==
'add' && $usercancreate) {
491 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
495 if (empty($duration)) {
496 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
502 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
517 $object->delivery_date = $date_delivery;
523 $object->duree_validite = $duration;
533 $object->user_author_id = $user->id;
539 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
548 $object->delivery_date = $date_delivery;
563 $object->user_author_id = $user->id;
567 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
573 if (isModEnabled(
"multicurrency")) {
574 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
578 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
586 if ($origin && $originid) {
588 $element = $subelement = $origin;
590 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
592 $subelement = $regs[2];
596 if ($element ==
'order') {
597 $element = $subelement =
'commande';
599 if ($element ==
'propal') {
600 $element =
'comm/propal';
601 $subelement =
'propal';
603 if ($element ==
'contract') {
604 $element = $subelement =
'contrat';
606 if ($element ==
'inter') {
607 $element = $subelement =
'fichinter';
609 if ($element ==
'shipping') {
610 $element = $subelement =
'expedition';
614 $object->origin_id = $originid;
619 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
626 $classname = ucfirst($subelement);
627 $srcobject =
new $classname($db);
628 '@phan-var-force Commande|Propal|Contrat|Fichinter|Expedition $srcobject';
631 $result = $srcobject->fetch(
$object->origin_id);
634 $lines = $srcobject->lines;
635 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
636 $srcobject->fetch_lines();
637 $lines = $srcobject->lines;
641 $num = count($lines);
642 for ($i = 0; $i < $num; $i++) {
643 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
644 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
647 $product_type = ($lines[$i]->product_type ? (int) $lines[$i]->product_type : 0);
651 if ($lines[$i]->date_debut_prevue) {
652 $date_start = $lines[$i]->date_debut_prevue;
654 if ($lines[$i]->date_debut_reel) {
655 $date_start = $lines[$i]->date_debut_reel;
657 if ($lines[$i]->date_start) {
658 $date_start = $lines[$i]->date_start;
663 if ($lines[$i]->date_fin_prevue) {
664 $date_end = $lines[$i]->date_fin_prevue;
666 if ($lines[$i]->date_fin_reel) {
667 $date_end = $lines[$i]->date_fin_reel;
669 if ($lines[$i]->date_end) {
670 $date_end = $lines[$i]->date_end;
674 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
679 if (method_exists($lines[$i],
'fetch_optionals')) {
680 $lines[$i]->fetch_optionals();
681 $array_options = $lines[$i]->array_options;
684 $tva_tx = $lines[$i]->tva_tx;
685 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
686 $tva_tx .=
' ('.$lines[$i]->vat_src_code.
')';
689 $result =
$object->addline($desc, $lines[$i]->subprice, $lines[$i]->qty, $tva_tx, $lines[$i]->localtax1_tx, $lines[$i]->localtax2_tx, $lines[$i]->fk_product, $lines[$i]->remise_percent,
'HT', 0, $lines[$i]->info_bits, $product_type, $lines[$i]->rang, $lines[$i]->special_code, $fk_parent_line, $lines[$i]->fk_fournprice, $lines[$i]->pa_ht, $label, $date_start, $date_end, $array_options, $lines[$i]->fk_unit);
700 if ($result > 0 && $lines[$i]->product_type == 9) {
701 $fk_parent_line = $result;
706 $parameters = array(
'objFrom' => $srcobject);
707 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
728 if (
GETPOST(
'contactid') > 0) {
737 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
740 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
749 $outputlangs = $langs;
752 $newlang =
GETPOST(
'lang_id',
'aZ09');
755 $newlang =
$object->thirdparty->default_lang;
757 if (!empty($newlang)) {
759 $outputlangs->setDefaultLang($newlang);
764 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
770 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
783 } elseif ($action ==
'classifybilled' && $usercanclose) {
787 $result =
$object->classifyBilled($user, 0,
'');
798 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
801 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
803 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
804 $locationTarget =
'';
818 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
823 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
826 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
827 && !empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
829 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
832 $forceFields = array();
834 if (GETPOSTISSET(
'date_pointoftax')) {
842 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
853 $ret = $deposit->fetch($deposit->id);
854 $outputlangs = $langs;
858 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
859 $outputlangs->load(
'products');
862 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
869 if ($locationTarget) {
870 header(
'Location: ' . $locationTarget);
882 } elseif ($action ==
'confirm_reopen' && $usercanreopen && !
GETPOST(
'cancel',
'alpha')) {
889 $result =
$object->reopen($user, $newstatus);
906 $fromElement =
GETPOST(
'fromelement');
907 $fromElementid =
GETPOST(
'fromelementid');
908 $importLines =
GETPOST(
'line_checkbox');
910 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
911 if ($fromElement ==
'commande') {
913 $lineClassName =
'OrderLine';
914 } elseif ($fromElement ==
'propal') {
915 dol_include_once(
'/comm/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
916 $lineClassName =
'PropaleLigne';
917 } elseif ($fromElement ==
'facture') {
918 dol_include_once(
'/compta/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
919 $lineClassName =
'FactureLigne';
921 $lineClassName =
null;
923 $nextRang = count(
$object->lines) + 1;
926 foreach ($importLines as $lineId) {
927 $lineId = intval($lineId);
928 $originLine =
new $lineClassName($db);
929 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
930 $originLine->fetch_optionals();
931 $desc = $originLine->desc;
932 $pu_ht = $originLine->subprice;
933 $qty = $originLine->qty;
934 $txtva = $originLine->tva_tx;
935 $txlocaltax1 = $originLine->localtax1_tx;
936 $txlocaltax2 = $originLine->localtax2_tx;
937 $fk_product = $originLine->fk_product;
938 $remise_percent = $originLine->remise_percent;
939 $date_start = $originLine->date_start;
940 $date_end = $originLine->date_end;
941 $fk_code_ventilation = 0;
942 $info_bits = $originLine->info_bits;
943 $fk_remise_except = $originLine->fk_remise_except;
944 $price_base_type =
'HT';
946 $type = $originLine->product_type;
948 $special_code = $originLine->special_code;
949 $origin = $originLine->element;
950 $origin_id = $originLine->id;
952 $fk_fournprice = $originLine->fk_fournprice;
953 $pa_ht = $originLine->pa_ht;
954 $label = $originLine->label;
955 $array_options = $originLine->array_options;
956 $situation_percent = 100;
958 $fk_unit = $originLine->fk_unit;
959 $pu_ht_devise = $originLine->multicurrency_subprice;
961 $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);
977 } elseif ($action ==
'addline' &&
GETPOST(
'updateallvatlinesblock',
'alpha') &&
GETPOST(
'vatforblocklines',
'alpha') !==
'' && $usercancreate) {
978 $tx_tva =
GETPOST(
'vatforblocklines') ?
GETPOST(
'vatforblocklines') : 0;
979 $object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'tva', $tx_tva);
980 } elseif ($action ==
'addline' &&
GETPOST(
'updatealldiscountlinesblock',
'alpha') &&
GETPOST(
'discountforblocklines',
'alpha') !==
'' && $usercancreate) {
981 $discount =
GETPOST(
'discountforblocklines') ?
GETPOST(
'discountforblocklines') : 0;
982 $object->updateSubtotalLineBlockLines($langs,
$object->getRangOfLine($lineid),
'discount', $discount);
985 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
988 $actiontypecode =
'AC_OTH_AUTO';
989 $triggersendname =
'PROPAL_SENTBYMAIL';
990 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
991 $trackid =
'pro'.$object->id;
992 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
996 if ($action ==
'modif' && $usercancreate) {
997 $result =
$object->setDraft($user);
1004 $outputlangs = $langs;
1007 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1008 $outputlangs->setDefaultLang($newlang);
1014 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1016 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
1025 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
1029 foreach (
$object->lines as $key => $line) {
1030 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1033 if ($line->product_type == 1) {
1034 $result =
$object->updateline($line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $alldate_start, $alldate_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
1038 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
1040 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
1041 $vat_rate = str_replace(
'*',
'', $vat_rate);
1044 foreach (
$object->lines as $key => $line) {
1045 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1048 $result =
$object->updateline($line->id, $line->subprice, $line->qty, $line->remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
1051 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
1053 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
1054 $remise_percent = str_replace(
'*',
'', $remise_percent);
1055 foreach (
$object->lines as $key => $line) {
1056 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1059 $tvatx = $line->tva_tx;
1060 if (!empty($line->vat_src_code)) {
1061 $tvatx .=
' ('.$line->vat_src_code.
')';
1063 $result =
$object->updateline($line->id, $line->subprice, $line->qty, (
float) $remise_percent, $tvatx, $line->localtax1_tx, $line->localtax2_tx, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice);
1066 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'' && $usercancreate) {
1068 $margin_rate = (
GETPOST(
'marginforalllines',
'alpha') ?
GETPOST(
'marginforalllines',
'alpha') : 0);
1069 foreach (
$object->lines as $key => $line) {
1070 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1073 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
1075 $prod->fetch($line->fk_product);
1076 if ($prod->price_min > $subprice) {
1077 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1078 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1079 setEventMessages($prod->ref.
' - '.$prod->label.
' ('.$price_subprice.
' < '.$price_price_min.
' '.strtolower($langs->trans(
"MinPrice")).
')'.
"\n",
null,
'warnings');
1082 if ($line->subprice <> 0) {
1083 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1085 $multicurrency_subprice = 0;
1088 $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);
1105 } elseif ($action ==
'confirm_addtitleline' && $usercancreate) {
1108 $langs->load(
'subtotals');
1110 $desc =
GETPOST(
'subtotallinedesc',
'alphanohtml');
1111 $depth =
GETPOSTINT(
'subtotallinelevel') ?? 1;
1113 $subtotal_options = array();
1115 foreach (Propal::$TITLE_OPTIONS as $option) {
1116 $value =
GETPOST($option,
'alphanohtml');
1118 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1123 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1134 $outputlangs = $langs;
1135 $newlang =
GETPOST(
'lang_id',
'alpha');
1137 $newlang =
$object->thirdparty->default_lang;
1139 if (!empty($newlang)) {
1141 $outputlangs->setDefaultLang($newlang);
1144 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1149 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
1151 } elseif ($action ==
'confirm_addsubtotalline' && $usercancreate) {
1154 $langs->load(
'subtotals');
1156 $choosen_line =
GETPOST(
'subtotaltitleline',
'alphanohtml');
1157 foreach (
$object->lines as $line) {
1158 if ($line->desc == $choosen_line && $line->special_code == SUBTOTALS_SPECIAL_CODE) {
1159 $desc = $line->desc;
1160 $depth = -$line->qty;
1164 $subtotal_options = array();
1166 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1167 $value =
GETPOST($option,
'alphanohtml');
1169 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1174 if (isset($desc) && isset($depth)) {
1175 $result =
$object->addSubtotalLine($langs, $desc, (
int) $depth, $subtotal_options);
1177 $object->errors[] = $langs->trans(
"CorrespondingTitleNotFound");
1180 if (isset($result) && $result >= 0) {
1186 $outputlangs = $langs;
1187 $newlang =
GETPOST(
'lang_id',
'alpha');
1189 $newlang =
$object->thirdparty->default_lang;
1191 if (!empty($newlang)) {
1193 $outputlangs->setDefaultLang($newlang);
1196 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1201 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
1203 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && !
GETPOST(
'markforalllines',
'alpha') && $usercancreate) {
1207 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1210 $price_ht_devise =
'';
1212 $price_ttc_devise =
'';
1216 if (
GETPOST(
'price_ht') !==
'') {
1219 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1222 if (
GETPOST(
'price_ttc') !==
'') {
1225 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1226 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1229 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1230 if ($prod_entry_mode ==
'free') {
1236 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1241 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1244 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef,
'alpha'),
'', 2) : 0);
1245 if (empty($remise_percent)) {
1246 $remise_percent = 0;
1250 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1251 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1253 if (is_array($extralabelsline)) {
1255 foreach ($extralabelsline as $key => $value) {
1256 unset($_POST[
"options_".$key]);
1260 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1261 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1265 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1266 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1269 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1270 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1274 if (!$error && isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1275 if ($combinations =
GETPOST(
'combinations',
'array')) {
1279 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1280 $idprod = $res->fk_product_child;
1282 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1288 $propal_qty_requirement = (
getDolGlobalString(
'PROPAL_ENABLE_NEGATIVE_QTY') ? ($qty >= 0 || $qty <= 0) : $qty >= 0);
1289 if (!$error && $propal_qty_requirement && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1297 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1306 if (!empty($idprod) && $idprod > 0) {
1308 $prod->fetch($idprod);
1310 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
1320 $pu_ht = $prod->price;
1321 $pu_ttc = $prod->price_ttc;
1322 $price_min = $prod->price_min;
1323 $price_min_ttc = $prod->price_min_ttc;
1324 $price_base_type = $prod->price_base_type;
1328 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1330 $filter = array(
't.fk_product' => (
string) $prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1333 $pricebycustomerexist =
false;
1334 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1337 if (count($prodcustprice->lines) > 0) {
1338 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1339 foreach ($prodcustprice->lines as $k => $custprice_line) {
1340 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1341 $pricebycustomerexist =
true;
1342 $pu_ht =
price($custprice_line->price);
1343 $pu_ttc =
price($custprice_line->price_ttc);
1344 $price_min =
price($custprice_line->price_min);
1345 $price_min_ttc =
price($custprice_line->price_min_ttc);
1346 $price_base_type = $custprice_line->price_base_type;
1363 if (!$pricebycustomerexist && !empty(
$object->thirdparty->price_level)) {
1364 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1365 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1366 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1367 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1368 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1370 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1371 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1373 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1374 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1379 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1380 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1381 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1382 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1383 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1385 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1386 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1388 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1389 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1394 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1398 $filter = array(
't.fk_product' => (
string) $prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
1400 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1403 if (count($prodcustprice->lines) > 0) {
1404 $date_now = (int) floor(
dol_now() / 86400) * 86400;
1405 foreach ($prodcustprice->lines as $k => $custprice_line) {
1406 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
1407 $pu_ht =
price($custprice_line->price);
1408 $pu_ttc =
price($custprice_line->price_ttc);
1409 $price_min =
price($custprice_line->price_min);
1410 $price_min_ttc =
price($custprice_line->price_min_ttc);
1411 $price_base_type = $custprice_line->price_base_type;
1429 if ($prod->prices_by_qty[0]) {
1434 foreach ($prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1435 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1439 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1440 $pu_ht = $priceforthequantityarray[
'unitprice'];
1442 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1450 if ($prod->prices_by_qty[
$object->thirdparty->price_level]) {
1455 foreach ($prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1456 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1460 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1461 $pu_ht = $priceforthequantityarray[
'unitprice'];
1463 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1471 $tmpvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1472 $tmpprodvat = (float)
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
1475 if (!empty($price_ht) || (string) $price_ht ===
'0') {
1476 $pu_ht = (float)
price2num($price_ht,
'MU');
1477 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1478 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1479 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1482 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1483 $pu_ttc = (float)
price2num($price_ttc,
'MU');
1484 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1485 } elseif ($tmpvat != $tmpprodvat) {
1487 if ($price_base_type !=
'HT') {
1488 $pu_ht = (float)
price2num((
float) $pu_ttc / (1 + ((float) $tmpvat / 100)),
'MU');
1490 $pu_ttc = (float)
price2num((
float) $pu_ht * (1 + ((float) $tmpvat / 100)),
'MU');
1498 $outputlangs = $langs;
1500 if (
GETPOST(
'lang_id',
'aZ09')) {
1501 $newlang =
GETPOST(
'lang_id',
'aZ09');
1503 if (empty($newlang)) {
1504 $newlang =
$object->thirdparty->default_lang;
1506 if (!empty($newlang)) {
1508 $outputlangs->setDefaultLang($newlang);
1511 $desc = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1513 $desc = $prod->description;
1525 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1529 $outputlangs = $langs;
1531 if (
GETPOST(
'lang_id',
'alpha')) {
1532 $newlang =
GETPOST(
'lang_id',
'alpha');
1534 if (empty($newlang)) {
1535 $newlang =
$object->thirdparty->default_lang;
1537 if (!empty($newlang)) {
1539 $outputlangs->setDefaultLang($newlang);
1540 $outputlangs->load(
'products');
1542 if (!empty($prod->customcode)) {
1543 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode").
': '.$prod->customcode;
1545 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1548 if (!empty($prod->country_code)) {
1549 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $outputlangs, 0);
1552 if (!empty($prod->customcode)) {
1553 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode").
': '.$prod->customcode;
1555 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1558 if (!empty($prod->country_code)) {
1559 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $langs, 0);
1566 $type = $prod->type;
1567 $fk_unit = $prod->fk_unit;
1571 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1572 $tva_tx = str_replace(
'*',
'', $tva_tx);
1573 if (empty($tva_tx)) {
1576 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1579 $fk_unit =
GETPOST(
'units',
'alpha');
1580 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1581 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1583 if ($pu_ttc && !$pu_ht) {
1584 $price_base_type =
'TTC';
1598 $fournprice = (int) (
GETPOST(
'fournprice'.$predef) ?
GETPOST(
'fournprice'.$predef) : 0);
1599 $buyingprice =
price2num((
GETPOST(
'buying_price'.$predef) !=
'' ?
GETPOST(
'buying_price'.$predef) :
''),
'', 2);
1605 $pu_equivalent = $pu_ht;
1606 $pu_equivalent_ttc = $pu_ttc;
1607 $currency_tx =
$object->multicurrency_tx;
1611 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1612 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1614 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1615 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1635 if ($usermustrespectpricemin) {
1636 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1637 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1640 } 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') {
1641 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1649 $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);
1661 $outputlangs = $langs;
1662 $newlang =
GETPOST(
'lang_id',
'alpha');
1664 $newlang =
$object->thirdparty->default_lang;
1666 if (!empty($newlang)) {
1668 $outputlangs->setDefaultLang($newlang);
1670 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1673 unset($_POST[
'prod_entry_mode']);
1675 unset($_POST[
'qty']);
1676 unset($_POST[
'type']);
1677 unset($_POST[
'remise_percent']);
1678 unset($_POST[
'price_ht']);
1679 unset($_POST[
'multicurrency_price_ht']);
1680 unset($_POST[
'price_ttc']);
1681 unset($_POST[
'tva_tx']);
1682 unset($_POST[
'product_ref']);
1683 unset($_POST[
'product_label']);
1684 unset($_POST[
'product_desc']);
1685 unset($_POST[
'fournprice']);
1686 unset($_POST[
'buying_price']);
1687 unset($_POST[
'np_marginRate']);
1688 unset($_POST[
'np_markRate']);
1689 unset($_POST[
'dp_desc']);
1690 unset($_POST[
'idprod']);
1691 unset($_POST[
'units']);
1693 unset($_POST[
'date_starthour']);
1694 unset($_POST[
'date_startmin']);
1695 unset($_POST[
'date_startsec']);
1696 unset($_POST[
'date_startday']);
1697 unset($_POST[
'date_startmonth']);
1698 unset($_POST[
'date_startyear']);
1699 unset($_POST[
'date_endhour']);
1700 unset($_POST[
'date_endmin']);
1701 unset($_POST[
'date_endsec']);
1702 unset($_POST[
'date_endday']);
1703 unset($_POST[
'date_endmonth']);
1704 unset($_POST[
'date_endyear']);
1712 } elseif ($action ==
'addline' && $usercancreate && (
1713 (
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'') ||
1714 (
GETPOST(
'submitforallmark',
'alpha') &&
GETPOST(
'markforalllines',
'alpha') !==
''))) {
1717 $margin_rate = GETPOSTISSET(
'marginforalllines') ?
GETPOST(
'marginforalllines',
'int') :
'';
1718 $mark_rate = GETPOSTISSET(
'markforalllines') ?
GETPOST(
'markforalllines',
'int') :
'';
1719 foreach (
$object->lines as &$line)
if ($line->subprice > 0) {
1720 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1723 $subprice_multicurrency = $line->subprice;
1724 if (is_numeric($margin_rate) && $margin_rate > 0) {
1725 $line->subprice = floatval(
price2num(floatval($line->pa_ht) * (1 + floatval($margin_rate) / 100),
'MU'));
1726 } elseif (is_numeric($mark_rate) && $mark_rate > 0) {
1727 $line->subprice = floatval($line->pa_ht / (1 - (floatval($mark_rate) / 100)));
1729 $line->subprice = floatval($line->pa_ht);
1733 $res = $prod->fetch($line->fk_product);
1735 if ($prod->price_min > $line->subprice) {
1736 $price_subprice =
price($line->subprice, 0, $outlangs, 1, -1, -1,
'auto');
1737 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1738 setEventMessages($prod->ref .
' - ' . $prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1747 $multicurrency_subprice = (float) $line->subprice * $line->multicurrency_subprice / $subprice_multicurrency;
1749 $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);
1752 if (is_numeric($margin_rate) && empty($mark_rate)) {
1753 $line->marge_tx = $margin_rate;
1754 } elseif (is_numeric($mark_rate) && empty($margin_rate)) {
1755 $line->marque_tx = $mark_rate;
1757 $line->total_ht = $line->qty * (float) $line->subprice;
1758 $line->total_tva = $line->tva_tx * $line->qty * (float) $line->subprice;
1759 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $line->subprice;
1761 $line->multicurrency_total_ht = $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1762 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1763 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1765 $line->multicurrency_subprice = $multicurrency_subprice;
1770 } elseif ($action ==
'updatetitleline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1773 $langs->load(
'subtotals');
1775 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1778 $subtotal_options = array();
1780 foreach (Propal::$TITLE_OPTIONS as $option) {
1781 $value =
GETPOST($option,
'alphanohtml');
1783 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1788 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1799 $outputlangs = $langs;
1800 $newlang =
GETPOST(
'lang_id',
'alpha');
1802 $newlang =
$object->thirdparty->default_lang;
1804 if (!empty($newlang)) {
1806 $outputlangs->setDefaultLang($newlang);
1809 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1814 } elseif ($action ==
'updatesubtotalline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1817 $langs->load(
'subtotals');
1819 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1822 $subtotal_options = array();
1824 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1825 $value =
GETPOST($option,
'alphanohtml');
1827 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1832 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1840 $outputlangs = $langs;
1841 $newlang =
GETPOST(
'lang_id',
'alpha');
1843 $newlang =
$object->thirdparty->default_lang;
1845 if (!empty($newlang)) {
1847 $outputlangs->setDefaultLang($newlang);
1850 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1855 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1863 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1868 $vat_rate = (
GETPOST(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : 0);
1869 $vat_rate = str_replace(
'*',
'', $vat_rate);
1876 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
1886 if (empty($remise_percent)) {
1887 $remise_percent = 0;
1891 $pu_equivalent = $pu_ht;
1892 $pu_equivalent_ttc = $pu_ttc;
1894 $currency_tx =
$object->multicurrency_tx;
1898 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1899 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1901 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1902 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1917 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1918 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1920 if (is_array($extralabelsline)) {
1922 foreach ($extralabelsline as $key => $value) {
1923 unset($_POST[
"options_".$key]);
1934 $price_base_type =
'HT';
1935 if (empty($pu) && !empty($pu_ttc)) {
1937 $price_base_type =
'TTC';
1942 if (!empty($productid)) {
1944 $res = $product->fetch($productid);
1946 $type = $product->type;
1949 if ($price_base_type ==
'TTC' && !empty($pu_ttc)) {
1955 $price_min = $product->price_min;
1957 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1959 $price_min_ttc = $product->price_min_ttc;
1961 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1968 if ($usermustrespectpricemin) {
1969 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1970 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1973 $action =
'editline';
1974 } 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') {
1975 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1978 $action =
'editline';
1983 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1987 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1995 if (!$user->hasRight(
'margins',
'creer')) {
1996 foreach (
$object->lines as &$line) {
1998 $fournprice = $line->fk_fournprice;
1999 $buyingprice = $line->pa_ht;
2007 $result =
$object->updateline(
GETPOSTINT(
'lineid'), (
float) $pu, (
float) $qty, $remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $description, $price_base_type, $info_bits, $special_code,
GETPOSTINT(
'fk_parent_line'), 0, (
int) $fournprice, $buyingprice, $label, $type, $date_start, $date_end, $array_options,
GETPOSTINT(
"units"), (
float) $pu_ht_devise);
2014 $outputlangs = $langs;
2017 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
2018 $outputlangs->setDefaultLang($newlang);
2024 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2027 unset($_POST[
'qty']);
2028 unset($_POST[
'type']);
2029 unset($_POST[
'productid']);
2030 unset($_POST[
'remise_percent']);
2031 unset($_POST[
'price_ht']);
2032 unset($_POST[
'multicurrency_price_ht']);
2033 unset($_POST[
'price_ttc']);
2034 unset($_POST[
'tva_tx']);
2035 unset($_POST[
'product_ref']);
2036 unset($_POST[
'product_label']);
2037 unset($_POST[
'product_desc']);
2038 unset($_POST[
'fournprice']);
2039 unset($_POST[
'buying_price']);
2041 unset($_POST[
'date_starthour']);
2042 unset($_POST[
'date_startmin']);
2043 unset($_POST[
'date_startsec']);
2044 unset($_POST[
'date_startday']);
2045 unset($_POST[
'date_startmonth']);
2046 unset($_POST[
'date_startyear']);
2047 unset($_POST[
'date_endhour']);
2048 unset($_POST[
'date_endmin']);
2049 unset($_POST[
'date_endsec']);
2050 unset($_POST[
'date_endday']);
2051 unset($_POST[
'date_endmonth']);
2052 unset($_POST[
'date_endyear']);
2059 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
2060 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2062 } elseif ($action ==
'classin' && $usercancreate) {
2065 } elseif ($action ==
'setavailability' && $usercancreate) {
2068 } elseif ($action ==
'setdemandreason' && $usercancreate) {
2071 } elseif ($action ==
'setconditions' && $usercancreate) {
2074 } elseif ($action ==
'setmode' && $usercancreate) {
2077 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
2079 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
2080 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
2083 } elseif ($action ==
'setbankaccount' && $usercancreate) {
2086 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
2089 } elseif ($action ==
'setwarehouse' && $usercancreate) {
2092 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
2095 $attribute_name =
GETPOST(
'attribute',
'aZ09');
2098 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
2103 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
2110 $action =
'edit_extras';
2115 if ($action ==
'addcontact' && $usercancreate) {
2119 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2123 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
2126 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2127 $langs->load(
"errors");
2128 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
2133 } elseif ($action ==
'swapstatut' && $usercancreate) {
2135 if (
$object->fetch($id) > 0) {
2140 } elseif ($action ==
'deletecontact' && $usercancreate) {
2143 $result =
$object->delete_contact($lineid);
2146 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
2155 $upload_dir = !empty(
$conf->propal->multidir_output[
$object->entity]) ?
$conf->propal->multidir_output[
$object->entity] :
$conf->propal->dir_output;
2156 $permissiontoadd = $usercancreate;
2157 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
2165$form =
new Form($db);
2170if (isModEnabled(
'project')) {
2174$title =
$object->ref.
" - ".$langs->trans(
'Card');
2175if ($action ==
'create') {
2176 $title = $langs->trans(
"NewPropal");
2178$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
2185if ($action ==
'create') {
2186 $currency_code =
$conf->currency;
2192 $res = $soc->fetch($socid);
2195 $currency_code =
$conf->currency;
2197 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2198 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2199 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2201 $datepropal = (empty($datepropal) ? (!
getDolGlobalString(
'MAIN_AUTOFILL_DATE_PROPOSAL') ? -1 :
'') : $datepropal);
2205 if (!empty($origin) && !empty($originid)) {
2207 $element = $subelement = $origin;
2209 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2210 $element = $regs[1];
2211 $subelement = $regs[2];
2214 if ($element ==
'project') {
2215 $projectid = $originid;
2219 $project->fetch($projectid);
2220 if ($project->socid > 0) {
2222 $soc->fetch($project->socid);
2226 if ($element ==
'order' || $element ==
'commande') {
2227 $element = $subelement =
'commande';
2229 if ($element ==
'propal') {
2230 $element =
'comm/propal';
2231 $subelement =
'propal';
2233 if ($element ==
'contract') {
2234 $element = $subelement =
'contrat';
2236 if ($element ==
'shipping') {
2237 $element = $subelement =
'expedition';
2242 $classname = ucfirst($subelement);
2243 $objectsrc =
new $classname($db);
2244 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
2245 $objectsrc->fetch($originid);
2246 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2247 $objectsrc->fetch_lines();
2249 $objectsrc->fetch_thirdparty();
2251 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
2252 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
2254 $soc = $objectsrc->thirdparty;
2256 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2257 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2258 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : -1));
2261 $objectsrc->fetch_optionals();
2262 $object->array_options = $objectsrc->array_options;
2264 if (isModEnabled(
"multicurrency")) {
2265 if (!empty($objectsrc->multicurrency_code)) {
2266 $currency_code = $objectsrc->multicurrency_code;
2268 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2269 $currency_tx = $objectsrc->multicurrency_tx;
2277 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
2278 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
2279 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
2280 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
2281 $shipping_method_id = $soc->shipping_method_id;
2282 $warehouse_id = !empty($soc->fk_warehouse) ? $soc->fk_warehouse : $warehouse_id;
2283 $remise_percent = $soc->remise_percent;
2285 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
2286 $currency_code = $soc->multicurrency_code;
2291 if (!
GETPOST(
'changecompany')) {
2292 if (GETPOSTISSET(
'cond_reglement_id')) {
2293 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2295 if (GETPOSTISSET(
'deposit_percent')) {
2298 if (GETPOSTISSET(
'mode_reglement_id')) {
2299 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2301 if (GETPOSTISSET(
'fk_account')) {
2306 if ($soc->fk_warehouse > 0) {
2307 $warehouse_id = $soc->fk_warehouse;
2309 if (isModEnabled(
'stock') && $warehouse_id < 0 &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2314 $warehouse_id = $user->fk_warehouse;
2318 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2319 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2320 print
'<input type="hidden" name="action" value="add">';
2321 print
'<input type="hidden" name="changecompany" value="0">';
2322 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2323 if ($origin !=
'project' && $originid) {
2324 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
2325 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
2326 } elseif ($origin ==
'project' && !empty($projectid)) {
2327 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
2333 $parameters = array();
2335 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
2336 if (empty($reshook)) {
2337 print
'<table class="border centpercent">';
2340 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
2343 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
2344 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
2348 print
'<tr class="field_socid">';
2349 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
2351 print
'<td class="valuefieldcreate">';
2352 print $soc->getNomUrl(1,
'customer');
2353 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
2355 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2356 $shipping_method_id = $soc->shipping_method_id;
2359 print
'<td class="valuefieldcreate">';
2360 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2361 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2365 $(document).ready(function() {
2366 $("#socid").change(function() {
2367 console.log("We have changed the company - Reload page");
2368 var socid = $(this).val();
2370 $("input[name=action]").val("create");
2371 $("input[name=changecompany]").val("1");
2372 $("form[name=addprop]").submit();
2377 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>';
2384 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
2385 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2387 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2391 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
2393 $absolute_discount = $soc->getAvailableDiscounts();
2397 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
2398 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2404 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
2405 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2406 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2410 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>';
2413 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2414 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2416 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2420 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2421 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2422 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2426 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2427 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2428 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2433 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2434 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2435 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2439 if (isModEnabled(
"shipping")) {
2440 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2441 $shipping_method_id = $soc->shipping_method_id;
2443 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2444 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2445 $form->selectShippingMethod((
string) (GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2449 $formproduct =
null;
2451 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2452 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2454 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2455 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2460 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2461 if (isModEnabled(
'order')) {
2462 print
' ('.$langs->trans(
'AfterOrder').
')';
2464 print
'</td><td class="valuefieldcreate">';
2465 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2466 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2470 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2471 print
'<td class="valuefieldcreate">';
2472 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2474 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2475 $syear = date(
"Y", $tmpdte);
2476 $smonth = date(
"m", $tmpdte);
2477 $sday = date(
"d", $tmpdte);
2478 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2480 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2481 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2486 if (isModEnabled(
'project') && is_object($formproject)) {
2487 $langs->load(
"projects");
2488 print
'<tr class="field_projectid">';
2489 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2490 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');
2491 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>';
2497 if (isModEnabled(
'incoterm')) {
2498 print
'<tr class="field_incoterm_id">';
2499 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2500 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2501 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2502 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2507 print
'<tr class="field_model">';
2508 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2509 print
'<td class="valuefieldcreate">';
2510 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2513 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2517 if (isModEnabled(
"multicurrency")) {
2518 print
'<tr class="field_currency">';
2519 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2520 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2521 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2526 print
'<tr class="field_note_public">';
2527 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2528 print
'<td class="valuefieldcreate">';
2529 $note_public =
$object->getDefaultCreateValueFor(
'note_public', (!empty($objectsrc) ? $objectsrc->note_public : (
getDolGlobalString(
'PROPALE_ADDON_NOTE_PUBLIC_DEFAULT') ?
$conf->global->PROPALE_ADDON_NOTE_PUBLIC_DEFAULT : null)),
'restricthtml');
2530 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2531 print $doleditor->Create(1);
2534 if (empty($user->socid)) {
2535 print
'<tr class="field_note_private">';
2536 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2537 print
'<td class="valuefieldcreate">';
2538 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2539 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2540 print $doleditor->Create(1);
2546 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2549 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2551 if ($origin ==
'contrat') {
2555 $objectsrc->update_price(1,
'auto', 1);
2558 print
"\n<!-- ".$classname.
" info -->";
2560 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2561 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2562 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2563 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2564 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2566 $newclassname = $classname;
2567 if ($newclassname ==
'Propal') {
2568 $newclassname =
'CommercialProposal';
2569 } elseif ($newclassname ==
'Commande') {
2570 $newclassname =
'Order';
2571 } elseif ($newclassname ==
'Expedition') {
2572 $newclassname =
'Sending';
2573 } elseif ($newclassname ==
'Fichinter') {
2574 $newclassname =
'Intervention';
2577 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2578 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency).
'</td></tr>';
2579 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2580 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2581 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2584 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2585 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2587 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2589 if (isModEnabled(
"multicurrency")) {
2590 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2591 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2592 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2604 print
'<input type="hidden" name="createmode" value="empty">';
2608 print
'<br><table>';
2612 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2613 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2615 $liste_propal = array();
2616 $liste_propal [0] =
'';
2618 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2619 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2620 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2621 $sql .=
" WHERE s.rowid = p.fk_soc";
2622 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2623 $sql .=
" AND p.fk_statut <> 0";
2624 $sql .=
" ORDER BY Id";
2626 $resql = $db->query($sql);
2628 $num = $db->num_rows($resql);
2631 $row = $db->fetch_row($resql);
2632 $propalRefAndSocName = $row[1].
" - ".$row[2];
2633 $liste_propal[$row[0]] = $propalRefAndSocName;
2636 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2642 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2643 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2650 $langs->load(
"bills");
2652 print $form->buttonsSaveCancel(
"CreateDraft");
2658 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2661 $title = $langs->trans(
'ProductsAndServices');
2664 print
'<div class="div-table-responsive-no-min">';
2665 print
'<table class="noborder centpercent">';
2667 $objectsrc->printOriginLinesList();
2684 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
'propal', 0,
'',
'', 0,
'', 1);
2689 if ($action ==
'clone') {
2691 $filter =
'(s.client:IN:1,2,3)';
2692 $formquestion = array(
2695 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2696 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2697 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2700 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2703 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1, 250, 600);
2707 if ($action ==
'add_title_line') {
2708 $langs->load(
'subtotals');
2710 $depth_array =
$object->getPossibleLevels($langs);
2712 } elseif ($action ==
'add_subtotal_line') {
2713 $langs->load(
'subtotals');
2715 $titles =
$object->getPossibleTitles();
2719 if ($action ==
'closeas') {
2721 $formquestion = array();
2723 $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)));
2725 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2727 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2732 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2734 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2735 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2739 $eligibleForDepositGeneration =
true;
2741 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2742 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2743 '@phan-var-force Facture $invoice';
2745 $eligibleForDepositGeneration =
false;
2751 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2752 foreach (
$object->linkedObjects[
'commande'] as $order) {
2753 $order->fetchObjectLinked();
2755 if (array_key_exists(
'facture', $order->linkedObjects)) {
2756 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2757 '@phan-var-force Facture $invoice';
2759 $eligibleForDepositGeneration =
false;
2768 if ($eligibleForDepositGeneration) {
2769 $formquestion[] = array(
2770 'type' =>
'checkbox',
2771 'tdclass' =>
'showonlyifsigned',
2772 'name' =>
'generate_deposit',
2773 'morecss' =>
'margintoponly marginbottomonly',
2774 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2777 $formquestion[] = array(
2779 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2781 'label' => $langs->trans(
'DateInvoice'),
2787 $formquestion[] = array(
2789 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2790 'name' =>
'date_pointoftax',
2791 'label' => $langs->trans(
'DatePointOfTax'),
2797 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2799 $formquestion[] = array(
2801 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2802 'name' =>
'cond_reglement_id',
2803 'label' => $langs->trans(
'PaymentTerm'),
2804 'value' => $paymentTermsSelect
2807 $formquestion[] = array(
2808 'type' =>
'checkbox',
2809 'tdclass' =>
'showonlyifgeneratedeposit',
2810 'name' =>
'validate_generated_deposit',
2811 'morecss' =>
'margintoponly marginbottomonly',
2812 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2815 $formquestion[] = array(
2816 'type' =>
'onecolumn',
2819 let signedValue = ' . $object::STATUS_SIGNED .
';
2821 $(document).ready(function() {
2822 $("[name=generate_deposit]").change(function () {
2823 let $self = $(this);
2824 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2826 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2835 $("#statut").change(function() {
2836 let $target = $(".showonlyifsigned").parent(".tagtr");
2838 if ($(this).val() == signedValue) {
2844 $("[name=generate_deposit]").trigger("change");
2849 $("#statut").trigger("change");
2858 if (isModEnabled(
'notification')) {
2859 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2860 $notify =
new Notify($db);
2861 $formquestion = array_merge($formquestion, array(
2862 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2867 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2869 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2871 } elseif ($action ==
'cancel') {
2873 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2874 } elseif ($action ==
'delete') {
2876 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2877 } elseif ($action ==
'reopen') {
2879 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2880 } elseif ($action ==
'ask_deleteline') {
2882 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2883 } elseif ($action ==
'ask_subtotal_deleteline') {
2885 $langs->load(
"subtotals");
2886 $title =
"DeleteSubtotalLine";
2887 $question =
"ConfirmDeleteSubtotalLine";
2888 if (
GETPOST(
'type') ==
'title') {
2889 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2890 $title =
"DeleteTitleLine";
2891 $question =
"ConfirmDeleteTitleLine";
2893 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2894 } elseif ($action ==
'validate') {
2899 $ref = substr(
$object->ref, 1, 4);
2900 if ($ref ==
'PROV' || $ref ==
'') {
2901 $numref =
$object->getNextNumRef($soc);
2902 if (empty($numref)) {
2910 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2911 if (isModEnabled(
'notification')) {
2912 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2913 $notify =
new Notify($db);
2915 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2920 foreach (
$object->lines as $line) {
2921 $res = $line->fetch_product();
2923 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2929 if ($nbMandated > 0) {
2931 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2934 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2939 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2944 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2945 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2946 if (empty($reshook)) {
2947 $formconfirm .= $hookmanager->resPrint;
2948 } elseif ($reshook > 0) {
2949 $formconfirm = $hookmanager->resPrint;
2958 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2960 $morehtmlref =
'<div class="refidno">';
2962 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2963 $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);
2965 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2967 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2970 if (isModEnabled(
'project')) {
2971 $langs->load(
"projects");
2972 $morehtmlref .=
'<br>';
2973 if ($usercancreate) {
2974 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2975 if ($action !=
'classify') {
2976 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2978 $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');
2980 if (!empty(
$object->fk_project)) {
2982 $proj->fetch(
$object->fk_project);
2983 $morehtmlref .= $proj->getNomUrl(1);
2985 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2990 $morehtmlref .=
'</div>';
2993 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2996 $parameters = array();
2998 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
2999 if (empty($reshook)) {
3000 print
'<div class="fichecenter">';
3001 print
'<div class="fichehalfleft">';
3002 print
'<div class="underbanner clearboth"></div>';
3004 print
'<table class="border tableforfield centpercent">';
3008 $filterabsolutediscount =
"fk_facture_source IS NULL";
3009 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3011 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3012 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3015 print
'<tr><td class="titlefieldmax45">'.$langs->trans(
'Discounts').
'</td><td>';
3017 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3018 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3019 $absolute_discount =
price2num($absolute_discount,
'MT');
3020 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3026 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
3027 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
3043 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, (
int) $editenable);
3044 print
'</td><td class="valuefield">';
3045 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3046 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
3047 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3048 print
'<input type="hidden" name="action" value="setdate">';
3049 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
3050 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3051 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
3065 print
'<table class="nobordernopadding centpercent"><tr><td>';
3066 print $langs->trans(
'DateEndPropal');
3068 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3069 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>';
3071 print
'</tr></table>';
3072 print
'</td><td class="valuefield">';
3073 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3074 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
3075 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3076 print
'<input type="hidden" name="action" value="setecheance">';
3077 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
3078 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3079 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
3082 if (!empty(
$object->fin_validite)) {
3096 print
'<table class="nobordernopadding centpercent"><tr><td>';
3097 print $langs->trans(
'PaymentConditionsShort');
3099 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3100 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>';
3102 print
'</tr></table>';
3103 print
'</td><td class="valuefield">';
3104 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3105 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3107 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3113 print
'<tr class="field_mode_reglement_id">';
3115 print
'<table class="nobordernopadding centpercent"><tr><td>';
3116 print $langs->trans(
'PaymentMode');
3118 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3119 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>';
3121 print
'</tr></table>';
3122 print
'</td><td class="valuefieldcreate">';
3123 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3124 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3126 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->mode_reglement_id,
'none');
3131 $langs->load(
'deliveries');
3133 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3134 print
'</td><td class="valuefieldedit">';
3135 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
3140 print
'<tr class="fielddeliverydelay"><td>';
3141 print
'<table class="nobordernopadding centpercent"><tr><td>';
3142 if (isModEnabled(
'order')) {
3143 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
3145 print $langs->trans(
'AvailabilityPeriod');
3148 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3149 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>';
3151 print
'</tr></table>';
3152 print
'</td><td class="valuefield">';
3153 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3154 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->availability_id,
'availability_id', 1);
3156 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->availability_id,
'none', 1);
3163 if (isModEnabled(
"shipping")) {
3165 print
'<table class="nobordernopadding centpercent"><tr><td>';
3166 print $langs->trans(
'SendingMethod');
3168 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3169 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>';
3171 print
'</tr></table>';
3172 print
'</td><td class="valuefield">';
3173 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3174 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3176 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->shipping_method_id,
'none');
3183 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
3184 $langs->load(
'stocks');
3185 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
3187 print
'<tr class="field_warehouse_id"><td>';
3188 $editenable = $usercancreate;
3189 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
3190 print
'</td><td class="valuefieldcreate">';
3191 if ($action ==
'editwarehouse') {
3192 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3194 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
3202 print
'<table class="nobordernopadding centpercent"><tr><td>';
3203 print $langs->trans(
'Source');
3205 if ($action !=
'editdemandreason' && $usercancreate) {
3206 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>';
3208 print
'</tr></table>';
3209 print
'</td><td class="valuefield">';
3210 if ($action ==
'editdemandreason' && $usercancreate) {
3211 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3213 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->demand_reason_id,
'none');
3218 if ($soc->outstanding_limit) {
3221 print $langs->trans(
'OutstandingBill');
3222 print
'</td><td class="valuefield">';
3223 $arrayoutstandingbills = $soc->getOutstandingBills();
3224 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
3225 print
price($arrayoutstandingbills[
'opened']).
' / ';
3226 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1,
$conf->currency);
3231 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
3234 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3235 print $langs->trans(
'BankAccount');
3237 if ($action !=
'editbankaccount' && $usercancreate) {
3238 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>';
3240 print
'</tr></table>';
3241 print
'</td><td class="valuefield">';
3242 if ($action ==
'editbankaccount') {
3243 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3245 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'none');
3252 $tmparray =
$object->getTotalWeightVolume();
3253 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3254 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3256 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
3257 print
'<td class="valuefield">';
3262 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
3263 print
'<td class="valuefield">';
3270 if (isModEnabled(
'incoterm')) {
3272 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3273 print $langs->trans(
'IncotermLabel');
3274 print
'<td><td class="right">';
3275 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3276 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
3280 print
'</td></tr></table>';
3282 print
'<td class="valuefield">';
3283 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3284 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
3286 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3292 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
3297 print
'<div class="fichehalfright">';
3298 print
'<div class="underbanner clearboth"></div>';
3300 print
'<table class="border tableforfield centpercent">';
3302 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
3305 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3306 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3307 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3308 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3313 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3314 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3315 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3316 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3320 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3322 print
'<td>' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
3323 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3324 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3327 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3332 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3334 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
3335 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3336 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3339 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3345 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3346 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3347 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3348 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3355 if (isModEnabled(
'margin')) {
3356 $formmargin->displayMarginInfos(
$object);
3362 print
'<div class="clearboth"></div><br>';
3365 $blocname =
'contacts';
3366 $title = $langs->trans(
'ContactsAddresses');
3367 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3371 $blocname =
'notes';
3372 $title = $langs->trans(
'Notes');
3373 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3381 $result =
$object->getLinesArray();
3385 global $inputalsopricewithtax;
3386 $inputalsopricewithtax = 1;
3388 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
3389 <input type="hidden" name="token" value="' .
newToken().
'">
3390 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3391 <input type="hidden" name="mode" value="">
3392 <input type="hidden" name="page_y" value="">
3393 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3394 <input type="hidden" name="id" value="' .
$object->id.
'">
3398 if (isModEnabled(
'subtotals')) {
3399 include DOL_DOCUMENT_ROOT.
'/core/tpl/subtotal_ajaxrow.tpl.php';
3401 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3405 print
'<div class="div-table-responsive-no-min">';
3407 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3411 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3416 if ($action !=
'editline') {
3417 $parameters = array();
3418 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3422 if (empty($reshook)) {
3423 $object->formAddObjectLine(1, $mysoc, $soc);
3426 $parameters = array();
3427 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3446 if ($action !=
'presend') {
3447 $numlines = count(
$object->lines);
3448 print
'<div class="tabsAction">';
3450 $parameters = array();
3451 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3453 if (empty($reshook)) {
3454 if ($action !=
'editline') {
3458 $langs->load(
'subtotals');
3460 $url_button = array();
3462 $url_button[] = array(
3463 'lang' =>
'subtotals',
3465 'perm' => (
bool) $usercancreate,
3466 'label' => $langs->trans(
'AddTitleLine'),
3467 'url' =>
'/comm/propal/card.php?id='.$object->id.
'&action=add_title_line&token='.
newToken()
3470 $url_button[] = array(
3471 'lang' =>
'subtotals',
3473 'perm' => (
bool) $usercancreate,
3474 'label' => $langs->trans(
'AddSubtotalLine'),
3475 'url' =>
'/comm/propal/card.php?id='.$object->id.
'&action=add_subtotal_line&token='.
newToken()
3478 print
dolGetButtonAction(
'', $langs->trans(
'Subtotal'),
'default', $url_button,
'',
true);
3484 if ($usercanvalidate) {
3485 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>';
3487 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3497 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3502 if ($usercanreopen) {
3503 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3504 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3506 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ReOpen").
'</a>';
3511 if (empty($user->socid)) {
3513 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3517 $arrayforbutaction = array();
3520 $arrayforbutaction[] = array(
3523 'perm' => $usercancreateorder,
3524 'label' =>
'AddOrder',
3525 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3535 $arrayforbutaction[] = array(
3538 'perm' => $usercancreatepurchaseorder,
3539 'label' =>
'AddPurchaseOrder',
3540 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3550 $arrayforbutaction[] = array(
3551 'lang' =>
'interventions',
3553 'perm' => $usercancreateintervention,
3554 'label' =>
'AddIntervention',
3555 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3565 $arrayforbutaction[] = array(
3566 'lang' =>
'contracts',
3568 'perm' => $usercancreatecontract,
3569 'label' =>
'AddContract',
3570 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3582 $arrayforbutaction[] = [
3583 'lang' =>
'invoice',
3584 'enabled' => isModEnabled(
'invoice'),
3585 'perm' => $usercancreateinvoice,
3586 'label' =>
'CreateBill',
3587 'url' =>
'/compta/facture/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((int)
$object->id).
'&socid='.((int)
$object->socid),
3594 $actionButtonsParameters = [
3595 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3596 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3599 if ($numlines > 0) {
3600 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3602 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3606 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3607 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3608 if ($usercanclose) {
3609 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3611 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3619 if ($usercanclose) {
3620 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3621 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3623 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3624 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3630 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3631 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3637 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3641 if ($usercancreate) {
3642 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&socid='.
$object->socid.
'&action=clone&token='.
newToken().
'&object='.
$object->element.
'">'.$langs->trans(
"ToClone").
'</a>';
3646 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3654 if (
GETPOST(
'modelselected')) {
3655 $action =
'presend';
3658 if ($action !=
'presend') {
3659 print
'<div class="fichecenter"><div class="fichehalfleft">';
3660 print
'<a name="builddoc"></a>';
3666 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3667 $genallowed = $usercanread;
3668 $delallowed = $usercancreate;
3670 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'0',
'', $soc->default_lang,
'',
$object);
3673 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'propal'), 1);
3674 $linktoelem = $tmparray[
'linktoelem'];
3675 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3676 print $htmltoenteralink;
3678 $compatibleImportElementsList =
false;
3680 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3682 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3688 print
'<br><!-- Link to sign -->';
3689 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3690 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3693 print
'</div><div class="fichehalfright">';
3697 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3700 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3702 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3704 print
'</div></div>';
3708 $modelmail =
'propal_send';
3709 $defaulttopic =
'SendPropalRef';
3710 $diroutput =
$conf->propal->multidir_output[
$object->entity];
3711 $trackid =
'pro'.$object->id;
3713 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $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.
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...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
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.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
dol_clone($object, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
getDictionaryValue($tablename, $field, $id, $checkentity=false, $rowidfield='rowid')
Return the value of a filed into a dictionary for the record $id.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
propal_prepare_head($object)
Prepare array with list of tabs.
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.