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) {
926 $result =
$object->setDraft($user);
933 $outputlangs = $langs;
936 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
937 $outputlangs->setDefaultLang($newlang);
943 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
945 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
954 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
958 foreach (
$object->lines as $line) {
959 if ($line->product_type == 1) {
960 $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);
963 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
965 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
966 $vat_rate = str_replace(
'*',
'', $vat_rate);
969 foreach (
$object->lines as $line) {
970 $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);
972 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
974 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
975 $remise_percent = str_replace(
'*',
'', $remise_percent);
976 foreach (
$object->lines as $line) {
977 $tvatx= $line->tva_tx;
978 if (!empty($line->vat_src_code)) {
979 $tvatx .=
' ('.$line->vat_src_code.
')';
981 $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);
983 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines') !==
'' && $usercancreate) {
985 $margin_rate = (
GETPOST(
'marginforalllines') ?
GETPOST(
'marginforalllines') : 0);
986 foreach (
$object->lines as &$line) {
987 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
989 $prod->fetch($line->fk_product);
990 if ($prod->price_min > $subprice) {
991 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
992 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
993 setEventMessages($prod->ref.
' - '.$prod->label.
' ('.$price_subprice.
' < '.$price_price_min.
' '.strtolower($langs->trans(
"MinPrice")).
')'.
"\n",
null,
'warnings');
996 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
998 $result =
$object->updateline($line->id, $subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->desc,
'HT', $line->info_bits, $line->special_code, $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $multicurrency_subprice);
1000 $line->price = $subprice;
1001 $line->marge_tx = $margin_rate;
1002 $line->marque_tx = $margin_rate * $line->pa_ht / (float) $subprice;
1003 $line->total_ht = $line->qty * (float) $subprice;
1004 $line->total_tva = $line->tva_tx * $line->qty * (float) $subprice;
1005 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice;
1007 $line->multicurrency_total_ht = $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1008 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1009 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice * $line->multicurrency_subprice / $line->subprice;
1011 $line->subprice = $subprice;
1012 $line->multicurrency_subprice = $multicurrency_subprice;
1014 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && $usercancreate) {
1017 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1020 $price_ht_devise =
'';
1022 $price_ttc_devise =
'';
1026 if (
GETPOST(
'price_ht') !==
'') {
1029 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1032 if (
GETPOST(
'price_ttc') !==
'') {
1035 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1036 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1039 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1040 if ($prod_entry_mode ==
'free') {
1046 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1051 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1054 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef,
'alpha'),
'', 2) : 0);
1055 if (empty($remise_percent)) {
1056 $remise_percent = 0;
1060 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1061 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1063 if (is_array($extralabelsline)) {
1065 foreach ($extralabelsline as $key => $value) {
1066 unset($_POST[
"options_".$key]);
1070 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1071 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1075 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1076 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1079 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
1080 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1084 if (!$error && isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1085 if ($combinations =
GETPOST(
'combinations',
'array')) {
1089 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1090 $idprod = $res->fk_product_child;
1092 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1098 $propal_qty_requirement = (
getDolGlobalString(
'PROPAL_ENABLE_NEGATIVE_QTY') ? ($qty >= 0 || $qty <= 0) : $qty >= 0);
1099 if (!$error && $propal_qty_requirement && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
1107 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1116 if (!empty($idprod) && $idprod > 0) {
1118 $prod->fetch($idprod);
1120 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
1130 $pu_ht = $prod->price;
1131 $pu_ttc = $prod->price_ttc;
1132 $price_min = $prod->price_min;
1133 $price_min_ttc = $prod->price_min_ttc;
1134 $price_base_type = $prod->price_base_type;
1138 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1139 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1140 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1141 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1142 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1144 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1145 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1147 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1148 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1153 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1157 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
1159 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1162 if (count($prodcustprice->lines) > 0) {
1163 $pu_ht =
price($prodcustprice->lines[0]->price);
1164 $pu_ttc =
price($prodcustprice->lines[0]->price_ttc);
1165 $price_min =
price($prodcustprice->lines[0]->price_min);
1166 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
1167 $price_base_type = $prodcustprice->lines[0]->price_base_type;
1180 if ($prod->prices_by_qty[0]) {
1185 foreach ($prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1186 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1190 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1191 $pu_ht = $priceforthequantityarray[
'unitprice'];
1193 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1201 if ($prod->prices_by_qty[
$object->thirdparty->price_level]) {
1206 foreach ($prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1207 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1211 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1212 $pu_ht = $priceforthequantityarray[
'unitprice'];
1214 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1222 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1223 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
1226 if (!empty($price_ht) || (
string) $price_ht ===
'0') {
1228 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
1229 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1230 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1233 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1235 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
1236 } elseif ($tmpvat != $tmpprodvat) {
1238 if ($price_base_type !=
'HT') {
1239 $pu_ht =
price2num((
float) $pu_ttc / (1 + ($tmpvat / 100)),
'MU');
1241 $pu_ttc =
price2num((
float) $pu_ht * (1 + ($tmpvat / 100)),
'MU');
1249 $outputlangs = $langs;
1251 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
1252 $newlang =
GETPOST(
'lang_id',
'aZ09');
1254 if (empty($newlang)) {
1255 $newlang =
$object->thirdparty->default_lang;
1257 if (!empty($newlang)) {
1258 $outputlangs =
new Translate(
"", $conf);
1259 $outputlangs->setDefaultLang($newlang);
1262 $desc = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1264 $desc = $prod->description;
1273 $desc = $product_desc;
1279 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1283 $outputlangs = $langs;
1285 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
1286 $newlang =
GETPOST(
'lang_id',
'alpha');
1288 if (empty($newlang)) {
1289 $newlang =
$object->thirdparty->default_lang;
1291 if (!empty($newlang)) {
1292 $outputlangs =
new Translate(
"", $conf);
1293 $outputlangs->setDefaultLang($newlang);
1294 $outputlangs->load(
'products');
1296 if (!empty($prod->customcode)) {
1297 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1299 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1302 if (!empty($prod->country_code)) {
1303 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
1306 if (!empty($prod->customcode)) {
1307 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1309 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1312 if (!empty($prod->country_code)) {
1313 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $langs, 0);
1320 $type = $prod->type;
1321 $fk_unit = $prod->fk_unit;
1325 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1326 if (empty($tva_tx)) {
1329 $tva_tx = str_replace(
'*',
'', $tva_tx);
1330 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1331 $desc = $product_desc;
1333 $fk_unit =
GETPOST(
'units',
'alpha');
1334 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1335 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1337 if ($pu_ttc && !$pu_ht) {
1338 $price_base_type =
'TTC';
1359 $pu_equivalent = $pu_ht;
1360 $pu_equivalent_ttc = $pu_ttc;
1361 $currency_tx =
$object->multicurrency_tx;
1365 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1366 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1368 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1369 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1387 if ($usermustrespectpricemin) {
1388 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) <
price2num($price_min)) && $price_base_type ==
'HT') {
1389 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1392 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) <
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1393 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1401 $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);
1408 $outputlangs = $langs;
1410 $outputlangs =
new Translate(
"", $conf);
1411 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1412 $outputlangs->setDefaultLang($newlang);
1418 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1421 unset($_POST[
'prod_entry_mode']);
1423 unset($_POST[
'qty']);
1424 unset($_POST[
'type']);
1425 unset($_POST[
'remise_percent']);
1426 unset($_POST[
'price_ht']);
1427 unset($_POST[
'multicurrency_price_ht']);
1428 unset($_POST[
'price_ttc']);
1429 unset($_POST[
'tva_tx']);
1430 unset($_POST[
'product_ref']);
1431 unset($_POST[
'product_label']);
1432 unset($_POST[
'product_desc']);
1433 unset($_POST[
'fournprice']);
1434 unset($_POST[
'buying_price']);
1435 unset($_POST[
'np_marginRate']);
1436 unset($_POST[
'np_markRate']);
1437 unset($_POST[
'dp_desc']);
1438 unset($_POST[
'idprod']);
1439 unset($_POST[
'units']);
1441 unset($_POST[
'date_starthour']);
1442 unset($_POST[
'date_startmin']);
1443 unset($_POST[
'date_startsec']);
1444 unset($_POST[
'date_startday']);
1445 unset($_POST[
'date_startmonth']);
1446 unset($_POST[
'date_startyear']);
1447 unset($_POST[
'date_endhour']);
1448 unset($_POST[
'date_endmin']);
1449 unset($_POST[
'date_endsec']);
1450 unset($_POST[
'date_endday']);
1451 unset($_POST[
'date_endmonth']);
1452 unset($_POST[
'date_endyear']);
1460 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1468 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1474 $vat_rate = str_replace(
'*',
'', $vat_rate);
1491 if (empty($remise_percent)) {
1492 $remise_percent = 0;
1496 $pu_equivalent = $pu_ht;
1497 $pu_equivalent_ttc = $pu_ttc;
1499 $currency_tx =
$object->multicurrency_tx;
1503 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1504 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1506 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1507 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1522 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1523 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1525 if (is_array($extralabelsline)) {
1527 foreach ($extralabelsline as $key => $value) {
1528 unset($_POST[
"options_".$key]);
1540 if (!empty($productid)) {
1542 $res = $product->fetch($productid);
1544 $type = $product->type;
1547 $price_min = $product->price_min;
1549 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1551 $price_min_ttc = $product->price_min_ttc;
1553 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1560 if ($usermustrespectpricemin) {
1561 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (
float)
price2num($price_min)) && $price_base_type ==
'HT') {
1562 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1565 $action =
'editline';
1566 } 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') {
1567 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1570 $action =
'editline';
1575 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1579 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1587 if (!$user->hasRight(
'margins',
'creer')) {
1588 foreach (
$object->lines as &$line) {
1590 $fournprice = $line->fk_fournprice;
1591 $buyingprice = $line->pa_ht;
1600 $price_base_type =
'HT';
1601 if (empty($pu) && !empty($pu_ttc)) {
1603 $price_base_type =
'TTC';
1606 $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);
1613 $outputlangs = $langs;
1615 $outputlangs =
new Translate(
"", $conf);
1616 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1617 $outputlangs->setDefaultLang($newlang);
1623 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1626 unset($_POST[
'qty']);
1627 unset($_POST[
'type']);
1628 unset($_POST[
'productid']);
1629 unset($_POST[
'remise_percent']);
1630 unset($_POST[
'price_ht']);
1631 unset($_POST[
'multicurrency_price_ht']);
1632 unset($_POST[
'price_ttc']);
1633 unset($_POST[
'tva_tx']);
1634 unset($_POST[
'product_ref']);
1635 unset($_POST[
'product_label']);
1636 unset($_POST[
'product_desc']);
1637 unset($_POST[
'fournprice']);
1638 unset($_POST[
'buying_price']);
1640 unset($_POST[
'date_starthour']);
1641 unset($_POST[
'date_startmin']);
1642 unset($_POST[
'date_startsec']);
1643 unset($_POST[
'date_startday']);
1644 unset($_POST[
'date_startmonth']);
1645 unset($_POST[
'date_startyear']);
1646 unset($_POST[
'date_endhour']);
1647 unset($_POST[
'date_endmin']);
1648 unset($_POST[
'date_endsec']);
1649 unset($_POST[
'date_endday']);
1650 unset($_POST[
'date_endmonth']);
1651 unset($_POST[
'date_endyear']);
1658 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
1659 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1661 } elseif ($action ==
'classin' && $usercancreate) {
1664 } elseif ($action ==
'setavailability' && $usercancreate) {
1667 } elseif ($action ==
'setdemandreason' && $usercancreate) {
1670 } elseif ($action ==
'setconditions' && $usercancreate) {
1677 } elseif ($action ==
'setmode' && $usercancreate) {
1680 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
1682 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
1683 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
1686 } elseif ($action ==
'setbankaccount' && $usercancreate) {
1689 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
1692 } elseif ($action ==
'setwarehouse' && $usercancreate) {
1695 } elseif ($action ==
'update_extras' && $usercancreate) {
1697 $attribute_name =
GETPOST(
'attribute',
'restricthtml');
1700 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
1705 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
1712 $action =
'edit_extras';
1717 if ($action ==
'addcontact' && $usercancreate) {
1721 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1725 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1728 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1729 $langs->load(
"errors");
1730 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1735 } elseif ($action ==
'swapstatut' && $usercancreate) {
1737 if (
$object->fetch($id) > 0) {
1742 } elseif ($action ==
'deletecontact' && $usercancreate) {
1745 $result =
$object->delete_contact($lineid);
1748 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1757 $upload_dir = !empty($conf->propal->multidir_output[
$object->entity]) ? $conf->propal->multidir_output[
$object->entity] : $conf->propal->dir_output;
1758 $permissiontoadd = $usercancreate;
1759 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1767$form =
new Form($db);
1771if (isModEnabled(
'project')) {
1775$title =
$object->ref.
" - ".$langs->trans(
'Card');
1776if ($action ==
'create') {
1777 $title = $langs->trans(
"NewPropal");
1779$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
1786if ($action ==
'create') {
1787 $currency_code = $conf->currency;
1793 $res = $soc->fetch($socid);
1796 $currency_code = $conf->currency;
1798 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1799 $deposit_percent =
GETPOST(
'cond_reglement_id_deposit_percent',
'alpha');
1800 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1804 if (!empty($origin) && !empty($originid)) {
1806 $element = $subelement = $origin;
1808 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1809 $element = $regs[1];
1810 $subelement = $regs[2];
1813 if ($element ==
'project') {
1814 $projectid = $originid;
1817 if ($element ==
'order' || $element ==
'commande') {
1818 $element = $subelement =
'commande';
1820 if ($element ==
'propal') {
1821 $element =
'comm/propal';
1822 $subelement =
'propal';
1824 if ($element ==
'contract') {
1825 $element = $subelement =
'contrat';
1827 if ($element ==
'shipping') {
1828 $element = $subelement =
'expedition';
1833 $classname = ucfirst($subelement);
1834 $objectsrc =
new $classname($db);
1835 $objectsrc->fetch($originid);
1836 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1837 $objectsrc->fetch_lines();
1839 $objectsrc->fetch_thirdparty();
1841 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
1842 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
1844 $soc = $objectsrc->thirdparty;
1846 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1847 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1848 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : 0));
1851 $objectsrc->fetch_optionals();
1852 $object->array_options = $objectsrc->array_options;
1854 if (isModEnabled(
"multicurrency")) {
1855 if (!empty($objectsrc->multicurrency_code)) {
1856 $currency_code = $objectsrc->multicurrency_code;
1858 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
1859 $currency_tx = $objectsrc->multicurrency_tx;
1864 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
1865 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
1866 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
1867 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
1868 $shipping_method_id = $soc->shipping_method_id;
1869 $warehouse_id = $soc->fk_warehouse;
1870 $remise_percent = $soc->remise_percent;
1872 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
1873 $currency_code = $soc->multicurrency_code;
1878 if (!
GETPOST(
'changecompany')) {
1879 if (GETPOSTISSET(
'cond_reglement_id')) {
1880 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1882 if (GETPOSTISSET(
'deposit_percent')) {
1885 if (GETPOSTISSET(
'mode_reglement_id')) {
1886 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1888 if (GETPOSTISSET(
'cond_reglement_id')) {
1894 if ($soc->fk_warehouse > 0) {
1895 $warehouse_id = $soc->fk_warehouse;
1897 if (isModEnabled(
'stock') && empty($warehouse_id) &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER')) {
1902 $warehouse_id = $user->fk_warehouse;
1906 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1907 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1908 print
'<input type="hidden" name="action" value="add">';
1909 print
'<input type="hidden" name="changecompany" value="0">';
1910 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1911 if ($origin !=
'project' && $originid) {
1912 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
1913 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
1914 } elseif ($origin ==
'project' && !empty($projectid)) {
1915 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
1921 $parameters = array();
1923 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
1924 if (empty($reshook)) {
1925 print
'<table class="border centpercent">';
1928 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
1931 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
1932 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
1936 print
'<tr class="field_socid">';
1937 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
1938 $shipping_method_id = 0;
1940 print
'<td class="valuefieldcreate">';
1941 print $soc->getNomUrl(1,
'customer');
1942 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1944 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
1945 $shipping_method_id = $soc->shipping_method_id;
1949 print
'<td class="valuefieldcreate">';
1950 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
1951 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0,
null, 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
1955 $(document).ready(function() {
1956 $("#socid").change(function() {
1957 console.log("We have changed the company - Reload page");
1958 var socid = $(this).val();
1960 $("input[name=action]").val("create");
1961 $("input[name=changecompany]").val("1");
1962 $("form[name=addprop]").submit();
1967 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>';
1974 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
1975 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
1977 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
1981 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
1983 $absolute_discount = $soc->getAvailableDiscounts();
1987 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
1988 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
1993 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
1994 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1995 print $form->selectDate(
'',
'', 0, 0, 0,
"addprop", 1, 1);
1999 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>';
2002 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2003 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2005 print $form->getSelectConditionsPaiements($cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2009 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2010 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2011 print $form->select_types_paiements($mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2015 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2016 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2017 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2022 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2023 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2024 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2028 if (isModEnabled(
"shipping")) {
2029 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2030 $shipping_method_id = $soc->shipping_method_id;
2032 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2033 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2034 $form->selectShippingMethod((GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2039 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2040 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2042 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2043 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2048 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2049 if (isModEnabled(
'order')) {
2050 print
' ('.$langs->trans(
'AfterOrder').
')';
2052 print
'</td><td class="valuefieldcreate">';
2053 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2054 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2058 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2059 print
'<td class="valuefieldcreate">';
2060 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2062 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2063 $syear = date(
"Y", $tmpdte);
2064 $smonth = date(
"m", $tmpdte);
2065 $sday = date(
"d", $tmpdte);
2066 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2068 print $form->selectDate(-1,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2073 if (isModEnabled(
'project')) {
2074 $langs->load(
"projects");
2075 print
'<tr class="field_projectid">';
2076 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2077 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');
2078 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>';
2084 if (isModEnabled(
'incoterm')) {
2085 print
'<tr class="field_incoterm_id">';
2086 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2087 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2088 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2089 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2094 print
'<tr class="field_model">';
2095 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2096 print
'<td class="valuefieldcreate">';
2097 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2100 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2104 if (isModEnabled(
"multicurrency")) {
2105 print
'<tr class="field_currency">';
2106 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2107 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2108 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0);
2113 print
'<tr class="field_note_public">';
2114 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2115 print
'<td class="valuefieldcreate">';
2116 $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');
2117 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2118 print $doleditor->Create(1);
2121 if (empty($user->socid)) {
2122 print
'<tr class="field_note_private">';
2123 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2124 print
'<td class="valuefieldcreate">';
2125 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2126 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2127 print $doleditor->Create(1);
2133 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2136 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2138 if ($origin ==
'contrat') {
2142 $objectsrc->update_price(1,
'auto', 1);
2145 print
"\n<!-- ".$classname.
" info -->";
2147 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2148 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2149 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2150 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2151 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2153 $newclassname = $classname;
2154 if ($newclassname ==
'Propal') {
2155 $newclassname =
'CommercialProposal';
2156 } elseif ($newclassname ==
'Commande') {
2157 $newclassname =
'Order';
2158 } elseif ($newclassname ==
'Expedition') {
2159 $newclassname =
'Sending';
2160 } elseif ($newclassname ==
'Fichinter') {
2161 $newclassname =
'Intervention';
2164 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2165 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1, $conf->currency).
'</td></tr>';
2166 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2167 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2168 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2171 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2172 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2174 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2176 if (isModEnabled(
"multicurrency")) {
2177 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2178 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2179 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2191 print
'<input type="hidden" name="createmode" value="empty">';
2195 print
'<br><table>';
2199 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2200 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2202 $liste_propal = array();
2203 $liste_propal [0] =
'';
2205 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2206 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2207 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2208 $sql .=
" WHERE s.rowid = p.fk_soc";
2209 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2210 $sql .=
" AND p.fk_statut <> 0";
2211 $sql .=
" ORDER BY Id";
2213 $resql = $db->query($sql);
2215 $num = $db->num_rows($resql);
2218 $row = $db->fetch_row($resql);
2219 $propalRefAndSocName = $row[1].
" - ".$row[2];
2220 $liste_propal[$row[0]] = $propalRefAndSocName;
2223 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2229 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2230 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2237 $langs->load(
"bills");
2239 print $form->buttonsSaveCancel(
"CreateDraft");
2245 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2248 $title = $langs->trans(
'ProductsAndServices');
2251 print
'<div class="div-table-responsive-no-min">';
2252 print
'<table class="noborder centpercent">';
2254 $objectsrc->printOriginLinesList();
2276 if ($action ==
'clone') {
2278 $filter =
'(s.client:IN:1,2,3)';
2279 $formquestion = array(
2282 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0,
null, 0,
'maxwidth300')),
2283 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2284 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2287 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2290 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
2293 if ($action ==
'closeas') {
2295 $formquestion = array();
2297 $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)));
2299 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2301 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2306 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2308 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2309 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2313 $eligibleForDepositGeneration =
true;
2315 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2316 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2318 $eligibleForDepositGeneration =
false;
2324 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2325 foreach (
$object->linkedObjects[
'commande'] as $order) {
2326 $order->fetchObjectLinked();
2328 if (array_key_exists(
'facture', $order->linkedObjects)) {
2329 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2331 $eligibleForDepositGeneration =
false;
2340 if ($eligibleForDepositGeneration) {
2341 $formquestion[] = array(
2342 'type' =>
'checkbox',
2343 'tdclass' =>
'showonlyifsigned',
2344 'name' =>
'generate_deposit',
2345 'morecss' =>
'margintoponly marginbottomonly',
2346 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2349 $formquestion[] = array(
2351 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2353 'label' => $langs->trans(
'DateInvoice'),
2359 $formquestion[] = array(
2361 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2362 'name' =>
'date_pointoftax',
2363 'label' => $langs->trans(
'DatePointOfTax'),
2369 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2371 $formquestion[] = array(
2373 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2374 'name' =>
'cond_reglement_id',
2375 'label' => $langs->trans(
'PaymentTerm'),
2376 'value' => $paymentTermsSelect
2379 $formquestion[] = array(
2380 'type' =>
'checkbox',
2381 'tdclass' =>
'showonlyifgeneratedeposit',
2382 'name' =>
'validate_generated_deposit',
2383 'morecss' =>
'margintoponly marginbottomonly',
2384 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2387 $formquestion[] = array(
2388 'type' =>
'onecolumn',
2391 let signedValue = ' . $object::STATUS_SIGNED .
';
2393 $(document).ready(function() {
2394 $("[name=generate_deposit]").change(function () {
2395 let $self = $(this);
2396 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2398 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2407 $("#statut").change(function() {
2408 let $target = $(".showonlyifsigned").parent(".tagtr");
2410 if ($(this).val() == signedValue) {
2416 $("[name=generate_deposit]").trigger("change");
2421 $("#statut").trigger("change");
2430 if (isModEnabled(
'notification')) {
2431 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2432 $notify =
new Notify($db);
2433 $formquestion = array_merge($formquestion, array(
2434 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2439 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2441 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2443 } elseif ($action ==
'cancel') {
2445 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2446 } elseif ($action ==
'delete') {
2448 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2449 } elseif ($action ==
'reopen') {
2451 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2452 } elseif ($action ==
'ask_deleteline') {
2454 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2455 } elseif ($action ==
'validate') {
2460 $ref = substr(
$object->ref, 1, 4);
2461 if ($ref ==
'PROV' || $ref ==
'') {
2462 $numref =
$object->getNextNumRef($soc);
2463 if (empty($numref)) {
2471 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2472 if (isModEnabled(
'notification')) {
2473 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2474 $notify =
new Notify($db);
2476 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2481 foreach (
$object->lines as $line) {
2482 $res = $line->fetch_product();
2484 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2490 if ($nbMandated > 0) {
2492 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2495 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2500 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2505 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2506 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2507 if (empty($reshook)) {
2508 $formconfirm .= $hookmanager->resPrint;
2509 } elseif ($reshook > 0) {
2510 $formconfirm = $hookmanager->resPrint;
2519 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2521 $morehtmlref =
'<div class="refidno">';
2523 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2524 $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);
2526 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2528 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2531 if (isModEnabled(
'project')) {
2532 $langs->load(
"projects");
2533 $morehtmlref .=
'<br>';
2534 if ($usercancreate) {
2535 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2536 if ($action !=
'classify') {
2537 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2539 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2541 if (!empty(
$object->fk_project)) {
2543 $proj->fetch(
$object->fk_project);
2544 $morehtmlref .= $proj->getNomUrl(1);
2546 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2551 $morehtmlref .=
'</div>';
2554 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2557 $parameters = array();
2559 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
2560 if (empty($reshook)) {
2561 print
'<div class="fichecenter">';
2562 print
'<div class="fichehalfleft">';
2563 print
'<div class="underbanner clearboth"></div>';
2565 print
'<table class="border tableforfield centpercent">';
2569 $filterabsolutediscount =
"fk_facture_source IS NULL";
2570 $filtercreditnote =
"fk_facture_source IS NOT NULL";
2572 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
2573 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
2576 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
2578 $absolute_discount = $soc->getAvailableDiscounts(
'', $filterabsolutediscount);
2579 $absolute_creditnote = $soc->getAvailableDiscounts(
'', $filtercreditnote);
2580 $absolute_discount =
price2num($absolute_discount,
'MT');
2581 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
2587 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
2588 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2604 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, $editenable);
2605 print
'</td><td class="valuefield">';
2606 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
2607 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2608 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2609 print
'<input type="hidden" name="action" value="setdate">';
2610 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2611 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
2612 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2626 print
'<table class="nobordernopadding centpercent"><tr><td>';
2627 print $langs->trans(
'DateEndPropal');
2629 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
2630 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>';
2632 print
'</tr></table>';
2633 print
'</td><td class="valuefield">';
2634 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
2635 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2636 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2637 print
'<input type="hidden" name="action" value="setecheance">';
2638 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2639 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
2640 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2643 if (!empty(
$object->fin_validite)) {
2657 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2658 print $langs->trans(
'PaymentConditionsShort');
2660 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
2661 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>';
2663 print
'</tr></table>';
2664 print
'</td><td class="valuefield">';
2665 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
2666 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
2668 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
2674 print
'<tr class="field_mode_reglement_id">';
2675 print
'<td class="titlefieldcreate">';
2676 print
'<table class="nobordernopadding centpercent"><tr><td>';
2677 print $langs->trans(
'PaymentMode');
2679 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
2680 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>';
2682 print
'</tr></table>';
2683 print
'</td><td class="valuefieldcreate">';
2684 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
2685 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
2687 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'none');
2692 $langs->load(
'deliveries');
2694 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2695 print
'</td><td class="valuefieldedit">';
2696 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2701 print
'<tr class="fielddeliverydelay"><td>';
2702 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2703 if (isModEnabled(
'order')) {
2704 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
2706 print $langs->trans(
'AvailabilityPeriod');
2709 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
2710 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>';
2712 print
'</tr></table>';
2713 print
'</td><td class="valuefield">';
2714 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
2715 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'availability_id', 1);
2717 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'none', 1);
2724 if (isModEnabled(
"shipping")) {
2726 print
'<table class="nobordernopadding centpercent"><tr><td>';
2727 print $langs->trans(
'SendingMethod');
2729 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
2730 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>';
2732 print
'</tr></table>';
2733 print
'</td><td class="valuefield">';
2734 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
2735 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'shipping_method_id', 1);
2737 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'none');
2744 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2745 $langs->load(
'stocks');
2746 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2748 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">';
2749 $editenable = $usercancreate;
2750 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
2751 print
'</td><td class="valuefieldcreate">';
2752 if ($action ==
'editwarehouse') {
2753 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
2755 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
2763 print
'<table class="nobordernopadding centpercent"><tr><td>';
2764 print $langs->trans(
'Source');
2766 if ($action !=
'editdemandreason' && $usercancreate) {
2767 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>';
2769 print
'</tr></table>';
2770 print
'</td><td class="valuefield">';
2771 if ($action ==
'editdemandreason' && $usercancreate) {
2772 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'demand_reason_id', 1);
2774 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'none');
2780 if (isModEnabled(
"multicurrency")) {
2784 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2785 print $form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0);
2787 if ($action !=
'editmulticurrencycode' &&
$object->statut == $object::STATUS_DRAFT && $usercancreate) {
2788 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>';
2790 print
'</tr></table>';
2791 print
'</td><td class="valuefield">';
2792 if (
$object->statut == $object::STATUS_DRAFT && $action ==
'editmulticurrencycode' && $usercancreate) {
2793 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_code,
'multicurrency_code');
2795 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_code,
'none');
2800 if (
$object->multicurrency_code != $conf->currency ||
$object->multicurrency_tx != 1) {
2803 print
'<table class="nobordernopadding" width="100%"><tr>';
2805 print $form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'',
$object, 0);
2807 if ($action !=
'editmulticurrencyrate' &&
$object->statut == $object::STATUS_DRAFT &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency && $usercancreate) {
2808 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>';
2810 print
'</tr></table>';
2811 print
'</td><td class="valuefield">';
2812 if (
$object->statut == $object::STATUS_DRAFT && ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') && $usercancreate) {
2813 if ($action ==
'actualizemulticurrencyrate') {
2816 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx,
'multicurrency_tx',
$object->multicurrency_code);
2818 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx,
'none',
$object->multicurrency_code);
2819 if (
$object->statut == $object::STATUS_DRAFT &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency) {
2820 print
'<div class="inline-block"> ';
2821 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
2829 if ($soc->outstanding_limit) {
2832 print $langs->trans(
'OutstandingBill');
2833 print
'</td><td class="valuefield">';
2834 $arrayoutstandingbills = $soc->getOutstandingBills();
2835 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
2836 print
price($arrayoutstandingbills[
'opened']).
' / ';
2837 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1, $conf->currency);
2842 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2845 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2846 print $langs->trans(
'BankAccount');
2848 if ($action !=
'editbankaccount' && $usercancreate) {
2849 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>';
2851 print
'</tr></table>';
2852 print
'</td><td class="valuefield">';
2853 if ($action ==
'editbankaccount') {
2854 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
2856 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
2862 $tmparray =
$object->getTotalWeightVolume();
2863 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
2864 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
2866 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
2867 print
'<td class="valuefield">';
2868 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);
2872 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
2873 print
'<td class="valuefield">';
2874 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);
2879 if (isModEnabled(
'incoterm')) {
2881 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2882 print $langs->trans(
'IncotermLabel');
2883 print
'<td><td class="right">';
2884 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
2885 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2889 print
'</td></tr></table>';
2891 print
'<td class="valuefield">';
2892 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
2893 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2895 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
2901 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2906 print
'<div class="fichehalfright">';
2907 print
'<div class="underbanner clearboth"></div>';
2909 print
'<table class="border tableforfield centpercent">';
2912 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
2913 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2914 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2915 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2920 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountVAT') .
'</td>';
2921 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2922 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2923 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2927 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
2929 print
'<td class="titlefieldmiddle">' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
2930 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2931 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2934 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2939 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
2941 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
2942 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2943 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2946 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2952 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
2953 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2954 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2955 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2962 if (isModEnabled(
'margin')) {
2963 $formmargin->displayMarginInfos(
$object);
2969 print
'<div class="clearboth"></div><br>';
2972 $blocname =
'contacts';
2973 $title = $langs->trans(
'ContactsAddresses');
2974 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
2978 $blocname =
'notes';
2979 $title = $langs->trans(
'Notes');
2980 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
2988 $result =
$object->getLinesArray();
2992 global $inputalsopricewithtax;
2993 $inputalsopricewithtax = 1;
2995 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
2996 <input type="hidden" name="token" value="' .
newToken().
'">
2997 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
2998 <input type="hidden" name="mode" value="">
2999 <input type="hidden" name="page_y" value="">
3000 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3001 <input type="hidden" name="id" value="' .
$object->id.
'">
3005 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3008 print
'<div class="div-table-responsive-no-min">';
3010 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3014 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3019 if ($action !=
'editline') {
3020 $parameters = array();
3021 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3025 if (empty($reshook)) {
3026 $object->formAddObjectLine(1, $mysoc, $soc);
3029 $parameters = array();
3030 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3049 if ($action !=
'presend') {
3050 print
'<div class="tabsAction">';
3052 $parameters = array();
3053 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3055 if (empty($reshook)) {
3056 if ($action !=
'editline') {
3060 if ($usercanvalidate) {
3061 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>';
3063 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3073 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3078 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3079 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3083 if (empty($user->socid)) {
3085 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3091 if ($usercancreateorder) {
3092 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>';
3099 if ($usercancreatepurchaseorder) {
3100 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>';
3107 if ($usercancreateintervention) {
3108 $langs->load(
"interventions");
3109 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>';
3115 $langs->load(
"contracts");
3117 if ($usercancreatecontract) {
3118 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>';
3124 if (isModEnabled(
'invoice') && $usercancreateinvoice) {
3125 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>';
3128 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3129 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3130 if ($usercanclose) {
3131 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3133 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3141 if ($usercanclose) {
3142 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3143 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3145 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3146 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3152 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3153 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3159 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3163 if ($usercancreate) {
3164 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>';
3168 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3176 if (
GETPOST(
'modelselected')) {
3177 $action =
'presend';
3180 if ($action !=
'presend') {
3181 print
'<div class="fichecenter"><div class="fichehalfleft">';
3182 print
'<a name="builddoc"></a>';
3188 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3189 $genallowed = $usercanread;
3190 $delallowed = $usercancreate;
3192 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $soc->default_lang,
'',
$object);
3195 $linktoelem = $form->showLinkToObjectBlock(
$object,
null, array(
'propal'));
3197 $compatibleImportElementsList =
false;
3199 $compatibleImportElementsList = array(
'commande',
'propal',
'facture');
3201 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3207 print
'<br><!-- Link to sign -->';
3208 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3209 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3212 print
'</div><div class="fichehalfright">';
3216 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3219 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3221 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3223 print
'</div></div>';
3227 $modelmail =
'propal_send';
3228 $defaulttopic =
'SendPropalRef';
3229 $diroutput = $conf->propal->multidir_output[
$object->entity];
3230 $trackid =
'pro'.$object->id;
3232 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.