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');
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')) {
2312 if ($soc->fk_warehouse > 0) {
2313 $warehouse_id = $soc->fk_warehouse;
2315 if (isModEnabled(
'stock') && $warehouse_id < 0 &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2320 $warehouse_id = $user->fk_warehouse;
2324 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2325 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2326 print
'<input type="hidden" name="action" value="add">';
2327 print
'<input type="hidden" name="changecompany" value="0">';
2328 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2329 if ($origin !=
'project' && $originid) {
2330 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
2331 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
2332 } elseif ($origin ==
'project' && !empty($projectid)) {
2333 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
2339 $parameters = array();
2341 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
2342 if (empty($reshook)) {
2343 print
'<table class="border centpercent">';
2346 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
2349 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
2350 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
2354 print
'<tr class="field_socid">';
2355 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
2357 print
'<td class="valuefieldcreate">';
2358 print $soc->getNomUrl(1,
'customer');
2359 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
2361 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2362 $shipping_method_id = $soc->shipping_method_id;
2365 print
'<td class="valuefieldcreate">';
2366 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2367 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2371 $(document).ready(function() {
2372 $("#socid").change(function() {
2373 console.log("We have changed the company - Reload page");
2374 var socid = $(this).val();
2376 $("input[name=action]").val("create");
2377 $("input[name=changecompany]").val("1");
2378 $("form[name=addprop]").submit();
2383 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>';
2390 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
2391 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2393 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2397 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
2399 $absolute_discount = $soc->getAvailableDiscounts();
2403 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
2404 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2410 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
2411 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2412 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2416 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>';
2419 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2420 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2422 print $form->getSelectConditionsPaiements((
int) $cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2426 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2427 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2428 print $form->select_types_paiements((
string) $mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2432 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2433 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2434 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2439 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2440 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2441 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2445 if (isModEnabled(
"shipping")) {
2446 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2447 $shipping_method_id = $soc->shipping_method_id;
2449 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2450 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2451 $form->selectShippingMethod((
string) (GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2455 $formproduct =
null;
2457 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2458 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2460 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2461 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2466 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2467 if (isModEnabled(
'order')) {
2468 print
' ('.$langs->trans(
'AfterOrder').
')';
2470 print
'</td><td class="valuefieldcreate">';
2471 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2472 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2476 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2477 print
'<td class="valuefieldcreate">';
2478 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2480 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2481 $syear = date(
"Y", $tmpdte);
2482 $smonth = date(
"m", $tmpdte);
2483 $sday = date(
"d", $tmpdte);
2484 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2486 $tmp_date_delivery =
GETPOST(
'date_delivery') ?: -1;
2487 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2492 if (isModEnabled(
'project') && is_object($formproject)) {
2493 $langs->load(
"projects");
2494 print
'<tr class="field_projectid">';
2495 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2496 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');
2497 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>';
2503 if (isModEnabled(
'incoterm')) {
2504 print
'<tr class="field_incoterm_id">';
2505 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2506 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2507 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2508 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2513 print
'<tr class="field_model">';
2514 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2515 print
'<td class="valuefieldcreate">';
2516 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2519 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2523 if (isModEnabled(
"multicurrency")) {
2524 print
'<tr class="field_currency">';
2525 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2526 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2527 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0,
'', false,
'maxwidth200 widthcentpercentminusx');
2532 print
'<tr class="field_note_public">';
2533 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2534 print
'<td class="valuefieldcreate">';
2535 $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');
2536 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2537 print $doleditor->Create(1);
2540 if (empty($user->socid)) {
2541 print
'<tr class="field_note_private">';
2542 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2543 print
'<td class="valuefieldcreate">';
2544 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2545 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2546 print $doleditor->Create(1);
2552 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2555 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2557 if ($origin ==
'contrat') {
2561 $objectsrc->update_price(1,
'auto', 1);
2564 print
"\n<!-- ".$classname.
" info -->";
2566 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2567 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2568 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2569 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2570 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2572 $newclassname = $classname;
2573 if ($newclassname ==
'Propal') {
2574 $newclassname =
'CommercialProposal';
2575 } elseif ($newclassname ==
'Commande') {
2576 $newclassname =
'Order';
2577 } elseif ($newclassname ==
'Expedition') {
2578 $newclassname =
'Sending';
2579 } elseif ($newclassname ==
'Fichinter') {
2580 $newclassname =
'Intervention';
2583 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2584 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency).
'</td></tr>';
2585 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2586 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2587 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2590 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2591 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2593 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2595 if (isModEnabled(
"multicurrency")) {
2596 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2597 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2598 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2610 print
'<input type="hidden" name="createmode" value="empty">';
2614 print
'<br><table>';
2618 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2619 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2621 $liste_propal = array();
2622 $liste_propal [0] =
'';
2624 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2625 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2626 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2627 $sql .=
" WHERE s.rowid = p.fk_soc";
2628 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2629 $sql .=
" AND p.fk_statut <> 0";
2630 $sql .=
" ORDER BY Id";
2632 $resql = $db->query($sql);
2634 $num = $db->num_rows($resql);
2637 $row = $db->fetch_row($resql);
2638 $propalRefAndSocName = $row[1].
" - ".$row[2];
2639 $liste_propal[$row[0]] = $propalRefAndSocName;
2642 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2648 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2649 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2656 $langs->load(
"bills");
2658 print $form->buttonsSaveCancel(
"CreateDraft");
2664 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2667 $title = $langs->trans(
'ProductsAndServices');
2670 print
'<div class="div-table-responsive-no-min">';
2671 print
'<table class="noborder centpercent">';
2673 $objectsrc->printOriginLinesList();
2690 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
'propal', 0,
'',
'', 0,
'', 1);
2695 if ($action ==
'clone') {
2697 $filter =
'(s.client:IN:1,2,3)';
2698 $formquestion = array(
2701 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2702 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2703 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2706 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2709 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1, 250, 600);
2713 if ($action ==
'add_title_line') {
2714 $langs->load(
'subtotals');
2716 $depth_array =
$object->getPossibleLevels($langs);
2718 } elseif ($action ==
'add_subtotal_line') {
2719 $langs->load(
'subtotals');
2721 $titles =
$object->getPossibleTitles();
2725 if ($action ==
'closeas') {
2727 $formquestion = array();
2729 $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)));
2731 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2733 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2738 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2740 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2741 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2745 $eligibleForDepositGeneration =
true;
2747 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2748 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2749 '@phan-var-force Facture $invoice';
2751 $eligibleForDepositGeneration =
false;
2757 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2758 foreach (
$object->linkedObjects[
'commande'] as $order) {
2759 $order->fetchObjectLinked();
2761 if (array_key_exists(
'facture', $order->linkedObjects)) {
2762 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2763 '@phan-var-force Facture $invoice';
2765 $eligibleForDepositGeneration =
false;
2774 if ($eligibleForDepositGeneration) {
2775 $formquestion[] = array(
2776 'type' =>
'checkbox',
2777 'tdclass' =>
'showonlyifsigned',
2778 'name' =>
'generate_deposit',
2779 'morecss' =>
'margintoponly marginbottomonly',
2780 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2783 $formquestion[] = array(
2785 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2787 'label' => $langs->trans(
'DateInvoice'),
2793 $formquestion[] = array(
2795 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2796 'name' =>
'date_pointoftax',
2797 'label' => $langs->trans(
'DatePointOfTax'),
2803 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2805 $formquestion[] = array(
2807 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2808 'name' =>
'cond_reglement_id',
2809 'label' => $langs->trans(
'PaymentTerm'),
2810 'value' => $paymentTermsSelect
2813 $formquestion[] = array(
2814 'type' =>
'checkbox',
2815 'tdclass' =>
'showonlyifgeneratedeposit',
2816 'name' =>
'validate_generated_deposit',
2817 'morecss' =>
'margintoponly marginbottomonly',
2818 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2821 $formquestion[] = array(
2822 'type' =>
'onecolumn',
2825 let signedValue = ' . $object::STATUS_SIGNED .
';
2827 $(document).ready(function() {
2828 $("[name=generate_deposit]").change(function () {
2829 let $self = $(this);
2830 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2832 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2841 $("#statut").change(function() {
2842 let $target = $(".showonlyifsigned").parent(".tagtr");
2844 if ($(this).val() == signedValue) {
2850 $("[name=generate_deposit]").trigger("change");
2855 $("#statut").trigger("change");
2864 if (isModEnabled(
'notification')) {
2865 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2866 $notify =
new Notify($db);
2867 $formquestion = array_merge($formquestion, array(
2868 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2873 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2875 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2877 } elseif ($action ==
'cancel') {
2879 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2880 } elseif ($action ==
'delete') {
2882 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2883 } elseif ($action ==
'reopen') {
2885 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2886 } elseif ($action ==
'ask_deleteline') {
2888 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2889 } elseif ($action ==
'ask_subtotal_deleteline') {
2891 $langs->load(
"subtotals");
2892 $title =
"DeleteSubtotalLine";
2893 $question =
"ConfirmDeleteSubtotalLine";
2894 if (
GETPOST(
'type') ==
'title') {
2895 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2896 $title =
"DeleteTitleLine";
2897 $question =
"ConfirmDeleteTitleLine";
2899 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2900 } elseif ($action ==
'validate') {
2905 $ref = substr(
$object->ref, 1, 4);
2906 if ($ref ==
'PROV' || $ref ==
'') {
2907 $numref =
$object->getNextNumRef($soc);
2908 if (empty($numref)) {
2916 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2917 if (isModEnabled(
'notification')) {
2918 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2919 $notify =
new Notify($db);
2921 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2926 foreach (
$object->lines as $line) {
2927 $res = $line->fetch_product();
2929 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2935 if ($nbMandated > 0) {
2937 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2940 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2945 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2950 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2951 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2952 if (empty($reshook)) {
2953 $formconfirm .= $hookmanager->resPrint;
2954 } elseif ($reshook > 0) {
2955 $formconfirm = $hookmanager->resPrint;
2964 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2966 $morehtmlref =
'<div class="refidno">';
2968 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2969 $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);
2971 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2973 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2976 if (isModEnabled(
'project')) {
2977 $langs->load(
"projects");
2978 $morehtmlref .=
'<br>';
2979 if ($usercancreate) {
2980 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2981 if ($action !=
'classify') {
2982 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2984 $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');
2986 if (!empty(
$object->fk_project)) {
2988 $proj->fetch(
$object->fk_project);
2989 $morehtmlref .= $proj->getNomUrl(1);
2991 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2996 $morehtmlref .=
'</div>';
2999 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
3002 $parameters = array();
3004 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
3005 if (empty($reshook)) {
3006 print
'<div class="fichecenter">';
3007 print
'<div class="fichehalfleft">';
3008 print
'<div class="underbanner clearboth"></div>';
3010 print
'<table class="border tableforfield centpercent">';
3014 $filterabsolutediscount =
"fk_facture_source IS NULL";
3015 $filtercreditnote =
"fk_facture_source IS NOT NULL";
3017 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
3018 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
3021 print
'<tr><td class="titlefieldmax45">'.$langs->trans(
'Discounts').
'</td><td>';
3023 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
3024 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
3025 $absolute_discount =
price2num($absolute_discount,
'MT');
3026 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
3032 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
3033 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
3049 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, (
int) $editenable);
3050 print
'</td><td class="valuefield">';
3051 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
3052 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
3053 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3054 print
'<input type="hidden" name="action" value="setdate">';
3055 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
3056 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
3057 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
3071 print
'<table class="nobordernopadding centpercent"><tr><td>';
3072 print $langs->trans(
'DateEndPropal');
3074 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
3075 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>';
3077 print
'</tr></table>';
3078 print
'</td><td class="valuefield">';
3079 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
3080 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
3081 print
'<input type="hidden" name="token" value="'.newToken().
'">';
3082 print
'<input type="hidden" name="action" value="setecheance">';
3083 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
3084 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
3085 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
3088 if (!empty(
$object->fin_validite)) {
3102 print
'<table class="nobordernopadding centpercent"><tr><td>';
3103 print $langs->trans(
'PaymentConditionsShort');
3105 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
3106 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>';
3108 print
'</tr></table>';
3109 print
'</td><td class="valuefield">';
3110 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
3111 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
3113 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
3119 print
'<tr class="field_mode_reglement_id">';
3121 print
'<table class="nobordernopadding centpercent"><tr><td>';
3122 print $langs->trans(
'PaymentMode');
3124 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
3125 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>';
3127 print
'</tr></table>';
3128 print
'</td><td class="valuefieldcreate">';
3129 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
3130 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
3132 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->mode_reglement_id,
'none');
3137 $langs->load(
'deliveries');
3139 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, (
int) ($usercancreate && $caneditfield),
'datepicker');
3140 print
'</td><td class="valuefieldedit">';
3141 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
3146 print
'<tr class="fielddeliverydelay"><td>';
3147 print
'<table class="nobordernopadding centpercent"><tr><td>';
3148 if (isModEnabled(
'order')) {
3149 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
3151 print $langs->trans(
'AvailabilityPeriod');
3154 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
3155 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>';
3157 print
'</tr></table>';
3158 print
'</td><td class="valuefield">';
3159 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
3160 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->availability_id,
'availability_id', 1);
3162 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->availability_id,
'none', 1);
3169 if (isModEnabled(
"shipping")) {
3171 print
'<table class="nobordernopadding centpercent"><tr><td>';
3172 print $langs->trans(
'SendingMethod');
3174 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
3175 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>';
3177 print
'</tr></table>';
3178 print
'</td><td class="valuefield">';
3179 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
3180 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->shipping_method_id,
'shipping_method_id', 1);
3182 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->shipping_method_id,
'none');
3189 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
3190 $langs->load(
'stocks');
3191 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
3193 print
'<tr class="field_warehouse_id"><td>';
3194 $editenable = $usercancreate;
3195 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
3196 print
'</td><td class="valuefieldcreate">';
3197 if ($action ==
'editwarehouse') {
3198 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
3200 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
3208 print
'<table class="nobordernopadding centpercent"><tr><td>';
3209 print $langs->trans(
'Source');
3211 if ($action !=
'editdemandreason' && $usercancreate) {
3212 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>';
3214 print
'</tr></table>';
3215 print
'</td><td class="valuefield">';
3216 if ($action ==
'editdemandreason' && $usercancreate) {
3217 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->demand_reason_id,
'demand_reason_id', 1);
3219 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->demand_reason_id,
'none');
3224 if ($soc->outstanding_limit) {
3227 print $langs->trans(
'OutstandingBill');
3228 print
'</td><td class="valuefield">';
3229 $arrayoutstandingbills = $soc->getOutstandingBills();
3230 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
3231 print
price($arrayoutstandingbills[
'opened']).
' / ';
3232 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1,
$conf->currency);
3237 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
3240 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3241 print $langs->trans(
'BankAccount');
3243 if ($action !=
'editbankaccount' && $usercancreate) {
3244 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>';
3246 print
'</tr></table>';
3247 print
'</td><td class="valuefield">';
3248 if ($action ==
'editbankaccount') {
3249 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'fk_account', 1);
3251 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (
string)
$object->fk_account,
'none');
3258 $tmparray =
$object->getTotalWeightVolume();
3259 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
3260 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
3262 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
3263 print
'<td class="valuefield">';
3268 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
3269 print
'<td class="valuefield">';
3276 if (isModEnabled(
'incoterm')) {
3278 print
'<table width="100%" class="nobordernopadding"><tr><td>';
3279 print $langs->trans(
'IncotermLabel');
3280 print
'<td><td class="right">';
3281 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
3282 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
3286 print
'</td></tr></table>';
3288 print
'<td class="valuefield">';
3289 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
3290 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
3292 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3298 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
3303 print
'<div class="fichehalfright">';
3304 print
'<div class="underbanner clearboth"></div>';
3306 print
'<table class="border tableforfield centpercent">';
3308 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
3311 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
3312 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3313 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3314 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3319 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
3320 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3321 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3322 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3326 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
3328 print
'<td>' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
3329 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3330 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3333 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3338 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
3340 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
3341 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3342 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3345 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3351 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
3352 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
3353 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
3354 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
3361 if (isModEnabled(
'margin')) {
3362 $formmargin->displayMarginInfos(
$object);
3368 print
'<div class="clearboth"></div><br>';
3371 $blocname =
'contacts';
3372 $title = $langs->trans(
'ContactsAddresses');
3373 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3377 $blocname =
'notes';
3378 $title = $langs->trans(
'Notes');
3379 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3387 $result =
$object->getLinesArray();
3391 global $inputalsopricewithtax;
3392 $inputalsopricewithtax = 1;
3394 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
3395 <input type="hidden" name="token" value="' .
newToken().
'">
3396 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3397 <input type="hidden" name="mode" value="">
3398 <input type="hidden" name="page_y" value="">
3399 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3400 <input type="hidden" name="id" value="' .
$object->id.
'">
3404 if (isModEnabled(
'subtotals')) {
3405 include DOL_DOCUMENT_ROOT.
'/core/tpl/subtotal_ajaxrow.tpl.php';
3407 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3411 print
'<div class="div-table-responsive-no-min">';
3413 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3417 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3422 if ($action !=
'editline') {
3423 $parameters = array();
3424 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3428 if (empty($reshook)) {
3429 $object->formAddObjectLine(1, $mysoc, $soc);
3432 $parameters = array();
3433 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3452 if ($action !=
'presend') {
3453 $numlines = count(
$object->lines);
3454 print
'<div class="tabsAction">';
3456 $parameters = array();
3457 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3459 if (empty($reshook)) {
3460 if ($action !=
'editline') {
3464 $langs->load(
'subtotals');
3466 $url_button = array();
3468 $url_button[] = array(
3469 'lang' =>
'subtotals',
3471 'perm' => (
bool) $usercancreate,
3472 'label' => $langs->trans(
'AddTitleLine'),
3473 'url' =>
'/comm/propal/card.php?id='.$object->id.
'&action=add_title_line&token='.
newToken()
3476 $url_button[] = array(
3477 'lang' =>
'subtotals',
3479 'perm' => (
bool) $usercancreate,
3480 'label' => $langs->trans(
'AddSubtotalLine'),
3481 'url' =>
'/comm/propal/card.php?id='.$object->id.
'&action=add_subtotal_line&token='.
newToken()
3484 print
dolGetButtonAction(
'', $langs->trans(
'Subtotal'),
'default', $url_button,
'',
true);
3490 if ($usercanvalidate) {
3491 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>';
3493 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3503 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3508 if ($usercanreopen) {
3509 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3510 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3512 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ReOpen").
'</a>';
3517 if (empty($user->socid)) {
3519 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3523 $arrayforbutaction = array();
3526 $arrayforbutaction[] = array(
3529 'perm' => $usercancreateorder,
3530 'label' =>
'AddOrder',
3531 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3541 $arrayforbutaction[] = array(
3544 'perm' => $usercancreatepurchaseorder,
3545 'label' =>
'AddPurchaseOrder',
3546 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3556 $arrayforbutaction[] = array(
3557 'lang' =>
'interventions',
3559 'perm' => $usercancreateintervention,
3560 'label' =>
'AddIntervention',
3561 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3571 $arrayforbutaction[] = array(
3572 'lang' =>
'contracts',
3574 'perm' => $usercancreatecontract,
3575 'label' =>
'AddContract',
3576 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3588 $arrayforbutaction[] = [
3589 'lang' =>
'invoice',
3590 'enabled' => isModEnabled(
'invoice'),
3591 'perm' => $usercancreateinvoice,
3592 'label' =>
'CreateBill',
3593 'url' =>
'/compta/facture/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((int)
$object->id).
'&socid='.((int)
$object->socid),
3600 $actionButtonsParameters = [
3601 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3602 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3605 if ($numlines > 0) {
3606 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 1, $actionButtonsParameters);
3608 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction, (
string)
$object->id, 0, $actionButtonsParameters);
3612 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3613 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3614 if ($usercanclose) {
3615 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3617 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3625 if ($usercanclose) {
3626 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3627 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3629 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3630 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3636 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3637 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3643 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3647 if ($usercancreate) {
3648 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>';
3652 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3660 if (
GETPOST(
'modelselected')) {
3661 $action =
'presend';
3664 if ($action !=
'presend') {
3665 print
'<div class="fichecenter"><div class="fichehalfleft">';
3666 print
'<a name="builddoc"></a>';
3672 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3673 $genallowed = $usercanread;
3674 $delallowed = $usercancreate;
3676 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'0',
'', $soc->default_lang,
'',
$object);
3679 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'propal'), 1);
3680 $linktoelem = $tmparray[
'linktoelem'];
3681 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3682 print $htmltoenteralink;
3684 $compatibleImportElementsList =
false;
3686 $compatibleImportElementsList = array(
'commande',
'propal',
'facture',
'subscription');
3688 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3694 print
'<br><!-- Link to sign -->';
3695 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3696 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3699 print
'</div><div class="fichehalfright">';
3703 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3706 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3708 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3710 print
'</div></div>';
3714 $modelmail =
'propal_send';
3715 $defaulttopic =
'SendPropalRef';
3716 $diroutput =
$conf->propal->multidir_output[
$object->entity];
3717 $trackid =
'pro'.$object->id;
3719 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.