45require
'../../main.inc.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
47require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
48require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formpropal.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmargin.class.php';
50require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
51require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
52require_once DOL_DOCUMENT_ROOT.
'/core/modules/propale/modules_propale.php';
53require_once DOL_DOCUMENT_ROOT.
'/core/lib/propal.lib.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
56require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
57if (isModEnabled(
'project')) {
58 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
59 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
62if (isModEnabled(
'variants')) {
63 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination.class.php';
67$langs->loadLangs(array(
'companies',
'propal',
'compta',
'bills',
'orders',
'products',
'deliveries',
'sendings',
'other'));
68if (isModEnabled(
'incoterm')) {
69 $langs->load(
'incoterm');
71if (isModEnabled(
'margin')) {
72 $langs->load(
'margins');
77$array_options = array();
82$action =
GETPOST(
'action',
'aZ09');
83$cancel =
GETPOST(
'cancel',
'alpha');
84$origin =
GETPOST(
'origin',
'alpha');
86$confirm =
GETPOST(
'confirm',
'alpha');
87$backtopage =
GETPOST(
'backtopage',
'alpha');
102$extrafields->fetch_name_optionals_label(
$object->table_element);
105if ($id > 0 || !empty($ref)) {
106 $ret =
$object->fetch($id, $ref);
108 $ret =
$object->fetch_thirdparty();
109 if ($ret > 0 && isset(
$object->fk_project)) {
110 $ret =
$object->fetch_project();
120$hookmanager->initHooks(array(
'propalcard',
'globalcard'));
122$usercanread = $user->hasRight(
"propal",
"lire");
123$usercancreate = $user->hasRight(
"propal",
"creer");
124$usercandelete = $user->hasRight(
"propal",
"supprimer");
126$usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'close')));
127$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'validate')));
130$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
131$usercancreateorder = $user->hasRight(
'commande',
'creer');
132$usercancreateinvoice = $user->hasRight(
'facture',
'creer');
133$usercancreatecontract = $user->hasRight(
'contrat',
'creer');
134$usercancreateintervention = $user->hasRight(
'ficheinter',
'creer');
135$usercancreatepurchaseorder = ($user->hasRight(
'fournisseur',
'commande',
'creer') || $user->hasRight(
'supplier_order',
'creer'));
137$permissionnote = $usercancreate;
138$permissiondellink = $usercancreate;
139$permissiontoedit = $usercancreate;
141$price_base_type =
null;
144if (!empty($user->socid)) {
145 $socid = $user->socid;
154$parameters = array(
'socid' => $socid);
155$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
160if (empty($reshook)) {
161 $backurlforlist = DOL_URL_ROOT.
'/comm/propal/list.php';
163 if (empty($backtopage) || ($cancel && empty($id))) {
164 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
165 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
166 $backtopage = $backurlforlist;
168 $backtopage = DOL_URL_ROOT.
'/comm/propal/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
174 if (!empty($backtopageforcancel)) {
175 header(
"Location: ".$backtopageforcancel);
177 } elseif (!empty($backtopage)) {
178 header(
"Location: ".$backtopage);
184 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
186 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
188 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
191 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
193 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'IdThirdParty')),
null,
'errors');
206 $date_delivery_old =
$object->delivery_date;
207 if (!empty($date_delivery_old) && !empty($date_delivery)) {
218 $difference = $date_delivery - $old_date_delivery;
219 if ($difference != 0) {
220 $object->delivery_date = $date_delivery;
221 foreach (
$object->lines as $line) {
222 if (isset($line->date_start)) {
223 $line->date_start += $difference;
225 if (isset($line->date_end)) {
226 $line->date_end += $difference;
233 $result =
$object->createFromClone($user, $socid, (GETPOSTISSET(
'entity') ?
GETPOSTINT(
'entity') : null), (
GETPOSTINT(
'update_prices') ? true : false), (
GETPOSTINT(
'update_desc') ? true : false));
235 $warningMsgLineList = array();
237 foreach (
$object->lines as $line) {
238 if (!is_object($line->product)) {
239 $line->fetch_product();
241 if (is_object($line->product) && $line->product->id > 0) {
242 if (empty($line->product->status)) {
243 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
247 if (!empty($warningMsgLineList)) {
251 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
254 if (count(
$object->errors) > 0) {
261 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanclose) {
263 $result =
$object->setCancel($user);
265 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
268 $langs->load(
"errors");
271 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
273 $result =
$object->delete($user);
275 header(
'Location: '.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1');
278 $langs->load(
"errors");
281 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
283 $result =
$object->deleteLine($lineid);
288 $langs->load(
"errors");
294 $outputlangs = $langs;
297 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
298 $outputlangs->setDefaultLang($newlang);
304 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
307 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
309 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
312 $result =
$object->valid($user);
314 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
318 $outputlangs = $langs;
321 $newlang =
GETPOST(
'lang_id',
'aZ09');
324 $newlang =
$object->thirdparty->default_lang;
326 if (!empty($newlang)) {
328 $outputlangs->setDefaultLang($newlang);
336 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
339 $langs->load(
"errors");
340 if (count(
$object->errors) > 0) {
346 } elseif ($action ==
'setdate' && $usercancreate) {
351 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
355 $result =
$object->set_date($user, $datep);
356 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
357 $datev = $datep + (
$object->duree_validite * 24 * 3600);
358 $result =
$object->set_echeance($user, $datev, 1);
363 $outputlangs = $langs;
366 $newlang =
GETPOST(
'lang_id',
'aZ09');
369 $newlang =
$object->thirdparty->default_lang;
371 if (!empty($newlang)) {
373 $outputlangs->setDefaultLang($newlang);
381 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
384 } elseif ($action ==
'setecheance' && $usercancreate) {
388 $outputlangs = $langs;
391 $newlang =
GETPOST(
'lang_id',
'aZ09');
394 $newlang =
$object->thirdparty->default_lang;
396 if (!empty($newlang)) {
398 $outputlangs->setDefaultLang($newlang);
406 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
411 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
416 } elseif ($action ==
'setref_client' && $usercancreate) {
422 } elseif ($action ==
'set_incoterms' && isModEnabled(
'incoterm') && $usercancreate) {
425 } elseif ($action ==
'add' && $usercancreate) {
435 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
439 if (empty($duration)) {
440 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
446 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
461 $object->delivery_date = $date_delivery;
467 $object->duree_validite = $duration;
477 $object->user_author_id = $user->id;
483 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
492 $object->delivery_date = $date_delivery;
510 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
516 if (isModEnabled(
"multicurrency")) {
517 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
521 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
529 if ($origin && $originid) {
531 $element = $subelement = $origin;
533 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
535 $subelement = $regs[2];
539 if ($element ==
'order') {
540 $element = $subelement =
'commande';
542 if ($element ==
'propal') {
543 $element =
'comm/propal';
544 $subelement =
'propal';
546 if ($element ==
'contract') {
547 $element = $subelement =
'contrat';
549 if ($element ==
'inter') {
550 $element = $subelement =
'fichinter';
552 if ($element ==
'shipping') {
553 $element = $subelement =
'expedition';
557 $object->origin_id = $originid;
562 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
569 $classname = ucfirst($subelement);
570 $srcobject =
new $classname($db);
571 '@phan-var-force Commande|Propal|Contrat|Fichinter|Expedition $srcobject';
574 $result = $srcobject->fetch(
$object->origin_id);
577 $lines = $srcobject->lines;
578 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
579 $srcobject->fetch_lines();
580 $lines = $srcobject->lines;
584 $num = count($lines);
585 for ($i = 0; $i < $num; $i++) {
586 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
587 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
590 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
594 if ($lines[$i]->date_debut_prevue) {
595 $date_start = $lines[$i]->date_debut_prevue;
597 if ($lines[$i]->date_debut_reel) {
598 $date_start = $lines[$i]->date_debut_reel;
600 if ($lines[$i]->date_start) {
601 $date_start = $lines[$i]->date_start;
606 if ($lines[$i]->date_fin_prevue) {
607 $date_end = $lines[$i]->date_fin_prevue;
609 if ($lines[$i]->date_fin_reel) {
610 $date_end = $lines[$i]->date_fin_reel;
612 if ($lines[$i]->date_end) {
613 $date_end = $lines[$i]->date_end;
617 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
622 if (method_exists($lines[$i],
'fetch_optionals')) {
623 $lines[$i]->fetch_optionals();
624 $array_options = $lines[$i]->array_options;
627 $tva_tx = $lines[$i]->tva_tx;
628 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
629 $tva_tx .=
' ('.$lines[$i]->vat_src_code.
')';
632 $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);
643 if ($result > 0 && $lines[$i]->product_type == 9) {
644 $fk_parent_line = $result;
649 $parameters = array(
'objFrom' => $srcobject);
650 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
671 if (
GETPOST(
'contactid') > 0) {
672 $result =
$object->add_contact(
GETPOST(
'contactid'),
'CUSTOMER',
'external');
680 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
683 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
692 $outputlangs = $langs;
695 $newlang =
GETPOST(
'lang_id',
'aZ09');
698 $newlang =
$object->thirdparty->default_lang;
700 if (!empty($newlang)) {
702 $outputlangs->setDefaultLang($newlang);
707 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
713 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
726 } elseif ($action ==
'classifybilled' && $usercanclose) {
730 $result =
$object->classifyBilled($user, 0,
'');
741 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
744 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
746 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
747 $locationTarget =
'';
761 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
766 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
769 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
770 && !empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
772 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
775 $forceFields = array();
777 if (GETPOSTISSET(
'date_pointoftax')) {
785 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
796 $ret = $deposit->fetch($deposit->id);
797 $outputlangs = $langs;
801 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
802 $outputlangs->load(
'products');
805 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
812 if ($locationTarget) {
813 header(
'Location: ' . $locationTarget);
825 } elseif ($action ==
'confirm_reopen' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
832 $result =
$object->reopen($user, $newstatus);
849 $fromElement =
GETPOST(
'fromelement');
850 $fromElementid =
GETPOST(
'fromelementid');
851 $importLines =
GETPOST(
'line_checkbox');
853 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
854 if ($fromElement ==
'commande') {
856 $lineClassName =
'OrderLine';
857 } elseif ($fromElement ==
'propal') {
858 dol_include_once(
'/comm/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
859 $lineClassName =
'PropaleLigne';
860 } elseif ($fromElement ==
'facture') {
861 dol_include_once(
'/compta/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
862 $lineClassName =
'FactureLigne';
864 $lineClassName =
null;
866 $nextRang = count(
$object->lines) + 1;
869 foreach ($importLines as $lineId) {
870 $lineId = intval($lineId);
871 $originLine =
new $lineClassName($db);
872 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
873 $originLine->fetch_optionals();
874 $desc = $originLine->desc;
875 $pu_ht = $originLine->subprice;
876 $qty = $originLine->qty;
877 $txtva = $originLine->tva_tx;
878 $txlocaltax1 = $originLine->localtax1_tx;
879 $txlocaltax2 = $originLine->localtax2_tx;
880 $fk_product = $originLine->fk_product;
881 $remise_percent = $originLine->remise_percent;
882 $date_start = $originLine->date_start;
883 $date_end = $originLine->date_end;
884 $fk_code_ventilation = 0;
885 $info_bits = $originLine->info_bits;
886 $fk_remise_except = $originLine->fk_remise_except;
887 $price_base_type =
'HT';
889 $type = $originLine->product_type;
891 $special_code = $originLine->special_code;
892 $origin = $originLine->element;
893 $origin_id = $originLine->id;
895 $fk_fournprice = $originLine->fk_fournprice;
896 $pa_ht = $originLine->pa_ht;
897 $label = $originLine->label;
898 $array_options = $originLine->array_options;
899 $situation_percent = 100;
901 $fk_unit = $originLine->fk_unit;
902 $pu_ht_devise = $originLine->multicurrency_subprice;
904 $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);
922 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
925 $actiontypecode =
'AC_OTH_AUTO';
926 $triggersendname =
'PROPAL_SENTBYMAIL';
927 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
928 $trackid =
'pro'.$object->id;
929 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
933 if ($action ==
'modif' && $usercancreate) {
934 $result =
$object->setDraft($user);
941 $outputlangs = $langs;
944 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
945 $outputlangs->setDefaultLang($newlang);
951 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
953 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
962 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
966 foreach (
$object->lines as $line) {
967 if ($line->product_type == 1) {
968 $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);
971 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
973 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
974 $vat_rate = str_replace(
'*',
'', $vat_rate);
977 foreach (
$object->lines as $line) {
978 $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);
980 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
982 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
983 $remise_percent = str_replace(
'*',
'', $remise_percent);
984 foreach (
$object->lines as $line) {
985 $tvatx = $line->tva_tx;
986 if (!empty($line->vat_src_code)) {
987 $tvatx .=
' ('.$line->vat_src_code.
')';
989 $result =
$object->updateline($line->id, $line->subprice, $line->qty, $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);
991 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines') !==
'' && $usercancreate) {
993 $margin_rate = (
GETPOST(
'marginforalllines') ?
GETPOST(
'marginforalllines') : 0);
994 foreach (
$object->lines as &$line) {
995 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
997 $prod->fetch($line->fk_product);
998 if ($prod->price_min > $subprice) {
999 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1000 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1001 setEventMessages($prod->ref.
' - '.$prod->label.
' ('.$price_subprice.
' < '.$price_price_min.
' '.strtolower($langs->trans(
"MinPrice")).
')'.
"\n",
null,
'warnings');
1004 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1006 $result =
$object->updateline($line->id, $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);
1008 $line->price = $subprice;
1009 $line->marge_tx = $margin_rate;
1010 $line->marque_tx = $margin_rate * $line->pa_ht / (float) $subprice;
1011 $line->total_ht = $line->qty * (float) $subprice;
1012 $line->total_tva = $line->tva_tx * $line->qty * (float) $subprice;
1013 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice;
1015 $line->multicurrency_total_ht = $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1016 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1017 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice * $line->multicurrency_subprice / $line->subprice;
1019 $line->subprice = (float) $subprice;
1020 $line->multicurrency_subprice = $multicurrency_subprice;
1022 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && $usercancreate) {
1025 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1028 $price_ht_devise =
'';
1030 $price_ttc_devise =
'';
1034 if (
GETPOST(
'price_ht') !==
'') {
1037 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1040 if (
GETPOST(
'price_ttc') !==
'') {
1043 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1044 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1047 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1048 if ($prod_entry_mode ==
'free') {
1054 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1059 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1062 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef,
'alpha'),
'', 2) : 0);
1063 if (empty($remise_percent)) {
1064 $remise_percent = 0;
1068 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1069 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1071 if (is_array($extralabelsline)) {
1073 foreach ($extralabelsline as $key => $value) {
1074 unset($_POST[
"options_".$key]);
1078 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1079 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1083 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1084 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1087 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
1088 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1092 if (!$error && isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1093 if ($combinations =
GETPOST(
'combinations',
'array')) {
1097 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1098 $idprod = $res->fk_product_child;
1100 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1106 $propal_qty_requirement = (
getDolGlobalString(
'PROPAL_ENABLE_NEGATIVE_QTY') ? ($qty >= 0 || $qty <= 0) : $qty >= 0);
1107 if (!$error && $propal_qty_requirement && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
1115 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1124 if (!empty($idprod) && $idprod > 0) {
1126 $prod->fetch($idprod);
1128 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
1138 $pu_ht = $prod->price;
1139 $pu_ttc = $prod->price_ttc;
1140 $price_min = $prod->price_min;
1141 $price_min_ttc = $prod->price_min_ttc;
1142 $price_base_type = $prod->price_base_type;
1146 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1148 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
1151 $pricebycustomerexist =
false;
1152 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1155 if (count($prodcustprice->lines) > 0) {
1156 $pricebycustomerexist =
true;
1157 $pu_ht =
price($prodcustprice->lines[0]->price);
1158 $pu_ttc =
price($prodcustprice->lines[0]->price_ttc);
1159 $price_min =
price($prodcustprice->lines[0]->price_min);
1160 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
1161 $price_base_type = $prodcustprice->lines[0]->price_base_type;
1173 if (!$pricebycustomerexist &&
$object->thirdparty->price_level) {
1174 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1175 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1176 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1177 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1178 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1180 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1181 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1183 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1184 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1189 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1190 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1191 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1192 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1193 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1195 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1196 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1198 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1199 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1204 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1208 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
1210 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1213 if (count($prodcustprice->lines) > 0) {
1214 $pu_ht =
price($prodcustprice->lines[0]->price);
1215 $pu_ttc =
price($prodcustprice->lines[0]->price_ttc);
1216 $price_min =
price($prodcustprice->lines[0]->price_min);
1217 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
1218 $price_base_type = $prodcustprice->lines[0]->price_base_type;
1231 if ($prod->prices_by_qty[0]) {
1236 foreach ($prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1237 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1241 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1242 $pu_ht = $priceforthequantityarray[
'unitprice'];
1244 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1252 if ($prod->prices_by_qty[
$object->thirdparty->price_level]) {
1257 foreach ($prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1258 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1262 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1263 $pu_ht = $priceforthequantityarray[
'unitprice'];
1265 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1273 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1274 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
1277 if (!empty($price_ht) || (
string) $price_ht ===
'0') {
1279 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
1280 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1281 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1284 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1286 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
1287 } elseif ($tmpvat != $tmpprodvat) {
1289 if ($price_base_type !=
'HT') {
1290 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
1292 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
1300 $outputlangs = $langs;
1302 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
1303 $newlang =
GETPOST(
'lang_id',
'aZ09');
1305 if (empty($newlang)) {
1306 $newlang =
$object->thirdparty->default_lang;
1308 if (!empty($newlang)) {
1309 $outputlangs =
new Translate(
"", $conf);
1310 $outputlangs->setDefaultLang($newlang);
1313 $desc = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1315 $desc = $prod->description;
1324 $desc = $product_desc;
1330 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1334 $outputlangs = $langs;
1336 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
1337 $newlang =
GETPOST(
'lang_id',
'alpha');
1339 if (empty($newlang)) {
1340 $newlang =
$object->thirdparty->default_lang;
1342 if (!empty($newlang)) {
1343 $outputlangs =
new Translate(
"", $conf);
1344 $outputlangs->setDefaultLang($newlang);
1345 $outputlangs->load(
'products');
1347 if (!empty($prod->customcode)) {
1348 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1350 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1353 if (!empty($prod->country_code)) {
1354 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $outputlangs, 0);
1357 if (!empty($prod->customcode)) {
1358 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1360 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1363 if (!empty($prod->country_code)) {
1364 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $langs, 0);
1371 $type = $prod->type;
1372 $fk_unit = $prod->fk_unit;
1376 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1377 if (empty($tva_tx)) {
1380 $tva_tx = str_replace(
'*',
'', $tva_tx);
1381 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1382 $desc = $product_desc;
1384 $fk_unit =
GETPOST(
'units',
'alpha');
1385 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1386 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1388 if ($pu_ttc && !$pu_ht) {
1389 $price_base_type =
'TTC';
1410 $pu_equivalent = $pu_ht;
1411 $pu_equivalent_ttc = $pu_ttc;
1412 $currency_tx =
$object->multicurrency_tx;
1416 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1417 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1419 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1420 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1438 if ($usermustrespectpricemin) {
1439 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) <
price2num($price_min)) && $price_base_type ==
'HT') {
1440 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1443 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) <
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1444 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1452 $result =
$object->addline($desc, $pu_ht, $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,
GETPOST(
'fk_parent_line'), $fournprice, $buyingprice, $label, $date_start, $date_end, $array_options, $fk_unit,
'', 0, $pu_ht_devise);
1459 $outputlangs = $langs;
1461 $outputlangs =
new Translate(
"", $conf);
1462 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1463 $outputlangs->setDefaultLang($newlang);
1469 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1472 unset($_POST[
'prod_entry_mode']);
1474 unset($_POST[
'qty']);
1475 unset($_POST[
'type']);
1476 unset($_POST[
'remise_percent']);
1477 unset($_POST[
'price_ht']);
1478 unset($_POST[
'multicurrency_price_ht']);
1479 unset($_POST[
'price_ttc']);
1480 unset($_POST[
'tva_tx']);
1481 unset($_POST[
'product_ref']);
1482 unset($_POST[
'product_label']);
1483 unset($_POST[
'product_desc']);
1484 unset($_POST[
'fournprice']);
1485 unset($_POST[
'buying_price']);
1486 unset($_POST[
'np_marginRate']);
1487 unset($_POST[
'np_markRate']);
1488 unset($_POST[
'dp_desc']);
1489 unset($_POST[
'idprod']);
1490 unset($_POST[
'units']);
1492 unset($_POST[
'date_starthour']);
1493 unset($_POST[
'date_startmin']);
1494 unset($_POST[
'date_startsec']);
1495 unset($_POST[
'date_startday']);
1496 unset($_POST[
'date_startmonth']);
1497 unset($_POST[
'date_startyear']);
1498 unset($_POST[
'date_endhour']);
1499 unset($_POST[
'date_endmin']);
1500 unset($_POST[
'date_endsec']);
1501 unset($_POST[
'date_endday']);
1502 unset($_POST[
'date_endmonth']);
1503 unset($_POST[
'date_endyear']);
1511 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1519 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1525 $vat_rate = str_replace(
'*',
'', $vat_rate);
1542 if (empty($remise_percent)) {
1543 $remise_percent = 0;
1547 $pu_equivalent = $pu_ht;
1548 $pu_equivalent_ttc = $pu_ttc;
1550 $currency_tx =
$object->multicurrency_tx;
1554 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1555 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1557 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1558 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1573 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1574 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1576 if (is_array($extralabelsline)) {
1578 foreach ($extralabelsline as $key => $value) {
1579 unset($_POST[
"options_".$key]);
1591 if (!empty($productid)) {
1593 $res = $product->fetch($productid);
1595 $type = $product->type;
1598 $price_min = $product->price_min;
1600 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1602 $price_min_ttc = $product->price_min_ttc;
1604 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1611 if ($usermustrespectpricemin) {
1612 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1613 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1616 $action =
'editline';
1617 } 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') {
1618 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1621 $action =
'editline';
1626 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1630 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1638 if (!$user->hasRight(
'margins',
'creer')) {
1639 foreach (
$object->lines as &$line) {
1641 $fournprice = $line->fk_fournprice;
1642 $buyingprice = $line->pa_ht;
1651 $price_base_type =
'HT';
1652 if (empty($pu) && !empty($pu_ttc)) {
1654 $price_base_type =
'TTC';
1657 $result =
$object->updateline(
GETPOSTINT(
'lineid'), $pu, $qty, $remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $description, $price_base_type, $info_bits, $special_code,
GETPOST(
'fk_parent_line'), 0, $fournprice, $buyingprice, $label, $type, $date_start, $date_end, $array_options,
GETPOST(
"units"), $pu_ht_devise);
1664 $outputlangs = $langs;
1666 $outputlangs =
new Translate(
"", $conf);
1667 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1668 $outputlangs->setDefaultLang($newlang);
1674 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1677 unset($_POST[
'qty']);
1678 unset($_POST[
'type']);
1679 unset($_POST[
'productid']);
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']);
1691 unset($_POST[
'date_starthour']);
1692 unset($_POST[
'date_startmin']);
1693 unset($_POST[
'date_startsec']);
1694 unset($_POST[
'date_startday']);
1695 unset($_POST[
'date_startmonth']);
1696 unset($_POST[
'date_startyear']);
1697 unset($_POST[
'date_endhour']);
1698 unset($_POST[
'date_endmin']);
1699 unset($_POST[
'date_endsec']);
1700 unset($_POST[
'date_endday']);
1701 unset($_POST[
'date_endmonth']);
1702 unset($_POST[
'date_endyear']);
1709 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
1710 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1712 } elseif ($action ==
'classin' && $usercancreate) {
1715 } elseif ($action ==
'setavailability' && $usercancreate) {
1718 } elseif ($action ==
'setdemandreason' && $usercancreate) {
1721 } elseif ($action ==
'setconditions' && $usercancreate) {
1728 } elseif ($action ==
'setmode' && $usercancreate) {
1731 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
1733 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
1734 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
1737 } elseif ($action ==
'setbankaccount' && $usercancreate) {
1740 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
1743 } elseif ($action ==
'setwarehouse' && $usercancreate) {
1746 } elseif ($action ==
'update_extras' && $usercancreate) {
1748 $attribute_name =
GETPOST(
'attribute',
'restricthtml');
1751 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
1756 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
1763 $action =
'edit_extras';
1768 if ($action ==
'addcontact' && $usercancreate) {
1772 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1776 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1779 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1780 $langs->load(
"errors");
1781 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1786 } elseif ($action ==
'swapstatut' && $usercancreate) {
1788 if (
$object->fetch($id) > 0) {
1793 } elseif ($action ==
'deletecontact' && $usercancreate) {
1796 $result =
$object->delete_contact($lineid);
1799 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1808 $upload_dir = !empty($conf->propal->multidir_output[
$object->entity]) ? $conf->propal->multidir_output[
$object->entity] : $conf->propal->dir_output;
1809 $permissiontoadd = $usercancreate;
1810 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1818$form =
new Form($db);
1823if (isModEnabled(
'project')) {
1827$title =
$object->ref.
" - ".$langs->trans(
'Card');
1828if ($action ==
'create') {
1829 $title = $langs->trans(
"NewPropal");
1831$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
1838if ($action ==
'create') {
1839 $currency_code = $conf->currency;
1845 $res = $soc->fetch($socid);
1848 $currency_code = $conf->currency;
1850 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1851 $deposit_percent =
GETPOST(
'cond_reglement_id_deposit_percent',
'alpha');
1852 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1854 $datepropal = (empty($datepropal) ? (!
getDolGlobalString(
'MAIN_AUTOFILL_DATE_PROPOSAL') ? -1 :
'') : $datepropal);
1858 if (!empty($origin) && !empty($originid)) {
1860 $element = $subelement = $origin;
1862 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1863 $element = $regs[1];
1864 $subelement = $regs[2];
1867 if ($element ==
'project') {
1868 $projectid = $originid;
1871 if ($element ==
'order' || $element ==
'commande') {
1872 $element = $subelement =
'commande';
1874 if ($element ==
'propal') {
1875 $element =
'comm/propal';
1876 $subelement =
'propal';
1878 if ($element ==
'contract') {
1879 $element = $subelement =
'contrat';
1881 if ($element ==
'shipping') {
1882 $element = $subelement =
'expedition';
1887 $classname = ucfirst($subelement);
1888 $objectsrc =
new $classname($db);
1889 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
1890 $objectsrc->fetch($originid);
1891 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1892 $objectsrc->fetch_lines();
1894 $objectsrc->fetch_thirdparty();
1896 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
1897 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
1899 $soc = $objectsrc->thirdparty;
1901 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1902 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1903 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : 0));
1906 $objectsrc->fetch_optionals();
1907 $object->array_options = $objectsrc->array_options;
1909 if (isModEnabled(
"multicurrency")) {
1910 if (!empty($objectsrc->multicurrency_code)) {
1911 $currency_code = $objectsrc->multicurrency_code;
1913 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
1914 $currency_tx = $objectsrc->multicurrency_tx;
1919 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
1920 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
1921 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
1922 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
1923 $shipping_method_id = $soc->shipping_method_id;
1924 $warehouse_id = $soc->fk_warehouse;
1925 $remise_percent = $soc->remise_percent;
1927 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
1928 $currency_code = $soc->multicurrency_code;
1933 if (!
GETPOST(
'changecompany')) {
1934 if (GETPOSTISSET(
'cond_reglement_id')) {
1935 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1937 if (GETPOSTISSET(
'deposit_percent')) {
1940 if (GETPOSTISSET(
'mode_reglement_id')) {
1941 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1943 if (GETPOSTISSET(
'cond_reglement_id')) {
1949 if ($soc->fk_warehouse > 0) {
1950 $warehouse_id = $soc->fk_warehouse;
1952 if (isModEnabled(
'stock') && empty($warehouse_id) &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER')) {
1957 $warehouse_id = $user->fk_warehouse;
1961 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1962 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1963 print
'<input type="hidden" name="action" value="add">';
1964 print
'<input type="hidden" name="changecompany" value="0">';
1965 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1966 if ($origin !=
'project' && $originid) {
1967 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
1968 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
1969 } elseif ($origin ==
'project' && !empty($projectid)) {
1970 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
1976 $parameters = array();
1978 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
1979 if (empty($reshook)) {
1980 print
'<table class="border centpercent">';
1983 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
1986 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
1987 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
1991 print
'<tr class="field_socid">';
1992 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
1993 $shipping_method_id = 0;
1996 print
'<td class="valuefieldcreate">';
1997 print $soc->getNomUrl(1,
'customer');
1998 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
2000 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2001 $shipping_method_id = $soc->shipping_method_id;
2005 print
'<td class="valuefieldcreate">';
2006 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2007 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2011 $(document).ready(function() {
2012 $("#socid").change(function() {
2013 console.log("We have changed the company - Reload page");
2014 var socid = $(this).val();
2016 $("input[name=action]").val("create");
2017 $("input[name=changecompany]").val("1");
2018 $("form[name=addprop]").submit();
2023 print
' <a href="'.DOL_URL_ROOT.
'/societe/card.php?action=create&client=3&fournisseur=0&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create').
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span></a>';
2030 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
2031 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2033 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2037 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
2039 $absolute_discount = $soc->getAvailableDiscounts();
2043 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
2044 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2050 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
2051 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2052 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2056 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') : $conf->global->PROPALE_VALIDITY_DURATION).
'"> '.$langs->trans(
"days").
'</td></tr>';
2059 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2060 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2062 print $form->getSelectConditionsPaiements($cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2066 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2067 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2068 print $form->select_types_paiements($mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2072 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2073 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2074 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2079 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2080 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2081 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2085 if (isModEnabled(
"shipping")) {
2086 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2087 $shipping_method_id = $soc->shipping_method_id;
2089 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2090 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2091 $form->selectShippingMethod((GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2095 $formproduct =
null;
2097 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2098 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2100 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2101 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2106 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2107 if (isModEnabled(
'order')) {
2108 print
' ('.$langs->trans(
'AfterOrder').
')';
2110 print
'</td><td class="valuefieldcreate">';
2111 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2112 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2116 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2117 print
'<td class="valuefieldcreate">';
2118 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2120 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2121 $syear = date(
"Y", $tmpdte);
2122 $smonth = date(
"m", $tmpdte);
2123 $sday = date(
"d", $tmpdte);
2124 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2126 print $form->selectDate(-1,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2131 if (isModEnabled(
'project') && is_object($formproject)) {
2132 $langs->load(
"projects");
2133 print
'<tr class="field_projectid">';
2134 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2135 print
img_picto(
'',
'project',
'class="pictofixedwidth"').$formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500 widthcentpercentminusxx');
2136 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>';
2142 if (isModEnabled(
'incoterm')) {
2143 print
'<tr class="field_incoterm_id">';
2144 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2145 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2146 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2147 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2152 print
'<tr class="field_model">';
2153 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2154 print
'<td class="valuefieldcreate">';
2155 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2158 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2162 if (isModEnabled(
"multicurrency")) {
2163 print
'<tr class="field_currency">';
2164 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2165 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2166 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0);
2171 print
'<tr class="field_note_public">';
2172 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2173 print
'<td class="valuefieldcreate">';
2174 $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');
2175 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2176 print $doleditor->Create(1);
2179 if (empty($user->socid)) {
2180 print
'<tr class="field_note_private">';
2181 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2182 print
'<td class="valuefieldcreate">';
2183 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2184 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2185 print $doleditor->Create(1);
2191 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2194 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2196 if ($origin ==
'contrat') {
2200 $objectsrc->update_price(1,
'auto', 1);
2203 print
"\n<!-- ".$classname.
" info -->";
2205 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2206 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2207 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2208 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2209 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2211 $newclassname = $classname;
2212 if ($newclassname ==
'Propal') {
2213 $newclassname =
'CommercialProposal';
2214 } elseif ($newclassname ==
'Commande') {
2215 $newclassname =
'Order';
2216 } elseif ($newclassname ==
'Expedition') {
2217 $newclassname =
'Sending';
2218 } elseif ($newclassname ==
'Fichinter') {
2219 $newclassname =
'Intervention';
2222 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2223 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1, $conf->currency).
'</td></tr>';
2224 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2225 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2226 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2229 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2230 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2232 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2234 if (isModEnabled(
"multicurrency")) {
2235 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2236 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2237 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2249 print
'<input type="hidden" name="createmode" value="empty">';
2253 print
'<br><table>';
2257 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2258 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2260 $liste_propal = array();
2261 $liste_propal [0] =
'';
2263 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2264 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2265 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2266 $sql .=
" WHERE s.rowid = p.fk_soc";
2267 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2268 $sql .=
" AND p.fk_statut <> 0";
2269 $sql .=
" ORDER BY Id";
2271 $resql = $db->query($sql);
2273 $num = $db->num_rows($resql);
2276 $row = $db->fetch_row($resql);
2277 $propalRefAndSocName = $row[1].
" - ".$row[2];
2278 $liste_propal[$row[0]] = $propalRefAndSocName;
2281 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2287 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2288 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2295 $langs->load(
"bills");
2297 print $form->buttonsSaveCancel(
"CreateDraft");
2303 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2306 $title = $langs->trans(
'ProductsAndServices');
2309 print
'<div class="div-table-responsive-no-min">';
2310 print
'<table class="noborder centpercent">';
2312 $objectsrc->printOriginLinesList();
2329 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
'propal', 0,
'',
'', 0,
'', 1);
2334 if ($action ==
'clone') {
2336 $filter =
'(s.client:IN:1,2,3)';
2337 $formquestion = array(
2340 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2341 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2342 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2345 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2348 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
2351 if ($action ==
'closeas') {
2353 $formquestion = array();
2355 $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)));
2357 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2359 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2364 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2366 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2367 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2371 $eligibleForDepositGeneration =
true;
2373 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2374 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2375 '@phan-var-force Facture $invoice';
2377 $eligibleForDepositGeneration =
false;
2383 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2384 foreach (
$object->linkedObjects[
'commande'] as $order) {
2385 $order->fetchObjectLinked();
2387 if (array_key_exists(
'facture', $order->linkedObjects)) {
2388 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2389 '@phan-var-force Facture $invoice';
2391 $eligibleForDepositGeneration =
false;
2400 if ($eligibleForDepositGeneration) {
2401 $formquestion[] = array(
2402 'type' =>
'checkbox',
2403 'tdclass' =>
'showonlyifsigned',
2404 'name' =>
'generate_deposit',
2405 'morecss' =>
'margintoponly marginbottomonly',
2406 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2409 $formquestion[] = array(
2411 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2413 'label' => $langs->trans(
'DateInvoice'),
2419 $formquestion[] = array(
2421 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2422 'name' =>
'date_pointoftax',
2423 'label' => $langs->trans(
'DatePointOfTax'),
2429 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2431 $formquestion[] = array(
2433 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2434 'name' =>
'cond_reglement_id',
2435 'label' => $langs->trans(
'PaymentTerm'),
2436 'value' => $paymentTermsSelect
2439 $formquestion[] = array(
2440 'type' =>
'checkbox',
2441 'tdclass' =>
'showonlyifgeneratedeposit',
2442 'name' =>
'validate_generated_deposit',
2443 'morecss' =>
'margintoponly marginbottomonly',
2444 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2447 $formquestion[] = array(
2448 'type' =>
'onecolumn',
2451 let signedValue = ' . $object::STATUS_SIGNED .
';
2453 $(document).ready(function() {
2454 $("[name=generate_deposit]").change(function () {
2455 let $self = $(this);
2456 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2458 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2467 $("#statut").change(function() {
2468 let $target = $(".showonlyifsigned").parent(".tagtr");
2470 if ($(this).val() == signedValue) {
2476 $("[name=generate_deposit]").trigger("change");
2481 $("#statut").trigger("change");
2490 if (isModEnabled(
'notification')) {
2491 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2492 $notify =
new Notify($db);
2493 $formquestion = array_merge($formquestion, array(
2494 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2499 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2501 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2503 } elseif ($action ==
'cancel') {
2505 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2506 } elseif ($action ==
'delete') {
2508 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2509 } elseif ($action ==
'reopen') {
2511 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2512 } elseif ($action ==
'ask_deleteline') {
2514 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2515 } elseif ($action ==
'validate') {
2520 $ref = substr(
$object->ref, 1, 4);
2521 if ($ref ==
'PROV' || $ref ==
'') {
2522 $numref =
$object->getNextNumRef($soc);
2523 if (empty($numref)) {
2531 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2532 if (isModEnabled(
'notification')) {
2533 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2534 $notify =
new Notify($db);
2536 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2541 foreach (
$object->lines as $line) {
2542 $res = $line->fetch_product();
2544 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2550 if ($nbMandated > 0) {
2552 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2555 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2560 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2565 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2566 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2567 if (empty($reshook)) {
2568 $formconfirm .= $hookmanager->resPrint;
2569 } elseif ($reshook > 0) {
2570 $formconfirm = $hookmanager->resPrint;
2579 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2581 $morehtmlref =
'<div class="refidno">';
2583 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2584 $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);
2586 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2588 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2591 if (isModEnabled(
'project')) {
2592 $langs->load(
"projects");
2593 $morehtmlref .=
'<br>';
2594 if ($usercancreate) {
2595 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2596 if ($action !=
'classify') {
2597 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2599 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2601 if (!empty(
$object->fk_project)) {
2603 $proj->fetch(
$object->fk_project);
2604 $morehtmlref .= $proj->getNomUrl(1);
2606 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2611 $morehtmlref .=
'</div>';
2614 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2617 $parameters = array();
2619 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
2620 if (empty($reshook)) {
2621 print
'<div class="fichecenter">';
2622 print
'<div class="fichehalfleft">';
2623 print
'<div class="underbanner clearboth"></div>';
2625 print
'<table class="border tableforfield centpercent">';
2629 $filterabsolutediscount =
"fk_facture_source IS NULL";
2630 $filtercreditnote =
"fk_facture_source IS NOT NULL";
2632 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
2633 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
2636 print
'<tr><td class="titlefieldmax45">'.$langs->trans(
'Discounts').
'</td><td>';
2638 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
2639 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
2640 $absolute_discount =
price2num($absolute_discount,
'MT');
2641 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
2647 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
2648 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2664 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, $editenable);
2665 print
'</td><td class="valuefield">';
2666 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
2667 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2668 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2669 print
'<input type="hidden" name="action" value="setdate">';
2670 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2671 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
2672 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2686 print
'<table class="nobordernopadding centpercent"><tr><td>';
2687 print $langs->trans(
'DateEndPropal');
2689 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
2690 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>';
2692 print
'</tr></table>';
2693 print
'</td><td class="valuefield">';
2694 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
2695 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2696 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2697 print
'<input type="hidden" name="action" value="setecheance">';
2698 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2699 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
2700 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2703 if (!empty(
$object->fin_validite)) {
2717 print
'<table class="nobordernopadding centpercent"><tr><td>';
2718 print $langs->trans(
'PaymentConditionsShort');
2720 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
2721 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>';
2723 print
'</tr></table>';
2724 print
'</td><td class="valuefield">';
2725 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
2726 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
2728 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
2734 print
'<tr class="field_mode_reglement_id">';
2736 print
'<table class="nobordernopadding centpercent"><tr><td>';
2737 print $langs->trans(
'PaymentMode');
2739 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
2740 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>';
2742 print
'</tr></table>';
2743 print
'</td><td class="valuefieldcreate">';
2744 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
2745 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
2747 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'none');
2752 $langs->load(
'deliveries');
2754 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2755 print
'</td><td class="valuefieldedit">';
2756 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2761 print
'<tr class="fielddeliverydelay"><td>';
2762 print
'<table class="nobordernopadding centpercent"><tr><td>';
2763 if (isModEnabled(
'order')) {
2764 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
2766 print $langs->trans(
'AvailabilityPeriod');
2769 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
2770 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>';
2772 print
'</tr></table>';
2773 print
'</td><td class="valuefield">';
2774 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
2775 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'availability_id', 1);
2777 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'none', 1);
2784 if (isModEnabled(
"shipping")) {
2786 print
'<table class="nobordernopadding centpercent"><tr><td>';
2787 print $langs->trans(
'SendingMethod');
2789 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
2790 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>';
2792 print
'</tr></table>';
2793 print
'</td><td class="valuefield">';
2794 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
2795 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'shipping_method_id', 1);
2797 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'none');
2804 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2805 $langs->load(
'stocks');
2806 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2808 print
'<tr class="field_warehouse_id"><td>';
2809 $editenable = $usercancreate;
2810 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
2811 print
'</td><td class="valuefieldcreate">';
2812 if ($action ==
'editwarehouse') {
2813 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
2815 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
2823 print
'<table class="nobordernopadding centpercent"><tr><td>';
2824 print $langs->trans(
'Source');
2826 if ($action !=
'editdemandreason' && $usercancreate) {
2827 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>';
2829 print
'</tr></table>';
2830 print
'</td><td class="valuefield">';
2831 if ($action ==
'editdemandreason' && $usercancreate) {
2832 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'demand_reason_id', 1);
2834 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'none');
2839 if ($soc->outstanding_limit) {
2842 print $langs->trans(
'OutstandingBill');
2843 print
'</td><td class="valuefield">';
2844 $arrayoutstandingbills = $soc->getOutstandingBills();
2845 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
2846 print
price($arrayoutstandingbills[
'opened']).
' / ';
2847 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1, $conf->currency);
2852 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2855 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2856 print $langs->trans(
'BankAccount');
2858 if ($action !=
'editbankaccount' && $usercancreate) {
2859 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>';
2861 print
'</tr></table>';
2862 print
'</td><td class="valuefield">';
2863 if ($action ==
'editbankaccount') {
2864 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
2866 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
2873 $tmparray =
$object->getTotalWeightVolume();
2874 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
2875 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
2877 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
2878 print
'<td class="valuefield">';
2883 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
2884 print
'<td class="valuefield">';
2891 if (isModEnabled(
'incoterm')) {
2893 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2894 print $langs->trans(
'IncotermLabel');
2895 print
'<td><td class="right">';
2896 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
2897 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2901 print
'</td></tr></table>';
2903 print
'<td class="valuefield">';
2904 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
2905 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2907 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
2913 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2918 print
'<div class="fichehalfright">';
2919 print
'<div class="underbanner clearboth"></div>';
2921 print
'<table class="border tableforfield centpercent">';
2923 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
2926 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
2927 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2928 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2929 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2934 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
2935 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2936 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2937 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2941 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
2943 print
'<td>' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
2944 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2945 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2948 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2953 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
2955 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
2956 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2957 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2960 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2966 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
2967 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2968 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2969 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2976 if (isModEnabled(
'margin')) {
2977 $formmargin->displayMarginInfos(
$object);
2983 print
'<div class="clearboth"></div><br>';
2986 $blocname =
'contacts';
2987 $title = $langs->trans(
'ContactsAddresses');
2988 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
2992 $blocname =
'notes';
2993 $title = $langs->trans(
'Notes');
2994 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3002 $result =
$object->getLinesArray();
3006 global $inputalsopricewithtax;
3007 $inputalsopricewithtax = 1;
3009 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
3010 <input type="hidden" name="token" value="' .
newToken().
'">
3011 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3012 <input type="hidden" name="mode" value="">
3013 <input type="hidden" name="page_y" value="">
3014 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3015 <input type="hidden" name="id" value="' .
$object->id.
'">
3019 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3022 print
'<div class="div-table-responsive-no-min">';
3024 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3028 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3033 if ($action !=
'editline') {
3034 $parameters = array();
3035 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3039 if (empty($reshook)) {
3040 $object->formAddObjectLine(1, $mysoc, $soc);
3043 $parameters = array();
3044 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3063 if ($action !=
'presend') {
3064 $numlines = count(
$object->lines);
3065 print
'<div class="tabsAction">';
3067 $parameters = array();
3068 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3070 if (empty($reshook)) {
3071 if ($action !=
'editline') {
3075 if ($usercanvalidate) {
3076 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>';
3078 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3088 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3093 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3094 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3098 if (empty($user->socid)) {
3100 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3104 $arrayforbutaction = array();
3107 $arrayforbutaction[] = array(
'lang' =>
'orders',
'enabled' => (isModEnabled(
'order') &&
$object->statut ==
Propal::STATUS_SIGNED),
'perm' => $usercancreateorder,
'label' =>
'AddOrder',
'url' =>
'/commande/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((
int)
$object->id).
'&socid='.((
int)
$object->socid));
3116 $arrayforbutaction[] = array(
'lang' =>
'orders',
'enabled' => (
$object->statut ==
Propal::STATUS_SIGNED && isModEnabled(
"supplier_order")),
'perm' => $usercancreatepurchaseorder,
'label' =>
'AddPurchaseOrder',
'url' =>
'/fourn/commande/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((
int)
$object->id).
'&socid='.((
int)
$object->socid));
3125 $arrayforbutaction[] = array(
'lang' =>
'interventions',
'enabled' => (isModEnabled(
"service") && isModEnabled(
'intervention') &&
$object->statut ==
Propal::STATUS_SIGNED),
'perm' => $usercancreateintervention,
'label' =>
'AddIntervention',
'url' =>
'/fichinter/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((
int)
$object->id).
'&socid='.((
int)
$object->socid));
3134 $arrayforbutaction[] = array(
'lang' =>
'contracts',
'enabled' => (isModEnabled(
'contract') &&
$object->statut ==
Propal::STATUS_SIGNED),
'perm' => $usercancreatecontract,
'label' =>
'AddContract',
'url' =>
'/contrat/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((
int)
$object->id).
'&socid='.((
int)
$object->socid));
3145 $arrayforbutaction[] = array(
'lang' =>
'invoice',
'enabled' => isModEnabled(
'invoice'),
'perm' => $usercancreateinvoice,
'label' =>
'CreateBill',
'url' =>
'/compta/facture/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((
int)
$object->id).
'&socid='.((
int)
$object->socid));
3151 $actionButtonsParameters = [
3152 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3153 "backtopage" => $_SERVER[
"PHP_SELF"].
"?id=".((int) $id)
3156 if ($numlines > 0) {
3157 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 1, $actionButtonsParameters);
3159 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 0, $actionButtonsParameters);
3163 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3164 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3165 if ($usercanclose) {
3166 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3168 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3176 if ($usercanclose) {
3177 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3178 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3180 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3181 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3187 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3188 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3194 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3198 if ($usercancreate) {
3199 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>';
3203 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3211 if (
GETPOST(
'modelselected')) {
3212 $action =
'presend';
3215 if ($action !=
'presend') {
3216 print
'<div class="fichecenter"><div class="fichehalfleft">';
3217 print
'<a name="builddoc"></a>';
3223 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3224 $genallowed = $usercanread;
3225 $delallowed = $usercancreate;
3227 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $soc->default_lang,
'',
$object);
3230 $linktoelem = $form->showLinkToObjectBlock(
$object, array(), array(
'propal'));
3232 $compatibleImportElementsList =
false;
3234 $compatibleImportElementsList = array(
'commande',
'propal',
'facture');
3236 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3242 print
'<br><!-- Link to sign -->';
3243 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3244 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3247 print
'</div><div class="fichehalfright">';
3251 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3254 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3256 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3258 print
'</div></div>';
3262 $modelmail =
'propal_send';
3263 $defaulttopic =
'SendPropalRef';
3264 $diroutput = $conf->propal->multidir_output[
$object->entity];
3265 $trackid =
'pro'.$object->id;
3267 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
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_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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)
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.
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'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
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_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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.
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.