45require
'../../main.inc.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
47require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
48require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formpropal.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmargin.class.php';
50require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
51require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
52require_once DOL_DOCUMENT_ROOT.
'/core/modules/propale/modules_propale.php';
53require_once DOL_DOCUMENT_ROOT.
'/core/lib/propal.lib.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
56require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
57if (isModEnabled(
'project')) {
58 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
59 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
62if (isModEnabled(
'variants')) {
63 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination.class.php';
67$langs->loadLangs(array(
'companies',
'propal',
'compta',
'bills',
'orders',
'products',
'deliveries',
'sendings',
'other'));
68if (isModEnabled(
'incoterm')) {
69 $langs->load(
'incoterm');
71if (isModEnabled(
'margin')) {
72 $langs->load(
'margins');
77$array_options = array();
82$action =
GETPOST(
'action',
'aZ09');
83$cancel =
GETPOST(
'cancel',
'alpha');
84$origin =
GETPOST(
'origin',
'alpha');
86$confirm =
GETPOST(
'confirm',
'alpha');
87$backtopage =
GETPOST(
'backtopage',
'alpha');
102$extrafields->fetch_name_optionals_label(
$object->table_element);
105if ($id > 0 || !empty($ref)) {
106 $ret =
$object->fetch($id, $ref);
108 $ret =
$object->fetch_thirdparty();
109 if ($ret > 0 && isset(
$object->fk_project)) {
110 $ret =
$object->fetchProject();
120$hookmanager->initHooks(array(
'propalcard',
'globalcard'));
122$usercanread = $user->hasRight(
"propal",
"lire");
123$usercancreate = $user->hasRight(
"propal",
"creer");
124$usercandelete = $user->hasRight(
"propal",
"supprimer");
126$usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'close')));
127$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'validate')));
130$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
131$usercancreateorder = $user->hasRight(
'commande',
'creer');
132$usercancreateinvoice = $user->hasRight(
'facture',
'creer');
133$usercancreatecontract = $user->hasRight(
'contrat',
'creer');
134$usercancreateintervention = $user->hasRight(
'ficheinter',
'creer');
135$usercancreatepurchaseorder = ($user->hasRight(
'fournisseur',
'commande',
'creer') || $user->hasRight(
'supplier_order',
'creer'));
137$permissionnote = $usercancreate;
138$permissiondellink = $usercancreate;
139$permissiontoedit = $usercancreate;
141$price_base_type =
null;
144if (!empty($user->socid)) {
145 $socid = $user->socid;
154$parameters = array(
'socid' => $socid);
155$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
159if (empty($reshook)) {
160 $backurlforlist = DOL_URL_ROOT.
'/comm/propal/list.php';
162 if (empty($backtopage) || ($cancel && empty($id))) {
163 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
164 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
165 $backtopage = $backurlforlist;
167 $backtopage = DOL_URL_ROOT.
'/comm/propal/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
173 if (!empty($backtopageforcancel)) {
174 header(
"Location: ".$backtopageforcancel);
176 } elseif (!empty($backtopage)) {
177 header(
"Location: ".$backtopage);
183 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
185 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
187 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
190 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
192 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'IdThirdParty')),
null,
'errors');
205 $date_delivery_old =
$object->delivery_date;
206 if (!empty($date_delivery_old) && !empty($date_delivery)) {
217 $difference = $date_delivery - $old_date_delivery;
218 if ($difference != 0) {
219 $object->delivery_date = $date_delivery;
220 foreach (
$object->lines as $line) {
221 if (isset($line->date_start)) {
222 $line->date_start += $difference;
224 if (isset($line->date_end)) {
225 $line->date_end += $difference;
232 $result =
$object->createFromClone($user, $socid, (GETPOSTISSET(
'entity') ?
GETPOSTINT(
'entity') : null), (
GETPOSTINT(
'update_prices') ? true : false), (
GETPOSTINT(
'update_desc') ? true : false));
234 $warningMsgLineList = array();
236 foreach (
$object->lines as $line) {
237 if (!is_object($line->product)) {
238 $line->fetch_product();
240 if (is_object($line->product) && $line->product->id > 0) {
241 if (empty($line->product->status)) {
242 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
246 if (!empty($warningMsgLineList)) {
250 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
253 if (count(
$object->errors) > 0) {
260 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanclose) {
262 $result =
$object->setCancel($user);
264 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
267 $langs->load(
"errors");
270 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
272 $result =
$object->delete($user);
274 header(
'Location: '.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1');
277 $langs->load(
"errors");
280 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
282 $result =
$object->deleteLine($lineid);
287 $langs->load(
"errors");
293 $outputlangs = $langs;
296 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
297 $outputlangs->setDefaultLang($newlang);
303 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
306 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
308 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
311 $result =
$object->valid($user);
313 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
317 $outputlangs = $langs;
320 $newlang =
GETPOST(
'lang_id',
'aZ09');
323 $newlang =
$object->thirdparty->default_lang;
325 if (!empty($newlang)) {
327 $outputlangs->setDefaultLang($newlang);
335 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
338 $langs->load(
"errors");
339 if (count(
$object->errors) > 0) {
345 } elseif ($action ==
'setdate' && $usercancreate) {
350 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
354 $result =
$object->set_date($user, $datep);
355 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
356 $datev = $datep + (
$object->duree_validite * 24 * 3600);
357 $result =
$object->set_echeance($user, $datev, 1);
362 $outputlangs = $langs;
365 $newlang =
GETPOST(
'lang_id',
'aZ09');
368 $newlang =
$object->thirdparty->default_lang;
370 if (!empty($newlang)) {
372 $outputlangs->setDefaultLang($newlang);
380 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
383 } elseif ($action ==
'setecheance' && $usercancreate) {
387 $outputlangs = $langs;
390 $newlang =
GETPOST(
'lang_id',
'aZ09');
393 $newlang =
$object->thirdparty->default_lang;
395 if (!empty($newlang)) {
397 $outputlangs->setDefaultLang($newlang);
405 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
410 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
415 } elseif ($action ==
'setref_client' && $usercancreate) {
421 } elseif ($action ==
'set_incoterms' && isModEnabled(
'incoterm') && $usercancreate) {
424 } elseif ($action ==
'add' && $usercancreate) {
434 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
438 if (empty($duration)) {
439 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
445 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
460 $object->delivery_date = $date_delivery;
466 $object->duree_validite = $duration;
476 $object->user_author_id = $user->id;
482 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
491 $object->delivery_date = $date_delivery;
509 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
515 if (isModEnabled(
"multicurrency")) {
516 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
520 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
528 if ($origin && $originid) {
530 $element = $subelement = $origin;
532 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
534 $subelement = $regs[2];
538 if ($element ==
'order') {
539 $element = $subelement =
'commande';
541 if ($element ==
'propal') {
542 $element =
'comm/propal';
543 $subelement =
'propal';
545 if ($element ==
'contract') {
546 $element = $subelement =
'contrat';
548 if ($element ==
'inter') {
549 $element = $subelement =
'fichinter';
551 if ($element ==
'shipping') {
552 $element = $subelement =
'expedition';
556 $object->origin_id = $originid;
561 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
568 $classname = ucfirst($subelement);
569 $srcobject =
new $classname($db);
570 '@phan-var-force Commande|Propal|Contrat|Fichinter|Expedition $srcobject';
573 $result = $srcobject->fetch(
$object->origin_id);
576 $lines = $srcobject->lines;
577 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
578 $srcobject->fetch_lines();
579 $lines = $srcobject->lines;
583 $num = count($lines);
584 for ($i = 0; $i < $num; $i++) {
585 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
586 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
589 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
593 if ($lines[$i]->date_debut_prevue) {
594 $date_start = $lines[$i]->date_debut_prevue;
596 if ($lines[$i]->date_debut_reel) {
597 $date_start = $lines[$i]->date_debut_reel;
599 if ($lines[$i]->date_start) {
600 $date_start = $lines[$i]->date_start;
605 if ($lines[$i]->date_fin_prevue) {
606 $date_end = $lines[$i]->date_fin_prevue;
608 if ($lines[$i]->date_fin_reel) {
609 $date_end = $lines[$i]->date_fin_reel;
611 if ($lines[$i]->date_end) {
612 $date_end = $lines[$i]->date_end;
616 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
621 if (method_exists($lines[$i],
'fetch_optionals')) {
622 $lines[$i]->fetch_optionals();
623 $array_options = $lines[$i]->array_options;
626 $tva_tx = $lines[$i]->tva_tx;
627 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
628 $tva_tx .=
' ('.$lines[$i]->vat_src_code.
')';
631 $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);
642 if ($result > 0 && $lines[$i]->product_type == 9) {
643 $fk_parent_line = $result;
648 $parameters = array(
'objFrom' => $srcobject);
649 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
670 if (
GETPOST(
'contactid') > 0) {
671 $result =
$object->add_contact(
GETPOST(
'contactid'),
'CUSTOMER',
'external');
679 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
682 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
691 $outputlangs = $langs;
694 $newlang =
GETPOST(
'lang_id',
'aZ09');
697 $newlang =
$object->thirdparty->default_lang;
699 if (!empty($newlang)) {
701 $outputlangs->setDefaultLang($newlang);
706 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
712 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
725 } elseif ($action ==
'classifybilled' && $usercanclose) {
729 $result =
$object->classifyBilled($user, 0,
'');
740 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
743 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
745 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
746 $locationTarget =
'';
760 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
765 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
768 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
769 && !empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
771 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
774 $forceFields = array();
776 if (GETPOSTISSET(
'date_pointoftax')) {
784 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
795 $ret = $deposit->fetch($deposit->id);
796 $outputlangs = $langs;
800 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
801 $outputlangs->load(
'products');
804 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
811 if ($locationTarget) {
812 header(
'Location: ' . $locationTarget);
824 } elseif ($action ==
'confirm_reopen' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
831 $result =
$object->reopen($user, $newstatus);
848 $fromElement =
GETPOST(
'fromelement');
849 $fromElementid =
GETPOST(
'fromelementid');
850 $importLines =
GETPOST(
'line_checkbox');
852 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
853 if ($fromElement ==
'commande') {
855 $lineClassName =
'OrderLine';
856 } elseif ($fromElement ==
'propal') {
857 dol_include_once(
'/comm/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
858 $lineClassName =
'PropaleLigne';
859 } elseif ($fromElement ==
'facture') {
860 dol_include_once(
'/compta/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
861 $lineClassName =
'FactureLigne';
863 $lineClassName =
null;
865 $nextRang = count(
$object->lines) + 1;
868 foreach ($importLines as $lineId) {
869 $lineId = intval($lineId);
870 $originLine =
new $lineClassName($db);
871 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
872 $originLine->fetch_optionals();
873 $desc = $originLine->desc;
874 $pu_ht = $originLine->subprice;
875 $qty = $originLine->qty;
876 $txtva = $originLine->tva_tx;
877 $txlocaltax1 = $originLine->localtax1_tx;
878 $txlocaltax2 = $originLine->localtax2_tx;
879 $fk_product = $originLine->fk_product;
880 $remise_percent = $originLine->remise_percent;
881 $date_start = $originLine->date_start;
882 $date_end = $originLine->date_end;
883 $fk_code_ventilation = 0;
884 $info_bits = $originLine->info_bits;
885 $fk_remise_except = $originLine->fk_remise_except;
886 $price_base_type =
'HT';
888 $type = $originLine->product_type;
890 $special_code = $originLine->special_code;
891 $origin = $originLine->element;
892 $origin_id = $originLine->id;
894 $fk_fournprice = $originLine->fk_fournprice;
895 $pa_ht = $originLine->pa_ht;
896 $label = $originLine->label;
897 $array_options = $originLine->array_options;
898 $situation_percent = 100;
900 $fk_unit = $originLine->fk_unit;
901 $pu_ht_devise = $originLine->multicurrency_subprice;
903 $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);
921 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
924 $actiontypecode =
'AC_OTH_AUTO';
925 $triggersendname =
'PROPAL_SENTBYMAIL';
926 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
927 $trackid =
'pro'.$object->id;
928 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
932 if ($action ==
'modif' && $usercancreate) {
933 $result =
$object->setDraft($user);
940 $outputlangs = $langs;
943 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
944 $outputlangs->setDefaultLang($newlang);
950 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
952 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
961 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
965 foreach (
$object->lines as $line) {
966 if ($line->product_type == 1) {
967 $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);
970 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
972 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
973 $vat_rate = str_replace(
'*',
'', $vat_rate);
976 foreach (
$object->lines as $line) {
977 $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);
979 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
981 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
982 $remise_percent = str_replace(
'*',
'', $remise_percent);
983 foreach (
$object->lines as $line) {
984 $tvatx = $line->tva_tx;
985 if (!empty($line->vat_src_code)) {
986 $tvatx .=
' ('.$line->vat_src_code.
')';
988 $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);
990 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines') !==
'' && $usercancreate) {
992 $margin_rate = (
GETPOST(
'marginforalllines') ?
GETPOST(
'marginforalllines') : 0);
993 foreach (
$object->lines as &$line) {
994 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
996 $prod->fetch($line->fk_product);
997 if ($prod->price_min > $subprice) {
998 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
999 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1000 setEventMessages($prod->ref.
' - '.$prod->label.
' ('.$price_subprice.
' < '.$price_price_min.
' '.strtolower($langs->trans(
"MinPrice")).
')'.
"\n",
null,
'warnings');
1003 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1005 $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);
1007 $line->price = $subprice;
1008 $line->marge_tx = $margin_rate;
1009 $line->marque_tx = $margin_rate * $line->pa_ht / (float) $subprice;
1010 $line->total_ht = $line->qty * (float) $subprice;
1011 $line->total_tva = $line->tva_tx * $line->qty * (float) $subprice;
1012 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice;
1014 $line->multicurrency_total_ht = $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1015 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1016 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice * $line->multicurrency_subprice / $line->subprice;
1018 $line->subprice = (float) $subprice;
1019 $line->multicurrency_subprice = $multicurrency_subprice;
1021 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && $usercancreate) {
1024 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1027 $price_ht_devise =
'';
1029 $price_ttc_devise =
'';
1033 if (
GETPOST(
'price_ht') !==
'') {
1036 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1039 if (
GETPOST(
'price_ttc') !==
'') {
1042 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1043 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1046 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1047 if ($prod_entry_mode ==
'free') {
1053 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1058 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1061 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef,
'alpha'),
'', 2) : 0);
1062 if (empty($remise_percent)) {
1063 $remise_percent = 0;
1067 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1068 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1070 if (is_array($extralabelsline)) {
1072 foreach ($extralabelsline as $key => $value) {
1073 unset($_POST[
"options_".$key]);
1077 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1078 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1082 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1083 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1086 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
1087 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1091 if (!$error && isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1092 if ($combinations =
GETPOST(
'combinations',
'array')) {
1096 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1097 $idprod = $res->fk_product_child;
1099 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1105 $propal_qty_requirement = (
getDolGlobalString(
'PROPAL_ENABLE_NEGATIVE_QTY') ? ($qty >= 0 || $qty <= 0) : $qty >= 0);
1106 if (!$error && $propal_qty_requirement && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
1114 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1123 if (!empty($idprod) && $idprod > 0) {
1125 $prod->fetch($idprod);
1127 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
1137 $pu_ht = $prod->price;
1138 $pu_ttc = $prod->price_ttc;
1139 $price_min = $prod->price_min;
1140 $price_min_ttc = $prod->price_min_ttc;
1141 $price_base_type = $prod->price_base_type;
1145 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1147 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
1150 $pricebycustomerexist =
false;
1151 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1154 if (count($prodcustprice->lines) > 0) {
1155 $pricebycustomerexist =
true;
1156 $pu_ht =
price($prodcustprice->lines[0]->price);
1157 $pu_ttc =
price($prodcustprice->lines[0]->price_ttc);
1158 $price_min =
price($prodcustprice->lines[0]->price_min);
1159 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
1160 $price_base_type = $prodcustprice->lines[0]->price_base_type;
1172 if (!$pricebycustomerexist &&
$object->thirdparty->price_level) {
1173 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1174 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1175 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1176 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1177 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1179 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1180 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1182 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1183 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1188 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1189 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1190 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1191 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1192 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1194 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1195 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1197 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1198 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1203 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1207 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
1209 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1212 if (count($prodcustprice->lines) > 0) {
1213 $pu_ht =
price($prodcustprice->lines[0]->price);
1214 $pu_ttc =
price($prodcustprice->lines[0]->price_ttc);
1215 $price_min =
price($prodcustprice->lines[0]->price_min);
1216 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
1217 $price_base_type = $prodcustprice->lines[0]->price_base_type;
1230 if ($prod->prices_by_qty[0]) {
1235 foreach ($prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1236 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1240 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1241 $pu_ht = $priceforthequantityarray[
'unitprice'];
1243 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1251 if ($prod->prices_by_qty[
$object->thirdparty->price_level]) {
1256 foreach ($prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1257 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1261 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1262 $pu_ht = $priceforthequantityarray[
'unitprice'];
1264 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1272 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1273 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
1276 if (!empty($price_ht) || (
string) $price_ht ===
'0') {
1278 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
1279 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1280 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1283 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1285 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
1286 } elseif ($tmpvat != $tmpprodvat) {
1288 if ($price_base_type !=
'HT') {
1289 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
1291 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
1299 $outputlangs = $langs;
1301 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
1302 $newlang =
GETPOST(
'lang_id',
'aZ09');
1304 if (empty($newlang)) {
1305 $newlang =
$object->thirdparty->default_lang;
1307 if (!empty($newlang)) {
1308 $outputlangs =
new Translate(
"", $conf);
1309 $outputlangs->setDefaultLang($newlang);
1312 $desc = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1314 $desc = $prod->description;
1323 $desc = $product_desc;
1329 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1333 $outputlangs = $langs;
1335 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
1336 $newlang =
GETPOST(
'lang_id',
'alpha');
1338 if (empty($newlang)) {
1339 $newlang =
$object->thirdparty->default_lang;
1341 if (!empty($newlang)) {
1342 $outputlangs =
new Translate(
"", $conf);
1343 $outputlangs->setDefaultLang($newlang);
1344 $outputlangs->load(
'products');
1346 if (!empty($prod->customcode)) {
1347 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1349 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1352 if (!empty($prod->country_code)) {
1353 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $outputlangs, 0);
1356 if (!empty($prod->customcode)) {
1357 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1359 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1362 if (!empty($prod->country_code)) {
1363 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $langs, 0);
1370 $type = $prod->type;
1371 $fk_unit = $prod->fk_unit;
1375 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1376 if (empty($tva_tx)) {
1379 $tva_tx = str_replace(
'*',
'', $tva_tx);
1380 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1381 $desc = $product_desc;
1383 $fk_unit =
GETPOST(
'units',
'alpha');
1384 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1385 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1387 if ($pu_ttc && !$pu_ht) {
1388 $price_base_type =
'TTC';
1409 $pu_equivalent = $pu_ht;
1410 $pu_equivalent_ttc = $pu_ttc;
1411 $currency_tx =
$object->multicurrency_tx;
1415 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1416 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1418 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1419 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1437 if ($usermustrespectpricemin) {
1438 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) <
price2num($price_min)) && $price_base_type ==
'HT') {
1439 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1442 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) <
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1443 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1451 $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);
1463 $outputlangs = $langs;
1465 $outputlangs =
new Translate(
"", $conf);
1466 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1467 $outputlangs->setDefaultLang($newlang);
1469 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1472 unset($_POST[
'prod_entry_mode']);
1474 unset($_POST[
'qty']);
1475 unset($_POST[
'type']);
1476 unset($_POST[
'remise_percent']);
1477 unset($_POST[
'price_ht']);
1478 unset($_POST[
'multicurrency_price_ht']);
1479 unset($_POST[
'price_ttc']);
1480 unset($_POST[
'tva_tx']);
1481 unset($_POST[
'product_ref']);
1482 unset($_POST[
'product_label']);
1483 unset($_POST[
'product_desc']);
1484 unset($_POST[
'fournprice']);
1485 unset($_POST[
'buying_price']);
1486 unset($_POST[
'np_marginRate']);
1487 unset($_POST[
'np_markRate']);
1488 unset($_POST[
'dp_desc']);
1489 unset($_POST[
'idprod']);
1490 unset($_POST[
'units']);
1492 unset($_POST[
'date_starthour']);
1493 unset($_POST[
'date_startmin']);
1494 unset($_POST[
'date_startsec']);
1495 unset($_POST[
'date_startday']);
1496 unset($_POST[
'date_startmonth']);
1497 unset($_POST[
'date_startyear']);
1498 unset($_POST[
'date_endhour']);
1499 unset($_POST[
'date_endmin']);
1500 unset($_POST[
'date_endsec']);
1501 unset($_POST[
'date_endday']);
1502 unset($_POST[
'date_endmonth']);
1503 unset($_POST[
'date_endyear']);
1511 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1519 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1525 $vat_rate = str_replace(
'*',
'', $vat_rate);
1542 if (empty($remise_percent)) {
1543 $remise_percent = 0;
1547 $pu_equivalent = $pu_ht;
1548 $pu_equivalent_ttc = $pu_ttc;
1550 $currency_tx =
$object->multicurrency_tx;
1554 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1555 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1557 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1558 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1573 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1574 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1576 if (is_array($extralabelsline)) {
1578 foreach ($extralabelsline as $key => $value) {
1579 unset($_POST[
"options_".$key]);
1591 if (!empty($productid)) {
1593 $res = $product->fetch($productid);
1595 $type = $product->type;
1598 $price_min = $product->price_min;
1600 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1602 $price_min_ttc = $product->price_min_ttc;
1604 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1611 if ($usermustrespectpricemin) {
1612 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1613 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1616 $action =
'editline';
1617 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - (
float) $remise_percent / 100)) < (
float)
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1618 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1621 $action =
'editline';
1626 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1630 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1638 if (!$user->hasRight(
'margins',
'creer')) {
1639 foreach (
$object->lines as &$line) {
1641 $fournprice = $line->fk_fournprice;
1642 $buyingprice = $line->pa_ht;
1651 $price_base_type =
'HT';
1652 if (empty($pu) && !empty($pu_ttc)) {
1654 $price_base_type =
'TTC';
1657 $result =
$object->updateline(
GETPOSTINT(
'lineid'), $pu, $qty, $remise_percent, $vat_rate, $localtax1_rate, $localtax2_rate, $description, $price_base_type, $info_bits, $special_code,
GETPOST(
'fk_parent_line'), 0, $fournprice, $buyingprice, $label, $type, $date_start, $date_end, $array_options,
GETPOST(
"units"), $pu_ht_devise);
1664 $outputlangs = $langs;
1666 $outputlangs =
new Translate(
"", $conf);
1667 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1668 $outputlangs->setDefaultLang($newlang);
1674 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1677 unset($_POST[
'qty']);
1678 unset($_POST[
'type']);
1679 unset($_POST[
'productid']);
1680 unset($_POST[
'remise_percent']);
1681 unset($_POST[
'price_ht']);
1682 unset($_POST[
'multicurrency_price_ht']);
1683 unset($_POST[
'price_ttc']);
1684 unset($_POST[
'tva_tx']);
1685 unset($_POST[
'product_ref']);
1686 unset($_POST[
'product_label']);
1687 unset($_POST[
'product_desc']);
1688 unset($_POST[
'fournprice']);
1689 unset($_POST[
'buying_price']);
1691 unset($_POST[
'date_starthour']);
1692 unset($_POST[
'date_startmin']);
1693 unset($_POST[
'date_startsec']);
1694 unset($_POST[
'date_startday']);
1695 unset($_POST[
'date_startmonth']);
1696 unset($_POST[
'date_startyear']);
1697 unset($_POST[
'date_endhour']);
1698 unset($_POST[
'date_endmin']);
1699 unset($_POST[
'date_endsec']);
1700 unset($_POST[
'date_endday']);
1701 unset($_POST[
'date_endmonth']);
1702 unset($_POST[
'date_endyear']);
1709 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
1710 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1712 } elseif ($action ==
'classin' && $usercancreate) {
1715 } elseif ($action ==
'setavailability' && $usercancreate) {
1718 } elseif ($action ==
'setdemandreason' && $usercancreate) {
1721 } elseif ($action ==
'setconditions' && $usercancreate) {
1723 $sql =
"SELECT code ";
1724 $sql .=
"FROM " . $db->prefix() .
"c_payment_term";
1725 $sql .=
" WHERE rowid = " . ((int)
GETPOST(
'cond_reglement_id',
'int'));
1726 $result = $db->query($sql);
1728 $obj = $db->fetch_object($result);
1729 if ($obj->code ==
'DEP30PCTDEL') {
1741 } elseif ($action ==
'setmode' && $usercancreate) {
1744 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
1746 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
1747 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
1750 } elseif ($action ==
'setbankaccount' && $usercancreate) {
1753 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
1756 } elseif ($action ==
'setwarehouse' && $usercancreate) {
1759 } elseif ($action ==
'update_extras' && $usercancreate) {
1761 $attribute_name =
GETPOST(
'attribute',
'restricthtml');
1764 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
1769 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
1776 $action =
'edit_extras';
1781 if ($action ==
'addcontact' && $usercancreate) {
1785 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1789 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1792 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1793 $langs->load(
"errors");
1794 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1799 } elseif ($action ==
'swapstatut' && $usercancreate) {
1801 if (
$object->fetch($id) > 0) {
1806 } elseif ($action ==
'deletecontact' && $usercancreate) {
1809 $result =
$object->delete_contact($lineid);
1812 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1821 $upload_dir = !empty($conf->propal->multidir_output[
$object->entity]) ? $conf->propal->multidir_output[
$object->entity] : $conf->propal->dir_output;
1822 $permissiontoadd = $usercancreate;
1823 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1831$form =
new Form($db);
1836if (isModEnabled(
'project')) {
1840$title =
$object->ref.
" - ".$langs->trans(
'Card');
1841if ($action ==
'create') {
1842 $title = $langs->trans(
"NewPropal");
1844$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
1851if ($action ==
'create') {
1852 $currency_code = $conf->currency;
1858 $res = $soc->fetch($socid);
1861 $currency_code = $conf->currency;
1863 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1864 $deposit_percent =
GETPOST(
'cond_reglement_id_deposit_percent',
'alpha');
1865 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1867 $datepropal = (empty($datepropal) ? (!
getDolGlobalString(
'MAIN_AUTOFILL_DATE_PROPOSAL') ? -1 :
'') : $datepropal);
1871 if (!empty($origin) && !empty($originid)) {
1873 $element = $subelement = $origin;
1875 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1876 $element = $regs[1];
1877 $subelement = $regs[2];
1880 if ($element ==
'project') {
1881 $projectid = $originid;
1884 if ($element ==
'order' || $element ==
'commande') {
1885 $element = $subelement =
'commande';
1887 if ($element ==
'propal') {
1888 $element =
'comm/propal';
1889 $subelement =
'propal';
1891 if ($element ==
'contract') {
1892 $element = $subelement =
'contrat';
1894 if ($element ==
'shipping') {
1895 $element = $subelement =
'expedition';
1900 $classname = ucfirst($subelement);
1901 $objectsrc =
new $classname($db);
1902 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
1903 $objectsrc->fetch($originid);
1904 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1905 $objectsrc->fetch_lines();
1907 $objectsrc->fetch_thirdparty();
1909 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
1910 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
1912 $soc = $objectsrc->thirdparty;
1914 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1915 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1916 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : 0));
1919 $objectsrc->fetch_optionals();
1920 $object->array_options = $objectsrc->array_options;
1922 if (isModEnabled(
"multicurrency")) {
1923 if (!empty($objectsrc->multicurrency_code)) {
1924 $currency_code = $objectsrc->multicurrency_code;
1926 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
1927 $currency_tx = $objectsrc->multicurrency_tx;
1932 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
1933 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
1934 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
1935 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
1936 $shipping_method_id = $soc->shipping_method_id;
1937 $warehouse_id = $soc->fk_warehouse;
1938 $remise_percent = $soc->remise_percent;
1940 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
1941 $currency_code = $soc->multicurrency_code;
1946 if (!
GETPOST(
'changecompany')) {
1947 if (GETPOSTISSET(
'cond_reglement_id')) {
1948 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1950 if (GETPOSTISSET(
'deposit_percent')) {
1953 if (GETPOSTISSET(
'mode_reglement_id')) {
1954 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1956 if (GETPOSTISSET(
'cond_reglement_id')) {
1962 if ($soc->fk_warehouse > 0) {
1963 $warehouse_id = $soc->fk_warehouse;
1965 if (isModEnabled(
'stock') && empty($warehouse_id) &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER')) {
1970 $warehouse_id = $user->fk_warehouse;
1974 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1975 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1976 print
'<input type="hidden" name="action" value="add">';
1977 print
'<input type="hidden" name="changecompany" value="0">';
1978 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1979 if ($origin !=
'project' && $originid) {
1980 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
1981 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
1982 } elseif ($origin ==
'project' && !empty($projectid)) {
1983 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
1989 $parameters = array();
1991 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
1992 if (empty($reshook)) {
1993 print
'<table class="border centpercent">';
1996 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
1999 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
2000 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
2004 print
'<tr class="field_socid">';
2005 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
2006 $shipping_method_id = 0;
2009 print
'<td class="valuefieldcreate">';
2010 print $soc->getNomUrl(1,
'customer');
2011 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
2013 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2014 $shipping_method_id = $soc->shipping_method_id;
2018 print
'<td class="valuefieldcreate">';
2019 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2020 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2024 $(document).ready(function() {
2025 $("#socid").change(function() {
2026 console.log("We have changed the company - Reload page");
2027 var socid = $(this).val();
2029 $("input[name=action]").val("create");
2030 $("input[name=changecompany]").val("1");
2031 $("form[name=addprop]").submit();
2036 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>';
2043 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
2044 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2046 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2050 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
2052 $absolute_discount = $soc->getAvailableDiscounts();
2056 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
2057 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2063 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
2064 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2065 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2069 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>';
2072 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2073 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2075 print $form->getSelectConditionsPaiements($cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2079 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2080 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2081 print $form->select_types_paiements($mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2085 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2086 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2087 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2092 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2093 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2094 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2098 if (isModEnabled(
"shipping")) {
2099 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2100 $shipping_method_id = $soc->shipping_method_id;
2102 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2103 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2104 $form->selectShippingMethod((GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2108 $formproduct =
null;
2110 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2111 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2113 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2114 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2119 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2120 if (isModEnabled(
'order')) {
2121 print
' ('.$langs->trans(
'AfterOrder').
')';
2123 print
'</td><td class="valuefieldcreate">';
2124 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2125 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2129 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2130 print
'<td class="valuefieldcreate">';
2131 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2133 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2134 $syear = date(
"Y", $tmpdte);
2135 $smonth = date(
"m", $tmpdte);
2136 $sday = date(
"d", $tmpdte);
2137 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2139 print $form->selectDate(-1,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2144 if (isModEnabled(
'project') && is_object($formproject)) {
2145 $langs->load(
"projects");
2146 print
'<tr class="field_projectid">';
2147 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2148 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');
2149 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>';
2155 if (isModEnabled(
'incoterm')) {
2156 print
'<tr class="field_incoterm_id">';
2157 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2158 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2159 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2160 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2165 print
'<tr class="field_model">';
2166 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2167 print
'<td class="valuefieldcreate">';
2168 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2171 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2175 if (isModEnabled(
"multicurrency")) {
2176 print
'<tr class="field_currency">';
2177 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2178 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2179 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0);
2184 print
'<tr class="field_note_public">';
2185 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2186 print
'<td class="valuefieldcreate">';
2187 $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');
2188 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2189 print $doleditor->Create(1);
2192 if (empty($user->socid)) {
2193 print
'<tr class="field_note_private">';
2194 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2195 print
'<td class="valuefieldcreate">';
2196 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2197 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2198 print $doleditor->Create(1);
2204 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2207 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2209 if ($origin ==
'contrat') {
2213 $objectsrc->update_price(1,
'auto', 1);
2216 print
"\n<!-- ".$classname.
" info -->";
2218 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2219 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2220 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2221 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2222 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2224 $newclassname = $classname;
2225 if ($newclassname ==
'Propal') {
2226 $newclassname =
'CommercialProposal';
2227 } elseif ($newclassname ==
'Commande') {
2228 $newclassname =
'Order';
2229 } elseif ($newclassname ==
'Expedition') {
2230 $newclassname =
'Sending';
2231 } elseif ($newclassname ==
'Fichinter') {
2232 $newclassname =
'Intervention';
2235 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2236 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1, $conf->currency).
'</td></tr>';
2237 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2238 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2239 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2242 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2243 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2245 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2247 if (isModEnabled(
"multicurrency")) {
2248 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2249 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2250 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2262 print
'<input type="hidden" name="createmode" value="empty">';
2266 print
'<br><table>';
2270 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2271 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2273 $liste_propal = array();
2274 $liste_propal [0] =
'';
2276 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2277 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2278 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2279 $sql .=
" WHERE s.rowid = p.fk_soc";
2280 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2281 $sql .=
" AND p.fk_statut <> 0";
2282 $sql .=
" ORDER BY Id";
2284 $resql = $db->query($sql);
2286 $num = $db->num_rows($resql);
2289 $row = $db->fetch_row($resql);
2290 $propalRefAndSocName = $row[1].
" - ".$row[2];
2291 $liste_propal[$row[0]] = $propalRefAndSocName;
2294 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2300 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2301 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2308 $langs->load(
"bills");
2310 print $form->buttonsSaveCancel(
"CreateDraft");
2316 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2319 $title = $langs->trans(
'ProductsAndServices');
2322 print
'<div class="div-table-responsive-no-min">';
2323 print
'<table class="noborder centpercent">';
2325 $objectsrc->printOriginLinesList();
2342 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
'propal', 0,
'',
'', 0,
'', 1);
2347 if ($action ==
'clone') {
2349 $filter =
'(s.client:IN:1,2,3)';
2350 $formquestion = array(
2353 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2354 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2355 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2358 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2361 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
2364 if ($action ==
'closeas') {
2366 $formquestion = array();
2368 $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)));
2370 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2372 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2377 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2379 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2380 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2384 $eligibleForDepositGeneration =
true;
2386 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2387 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2388 '@phan-var-force Facture $invoice';
2390 $eligibleForDepositGeneration =
false;
2396 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2397 foreach (
$object->linkedObjects[
'commande'] as $order) {
2398 $order->fetchObjectLinked();
2400 if (array_key_exists(
'facture', $order->linkedObjects)) {
2401 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2402 '@phan-var-force Facture $invoice';
2404 $eligibleForDepositGeneration =
false;
2413 if ($eligibleForDepositGeneration) {
2414 $formquestion[] = array(
2415 'type' =>
'checkbox',
2416 'tdclass' =>
'showonlyifsigned',
2417 'name' =>
'generate_deposit',
2418 'morecss' =>
'margintoponly marginbottomonly',
2419 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2422 $formquestion[] = array(
2424 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2426 'label' => $langs->trans(
'DateInvoice'),
2432 $formquestion[] = array(
2434 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2435 'name' =>
'date_pointoftax',
2436 'label' => $langs->trans(
'DatePointOfTax'),
2442 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2444 $formquestion[] = array(
2446 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2447 'name' =>
'cond_reglement_id',
2448 'label' => $langs->trans(
'PaymentTerm'),
2449 'value' => $paymentTermsSelect
2452 $formquestion[] = array(
2453 'type' =>
'checkbox',
2454 'tdclass' =>
'showonlyifgeneratedeposit',
2455 'name' =>
'validate_generated_deposit',
2456 'morecss' =>
'margintoponly marginbottomonly',
2457 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2460 $formquestion[] = array(
2461 'type' =>
'onecolumn',
2464 let signedValue = ' . $object::STATUS_SIGNED .
';
2466 $(document).ready(function() {
2467 $("[name=generate_deposit]").change(function () {
2468 let $self = $(this);
2469 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2471 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2480 $("#statut").change(function() {
2481 let $target = $(".showonlyifsigned").parent(".tagtr");
2483 if ($(this).val() == signedValue) {
2489 $("[name=generate_deposit]").trigger("change");
2494 $("#statut").trigger("change");
2503 if (isModEnabled(
'notification')) {
2504 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2505 $notify =
new Notify($db);
2506 $formquestion = array_merge($formquestion, array(
2507 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2512 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2514 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2516 } elseif ($action ==
'cancel') {
2518 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2519 } elseif ($action ==
'delete') {
2521 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2522 } elseif ($action ==
'reopen') {
2524 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2525 } elseif ($action ==
'ask_deleteline') {
2527 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2528 } elseif ($action ==
'validate') {
2533 $ref = substr(
$object->ref, 1, 4);
2534 if ($ref ==
'PROV' || $ref ==
'') {
2535 $numref =
$object->getNextNumRef($soc);
2536 if (empty($numref)) {
2544 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2545 if (isModEnabled(
'notification')) {
2546 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2547 $notify =
new Notify($db);
2549 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2554 foreach (
$object->lines as $line) {
2555 $res = $line->fetch_product();
2557 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2563 if ($nbMandated > 0) {
2565 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2568 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2573 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2578 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2579 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2580 if (empty($reshook)) {
2581 $formconfirm .= $hookmanager->resPrint;
2582 } elseif ($reshook > 0) {
2583 $formconfirm = $hookmanager->resPrint;
2592 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2594 $morehtmlref =
'<div class="refidno">';
2596 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2597 $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);
2599 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2601 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2604 if (isModEnabled(
'project')) {
2605 $langs->load(
"projects");
2606 $morehtmlref .=
'<br>';
2607 if ($usercancreate) {
2608 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2609 if ($action !=
'classify') {
2610 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2612 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2614 if (!empty(
$object->fk_project)) {
2616 $proj->fetch(
$object->fk_project);
2617 $morehtmlref .= $proj->getNomUrl(1);
2619 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2624 $morehtmlref .=
'</div>';
2627 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2630 $parameters = array();
2632 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
2633 if (empty($reshook)) {
2634 print
'<div class="fichecenter">';
2635 print
'<div class="fichehalfleft">';
2636 print
'<div class="underbanner clearboth"></div>';
2638 print
'<table class="border tableforfield centpercent">';
2642 $filterabsolutediscount =
"fk_facture_source IS NULL";
2643 $filtercreditnote =
"fk_facture_source IS NOT NULL";
2645 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
2646 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
2649 print
'<tr><td class="titlefieldmax45">'.$langs->trans(
'Discounts').
'</td><td>';
2651 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
2652 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
2653 $absolute_discount =
price2num($absolute_discount,
'MT');
2654 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
2660 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
2661 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2677 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, $editenable);
2678 print
'</td><td class="valuefield">';
2679 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
2680 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2681 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2682 print
'<input type="hidden" name="action" value="setdate">';
2683 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2684 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
2685 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2699 print
'<table class="nobordernopadding centpercent"><tr><td>';
2700 print $langs->trans(
'DateEndPropal');
2702 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
2703 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>';
2705 print
'</tr></table>';
2706 print
'</td><td class="valuefield">';
2707 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
2708 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2709 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2710 print
'<input type="hidden" name="action" value="setecheance">';
2711 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2712 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
2713 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2716 if (!empty(
$object->fin_validite)) {
2730 print
'<table class="nobordernopadding centpercent"><tr><td>';
2731 print $langs->trans(
'PaymentConditionsShort');
2733 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
2734 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>';
2736 print
'</tr></table>';
2737 print
'</td><td class="valuefield">';
2738 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
2739 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
2741 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
2747 print
'<tr class="field_mode_reglement_id">';
2749 print
'<table class="nobordernopadding centpercent"><tr><td>';
2750 print $langs->trans(
'PaymentMode');
2752 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
2753 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>';
2755 print
'</tr></table>';
2756 print
'</td><td class="valuefieldcreate">';
2757 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
2758 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
2760 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'none');
2765 $langs->load(
'deliveries');
2767 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2768 print
'</td><td class="valuefieldedit">';
2769 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2774 print
'<tr class="fielddeliverydelay"><td>';
2775 print
'<table class="nobordernopadding centpercent"><tr><td>';
2776 if (isModEnabled(
'order')) {
2777 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
2779 print $langs->trans(
'AvailabilityPeriod');
2782 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
2783 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>';
2785 print
'</tr></table>';
2786 print
'</td><td class="valuefield">';
2787 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
2788 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'availability_id', 1);
2790 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'none', 1);
2797 if (isModEnabled(
"shipping")) {
2799 print
'<table class="nobordernopadding centpercent"><tr><td>';
2800 print $langs->trans(
'SendingMethod');
2802 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
2803 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>';
2805 print
'</tr></table>';
2806 print
'</td><td class="valuefield">';
2807 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
2808 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'shipping_method_id', 1);
2810 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'none');
2817 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2818 $langs->load(
'stocks');
2819 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2821 print
'<tr class="field_warehouse_id"><td>';
2822 $editenable = $usercancreate;
2823 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
2824 print
'</td><td class="valuefieldcreate">';
2825 if ($action ==
'editwarehouse') {
2826 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
2828 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
2836 print
'<table class="nobordernopadding centpercent"><tr><td>';
2837 print $langs->trans(
'Source');
2839 if ($action !=
'editdemandreason' && $usercancreate) {
2840 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>';
2842 print
'</tr></table>';
2843 print
'</td><td class="valuefield">';
2844 if ($action ==
'editdemandreason' && $usercancreate) {
2845 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'demand_reason_id', 1);
2847 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'none');
2852 if ($soc->outstanding_limit) {
2855 print $langs->trans(
'OutstandingBill');
2856 print
'</td><td class="valuefield">';
2857 $arrayoutstandingbills = $soc->getOutstandingBills();
2858 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
2859 print
price($arrayoutstandingbills[
'opened']).
' / ';
2860 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1, $conf->currency);
2865 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2868 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2869 print $langs->trans(
'BankAccount');
2871 if ($action !=
'editbankaccount' && $usercancreate) {
2872 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>';
2874 print
'</tr></table>';
2875 print
'</td><td class="valuefield">';
2876 if ($action ==
'editbankaccount') {
2877 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
2879 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
2886 $tmparray =
$object->getTotalWeightVolume();
2887 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
2888 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
2890 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
2891 print
'<td class="valuefield">';
2896 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
2897 print
'<td class="valuefield">';
2904 if (isModEnabled(
'incoterm')) {
2906 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2907 print $langs->trans(
'IncotermLabel');
2908 print
'<td><td class="right">';
2909 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
2910 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2914 print
'</td></tr></table>';
2916 print
'<td class="valuefield">';
2917 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
2918 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2920 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
2926 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2931 print
'<div class="fichehalfright">';
2932 print
'<div class="underbanner clearboth"></div>';
2934 print
'<table class="border tableforfield centpercent">';
2936 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
2939 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
2940 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2941 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2942 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2947 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
2948 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2949 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2950 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2954 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
2956 print
'<td>' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
2957 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2958 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2961 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2966 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
2968 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
2969 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2970 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2973 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2979 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
2980 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2981 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2982 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2989 if (isModEnabled(
'margin')) {
2990 $formmargin->displayMarginInfos(
$object);
2996 print
'<div class="clearboth"></div><br>';
2999 $blocname =
'contacts';
3000 $title = $langs->trans(
'ContactsAddresses');
3001 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3005 $blocname =
'notes';
3006 $title = $langs->trans(
'Notes');
3007 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3015 $result =
$object->getLinesArray();
3019 global $inputalsopricewithtax;
3020 $inputalsopricewithtax = 1;
3022 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
3023 <input type="hidden" name="token" value="' .
newToken().
'">
3024 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3025 <input type="hidden" name="mode" value="">
3026 <input type="hidden" name="page_y" value="">
3027 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3028 <input type="hidden" name="id" value="' .
$object->id.
'">
3032 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3035 print
'<div class="div-table-responsive-no-min">';
3037 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3041 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3046 if ($action !=
'editline') {
3047 $parameters = array();
3048 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3052 if (empty($reshook)) {
3053 $object->formAddObjectLine(1, $mysoc, $soc);
3056 $parameters = array();
3057 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3076 if ($action !=
'presend') {
3077 $numlines = count(
$object->lines);
3078 print
'<div class="tabsAction">';
3080 $parameters = array();
3081 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3083 if (empty($reshook)) {
3084 if ($action !=
'editline') {
3088 if ($usercanvalidate) {
3089 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>';
3091 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3101 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3106 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3107 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3111 if (empty($user->socid)) {
3113 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3117 $arrayforbutaction = array();
3120 $arrayforbutaction[] = array(
'lang' =>
'orders',
'enabled' => (isModEnabled(
'order') &&
$object->statut ==
Propal::STATUS_SIGNED),
'perm' => $usercancreateorder,
'label' =>
'AddOrder',
'url' =>
'/commande/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((
int)
$object->id).
'&socid='.((
int)
$object->socid));
3129 $arrayforbutaction[] = array(
'lang' =>
'orders',
'enabled' => (
$object->statut ==
Propal::STATUS_SIGNED && isModEnabled(
"supplier_order")),
'perm' => $usercancreatepurchaseorder,
'label' =>
'AddPurchaseOrder',
'url' =>
'/fourn/commande/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((
int)
$object->id).
'&socid='.((
int)
$object->socid));
3138 $arrayforbutaction[] = array(
'lang' =>
'interventions',
'enabled' => (isModEnabled(
"service") && isModEnabled(
'intervention') &&
$object->statut ==
Propal::STATUS_SIGNED),
'perm' => $usercancreateintervention,
'label' =>
'AddIntervention',
'url' =>
'/fichinter/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((
int)
$object->id).
'&socid='.((
int)
$object->socid));
3147 $arrayforbutaction[] = array(
'lang' =>
'contracts',
'enabled' => (isModEnabled(
'contract') &&
$object->statut ==
Propal::STATUS_SIGNED),
'perm' => $usercancreatecontract,
'label' =>
'AddContract',
'url' =>
'/contrat/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((
int)
$object->id).
'&socid='.((
int)
$object->socid));
3158 $arrayforbutaction[] = array(
'lang' =>
'invoice',
'enabled' => isModEnabled(
'invoice'),
'perm' => $usercancreateinvoice,
'label' =>
'CreateBill',
'url' =>
'/compta/facture/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((
int)
$object->id).
'&socid='.((
int)
$object->socid));
3164 $actionButtonsParameters = [
3165 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3166 "backtopage" => $_SERVER[
"PHP_SELF"].
"?id=".((int) $id)
3169 if ($numlines > 0) {
3170 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 1, $actionButtonsParameters);
3172 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 0, $actionButtonsParameters);
3176 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3177 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3178 if ($usercanclose) {
3179 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3181 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3189 if ($usercanclose) {
3190 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3191 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3193 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3194 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3200 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3201 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3207 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3211 if ($usercancreate) {
3212 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>';
3216 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3224 if (
GETPOST(
'modelselected')) {
3225 $action =
'presend';
3228 if ($action !=
'presend') {
3229 print
'<div class="fichecenter"><div class="fichehalfleft">';
3230 print
'<a name="builddoc"></a>';
3236 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3237 $genallowed = $usercanread;
3238 $delallowed = $usercancreate;
3240 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $soc->default_lang,
'',
$object);
3243 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'propal'), 1);
3244 $linktoelem = $tmparray[
'linktoelem'];
3245 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3246 print $htmltoenteralink;
3248 $compatibleImportElementsList =
false;
3250 $compatibleImportElementsList = array(
'commande',
'propal',
'facture');
3252 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3258 print
'<br><!-- Link to sign -->';
3259 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3260 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3263 print
'</div><div class="fichehalfright">';
3267 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3270 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3272 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3274 print
'</div></div>';
3278 $modelmail =
'propal_send';
3279 $defaulttopic =
'SendPropalRef';
3280 $diroutput = $conf->propal->multidir_output[
$object->entity];
3281 $trackid =
'pro'.$object->id;
3283 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage a WYSIWYG editor.
static createDepositFromOrigin(CommonObject $origin, $date, $payment_terms_id, User $user, $notrigger=0, $autoValidateDeposit=false, $overrideFields=array())
Creates a deposit from a proposal or an order by grouping lines by VAT rates.
const TYPE_DEPOSIT
Deposit invoice.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage the table of subscription to notifications.
Class ProductCombination Used to represent the relation between a product and one of its variants.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
Class to manage projects.
Class to manage proposals.
const STATUS_DRAFT
Draft status.
const STATUS_SIGNED
Signed quote.
const STATUS_NOTSIGNED
Not signed quote.
const STATUS_BILLED
Billed or processed quote.
const STATUS_CANCELED
Canceled status.
const STATUS_VALIDATED
Validated status.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
getDictionaryValue($tablename, $field, $id, $checkentity=false, $rowidfield='rowid')
Return the value of a filed into a dictionary for the record $id.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
propal_prepare_head($object)
Prepare array with list of tabs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.