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;
1614 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1615 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1617 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1618 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1638 if ($usermustrespectpricemin) {
1639 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1640 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1643 } 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') {
1644 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1652 $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);
1664 $outputlangs = $langs;
1665 $newlang =
GETPOST(
'lang_id',
'alpha');
1667 $newlang =
$object->thirdparty->default_lang;
1669 if (!empty($newlang)) {
1671 $outputlangs->setDefaultLang($newlang);
1673 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1676 unset($_POST[
'prod_entry_mode']);
1678 unset($_POST[
'qty']);
1679 unset($_POST[
'type']);
1680 unset($_POST[
'remise_percent']);
1681 unset($_POST[
'price_ht']);
1682 unset($_POST[
'multicurrency_price_ht']);
1683 unset($_POST[
'price_ttc']);
1684 unset($_POST[
'tva_tx']);
1685 unset($_POST[
'product_ref']);
1686 unset($_POST[
'product_label']);
1687 unset($_POST[
'product_desc']);
1688 unset($_POST[
'fournprice']);
1689 unset($_POST[
'buying_price']);
1690 unset($_POST[
'np_marginRate']);
1691 unset($_POST[
'np_markRate']);
1692 unset($_POST[
'dp_desc']);
1693 unset($_POST[
'idprod']);
1694 unset($_POST[
'units']);
1696 unset($_POST[
'date_starthour']);
1697 unset($_POST[
'date_startmin']);
1698 unset($_POST[
'date_startsec']);
1699 unset($_POST[
'date_startday']);
1700 unset($_POST[
'date_startmonth']);
1701 unset($_POST[
'date_startyear']);
1702 unset($_POST[
'date_endhour']);
1703 unset($_POST[
'date_endmin']);
1704 unset($_POST[
'date_endsec']);
1705 unset($_POST[
'date_endday']);
1706 unset($_POST[
'date_endmonth']);
1707 unset($_POST[
'date_endyear']);
1715 } elseif ($action ==
'addline' && $usercancreate && (
1716 (
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines',
'alpha') !==
'') ||
1717 (
GETPOST(
'submitforallmark',
'alpha') &&
GETPOST(
'markforalllines',
'alpha') !==
''))) {
1720 $margin_rate = GETPOSTISSET(
'marginforalllines') ?
GETPOST(
'marginforalllines',
'int') :
'';
1721 $mark_rate = GETPOSTISSET(
'markforalllines') ?
GETPOST(
'markforalllines',
'int') :
'';
1722 foreach (
$object->lines as &$line)
if ($line->subprice > 0) {
1723 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1726 $subprice_multicurrency = $line->subprice;
1727 if (is_numeric($margin_rate) && $margin_rate > 0) {
1728 $line->subprice = floatval(
price2num(floatval($line->pa_ht) * (1 + floatval($margin_rate) / 100),
'MU'));
1729 } elseif (is_numeric($mark_rate) && $mark_rate > 0) {
1730 $line->subprice = floatval($line->pa_ht / (1 - (floatval($mark_rate) / 100)));
1732 $line->subprice = floatval($line->pa_ht);
1736 $res = $prod->fetch($line->fk_product);
1738 if ($prod->price_min > $line->subprice) {
1739 $price_subprice =
price($line->subprice, 0, $outlangs, 1, -1, -1,
'auto');
1740 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1741 setEventMessages($prod->ref .
' - ' . $prod->label .
' (' . $price_subprice .
' < ' . $price_price_min .
' ' . strtolower($langs->trans(
"MinPrice")) .
')' .
"\n",
null,
'warnings');
1745 } elseif ($line->fk_product) {
1750 $multicurrency_subprice = (float) $line->subprice * $line->multicurrency_subprice / $subprice_multicurrency;
1752 $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);
1755 if (is_numeric($margin_rate) && empty($mark_rate)) {
1756 $line->marge_tx = $margin_rate;
1757 } elseif (is_numeric($mark_rate) && empty($margin_rate)) {
1758 $line->marque_tx = $mark_rate;
1760 $line->total_ht = $line->qty * (float) $line->subprice;
1761 $line->total_tva = $line->tva_tx * $line->qty * (float) $line->subprice;
1762 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $line->subprice;
1764 $line->multicurrency_total_ht = $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1765 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1766 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice_multicurrency * $line->multicurrency_subprice / $line->subprice;
1768 $line->multicurrency_subprice = $multicurrency_subprice;
1773 } elseif ($action ==
'updatetitleline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1776 $langs->load(
'subtotals');
1778 $desc =
GETPOST(
'line_desc',
'alphanohtml') ?? $langs->trans(
"Title");
1781 $subtotal_options = array();
1783 foreach (Propal::$TITLE_OPTIONS as $option) {
1784 $value =
GETPOST($option,
'alphanohtml');
1786 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1791 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1802 $outputlangs = $langs;
1803 $newlang =
GETPOST(
'lang_id',
'alpha');
1805 $newlang =
$object->thirdparty->default_lang;
1807 if (!empty($newlang)) {
1809 $outputlangs->setDefaultLang($newlang);
1812 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1817 } elseif ($action ==
'updatesubtotalline' && GETPOSTISSET(
"save") && $usercancreate && !
GETPOST(
'cancel',
'alpha')) {
1820 $langs->load(
'subtotals');
1822 $desc =
GETPOST(
'line_desc',
'alphanohtml');
1825 $subtotal_options = array();
1827 foreach (Propal::$SUBTOTAL_OPTIONS as $option) {
1828 $value =
GETPOST($option,
'alphanohtml');
1830 $subtotal_options[$option] = $value ==
'on' ? 1 : $value;
1835 $result =
$object->updateSubtotalLine($langs,
GETPOSTINT(
'lineid'), $desc, $depth, $subtotal_options);
1843 $outputlangs = $langs;
1844 $newlang =
GETPOST(
'lang_id',
'alpha');
1846 $newlang =
$object->thirdparty->default_lang;
1848 if (!empty($newlang)) {
1850 $outputlangs->setDefaultLang($newlang);
1853 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1858 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1866 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1871 $vat_rate = (
GETPOST(
'tva_tx') ?
GETPOST(
'tva_tx',
'alpha') : 0);
1872 $vat_rate = str_replace(
'*',
'', $vat_rate);
1879 $fournprice = (int) (
GETPOST(
'fournprice') ?
GETPOST(
'fournprice') :
'');
1889 if (empty($remise_percent)) {
1890 $remise_percent = 0;
1894 $pu_equivalent = $pu_ht;
1895 $pu_equivalent_ttc = $pu_ttc;
1897 $currency_tx =
$object->multicurrency_tx;
1904 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1905 $pu_equivalent = (float) $pu_ht_devise / (
float) $currency_tx;
1907 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1908 $pu_equivalent_ttc = (float) $pu_ttc_devise / (
float) $currency_tx;
1923 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1924 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1926 if (is_array($extralabelsline)) {
1928 foreach ($extralabelsline as $key => $value) {
1929 unset($_POST[
"options_".$key]);
1940 $price_base_type =
'HT';
1941 if (empty($pu) && !empty($pu_ttc)) {
1943 $price_base_type =
'TTC';
1948 if (!empty($productid)) {
1950 $res = $product->fetch($productid);
1952 $type = $product->type;
1955 if ($price_base_type ==
'TTC' && !empty($pu_ttc)) {
1961 $price_min = $product->price_min;
1963 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1965 $price_min_ttc = $product->price_min_ttc;
1967 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1974 if ($usermustrespectpricemin) {
1975 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1976 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1979 $action =
'editline';
1980 } 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') {
1981 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1984 $action =
'editline';
1989 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1993 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
2001 if (!$user->hasRight(
'margins',
'creer')) {
2002 foreach (
$object->lines as &$line) {
2004 $fournprice = $line->fk_fournprice;
2005 $buyingprice = $line->pa_ht;
2013 $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);
2020 $outputlangs = $langs;
2023 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
2024 $outputlangs->setDefaultLang($newlang);
2030 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2033 unset($_POST[
'qty']);
2034 unset($_POST[
'type']);
2035 unset($_POST[
'productid']);
2036 unset($_POST[
'remise_percent']);
2037 unset($_POST[
'price_ht']);
2038 unset($_POST[
'multicurrency_price_ht']);
2039 unset($_POST[
'price_ttc']);
2040 unset($_POST[
'tva_tx']);
2041 unset($_POST[
'product_ref']);
2042 unset($_POST[
'product_label']);
2043 unset($_POST[
'product_desc']);
2044 unset($_POST[
'fournprice']);
2045 unset($_POST[
'buying_price']);
2047 unset($_POST[
'date_starthour']);
2048 unset($_POST[
'date_startmin']);
2049 unset($_POST[
'date_startsec']);
2050 unset($_POST[
'date_startday']);
2051 unset($_POST[
'date_startmonth']);
2052 unset($_POST[
'date_startyear']);
2053 unset($_POST[
'date_endhour']);
2054 unset($_POST[
'date_endmin']);
2055 unset($_POST[
'date_endsec']);
2056 unset($_POST[
'date_endday']);
2057 unset($_POST[
'date_endmonth']);
2058 unset($_POST[
'date_endyear']);
2065 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
2066 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2068 } elseif ($action ==
'classin' && $usercancreate) {
2071 } elseif ($action ==
'setavailability' && $usercancreate) {
2074 } elseif ($action ==
'setdemandreason' && $usercancreate) {
2077 } elseif ($action ==
'setconditions' && $usercancreate) {
2080 } elseif ($action ==
'setmode' && $usercancreate) {
2083 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
2085 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
2086 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
2089 } elseif ($action ==
'setbankaccount' && $usercancreate) {
2092 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
2095 } elseif ($action ==
'setwarehouse' && $usercancreate) {
2098 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
2101 $attribute_name =
GETPOST(
'attribute',
'aZ09');
2104 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
2109 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
2116 $action =
'edit_extras';
2121 if ($action ==
'addcontact' && $usercancreate) {
2125 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
2129 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
2132 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2133 $langs->load(
"errors");
2134 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
2139 } elseif ($action ==
'swapstatut' && $usercancreate) {
2141 if (
$object->fetch($id) > 0) {
2146 } elseif ($action ==
'deletecontact' && $usercancreate) {
2149 $result =
$object->delete_contact($lineid);
2152 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
2161 $upload_dir = !empty(
$conf->propal->multidir_output[
$object->entity]) ?
$conf->propal->multidir_output[
$object->entity] :
$conf->propal->dir_output;
2162 $permissiontoadd = $usercancreate;
2163 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
2171$form =
new Form($db);
2176if (isModEnabled(
'project')) {
2180$title =
$object->ref.
" - ".$langs->trans(
'Card');
2181if ($action ==
'create') {
2182 $title = $langs->trans(
"NewPropal");
2184$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
2191if ($action ==
'create') {
2192 $currency_code =
$conf->currency;
2198 $res = $soc->fetch($socid);
2201 $currency_code =
$conf->currency;
2203 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2204 $deposit_percent =
GETPOSTFLOAT(
'cond_reglement_id_deposit_percent');
2205 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2207 $datepropal = (empty($datepropal) ? (!
getDolGlobalString(
'MAIN_AUTOFILL_DATE_PROPOSAL') ? -1 :
'') : $datepropal);
2211 if (!empty($origin) && !empty($originid)) {
2213 $element = $subelement = $origin;
2215 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
2216 $element = $regs[1];
2217 $subelement = $regs[2];
2220 if ($element ==
'project') {
2221 $projectid = $originid;
2225 $project->fetch($projectid);
2226 if ($project->socid > 0) {
2228 $soc->fetch($project->socid);
2232 if ($element ==
'order' || $element ==
'commande') {
2233 $element = $subelement =
'commande';
2235 if ($element ==
'propal') {
2236 $element =
'comm/propal';
2237 $subelement =
'propal';
2239 if ($element ==
'contract') {
2240 $element = $subelement =
'contrat';
2242 if ($element ==
'shipping') {
2243 $element = $subelement =
'expedition';
2248 $classname = ucfirst($subelement);
2249 $objectsrc =
new $classname($db);
2250 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
2251 $objectsrc->fetch($originid);
2252 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
2253 $objectsrc->fetch_lines();
2255 $objectsrc->fetch_thirdparty();
2257 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
2258 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
2260 $soc = $objectsrc->thirdparty;
2262 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
2263 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
2264 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : -1));
2267 $objectsrc->fetch_optionals();
2268 $object->array_options = $objectsrc->array_options;
2270 if (isModEnabled(
"multicurrency")) {
2271 if (!empty($objectsrc->multicurrency_code)) {
2272 $currency_code = $objectsrc->multicurrency_code;
2274 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2275 $currency_tx = $objectsrc->multicurrency_tx;
2283 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
2284 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
2285 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
2286 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
2287 $shipping_method_id = $soc->shipping_method_id;
2288 $warehouse_id = !empty($soc->fk_warehouse) ? $soc->fk_warehouse : $warehouse_id;
2289 $remise_percent = $soc->remise_percent;
2291 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
2292 $currency_code = $soc->multicurrency_code;
2297 if (!
GETPOST(
'changecompany')) {
2298 if (GETPOSTISSET(
'cond_reglement_id')) {
2299 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
2301 if (GETPOSTISSET(
'deposit_percent')) {
2304 if (GETPOSTISSET(
'mode_reglement_id')) {
2305 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
2307 if (GETPOSTISSET(
'fk_account')) {
2310 if (GETPOSTISSET(
'shipping_method_id')) {
2311 $shipping_method_id =
GETPOSTINT(
'shipping_method_id');
2315 if ($soc->fk_warehouse > 0) {
2316 $warehouse_id = $soc->fk_warehouse;
2318 if (isModEnabled(
'stock') && $warehouse_id < 0 &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2323 $warehouse_id = $user->fk_warehouse;
2327 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2328 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2329 print
'<input type="hidden" name="action" value="add">';
2330 print
'<input type="hidden" name="changecompany" value="0">';
2331 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2332 if ($origin !=
'project' && $originid) {
2333 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
2334 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
2335 } elseif ($origin ==
'project' && !empty($projectid)) {
2336 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
2342 $parameters = array();
2344 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
2345 if (empty($reshook)) {
2346 print
'<table class="border centpercent">';
2349 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
2352 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
2353 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
2357 print
'<tr class="field_socid">';
2358 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
2360 print
'<td class="valuefieldcreate">';
2361 print $soc->getNomUrl(1,
'customer');
2362 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
2364 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2365 $shipping_method_id = $soc->shipping_method_id;
2368 print
'<td class="valuefieldcreate">';
2369 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2370 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2374 $(document).ready(function() {
2375 $("#socid").change(function() {
2376 console.log("We have changed the company - Reload page");
2377 var socid = $(this).val();
2379 $("input[name=action]").val("create");
2380 $("input[name=changecompany]").val("1");
2381 $("form[name=addprop]").submit();
2386 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>';
2393 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
2394 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2396 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2400 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
2402 $absolute_discount = $soc->getAvailableDiscounts();
2406 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
2407 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2413 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
2414 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2415 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2419 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>';
2422 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2423 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2425 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2429 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2430 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2431 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2435 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2436 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2437 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2442 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2443 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2444 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2448 if (isModEnabled(
"shipping")) {
2449 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2450 $shipping_method_id = $soc->shipping_method_id;
2452 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2453 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2454 $form->selectShippingMethod((
string) $shipping_method_id,
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2458 $formproduct =
null;
2460 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2461 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2463 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2464 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2469 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2470 if (isModEnabled(
'order')) {
2471 print
' ('.$langs->trans(
'AfterOrder').
')';
2473 print
'</td><td class="valuefieldcreate">';
2474 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2475 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2479 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2480 print
'<td class="valuefieldcreate">';
2481 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2483 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2484 $syear = date(
"Y", $tmpdte);
2485 $smonth = date(
"m", $tmpdte);
2486 $sday = date(
"d", $tmpdte);
2487 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2489 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2490 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2495 if (isModEnabled(
'project') && is_object($formproject)) {
2496 $langs->load(
"projects");
2497 print
'<tr class="field_projectid">';
2498 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2499 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');
2500 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>';
2506 if (isModEnabled(
'incoterm')) {
2507 print
'<tr class="field_incoterm_id">';
2508 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2509 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2510 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2511 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2516 print
'<tr class="field_model">';
2517 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2518 print
'<td class="valuefieldcreate">';
2519 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2522 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2526 if (isModEnabled(
"multicurrency")) {
2527 print
'<tr class="field_currency">';
2528 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2529 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2530 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2535 print
'<tr class="field_note_public">';
2536 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2537 print
'<td class="valuefieldcreate">';
2538 $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');
2539 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2540 print $doleditor->Create(1);
2543 if (empty($user->socid)) {
2544 print
'<tr class="field_note_private">';
2545 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2546 print
'<td class="valuefieldcreate">';
2547 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2548 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2549 print $doleditor->Create(1);
2555 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2558 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2560 if ($origin ==
'contrat') {
2564 $objectsrc->update_price(1,
'auto', 1);
2567 print
"\n<!-- ".$classname.
" info -->";
2569 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2570 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2571 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2572 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2573 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2575 $newclassname = $classname;
2576 if ($newclassname ==
'Propal') {
2577 $newclassname =
'CommercialProposal';
2578 } elseif ($newclassname ==
'Commande') {
2579 $newclassname =
'Order';
2580 } elseif ($newclassname ==
'Expedition') {
2581 $newclassname =
'Sending';
2582 } elseif ($newclassname ==
'Fichinter') {
2583 $newclassname =
'Intervention';
2586 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2587 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency).
'</td></tr>';
2588 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2589 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2590 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2593 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2594 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2596 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2598 if (isModEnabled(
"multicurrency")) {
2599 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2600 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2601 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2613 print
'<input type="hidden" name="createmode" value="empty">';
2617 print
'<br><table>';
2621 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2622 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2624 $liste_propal = array();
2625 $liste_propal [0] =
'';
2627 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2628 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2629 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2630 $sql .=
" WHERE s.rowid = p.fk_soc";
2631 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2632 $sql .=
" AND p.fk_statut <> 0";
2633 $sql .=
" ORDER BY Id";
2635 $resql = $db->query($sql);
2637 $num = $db->num_rows($resql);
2640 $row = $db->fetch_row($resql);
2641 $propalRefAndSocName = $row[1].
" - ".$row[2];
2642 $liste_propal[$row[0]] = $propalRefAndSocName;
2645 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2651 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2652 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2659 $langs->load(
"bills");
2661 print $form->buttonsSaveCancel(
"CreateDraft");
2667 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2670 $title = $langs->trans(
'ProductsAndServices');
2673 print
'<div class="div-table-responsive-no-min">';
2674 print
'<table class="noborder centpercent">';
2676 $objectsrc->printOriginLinesList();
2693 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
'propal', 0,
'',
'', 0,
'', 1);
2698 if ($action ==
'clone') {
2700 $filter =
'(s.client:IN:1,2,3)';
2701 $formquestion = array(
2704 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2705 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2706 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2709 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2712 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1, 250, 600);
2716 if ($action ==
'add_title_line') {
2717 $langs->load(
'subtotals');
2719 $depth_array =
$object->getPossibleLevels($langs);
2721 } elseif ($action ==
'add_subtotal_line') {
2722 $langs->load(
'subtotals');
2724 $titles =
$object->getPossibleTitles();
2728 if ($action ==
'closeas') {
2730 $formquestion = array();
2732 $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)));
2734 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2736 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2741 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2743 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2744 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2748 $eligibleForDepositGeneration =
true;
2750 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2751 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2752 '@phan-var-force Facture $invoice';
2754 $eligibleForDepositGeneration =
false;
2760 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2761 foreach (
$object->linkedObjects[
'commande'] as $order) {
2762 $order->fetchObjectLinked();
2764 if (array_key_exists(
'facture', $order->linkedObjects)) {
2765 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2766 '@phan-var-force Facture $invoice';
2768 $eligibleForDepositGeneration =
false;
2777 if ($eligibleForDepositGeneration) {
2778 $formquestion[] = array(
2779 'type' =>
'checkbox',
2780 'tdclass' =>
'showonlyifsigned',
2781 'name' =>
'generate_deposit',
2782 'morecss' =>
'margintoponly marginbottomonly',
2783 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2786 $formquestion[] = array(
2788 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2790 'label' => $langs->trans(
'DateInvoice'),
2796 $formquestion[] = array(
2798 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2799 'name' =>
'date_pointoftax',
2800 'label' => $langs->trans(
'DatePointOfTax'),
2806 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2808 $formquestion[] = array(
2810 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2811 'name' =>
'cond_reglement_id',
2812 'label' => $langs->trans(
'PaymentTerm'),
2813 'value' => $paymentTermsSelect
2816 $formquestion[] = array(
2817 'type' =>
'checkbox',
2818 'tdclass' =>
'showonlyifgeneratedeposit',
2819 'name' =>
'validate_generated_deposit',
2820 'morecss' =>
'margintoponly marginbottomonly',
2821 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2824 $formquestion[] = array(
2825 'type' =>
'onecolumn',
2828 let signedValue = ' . $object::STATUS_SIGNED .
';
2830 $(document).ready(function() {
2831 $("[name=generate_deposit]").change(function () {
2832 let $self = $(this);
2833 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2835 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2844 $("#statut").change(function() {
2845 let $target = $(".showonlyifsigned").parent(".tagtr");
2847 if ($(this).val() == signedValue) {
2853 $("[name=generate_deposit]").trigger("change");
2858 $("#statut").trigger("change");
2867 if (isModEnabled(
'notification')) {
2868 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2869 $notify =
new Notify($db);
2870 $formquestion = array_merge($formquestion, array(
2871 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2876 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2878 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2880 } elseif ($action ==
'cancel') {
2882 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2883 } elseif ($action ==
'delete') {
2885 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2886 } elseif ($action ==
'reopen') {
2888 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2889 } elseif ($action ==
'ask_deleteline') {
2891 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2892 } elseif ($action ==
'ask_subtotal_deleteline') {
2894 $langs->load(
"subtotals");
2895 $title =
"DeleteSubtotalLine";
2896 $question =
"ConfirmDeleteSubtotalLine";
2897 if (
GETPOST(
'type') ==
'title') {
2898 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2899 $title =
"DeleteTitleLine";
2900 $question =
"ConfirmDeleteTitleLine";
2902 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2903 } elseif ($action ==
'validate') {
2908 $ref = substr(
$object->ref, 1, 4);
2909 if ($ref ==
'PROV' || $ref ==
'') {
2910 $numref =
$object->getNextNumRef($soc);
2911 if (empty($numref)) {
2919 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2920 if (isModEnabled(
'notification')) {
2921 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2922 $notify =
new Notify($db);
2924 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2929 foreach (
$object->lines as $line) {
2930 $res = $line->fetch_product();
2932 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2938 if ($nbMandated > 0) {
2940 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2943 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2948 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2953 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2954 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2955 if (empty($reshook)) {
2956 $formconfirm .= $hookmanager->resPrint;
2957 } elseif ($reshook > 0) {
2958 $formconfirm = $hookmanager->resPrint;
2967 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2969 $morehtmlref =
'<div class="refidno">';
2971 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2972 $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);
2974 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2976 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2979 if (isModEnabled(
'project')) {
2980 $langs->load(
"projects");
2981 $morehtmlref .=
'<br>';
2982 if ($usercancreate) {
2983 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2984 if ($action !=
'classify') {
2985 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2987 $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');
2989 if (!empty(
$object->fk_project)) {
2991 $proj->fetch(
$object->fk_project);
2992 $morehtmlref .= $proj->getNomUrl(1);
2994 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2999 $morehtmlref .=
'</div>';
3002 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
3005 $parameters = array();
3007 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
3008 if (empty($reshook)) {
3009 print
'<div class="fichecenter">';
3010 print
'<div class="fichehalfleft">';
3011 print
'<div class="underbanner clearboth"></div>';
3013 print
'<table class="border tableforfield centpercent">';
3017 $filterabsolutediscount =
"fk_facture_source IS NULL";
3018 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3020 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3021 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3024 print
'<tr><td class="titlefieldmax45">'.$langs->trans(
'Discounts').
'</td><td>';
3026 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3027 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3028 $absolute_discount =
price2num($absolute_discount,
'MT');
3029 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3035 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
3036 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
3052 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, (
int) $editenable);
3053 print
'</td><td class="valuefield">';
3054 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3055 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
3056 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3057 print
'<input type="hidden" name="action" value="setdate">';
3058 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
3059 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3060 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
3074 print
'<table class="nobordernopadding centpercent"><tr><td>';
3075 print $langs->trans(
'DateEndPropal');
3077 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3078 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>';
3080 print
'</tr></table>';
3081 print
'</td><td class="valuefield">';
3082 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3083 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
3084 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3085 print
'<input type="hidden" name="action" value="setecheance">';
3086 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
3087 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3088 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
3091 if (!empty(
$object->fin_validite)) {
3105 print
'<table class="nobordernopadding centpercent"><tr><td>';
3106 print $langs->trans(
'PaymentConditionsShort');
3108 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3109 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>';
3111 print
'</tr></table>';
3112 print
'</td><td class="valuefield">';
3113 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3114 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3116 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3122 print
'<tr class="field_mode_reglement_id">';
3124 print
'<table class="nobordernopadding centpercent"><tr><td>';
3125 print $langs->trans(
'PaymentMode');
3127 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3128 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>';
3130 print
'</tr></table>';
3131 print
'</td><td class="valuefieldcreate">';
3132 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3133 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3135 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->mode_reglement_id,
'none');
3140 $langs->load(
'deliveries');
3142 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3143 print
'</td><td class="valuefieldedit">';
3144 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
3149 print
'<tr class="fielddeliverydelay"><td>';
3150 print
'<table class="nobordernopadding centpercent"><tr><td>';
3151 if (isModEnabled(
'order')) {
3152 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
3154 print $langs->trans(
'AvailabilityPeriod');
3157 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3158 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>';
3160 print
'</tr></table>';
3161 print
'</td><td class="valuefield">';
3162 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3163 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->availability_id,
'availability_id', 1);
3165 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->availability_id,
'none', 1);
3172 if (isModEnabled(
"shipping")) {
3174 print
'<table class="nobordernopadding centpercent"><tr><td>';
3175 print $langs->trans(
'SendingMethod');
3177 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3178 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>';
3180 print
'</tr></table>';
3181 print
'</td><td class="valuefield">';
3182 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3183 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3185 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->shipping_method_id,
'none');
3192 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
3193 $langs->load(
'stocks');
3194 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
3196 print
'<tr class="field_warehouse_id"><td>';
3197 $editenable = $usercancreate;
3198 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
3199 print
'</td><td class="valuefieldcreate">';
3200 if ($action ==
'editwarehouse') {
3201 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3203 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
3211 print
'<table class="nobordernopadding centpercent"><tr><td>';
3212 print $langs->trans(
'Source');
3214 if ($action !=
'editdemandreason' && $usercancreate) {
3215 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>';
3217 print
'</tr></table>';
3218 print
'</td><td class="valuefield">';
3219 if ($action ==
'editdemandreason' && $usercancreate) {
3220 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3222 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->demand_reason_id,
'none');
3227 if ($soc->outstanding_limit) {
3230 print $langs->trans(
'OutstandingBill');
3231 print
'</td><td class="valuefield">';
3232 $arrayoutstandingbills = $soc->getOutstandingBills();
3233 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
3234 print
price($arrayoutstandingbills[
'opened']).
' / ';
3235 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1,
$conf->currency);
3240 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
3243 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3244 print $langs->trans(
'BankAccount');
3246 if ($action !=
'editbankaccount' && $usercancreate) {
3247 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>';
3249 print
'</tr></table>';
3250 print
'</td><td class="valuefield">';
3251 if ($action ==
'editbankaccount') {
3252 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3254 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'none');
3261 $tmparray =
$object->getTotalWeightVolume();
3262 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3263 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3265 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
3266 print
'<td class="valuefield">';
3271 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
3272 print
'<td class="valuefield">';
3279 if (isModEnabled(
'incoterm')) {
3281 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3282 print $langs->trans(
'IncotermLabel');
3283 print
'<td><td class="right">';
3284 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3285 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
3289 print
'</td></tr></table>';
3291 print
'<td class="valuefield">';
3292 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3293 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
3295 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3301 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
3306 print
'<div class="fichehalfright">';
3307 print
'<div class="underbanner clearboth"></div>';
3309 print
'<table class="border tableforfield centpercent">';
3311 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
3314 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3315 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3316 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3317 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3322 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3323 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3324 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3325 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3329 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3331 print
'<td>' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
3332 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3333 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3336 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3341 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3343 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
3344 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3345 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3348 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3354 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3355 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3356 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3357 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3364 if (isModEnabled(
'margin')) {
3365 $formmargin->displayMarginInfos(
$object);
3371 print
'<div class="clearboth"></div><br>';
3374 $blocname =
'contacts';
3375 $title = $langs->trans(
'ContactsAddresses');
3376 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3380 $blocname =
'notes';
3381 $title = $langs->trans(
'Notes');
3382 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3390 $result =
$object->getLinesArray();
3394 global $inputalsopricewithtax;
3395 $inputalsopricewithtax = 1;
3397 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
3398 <input type="hidden" name="token" value="' .
newToken().
'">
3399 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3400 <input type="hidden" name="mode" value="">
3401 <input type="hidden" name="page_y" value="">
3402 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3403 <input type="hidden" name="id" value="' .
$object->id.
'">
3407 if (isModEnabled(
'subtotals')) {
3408 include DOL_DOCUMENT_ROOT.
'/core/tpl/subtotal_ajaxrow.tpl.php';
3410 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3414 print
'<div class="div-table-responsive-no-min">';
3416 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3420 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3425 if ($action !=
'editline') {
3426 $parameters = array();
3427 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3431 if (empty($reshook)) {
3432 $object->formAddObjectLine(1, $mysoc, $soc);
3435 $parameters = array();
3436 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3455 if ($action !=
'presend') {
3456 $numlines = count(
$object->lines);
3457 print
'<div class="tabsAction">';
3459 $parameters = array();
3460 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3462 if (empty($reshook)) {
3463 if ($action !=
'editline') {
3467 $langs->load(
'subtotals');
3469 $url_button = array();
3471 $url_button[] = array(
3472 'lang' =>
'subtotals',
3474 'perm' => (
bool) $usercancreate,
3475 'label' => $langs->trans(
'AddTitleLine'),
3476 'url' =>
'/comm/propal/card.php?id='.$object->id.
'&action=add_title_line&token='.
newToken()
3479 $url_button[] = array(
3480 'lang' =>
'subtotals',
3482 'perm' => (
bool) $usercancreate,
3483 'label' => $langs->trans(
'AddSubtotalLine'),
3484 'url' =>
'/comm/propal/card.php?id='.$object->id.
'&action=add_subtotal_line&token='.
newToken()
3487 print
dolGetButtonAction(
'', $langs->trans(
'Subtotal'),
'default', $url_button,
'',
true);
3493 if ($usercanvalidate) {
3494 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>';
3496 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3506 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3511 if ($usercanreopen) {
3512 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3513 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3515 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ReOpen").
'</a>';
3520 if (empty($user->socid)) {
3522 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3526 $arrayforbutaction = array();
3529 $arrayforbutaction[] = array(
3532 'perm' => $usercancreateorder,
3533 'label' =>
'AddOrder',
3534 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3544 $arrayforbutaction[] = array(
3547 'perm' => $usercancreatepurchaseorder,
3548 'label' =>
'AddPurchaseOrder',
3549 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3559 $arrayforbutaction[] = array(
3560 'lang' =>
'interventions',
3562 'perm' => $usercancreateintervention,
3563 'label' =>
'AddIntervention',
3564 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3574 $arrayforbutaction[] = array(
3575 'lang' =>
'contracts',
3577 'perm' => $usercancreatecontract,
3578 'label' =>
'AddContract',
3579 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3591 $arrayforbutaction[] = [
3592 'lang' =>
'invoice',
3593 'enabled' => isModEnabled(
'invoice'),
3594 'perm' => $usercancreateinvoice,
3595 'label' =>
'CreateBill',
3596 'url' =>
'/compta/facture/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((int)
$object->id).
'&socid='.((int)
$object->socid),
3603 $actionButtonsParameters = [
3604 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3605 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3608 if ($numlines > 0) {
3609 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3611 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3615 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3616 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3617 if ($usercanclose) {
3618 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3620 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3628 if ($usercanclose) {
3629 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3630 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3632 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3633 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3639 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3640 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3646 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3650 if ($usercancreate) {
3651 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>';
3655 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3663 if (
GETPOST(
'modelselected')) {
3664 $action =
'presend';
3667 if ($action !=
'presend') {
3668 print
'<div class="fichecenter"><div class="fichehalfleft">';
3669 print
'<a name="builddoc"></a>';
3675 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3676 $genallowed = $usercanread;
3677 $delallowed = $usercancreate;
3679 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'0',
'', $soc->default_lang,
'',
$object);
3682 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'propal'), 1);
3683 $linktoelem = $tmparray[
'linktoelem'];
3684 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3685 print $htmltoenteralink;
3687 $compatibleImportElementsList =
false;
3689 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3691 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3697 print
'<br><!-- Link to sign -->';
3698 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3699 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3702 print
'</div><div class="fichehalfright">';
3706 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3709 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3711 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3713 print
'</div></div>';
3717 $modelmail =
'propal_send';
3718 $defaulttopic =
'SendPropalRef';
3719 $diroutput =
$conf->propal->multidir_output[
$object->entity];
3720 $trackid =
'pro'.$object->id;
3722 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.