44require
'../../main.inc.php';
45require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
47require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formpropal.class.php';
48require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmargin.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
50require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
51require_once DOL_DOCUMENT_ROOT.
'/core/modules/propale/modules_propale.php';
52require_once DOL_DOCUMENT_ROOT.
'/core/lib/propal.lib.php';
53require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
56if (isModEnabled(
'project')) {
57 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
58 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
61if (isModEnabled(
'variants')) {
62 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination.class.php';
66$langs->loadLangs(array(
'companies',
'propal',
'compta',
'bills',
'orders',
'products',
'deliveries',
'sendings',
'other'));
67if (isModEnabled(
'incoterm')) {
68 $langs->load(
'incoterm');
70if (isModEnabled(
'margin')) {
71 $langs->load(
'margins');
79$action =
GETPOST(
'action',
'aZ09');
80$cancel =
GETPOST(
'cancel',
'alpha');
81$origin =
GETPOST(
'origin',
'alpha');
83$confirm =
GETPOST(
'confirm',
'alpha');
84$backtopage =
GETPOST(
'backtopage',
'alpha');
99$extrafields->fetch_name_optionals_label(
$object->table_element);
102if ($id > 0 || !empty($ref)) {
103 $ret =
$object->fetch($id, $ref);
105 $ret =
$object->fetch_thirdparty();
106 if ($ret > 0 && isset(
$object->fk_project)) {
107 $ret =
$object->fetch_project();
117$hookmanager->initHooks(array(
'propalcard',
'globalcard'));
119$usercanread = $user->hasRight(
"propal",
"lire");
120$usercancreate = $user->hasRight(
"propal",
"creer");
121$usercandelete = $user->hasRight(
"propal",
"supprimer");
123$usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'close')));
124$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'validate')));
127$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
128$usercancreateorder = $user->hasRight(
'commande',
'creer');
129$usercancreateinvoice = $user->hasRight(
'facture',
'creer');
130$usercancreatecontract = $user->hasRight(
'contrat',
'creer');
131$usercancreateintervention = $user->hasRight(
'ficheinter',
'creer');
132$usercancreatepurchaseorder = ($user->hasRight(
'fournisseur',
'commande',
'creer') || $user->hasRight(
'supplier_order',
'creer'));
134$permissionnote = $usercancreate;
135$permissiondellink = $usercancreate;
136$permissiontoedit = $usercancreate;
139if (!empty($user->socid)) {
140 $socid = $user->socid;
149$parameters = array(
'socid' => $socid);
150$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
155if (empty($reshook)) {
156 $backurlforlist = DOL_URL_ROOT.
'/comm/propal/list.php';
158 if (empty($backtopage) || ($cancel && empty($id))) {
159 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
160 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
161 $backtopage = $backurlforlist;
163 $backtopage = DOL_URL_ROOT.
'/comm/propal/card.php?id='.((!empty($id) && $id > 0) ? $id :
'__ID__');
169 if (!empty($backtopageforcancel)) {
170 header(
"Location: ".$backtopageforcancel);
172 } elseif (!empty($backtopage)) {
173 header(
"Location: ".$backtopage);
179 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
181 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
183 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
186 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
188 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'IdThirdParty')),
null,
'errors');
201 $date_delivery_old =
$object->delivery_date;
202 if (!empty($date_delivery_old) && !empty($date_delivery)) {
213 $difference = $date_delivery - $old_date_delivery;
214 if ($difference != 0) {
215 $object->delivery_date = $date_delivery;
216 foreach (
$object->lines as $line) {
217 if (isset($line->date_start)) {
218 $line->date_start = $line->date_start + $difference;
220 if (isset($line->date_end)) {
221 $line->date_end = $line->date_end + $difference;
228 $result =
$object->createFromClone($user, $socid, (GETPOSTISSET(
'entity') ?
GETPOSTINT(
'entity') : null), (
GETPOSTINT(
'update_prices') ? true : false), (
GETPOSTINT(
'update_desc') ? true : false));
230 $warningMsgLineList = array();
232 foreach (
$object->lines as $line) {
233 if (!is_object($line->product)) {
234 $line->fetch_product();
236 if (is_object($line->product) && $line->product->id > 0) {
237 if (empty($line->product->status)) {
238 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
242 if (!empty($warningMsgLineList)) {
246 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
249 if (count(
$object->errors) > 0) {
256 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanclose) {
258 $result =
$object->setCancel($user);
260 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
263 $langs->load(
"errors");
266 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
268 $result =
$object->delete($user);
270 header(
'Location: '.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1');
273 $langs->load(
"errors");
276 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
278 $result =
$object->deleteLine($lineid);
283 $langs->load(
"errors");
289 $outputlangs = $langs;
292 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
293 $outputlangs->setDefaultLang($newlang);
299 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
302 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
304 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
307 $result =
$object->valid($user);
309 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
313 $outputlangs = $langs;
316 $newlang =
GETPOST(
'lang_id',
'aZ09');
319 $newlang =
$object->thirdparty->default_lang;
321 if (!empty($newlang)) {
323 $outputlangs->setDefaultLang($newlang);
331 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
334 $langs->load(
"errors");
335 if (count(
$object->errors) > 0) {
341 } elseif ($action ==
'setdate' && $usercancreate) {
346 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
350 $result =
$object->set_date($user, $datep);
351 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
352 $datev = $datep + (
$object->duree_validite * 24 * 3600);
353 $result =
$object->set_echeance($user, $datev, 1);
358 $outputlangs = $langs;
361 $newlang =
GETPOST(
'lang_id',
'aZ09');
364 $newlang =
$object->thirdparty->default_lang;
366 if (!empty($newlang)) {
368 $outputlangs->setDefaultLang($newlang);
376 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
379 } elseif ($action ==
'setecheance' && $usercancreate) {
383 $outputlangs = $langs;
386 $newlang =
GETPOST(
'lang_id',
'aZ09');
389 $newlang =
$object->thirdparty->default_lang;
391 if (!empty($newlang)) {
393 $outputlangs->setDefaultLang($newlang);
401 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
406 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
411 } elseif ($action ==
'setref_client' && $usercancreate) {
417 } elseif ($action ==
'set_incoterms' && isModEnabled(
'incoterm') && $usercancreate) {
420 } elseif ($action ==
'add' && $usercancreate) {
430 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
434 if (empty($duration)) {
435 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
441 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
456 $object->delivery_date = $date_delivery;
462 $object->duree_validite = $duration;
472 $object->user_author_id = $user->id;
478 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
487 $object->delivery_date = $date_delivery;
505 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
511 if (isModEnabled(
"multicurrency")) {
512 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
516 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
524 if ($origin && $originid) {
526 $element = $subelement = $origin;
528 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
530 $subelement = $regs[2];
534 if ($element ==
'order') {
535 $element = $subelement =
'commande';
537 if ($element ==
'propal') {
538 $element =
'comm/propal';
539 $subelement =
'propal';
541 if ($element ==
'contract') {
542 $element = $subelement =
'contrat';
544 if ($element ==
'inter') {
545 $element = $subelement =
'ficheinter';
547 if ($element ==
'shipping') {
548 $element = $subelement =
'expedition';
552 $object->origin_id = $originid;
557 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
564 $classname = ucfirst($subelement);
565 $srcobject =
new $classname($db);
568 $result = $srcobject->fetch(
$object->origin_id);
571 $lines = $srcobject->lines;
572 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
573 $srcobject->fetch_lines();
574 $lines = $srcobject->lines;
578 $num = count($lines);
579 for ($i = 0; $i < $num; $i++) {
580 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
581 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
584 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
588 if ($lines[$i]->date_debut_prevue) {
589 $date_start = $lines[$i]->date_debut_prevue;
591 if ($lines[$i]->date_debut_reel) {
592 $date_start = $lines[$i]->date_debut_reel;
594 if ($lines[$i]->date_start) {
595 $date_start = $lines[$i]->date_start;
600 if ($lines[$i]->date_fin_prevue) {
601 $date_end = $lines[$i]->date_fin_prevue;
603 if ($lines[$i]->date_fin_reel) {
604 $date_end = $lines[$i]->date_fin_reel;
606 if ($lines[$i]->date_end) {
607 $date_end = $lines[$i]->date_end;
611 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
616 if (method_exists($lines[$i],
'fetch_optionals')) {
617 $lines[$i]->fetch_optionals();
618 $array_options = $lines[$i]->array_options;
621 $tva_tx = $lines[$i]->tva_tx;
622 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
623 $tva_tx .=
' ('.$lines[$i]->vat_src_code.
')';
626 $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);
637 if ($result > 0 && $lines[$i]->product_type == 9) {
638 $fk_parent_line = $result;
643 $parameters = array(
'objFrom' => $srcobject);
644 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
665 if (
GETPOST(
'contactid') > 0) {
666 $result =
$object->add_contact(
GETPOST(
'contactid'),
'CUSTOMER',
'external');
674 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
677 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
686 $outputlangs = $langs;
689 $newlang =
GETPOST(
'lang_id',
'aZ09');
692 $newlang =
$object->thirdparty->default_lang;
694 if (!empty($newlang)) {
696 $outputlangs->setDefaultLang($newlang);
701 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
707 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
720 } elseif ($action ==
'classifybilled' && $usercanclose) {
724 $result =
$object->classifyBilled($user, 0,
'');
735 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
738 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
740 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
741 $locationTarget =
'';
755 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
760 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
763 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
764 && !empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
766 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
769 $forceFields = array();
771 if (GETPOSTISSET(
'date_pointoftax')) {
779 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
790 $ret = $deposit->fetch($deposit->id);
791 $outputlangs = $langs;
795 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
796 $outputlangs->load(
'products');
799 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
806 if ($locationTarget) {
807 header(
'Location: ' . $locationTarget);
819 } elseif ($action ==
'confirm_reopen' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
826 $result =
$object->reopen($user, $newstatus);
843 $fromElement =
GETPOST(
'fromelement');
844 $fromElementid =
GETPOST(
'fromelementid');
845 $importLines =
GETPOST(
'line_checkbox');
847 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
848 if ($fromElement ==
'commande') {
850 $lineClassName =
'OrderLine';
851 } elseif ($fromElement ==
'propal') {
852 dol_include_once(
'/comm/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
853 $lineClassName =
'PropaleLigne';
854 } elseif ($fromElement ==
'facture') {
855 dol_include_once(
'/compta/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
856 $lineClassName =
'FactureLigne';
858 $nextRang = count(
$object->lines) + 1;
861 foreach ($importLines as $lineId) {
862 $lineId = intval($lineId);
863 $originLine =
new $lineClassName($db);
864 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
865 $originLine->fetch_optionals();
866 $desc = $originLine->desc;
867 $pu_ht = $originLine->subprice;
868 $qty = $originLine->qty;
869 $txtva = $originLine->tva_tx;
870 $txlocaltax1 = $originLine->localtax1_tx;
871 $txlocaltax2 = $originLine->localtax2_tx;
872 $fk_product = $originLine->fk_product;
873 $remise_percent = $originLine->remise_percent;
874 $date_start = $originLine->date_start;
875 $date_end = $originLine->date_end;
876 $fk_code_ventilation = 0;
877 $info_bits = $originLine->info_bits;
878 $fk_remise_except = $originLine->fk_remise_except;
879 $price_base_type =
'HT';
881 $type = $originLine->product_type;
883 $special_code = $originLine->special_code;
884 $origin = $originLine->element;
885 $origin_id = $originLine->id;
887 $fk_fournprice = $originLine->fk_fournprice;
888 $pa_ht = $originLine->pa_ht;
889 $label = $originLine->label;
890 $array_options = $originLine->array_options;
891 $situation_percent = 100;
893 $fk_unit = $originLine->fk_unit;
894 $pu_ht_devise = $originLine->multicurrency_subprice;
896 $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);
914 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
917 $actiontypecode =
'AC_OTH_AUTO';
918 $triggersendname =
'PROPAL_SENTBYMAIL';
919 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
920 $trackid =
'pro'.$object->id;
921 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
925 if ($action ==
'modif' && $usercancreate) {
930 $outputlangs = $langs;
933 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
934 $outputlangs->setDefaultLang($newlang);
940 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
942 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
951 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
955 foreach (
$object->lines as $line) {
956 if ($line->product_type == 1) {
957 $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);
960 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
962 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
963 $vat_rate = str_replace(
'*',
'', $vat_rate);
966 foreach (
$object->lines as $line) {
967 $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);
969 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
971 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
972 $remise_percent = str_replace(
'*',
'', $remise_percent);
973 foreach (
$object->lines as $line) {
974 $tvatx= $line->tva_tx;
975 if (!empty($line->vat_src_code)) {
976 $tvatx .=
' ('.$line->vat_src_code.
')';
978 $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);
980 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines') !==
'' && $usercancreate) {
982 $margin_rate = (
GETPOST(
'marginforalllines') ?
GETPOST(
'marginforalllines') : 0);
983 foreach (
$object->lines as &$line) {
984 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
986 $prod->fetch($line->fk_product);
987 if ($prod->price_min > $subprice) {
988 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
989 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
990 setEventMessages($prod->ref.
' - '.$prod->label.
' ('.$price_subprice.
' < '.$price_price_min.
' '.strtolower($langs->trans(
"MinPrice")).
')'.
"\n",
null,
'warnings');
993 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
995 $result =
$object->updateline($line->id, $subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_rate, $line->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, $multicurrency_subprice);
997 $line->price = $subprice;
998 $line->marge_tx = $margin_rate;
999 $line->marque_tx = $margin_rate * $line->pa_ht / (float) $subprice;
1000 $line->total_ht = $line->qty * (float) $subprice;
1001 $line->total_tva = $line->tva_tx * $line->qty * (float) $subprice;
1002 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice;
1004 $line->multicurrency_total_ht = $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1005 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1006 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice * $line->multicurrency_subprice / $line->subprice;
1008 $line->subprice = $subprice;
1009 $line->multicurrency_subprice = $multicurrency_subprice;
1011 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && $usercancreate) {
1014 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1017 $price_ht_devise =
'';
1019 $price_ttc_devise =
'';
1023 if (
GETPOST(
'price_ht') !==
'') {
1026 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1029 if (
GETPOST(
'price_ttc') !==
'') {
1032 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1033 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1036 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1037 if ($prod_entry_mode ==
'free') {
1043 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1048 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1051 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef,
'alpha'),
'', 2) : 0);
1052 if (empty($remise_percent)) {
1053 $remise_percent = 0;
1057 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1058 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1060 if (is_array($extralabelsline)) {
1062 foreach ($extralabelsline as $key => $value) {
1063 unset($_POST[
"options_".$key]);
1067 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1068 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1072 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1073 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1076 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
1077 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1081 if (!$error && isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1082 if ($combinations =
GETPOST(
'combinations',
'array')) {
1086 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1087 $idprod = $res->fk_product_child;
1089 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1095 $propal_qty_requirement = (
getDolGlobalString(
'PROPAL_ENABLE_NEGATIVE_QTY') ? ($qty >= 0 || $qty <= 0) : $qty >= 0);
1096 if (!$error && $propal_qty_requirement && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
1104 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1113 if (!empty($idprod) && $idprod > 0) {
1115 $prod->fetch($idprod);
1117 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
1127 $pu_ht = $prod->price;
1128 $pu_ttc = $prod->price_ttc;
1129 $price_min = $prod->price_min;
1130 $price_min_ttc = $prod->price_min_ttc;
1131 $price_base_type = $prod->price_base_type;
1135 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1136 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1137 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1138 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1139 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1141 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1142 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1144 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1145 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1150 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1154 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
1156 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1159 if (count($prodcustprice->lines) > 0) {
1160 $pu_ht =
price($prodcustprice->lines[0]->price);
1161 $pu_ttc =
price($prodcustprice->lines[0]->price_ttc);
1162 $price_min =
price($prodcustprice->lines[0]->price_min);
1163 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
1164 $price_base_type = $prodcustprice->lines[0]->price_base_type;
1177 if ($prod->prices_by_qty[0]) {
1182 foreach ($prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1183 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1187 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1188 $pu_ht = $priceforthequantityarray[
'unitprice'];
1190 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1198 if ($prod->prices_by_qty[
$object->thirdparty->price_level]) {
1203 foreach ($prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1204 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1208 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1209 $pu_ht = $priceforthequantityarray[
'unitprice'];
1211 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1219 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1220 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
1223 if (!empty($price_ht) || (
string) $price_ht ===
'0') {
1225 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
1226 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1227 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1230 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1232 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
1233 } elseif ($tmpvat != $tmpprodvat) {
1235 if ($price_base_type !=
'HT') {
1236 $pu_ht =
price2num((
float) $pu_ttc / (1 + ($tmpvat / 100)),
'MU');
1238 $pu_ttc =
price2num((
float) $pu_ht * (1 + ($tmpvat / 100)),
'MU');
1246 $outputlangs = $langs;
1248 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
1249 $newlang =
GETPOST(
'lang_id',
'aZ09');
1251 if (empty($newlang)) {
1252 $newlang =
$object->thirdparty->default_lang;
1254 if (!empty($newlang)) {
1255 $outputlangs =
new Translate(
"", $conf);
1256 $outputlangs->setDefaultLang($newlang);
1259 $desc = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1261 $desc = $prod->description;
1270 $desc = $product_desc;
1276 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1280 $outputlangs = $langs;
1282 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
1283 $newlang =
GETPOST(
'lang_id',
'alpha');
1285 if (empty($newlang)) {
1286 $newlang =
$object->thirdparty->default_lang;
1288 if (!empty($newlang)) {
1289 $outputlangs =
new Translate(
"", $conf);
1290 $outputlangs->setDefaultLang($newlang);
1291 $outputlangs->load(
'products');
1293 if (!empty($prod->customcode)) {
1294 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1296 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1299 if (!empty($prod->country_code)) {
1300 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
1303 if (!empty($prod->customcode)) {
1304 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1306 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1309 if (!empty($prod->country_code)) {
1310 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $langs, 0);
1317 $type = $prod->type;
1318 $fk_unit = $prod->fk_unit;
1322 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1323 if (empty($tva_tx)) {
1326 $tva_tx = str_replace(
'*',
'', $tva_tx);
1327 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1328 $desc = $product_desc;
1330 $fk_unit =
GETPOST(
'units',
'alpha');
1331 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1332 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1334 if ($pu_ttc && !$pu_ht) {
1335 $price_base_type =
'TTC';
1356 $pu_equivalent = $pu_ht;
1357 $pu_equivalent_ttc = $pu_ttc;
1358 $currency_tx =
$object->multicurrency_tx;
1362 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1363 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1365 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1366 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1384 if ($usermustrespectpricemin) {
1385 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) <
price2num($price_min)) && $price_base_type ==
'HT') {
1386 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1389 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) <
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1390 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1398 $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);
1405 $outputlangs = $langs;
1407 $outputlangs =
new Translate(
"", $conf);
1408 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1409 $outputlangs->setDefaultLang($newlang);
1415 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1418 unset($_POST[
'prod_entry_mode']);
1420 unset($_POST[
'qty']);
1421 unset($_POST[
'type']);
1422 unset($_POST[
'remise_percent']);
1423 unset($_POST[
'price_ht']);
1424 unset($_POST[
'multicurrency_price_ht']);
1425 unset($_POST[
'price_ttc']);
1426 unset($_POST[
'tva_tx']);
1427 unset($_POST[
'product_ref']);
1428 unset($_POST[
'product_label']);
1429 unset($_POST[
'product_desc']);
1430 unset($_POST[
'fournprice']);
1431 unset($_POST[
'buying_price']);
1432 unset($_POST[
'np_marginRate']);
1433 unset($_POST[
'np_markRate']);
1434 unset($_POST[
'dp_desc']);
1435 unset($_POST[
'idprod']);
1436 unset($_POST[
'units']);
1438 unset($_POST[
'date_starthour']);
1439 unset($_POST[
'date_startmin']);
1440 unset($_POST[
'date_startsec']);
1441 unset($_POST[
'date_startday']);
1442 unset($_POST[
'date_startmonth']);
1443 unset($_POST[
'date_startyear']);
1444 unset($_POST[
'date_endhour']);
1445 unset($_POST[
'date_endmin']);
1446 unset($_POST[
'date_endsec']);
1447 unset($_POST[
'date_endday']);
1448 unset($_POST[
'date_endmonth']);
1449 unset($_POST[
'date_endyear']);
1457 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1465 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1471 $vat_rate = str_replace(
'*',
'', $vat_rate);
1488 if (empty($remise_percent)) {
1489 $remise_percent = 0;
1493 $pu_equivalent = $pu_ht;
1494 $pu_equivalent_ttc = $pu_ttc;
1496 $currency_tx =
$object->multicurrency_tx;
1500 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1501 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1503 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1504 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1519 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1520 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1522 if (is_array($extralabelsline)) {
1524 foreach ($extralabelsline as $key => $value) {
1525 unset($_POST[
"options_".$key]);
1537 if (!empty($productid)) {
1539 $res = $product->fetch($productid);
1541 $type = $product->type;
1544 $price_min = $product->price_min;
1546 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1548 $price_min_ttc = $product->price_min_ttc;
1550 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1557 if ($usermustrespectpricemin) {
1558 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (
float)
price2num($price_min)) && $price_base_type ==
'HT') {
1559 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1562 $action =
'editline';
1563 } 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') {
1564 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1567 $action =
'editline';
1572 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1576 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1584 if (!$user->hasRight(
'margins',
'creer')) {
1585 foreach (
$object->lines as &$line) {
1587 $fournprice = $line->fk_fournprice;
1588 $buyingprice = $line->pa_ht;
1597 $price_base_type =
'HT';
1598 if (empty($pu) && !empty($pu_ttc)) {
1600 $price_base_type =
'TTC';
1603 $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);
1610 $outputlangs = $langs;
1612 $outputlangs =
new Translate(
"", $conf);
1613 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1614 $outputlangs->setDefaultLang($newlang);
1620 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1623 unset($_POST[
'qty']);
1624 unset($_POST[
'type']);
1625 unset($_POST[
'productid']);
1626 unset($_POST[
'remise_percent']);
1627 unset($_POST[
'price_ht']);
1628 unset($_POST[
'multicurrency_price_ht']);
1629 unset($_POST[
'price_ttc']);
1630 unset($_POST[
'tva_tx']);
1631 unset($_POST[
'product_ref']);
1632 unset($_POST[
'product_label']);
1633 unset($_POST[
'product_desc']);
1634 unset($_POST[
'fournprice']);
1635 unset($_POST[
'buying_price']);
1637 unset($_POST[
'date_starthour']);
1638 unset($_POST[
'date_startmin']);
1639 unset($_POST[
'date_startsec']);
1640 unset($_POST[
'date_startday']);
1641 unset($_POST[
'date_startmonth']);
1642 unset($_POST[
'date_startyear']);
1643 unset($_POST[
'date_endhour']);
1644 unset($_POST[
'date_endmin']);
1645 unset($_POST[
'date_endsec']);
1646 unset($_POST[
'date_endday']);
1647 unset($_POST[
'date_endmonth']);
1648 unset($_POST[
'date_endyear']);
1655 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
1656 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1658 } elseif ($action ==
'classin' && $usercancreate) {
1661 } elseif ($action ==
'setavailability' && $usercancreate) {
1664 } elseif ($action ==
'setdemandreason' && $usercancreate) {
1667 } elseif ($action ==
'setconditions' && $usercancreate) {
1674 } elseif ($action ==
'setmode' && $usercancreate) {
1677 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
1679 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
1680 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
1683 } elseif ($action ==
'setbankaccount' && $usercancreate) {
1686 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
1689 } elseif ($action ==
'setwarehouse' && $usercancreate) {
1692 } elseif ($action ==
'update_extras' && $usercancreate) {
1694 $attribute_name =
GETPOST(
'attribute',
'restricthtml');
1697 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
1702 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
1709 $action =
'edit_extras';
1714 if ($action ==
'addcontact' && $usercancreate) {
1718 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1722 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1725 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1726 $langs->load(
"errors");
1727 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1732 } elseif ($action ==
'swapstatut' && $usercancreate) {
1734 if (
$object->fetch($id) > 0) {
1739 } elseif ($action ==
'deletecontact' && $usercancreate) {
1742 $result =
$object->delete_contact($lineid);
1745 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1754 $upload_dir = !empty($conf->propal->multidir_output[
$object->entity]) ? $conf->propal->multidir_output[
$object->entity] : $conf->propal->dir_output;
1755 $permissiontoadd = $usercancreate;
1756 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1764$form =
new Form($db);
1768if (isModEnabled(
'project')) {
1772$title =
$object->ref.
" - ".$langs->trans(
'Card');
1773if ($action ==
'create') {
1774 $title = $langs->trans(
"NewPropal");
1776$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
1783if ($action ==
'create') {
1784 $currency_code = $conf->currency;
1790 $res = $soc->fetch($socid);
1793 $currency_code = $conf->currency;
1795 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1796 $deposit_percent =
GETPOST(
'cond_reglement_id_deposit_percent',
'alpha');
1797 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1801 if (!empty($origin) && !empty($originid)) {
1803 $element = $subelement = $origin;
1805 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1806 $element = $regs[1];
1807 $subelement = $regs[2];
1810 if ($element ==
'project') {
1811 $projectid = $originid;
1814 if ($element ==
'order' || $element ==
'commande') {
1815 $element = $subelement =
'commande';
1817 if ($element ==
'propal') {
1818 $element =
'comm/propal';
1819 $subelement =
'propal';
1821 if ($element ==
'contract') {
1822 $element = $subelement =
'contrat';
1824 if ($element ==
'shipping') {
1825 $element = $subelement =
'expedition';
1830 $classname = ucfirst($subelement);
1831 $objectsrc =
new $classname($db);
1832 $objectsrc->fetch($originid);
1833 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1834 $objectsrc->fetch_lines();
1836 $objectsrc->fetch_thirdparty();
1838 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
1839 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
1841 $soc = $objectsrc->thirdparty;
1843 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1844 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1845 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : 0));
1848 $objectsrc->fetch_optionals();
1849 $object->array_options = $objectsrc->array_options;
1851 if (isModEnabled(
"multicurrency")) {
1852 if (!empty($objectsrc->multicurrency_code)) {
1853 $currency_code = $objectsrc->multicurrency_code;
1855 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
1856 $currency_tx = $objectsrc->multicurrency_tx;
1861 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
1862 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
1863 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
1864 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
1865 $shipping_method_id = $soc->shipping_method_id;
1866 $warehouse_id = $soc->fk_warehouse;
1867 $remise_percent = $soc->remise_percent;
1869 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
1870 $currency_code = $soc->multicurrency_code;
1875 if (!
GETPOST(
'changecompany')) {
1876 if (GETPOSTISSET(
'cond_reglement_id')) {
1877 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1879 if (GETPOSTISSET(
'deposit_percent')) {
1882 if (GETPOSTISSET(
'mode_reglement_id')) {
1883 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1885 if (GETPOSTISSET(
'cond_reglement_id')) {
1891 if ($soc->fk_warehouse > 0) {
1892 $warehouse_id = $soc->fk_warehouse;
1894 if (isModEnabled(
'stock') && empty($warehouse_id) &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER')) {
1899 $warehouse_id = $user->fk_warehouse;
1903 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1904 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1905 print
'<input type="hidden" name="action" value="add">';
1906 print
'<input type="hidden" name="changecompany" value="0">';
1907 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1908 if ($origin !=
'project' && $originid) {
1909 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
1910 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
1911 } elseif ($origin ==
'project' && !empty($projectid)) {
1912 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
1918 $parameters = array();
1920 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
1921 if (empty($reshook)) {
1922 print
'<table class="border centpercent">';
1925 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
1928 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
1929 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
1933 print
'<tr class="field_socid">';
1934 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
1935 $shipping_method_id = 0;
1937 print
'<td class="valuefieldcreate">';
1938 print $soc->getNomUrl(1,
'customer');
1939 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1941 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
1942 $shipping_method_id = $soc->shipping_method_id;
1946 print
'<td class="valuefieldcreate">';
1947 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
1948 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0,
null, 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
1952 $(document).ready(function() {
1953 $("#socid").change(function() {
1954 console.log("We have changed the company - Reload page");
1955 var socid = $(this).val();
1957 $("input[name=action]").val("create");
1958 $("input[name=changecompany]").val("1");
1959 $("form[name=addprop]").submit();
1964 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>';
1971 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
1972 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
1974 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
1978 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
1980 $absolute_discount = $soc->getAvailableDiscounts();
1984 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
1985 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
1990 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
1991 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1992 print $form->selectDate(
'',
'', 0, 0, 0,
"addprop", 1, 1);
1996 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>';
1999 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2000 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2002 print $form->getSelectConditionsPaiements($cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2006 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2007 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2008 print $form->select_types_paiements($mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2012 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2013 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2014 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2019 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2020 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2021 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2025 if (isModEnabled(
"shipping")) {
2026 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2027 $shipping_method_id = $soc->shipping_method_id;
2029 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2030 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2031 $form->selectShippingMethod((GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2036 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2037 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2039 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2040 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2045 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2046 if (isModEnabled(
'order')) {
2047 print
' ('.$langs->trans(
'AfterOrder').
')';
2049 print
'</td><td class="valuefieldcreate">';
2050 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2051 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2055 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2056 print
'<td class="valuefieldcreate">';
2057 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2059 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2060 $syear = date(
"Y", $tmpdte);
2061 $smonth = date(
"m", $tmpdte);
2062 $sday = date(
"d", $tmpdte);
2063 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2065 print $form->selectDate(-1,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2070 if (isModEnabled(
'project')) {
2071 $langs->load(
"projects");
2072 print
'<tr class="field_projectid">';
2073 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2074 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');
2075 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>';
2081 if (isModEnabled(
'incoterm')) {
2082 print
'<tr class="field_incoterm_id">';
2083 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2084 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2085 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2086 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2091 print
'<tr class="field_model">';
2092 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2093 print
'<td class="valuefieldcreate">';
2094 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2097 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2101 if (isModEnabled(
"multicurrency")) {
2102 print
'<tr class="field_currency">';
2103 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2104 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2105 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0);
2110 print
'<tr class="field_note_public">';
2111 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2112 print
'<td class="valuefieldcreate">';
2113 $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');
2114 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2115 print $doleditor->Create(1);
2118 if (empty($user->socid)) {
2119 print
'<tr class="field_note_private">';
2120 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2121 print
'<td class="valuefieldcreate">';
2122 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2123 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2124 print $doleditor->Create(1);
2130 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2133 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2135 if ($origin ==
'contrat') {
2139 $objectsrc->update_price(1,
'auto', 1);
2142 print
"\n<!-- ".$classname.
" info -->";
2144 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2145 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2146 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2147 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2148 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2150 $newclassname = $classname;
2151 if ($newclassname ==
'Propal') {
2152 $newclassname =
'CommercialProposal';
2153 } elseif ($newclassname ==
'Commande') {
2154 $newclassname =
'Order';
2155 } elseif ($newclassname ==
'Expedition') {
2156 $newclassname =
'Sending';
2157 } elseif ($newclassname ==
'Fichinter') {
2158 $newclassname =
'Intervention';
2161 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2162 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1, $conf->currency).
'</td></tr>';
2163 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2164 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2165 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2168 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2169 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2171 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2173 if (isModEnabled(
"multicurrency")) {
2174 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2175 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2176 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2188 print
'<input type="hidden" name="createmode" value="empty">';
2192 print
'<br><table>';
2196 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2197 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2199 $liste_propal = array();
2200 $liste_propal [0] =
'';
2202 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2203 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2204 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2205 $sql .=
" WHERE s.rowid = p.fk_soc";
2206 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2207 $sql .=
" AND p.fk_statut <> 0";
2208 $sql .=
" ORDER BY Id";
2210 $resql = $db->query($sql);
2212 $num = $db->num_rows($resql);
2215 $row = $db->fetch_row($resql);
2216 $propalRefAndSocName = $row[1].
" - ".$row[2];
2217 $liste_propal[$row[0]] = $propalRefAndSocName;
2220 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2226 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2227 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2234 $langs->load(
"bills");
2236 print $form->buttonsSaveCancel(
"CreateDraft");
2242 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2245 $title = $langs->trans(
'ProductsAndServices');
2248 print
'<div class="div-table-responsive-no-min">';
2249 print
'<table class="noborder centpercent">';
2251 $objectsrc->printOriginLinesList();
2273 if ($action ==
'clone') {
2275 $filter =
'(s.client:IN:1,2,3)';
2276 $formquestion = array(
2279 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0,
null, 0,
'maxwidth300')),
2280 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2281 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2284 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2287 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
2290 if ($action ==
'closeas') {
2292 $formquestion = array();
2294 $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)));
2296 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2298 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2303 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2305 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2306 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2310 $eligibleForDepositGeneration =
true;
2312 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2313 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2315 $eligibleForDepositGeneration =
false;
2321 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2322 foreach (
$object->linkedObjects[
'commande'] as $order) {
2323 $order->fetchObjectLinked();
2325 if (array_key_exists(
'facture', $order->linkedObjects)) {
2326 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2328 $eligibleForDepositGeneration =
false;
2337 if ($eligibleForDepositGeneration) {
2338 $formquestion[] = array(
2339 'type' =>
'checkbox',
2340 'tdclass' =>
'showonlyifsigned',
2341 'name' =>
'generate_deposit',
2342 'morecss' =>
'margintoponly marginbottomonly',
2343 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2346 $formquestion[] = array(
2348 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2350 'label' => $langs->trans(
'DateInvoice'),
2356 $formquestion[] = array(
2358 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2359 'name' =>
'date_pointoftax',
2360 'label' => $langs->trans(
'DatePointOfTax'),
2366 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2368 $formquestion[] = array(
2370 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2371 'name' =>
'cond_reglement_id',
2372 'label' => $langs->trans(
'PaymentTerm'),
2373 'value' => $paymentTermsSelect
2376 $formquestion[] = array(
2377 'type' =>
'checkbox',
2378 'tdclass' =>
'showonlyifgeneratedeposit',
2379 'name' =>
'validate_generated_deposit',
2380 'morecss' =>
'margintoponly marginbottomonly',
2381 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2384 $formquestion[] = array(
2385 'type' =>
'onecolumn',
2388 let signedValue = ' . $object::STATUS_SIGNED .
';
2390 $(document).ready(function() {
2391 $("[name=generate_deposit]").change(function () {
2392 let $self = $(this);
2393 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2395 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2404 $("#statut").change(function() {
2405 let $target = $(".showonlyifsigned").parent(".tagtr");
2407 if ($(this).val() == signedValue) {
2413 $("[name=generate_deposit]").trigger("change");
2418 $("#statut").trigger("change");
2427 if (isModEnabled(
'notification')) {
2428 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2429 $notify =
new Notify($db);
2430 $formquestion = array_merge($formquestion, array(
2431 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2436 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2438 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2440 } elseif ($action ==
'cancel') {
2442 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2443 } elseif ($action ==
'delete') {
2445 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2446 } elseif ($action ==
'reopen') {
2448 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2449 } elseif ($action ==
'ask_deleteline') {
2451 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2452 } elseif ($action ==
'validate') {
2457 $ref = substr(
$object->ref, 1, 4);
2458 if ($ref ==
'PROV' || $ref ==
'') {
2459 $numref =
$object->getNextNumRef($soc);
2460 if (empty($numref)) {
2468 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2469 if (isModEnabled(
'notification')) {
2470 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2471 $notify =
new Notify($db);
2473 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2478 foreach (
$object->lines as $line) {
2479 $res = $line->fetch_product();
2481 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2487 if ($nbMandated > 0) {
2489 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2492 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2497 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2502 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2503 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2504 if (empty($reshook)) {
2505 $formconfirm .= $hookmanager->resPrint;
2506 } elseif ($reshook > 0) {
2507 $formconfirm = $hookmanager->resPrint;
2516 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2518 $morehtmlref =
'<div class="refidno">';
2520 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2521 $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);
2523 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2525 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2528 if (isModEnabled(
'project')) {
2529 $langs->load(
"projects");
2530 $morehtmlref .=
'<br>';
2531 if ($usercancreate) {
2532 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2533 if ($action !=
'classify') {
2534 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2536 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2538 if (!empty(
$object->fk_project)) {
2540 $proj->fetch(
$object->fk_project);
2541 $morehtmlref .= $proj->getNomUrl(1);
2543 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2548 $morehtmlref .=
'</div>';
2551 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2554 $parameters = array();
2556 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
2557 if (empty($reshook)) {
2558 print
'<div class="fichecenter">';
2559 print
'<div class="fichehalfleft">';
2560 print
'<div class="underbanner clearboth"></div>';
2562 print
'<table class="border tableforfield centpercent">';
2566 $filterabsolutediscount =
"fk_facture_source IS NULL";
2567 $filtercreditnote =
"fk_facture_source IS NOT NULL";
2569 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
2570 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
2573 print
'<tr><td class="titlefield">'.$langs->trans(
'Discounts').
'</td><td>';
2575 $absolute_discount = $soc->getAvailableDiscounts(
'', $filterabsolutediscount);
2576 $absolute_creditnote = $soc->getAvailableDiscounts(
'', $filtercreditnote);
2577 $absolute_discount =
price2num($absolute_discount,
'MT');
2578 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
2584 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
2585 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2601 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, $editenable);
2602 print
'</td><td class="valuefield">';
2603 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
2604 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2605 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2606 print
'<input type="hidden" name="action" value="setdate">';
2607 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2608 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
2609 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2623 print
'<table class="nobordernopadding centpercent"><tr><td>';
2624 print $langs->trans(
'DateEndPropal');
2626 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
2627 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>';
2629 print
'</tr></table>';
2630 print
'</td><td class="valuefield">';
2631 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
2632 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2633 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2634 print
'<input type="hidden" name="action" value="setecheance">';
2635 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2636 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
2637 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2640 if (!empty(
$object->fin_validite)) {
2654 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2655 print $langs->trans(
'PaymentConditionsShort');
2657 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
2658 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>';
2660 print
'</tr></table>';
2661 print
'</td><td class="valuefield">';
2662 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
2663 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
2665 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
2671 print
'<tr class="field_mode_reglement_id">';
2672 print
'<td class="titlefieldcreate">';
2673 print
'<table class="nobordernopadding centpercent"><tr><td>';
2674 print $langs->trans(
'PaymentMode');
2676 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
2677 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>';
2679 print
'</tr></table>';
2680 print
'</td><td class="valuefieldcreate">';
2681 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
2682 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
2684 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'none');
2689 $langs->load(
'deliveries');
2691 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2692 print
'</td><td class="valuefieldedit">';
2693 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2698 print
'<tr class="fielddeliverydelay"><td>';
2699 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2700 if (isModEnabled(
'order')) {
2701 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
2703 print $langs->trans(
'AvailabilityPeriod');
2706 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
2707 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>';
2709 print
'</tr></table>';
2710 print
'</td><td class="valuefield">';
2711 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
2712 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'availability_id', 1);
2714 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'none', 1);
2721 if (isModEnabled(
"shipping")) {
2723 print
'<table class="nobordernopadding centpercent"><tr><td>';
2724 print $langs->trans(
'SendingMethod');
2726 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
2727 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>';
2729 print
'</tr></table>';
2730 print
'</td><td class="valuefield">';
2731 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
2732 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'shipping_method_id', 1);
2734 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'none');
2741 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2742 $langs->load(
'stocks');
2743 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2745 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">';
2746 $editenable = $usercancreate;
2747 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
2748 print
'</td><td class="valuefieldcreate">';
2749 if ($action ==
'editwarehouse') {
2750 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
2752 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
2760 print
'<table class="nobordernopadding centpercent"><tr><td>';
2761 print $langs->trans(
'Source');
2763 if ($action !=
'editdemandreason' && $usercancreate) {
2764 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>';
2766 print
'</tr></table>';
2767 print
'</td><td class="valuefield">';
2768 if ($action ==
'editdemandreason' && $usercancreate) {
2769 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'demand_reason_id', 1);
2771 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'none');
2777 if (isModEnabled(
"multicurrency")) {
2781 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2782 print $form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0);
2784 if ($action !=
'editmulticurrencycode' &&
$object->statut == $object::STATUS_DRAFT && $usercancreate) {
2785 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmulticurrencycode&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetMultiCurrencyCode'), 1).
'</a></td>';
2787 print
'</tr></table>';
2788 print
'</td><td class="valuefield">';
2789 if (
$object->statut == $object::STATUS_DRAFT && $action ==
'editmulticurrencycode' && $usercancreate) {
2790 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_code,
'multicurrency_code');
2792 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_code,
'none');
2797 if (
$object->multicurrency_code != $conf->currency ||
$object->multicurrency_tx != 1) {
2800 print
'<table class="nobordernopadding" width="100%"><tr>';
2802 print $form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'',
$object, 0);
2804 if ($action !=
'editmulticurrencyrate' &&
$object->statut == $object::STATUS_DRAFT &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency && $usercancreate) {
2805 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmulticurrencyrate&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetMultiCurrencyCode'), 1).
'</a></td>';
2807 print
'</tr></table>';
2808 print
'</td><td class="valuefield">';
2809 if (
$object->statut == $object::STATUS_DRAFT && ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') && $usercancreate) {
2810 if ($action ==
'actualizemulticurrencyrate') {
2813 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx,
'multicurrency_tx',
$object->multicurrency_code);
2815 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx,
'none',
$object->multicurrency_code);
2816 if (
$object->statut == $object::STATUS_DRAFT &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency) {
2817 print
'<div class="inline-block"> ';
2818 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
2826 if ($soc->outstanding_limit) {
2829 print $langs->trans(
'OutstandingBill');
2830 print
'</td><td class="valuefield">';
2831 $arrayoutstandingbills = $soc->getOutstandingBills();
2832 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
2833 print
price($arrayoutstandingbills[
'opened']).
' / ';
2834 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1, $conf->currency);
2839 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2842 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2843 print $langs->trans(
'BankAccount');
2845 if ($action !=
'editbankaccount' && $usercancreate) {
2846 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>';
2848 print
'</tr></table>';
2849 print
'</td><td class="valuefield">';
2850 if ($action ==
'editbankaccount') {
2851 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
2853 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
2859 $tmparray =
$object->getTotalWeightVolume();
2860 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
2861 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
2863 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
2864 print
'<td class="valuefield">';
2865 print
showDimensionInBestUnit($totalWeight, 0,
"weight", $langs, isset($conf->global->MAIN_WEIGHT_DEFAULT_ROUND) ? $conf->global->MAIN_WEIGHT_DEFAULT_ROUND : -1, isset($conf->global->MAIN_WEIGHT_DEFAULT_UNIT) ? $conf->global->MAIN_WEIGHT_DEFAULT_UNIT :
'no', 0);
2869 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
2870 print
'<td class="valuefield">';
2871 print
showDimensionInBestUnit($totalVolume, 0,
"volume", $langs, isset($conf->global->MAIN_VOLUME_DEFAULT_ROUND) ? $conf->global->MAIN_VOLUME_DEFAULT_ROUND : -1, isset($conf->global->MAIN_VOLUME_DEFAULT_UNIT) ? $conf->global->MAIN_VOLUME_DEFAULT_UNIT :
'no', 0);
2876 if (isModEnabled(
'incoterm')) {
2878 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2879 print $langs->trans(
'IncotermLabel');
2880 print
'<td><td class="right">';
2881 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
2882 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2886 print
'</td></tr></table>';
2888 print
'<td class="valuefield">';
2889 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
2890 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2892 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
2898 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2903 print
'<div class="fichehalfright">';
2904 print
'<div class="underbanner clearboth"></div>';
2906 print
'<table class="border tableforfield centpercent">';
2909 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
2910 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2911 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2912 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2917 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountVAT') .
'</td>';
2918 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2919 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2920 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2924 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
2926 print
'<td class="titlefieldmiddle">' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
2927 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2928 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2931 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2936 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
2938 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
2939 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2940 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2943 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2949 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
2950 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2951 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2952 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2959 if (isModEnabled(
'margin')) {
2960 $formmargin->displayMarginInfos(
$object);
2966 print
'<div class="clearboth"></div><br>';
2969 $blocname =
'contacts';
2970 $title = $langs->trans(
'ContactsAddresses');
2971 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
2975 $blocname =
'notes';
2976 $title = $langs->trans(
'Notes');
2977 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
2985 $result =
$object->getLinesArray();
2989 global $inputalsopricewithtax;
2990 $inputalsopricewithtax = 1;
2992 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
2993 <input type="hidden" name="token" value="' .
newToken().
'">
2994 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
2995 <input type="hidden" name="mode" value="">
2996 <input type="hidden" name="page_y" value="">
2997 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
2998 <input type="hidden" name="id" value="' .
$object->id.
'">
3002 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3005 print
'<div class="div-table-responsive-no-min">';
3007 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3011 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3016 if ($action !=
'editline') {
3017 $parameters = array();
3018 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3022 if (empty($reshook)) {
3023 $object->formAddObjectLine(1, $mysoc, $soc);
3026 $parameters = array();
3027 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3046 if ($action !=
'presend') {
3047 print
'<div class="tabsAction">';
3049 $parameters = array();
3050 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3052 if (empty($reshook)) {
3053 if ($action !=
'editline') {
3057 if ($usercanvalidate) {
3058 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>';
3060 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3070 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3075 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3076 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3080 if (empty($user->socid)) {
3082 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3088 if ($usercancreateorder) {
3089 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/commande/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid.
'">'.$langs->trans(
"AddOrder").
'</a>';
3096 if ($usercancreatepurchaseorder) {
3097 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/fourn/commande/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid.
'">'.$langs->trans(
"AddPurchaseOrder").
'</a>';
3104 if ($usercancreateintervention) {
3105 $langs->load(
"interventions");
3106 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/fichinter/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid.
'">'.$langs->trans(
"AddIntervention").
'</a>';
3112 $langs->load(
"contracts");
3114 if ($usercancreatecontract) {
3115 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/contrat/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid.
'">'.$langs->trans(
'AddContract').
'</a>';
3121 if (isModEnabled(
'invoice') && $usercancreateinvoice) {
3122 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/compta/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid.
'">'.$langs->trans(
"CreateBill").
'</a>';
3125 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3126 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3127 if ($usercanclose) {
3128 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3130 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3138 if ($usercanclose) {
3139 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3140 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3142 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3143 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3149 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3150 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3156 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3160 if ($usercancreate) {
3161 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>';
3165 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3173 if (
GETPOST(
'modelselected')) {
3174 $action =
'presend';
3177 if ($action !=
'presend') {
3178 print
'<div class="fichecenter"><div class="fichehalfleft">';
3179 print
'<a name="builddoc"></a>';
3185 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3186 $genallowed = $usercanread;
3187 $delallowed = $usercancreate;
3189 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $soc->default_lang,
'',
$object);
3192 $linktoelem = $form->showLinkToObjectBlock(
$object,
null, array(
'propal'));
3194 $compatibleImportElementsList =
false;
3196 $compatibleImportElementsList = array(
'commande',
'propal',
'facture');
3198 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3204 print
'<br><!-- Link to sign -->';
3205 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3206 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3209 print
'</div><div class="fichehalfright">';
3213 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3216 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3218 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3220 print
'</div></div>';
3224 $modelmail =
'propal_send';
3225 $defaulttopic =
'SendPropalRef';
3226 $diroutput = $conf->propal->multidir_output[
$object->entity];
3227 $trackid =
'pro'.$object->id;
3229 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()
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.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
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.
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)
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
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 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.