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';
76$langs->loadLangs(array(
'companies',
'propal',
'compta',
'bills',
'orders',
'products',
'deliveries',
'sendings',
'other'));
77if (isModEnabled(
'incoterm')) {
78 $langs->load(
'incoterm');
80if (isModEnabled(
'margin')) {
81 $langs->load(
'margins');
86$array_options = array();
91$action =
GETPOST(
'action',
'aZ09');
92$cancel =
GETPOST(
'cancel',
'alpha');
93$origin =
GETPOST(
'origin',
'alpha');
95$confirm =
GETPOST(
'confirm',
'alpha');
96$backtopage =
GETPOST(
'backtopage',
'alpha');
111$extrafields->fetch_name_optionals_label(
$object->table_element);
114if ($id > 0 || !empty($ref)) {
115 $ret =
$object->fetch($id, $ref);
117 $ret =
$object->fetch_thirdparty();
118 if ($ret > 0 && isset(
$object->fk_project)) {
119 $ret =
$object->fetchProject();
129$hookmanager->initHooks(array(
'propalcard',
'globalcard'));
131$usercanread = $user->hasRight(
"propal",
"lire");
132$usercancreate = $user->hasRight(
"propal",
"creer");
133$usercandelete = $user->hasRight(
"propal",
"supprimer");
135$usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'close')));
136$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'validate')));
139$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
140$usercancreateorder = ($user->hasRight(
'commande',
'creer') == 1);
141$usercancreateinvoice = ($user->hasRight(
'facture',
'creer') == 1);
142$usercancreatecontract = ($user->hasRight(
'contrat',
'creer') == 1);
143$usercancreateintervention = ($user->hasRight(
'ficheinter',
'creer') == 1);
144$usercancreatepurchaseorder = ($user->hasRight(
'fournisseur',
'commande',
'creer') || $user->hasRight(
'supplier_order',
'creer'));
146$permissionnote = $usercancreate;
147$permissiondellink = $usercancreate;
148$permissiontoedit = $usercancreate;
150$price_base_type =
null;
153if (!empty($user->socid)) {
154 $socid = $user->socid;
163$parameters = array(
'socid' => $socid);
164$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
168if (empty($reshook)) {
169 $backurlforlist = DOL_URL_ROOT.
'/comm/propal/list.php';
171 if (empty($backtopage) || ($cancel && empty($id))) {
172 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
173 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
174 $backtopage = $backurlforlist;
176 $backtopage = DOL_URL_ROOT.
'/comm/propal/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
182 if (!empty($backtopageforcancel)) {
183 header(
"Location: ".$backtopageforcancel);
185 } elseif (!empty($backtopage)) {
186 header(
"Location: ".$backtopage);
192 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
194 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
196 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
199 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
201 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'IdThirdParty')),
null,
'errors');
214 $date_delivery_old =
$object->delivery_date;
215 if (!empty($date_delivery_old) && !empty($date_delivery)) {
226 $difference = $date_delivery - $old_date_delivery;
227 if ($difference != 0) {
228 $object->delivery_date = $date_delivery;
229 foreach (
$object->lines as $line) {
230 if (isset($line->date_start)) {
231 $line->date_start += $difference;
233 if (isset($line->date_end)) {
234 $line->date_end += $difference;
241 $result =
$object->createFromClone($user, $socid, (GETPOSTISSET(
'entity') ?
GETPOSTINT(
'entity') : null), (
GETPOSTINT(
'update_prices') ? true : false), (
GETPOSTINT(
'update_desc') ? true : false));
243 $warningMsgLineList = array();
245 foreach (
$object->lines as $line) {
246 if (!is_object($line->product)) {
247 $line->fetch_product();
249 if (is_object($line->product) && $line->product->id > 0) {
250 if (empty($line->product->status)) {
251 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
255 if (!empty($warningMsgLineList)) {
259 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
262 if (count(
$object->errors) > 0) {
269 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanclose) {
271 $result =
$object->setCancel($user);
273 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
276 $langs->load(
"errors");
279 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
281 $result =
$object->delete($user);
283 header(
'Location: '.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1');
286 $langs->load(
"errors");
289 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
291 $result =
$object->deleteLine($lineid);
296 $langs->load(
"errors");
302 $outputlangs = $langs;
305 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
306 $outputlangs->setDefaultLang($newlang);
312 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
315 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
317 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
320 $result =
$object->valid($user);
322 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
326 $outputlangs = $langs;
329 $newlang =
GETPOST(
'lang_id',
'aZ09');
332 $newlang =
$object->thirdparty->default_lang;
334 if (!empty($newlang)) {
336 $outputlangs->setDefaultLang($newlang);
344 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
347 $langs->load(
"errors");
348 if (count(
$object->errors) > 0) {
354 } elseif ($action ==
'setdate' && $usercancreate) {
359 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
363 $result =
$object->set_date($user, $datep);
364 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
365 $datev = $datep + (
$object->duree_validite * 24 * 3600);
366 $result =
$object->set_echeance($user, $datev, 1);
371 $outputlangs = $langs;
374 $newlang =
GETPOST(
'lang_id',
'aZ09');
377 $newlang =
$object->thirdparty->default_lang;
379 if (!empty($newlang)) {
381 $outputlangs->setDefaultLang($newlang);
389 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
392 } elseif ($action ==
'setecheance' && $usercancreate) {
396 $outputlangs = $langs;
399 $newlang =
GETPOST(
'lang_id',
'aZ09');
402 $newlang =
$object->thirdparty->default_lang;
404 if (!empty($newlang)) {
406 $outputlangs->setDefaultLang($newlang);
414 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
419 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
424 } elseif ($action ==
'setref_client' && $usercancreate) {
430 } elseif ($action ==
'set_incoterms' && isModEnabled(
'incoterm') && $usercancreate) {
433 } elseif ($action ==
'add' && $usercancreate) {
443 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
447 if (empty($duration)) {
448 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
454 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
469 $object->delivery_date = $date_delivery;
475 $object->duree_validite = $duration;
485 $object->user_author_id = $user->id;
491 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
500 $object->delivery_date = $date_delivery;
518 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
524 if (isModEnabled(
"multicurrency")) {
525 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
529 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
537 if ($origin && $originid) {
539 $element = $subelement = $origin;
541 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
543 $subelement = $regs[2];
547 if ($element ==
'order') {
548 $element = $subelement =
'commande';
550 if ($element ==
'propal') {
551 $element =
'comm/propal';
552 $subelement =
'propal';
554 if ($element ==
'contract') {
555 $element = $subelement =
'contrat';
557 if ($element ==
'inter') {
558 $element = $subelement =
'fichinter';
560 if ($element ==
'shipping') {
561 $element = $subelement =
'expedition';
565 $object->origin_id = $originid;
570 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
577 $classname = ucfirst($subelement);
578 $srcobject =
new $classname($db);
579 '@phan-var-force Commande|Propal|Contrat|Fichinter|Expedition $srcobject';
582 $result = $srcobject->fetch(
$object->origin_id);
585 $lines = $srcobject->lines;
586 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
587 $srcobject->fetch_lines();
588 $lines = $srcobject->lines;
592 $num = count($lines);
593 for ($i = 0; $i < $num; $i++) {
594 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
595 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
598 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
602 if ($lines[$i]->date_debut_prevue) {
603 $date_start = $lines[$i]->date_debut_prevue;
605 if ($lines[$i]->date_debut_reel) {
606 $date_start = $lines[$i]->date_debut_reel;
608 if ($lines[$i]->date_start) {
609 $date_start = $lines[$i]->date_start;
614 if ($lines[$i]->date_fin_prevue) {
615 $date_end = $lines[$i]->date_fin_prevue;
617 if ($lines[$i]->date_fin_reel) {
618 $date_end = $lines[$i]->date_fin_reel;
620 if ($lines[$i]->date_end) {
621 $date_end = $lines[$i]->date_end;
625 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
630 if (method_exists($lines[$i],
'fetch_optionals')) {
631 $lines[$i]->fetch_optionals();
632 $array_options = $lines[$i]->array_options;
635 $tva_tx = $lines[$i]->tva_tx;
636 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
637 $tva_tx .=
' ('.$lines[$i]->vat_src_code.
')';
640 $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);
651 if ($result > 0 && $lines[$i]->product_type == 9) {
652 $fk_parent_line = $result;
657 $parameters = array(
'objFrom' => $srcobject);
658 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
679 if (
GETPOST(
'contactid') > 0) {
680 $result =
$object->add_contact(
GETPOST(
'contactid'),
'CUSTOMER',
'external');
688 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
691 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
700 $outputlangs = $langs;
703 $newlang =
GETPOST(
'lang_id',
'aZ09');
706 $newlang =
$object->thirdparty->default_lang;
708 if (!empty($newlang)) {
710 $outputlangs->setDefaultLang($newlang);
715 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
721 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
734 } elseif ($action ==
'classifybilled' && $usercanclose) {
738 $result =
$object->classifyBilled($user, 0,
'');
749 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
752 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
754 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
755 $locationTarget =
'';
769 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
774 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
777 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
778 && !empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
780 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
783 $forceFields = array();
785 if (GETPOSTISSET(
'date_pointoftax')) {
793 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
804 $ret = $deposit->fetch($deposit->id);
805 $outputlangs = $langs;
809 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
810 $outputlangs->load(
'products');
813 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
820 if ($locationTarget) {
821 header(
'Location: ' . $locationTarget);
833 } elseif ($action ==
'confirm_reopen' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
840 $result =
$object->reopen($user, $newstatus);
857 $fromElement =
GETPOST(
'fromelement');
858 $fromElementid =
GETPOST(
'fromelementid');
859 $importLines =
GETPOST(
'line_checkbox');
861 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
862 if ($fromElement ==
'commande') {
864 $lineClassName =
'OrderLine';
865 } elseif ($fromElement ==
'propal') {
866 dol_include_once(
'/comm/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
867 $lineClassName =
'PropaleLigne';
868 } elseif ($fromElement ==
'facture') {
869 dol_include_once(
'/compta/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
870 $lineClassName =
'FactureLigne';
872 $lineClassName =
null;
874 $nextRang = count(
$object->lines) + 1;
877 foreach ($importLines as $lineId) {
878 $lineId = intval($lineId);
879 $originLine =
new $lineClassName($db);
880 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
881 $originLine->fetch_optionals();
882 $desc = $originLine->desc;
883 $pu_ht = $originLine->subprice;
884 $qty = $originLine->qty;
885 $txtva = $originLine->tva_tx;
886 $txlocaltax1 = $originLine->localtax1_tx;
887 $txlocaltax2 = $originLine->localtax2_tx;
888 $fk_product = $originLine->fk_product;
889 $remise_percent = $originLine->remise_percent;
890 $date_start = $originLine->date_start;
891 $date_end = $originLine->date_end;
892 $fk_code_ventilation = 0;
893 $info_bits = $originLine->info_bits;
894 $fk_remise_except = $originLine->fk_remise_except;
895 $price_base_type =
'HT';
897 $type = $originLine->product_type;
899 $special_code = $originLine->special_code;
900 $origin = $originLine->element;
901 $origin_id = $originLine->id;
903 $fk_fournprice = $originLine->fk_fournprice;
904 $pa_ht = $originLine->pa_ht;
905 $label = $originLine->label;
906 $array_options = $originLine->array_options;
907 $situation_percent = 100;
909 $fk_unit = $originLine->fk_unit;
910 $pu_ht_devise = $originLine->multicurrency_subprice;
912 $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);
930 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
933 $actiontypecode =
'AC_OTH_AUTO';
934 $triggersendname =
'PROPAL_SENTBYMAIL';
935 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
936 $trackid =
'pro'.$object->id;
937 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
941 if ($action ==
'modif' && $usercancreate) {
942 $result =
$object->setDraft($user);
949 $outputlangs = $langs;
952 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
953 $outputlangs->setDefaultLang($newlang);
959 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
961 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
970 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
974 foreach (
$object->lines as $line) {
975 if ($line->product_type == 1) {
976 $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);
979 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
981 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
982 $vat_rate = str_replace(
'*',
'', $vat_rate);
985 foreach (
$object->lines as $line) {
986 $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);
988 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
990 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
991 $remise_percent = str_replace(
'*',
'', $remise_percent);
992 foreach (
$object->lines as $line) {
993 $tvatx = $line->tva_tx;
994 if (!empty($line->vat_src_code)) {
995 $tvatx .=
' ('.$line->vat_src_code.
')';
997 $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);
999 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines') !==
'' && $usercancreate) {
1001 $margin_rate = (
GETPOST(
'marginforalllines') ?
GETPOST(
'marginforalllines') : 0);
1002 foreach (
$object->lines as &$line) {
1003 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
1005 $prod->fetch($line->fk_product);
1006 if ($prod->price_min > $subprice) {
1007 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
1008 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
1009 setEventMessages($prod->ref.
' - '.$prod->label.
' ('.$price_subprice.
' < '.$price_price_min.
' '.strtolower($langs->trans(
"MinPrice")).
')'.
"\n",
null,
'warnings');
1012 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1014 $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);
1016 $line->price = $subprice;
1017 $line->marge_tx = $margin_rate;
1018 $line->marque_tx = $margin_rate * $line->pa_ht / (float) $subprice;
1019 $line->total_ht = $line->qty * (float) $subprice;
1020 $line->total_tva = $line->tva_tx * $line->qty * (float) $subprice;
1021 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice;
1023 $line->multicurrency_total_ht = $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1024 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1025 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice * $line->multicurrency_subprice / $line->subprice;
1027 $line->subprice = (float) $subprice;
1028 $line->multicurrency_subprice = $multicurrency_subprice;
1030 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && $usercancreate) {
1033 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1036 $price_ht_devise =
'';
1038 $price_ttc_devise =
'';
1042 if (
GETPOST(
'price_ht') !==
'') {
1045 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1048 if (
GETPOST(
'price_ttc') !==
'') {
1051 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1052 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1055 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1056 if ($prod_entry_mode ==
'free') {
1062 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1067 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1070 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef,
'alpha'),
'', 2) : 0);
1071 if (empty($remise_percent)) {
1072 $remise_percent = 0;
1076 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1077 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1079 if (is_array($extralabelsline)) {
1081 foreach ($extralabelsline as $key => $value) {
1082 unset($_POST[
"options_".$key]);
1086 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1087 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1091 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1092 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1095 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
1096 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1100 if (!$error && isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1101 if ($combinations =
GETPOST(
'combinations',
'array')) {
1105 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1106 $idprod = $res->fk_product_child;
1108 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1114 $propal_qty_requirement = (
getDolGlobalString(
'PROPAL_ENABLE_NEGATIVE_QTY') ? ($qty >= 0 || $qty <= 0) : $qty >= 0);
1115 if (!$error && $propal_qty_requirement && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
1123 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1132 if (!empty($idprod) && $idprod > 0) {
1134 $prod->fetch($idprod);
1136 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
1146 $pu_ht = $prod->price;
1147 $pu_ttc = $prod->price_ttc;
1148 $price_min = $prod->price_min;
1149 $price_min_ttc = $prod->price_min_ttc;
1150 $price_base_type = $prod->price_base_type;
1154 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1156 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
1159 $pricebycustomerexist =
false;
1160 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1163 if (count($prodcustprice->lines) > 0) {
1164 $pricebycustomerexist =
true;
1165 $pu_ht =
price($prodcustprice->lines[0]->price);
1166 $pu_ttc =
price($prodcustprice->lines[0]->price_ttc);
1167 $price_min =
price($prodcustprice->lines[0]->price_min);
1168 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
1169 $price_base_type = $prodcustprice->lines[0]->price_base_type;
1181 if (!$pricebycustomerexist &&
$object->thirdparty->price_level) {
1182 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1183 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1184 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1185 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1186 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1188 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1189 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1191 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1192 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1197 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1198 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1199 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1200 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1201 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1203 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1204 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1206 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1207 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1212 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1216 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
1218 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1221 if (count($prodcustprice->lines) > 0) {
1222 $pu_ht =
price($prodcustprice->lines[0]->price);
1223 $pu_ttc =
price($prodcustprice->lines[0]->price_ttc);
1224 $price_min =
price($prodcustprice->lines[0]->price_min);
1225 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
1226 $price_base_type = $prodcustprice->lines[0]->price_base_type;
1239 if ($prod->prices_by_qty[0]) {
1244 foreach ($prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1245 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1249 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1250 $pu_ht = $priceforthequantityarray[
'unitprice'];
1252 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1260 if ($prod->prices_by_qty[
$object->thirdparty->price_level]) {
1265 foreach ($prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1266 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1270 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1271 $pu_ht = $priceforthequantityarray[
'unitprice'];
1273 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1281 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1282 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
1285 if (!empty($price_ht) || (
string) $price_ht ===
'0') {
1287 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
1288 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1289 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1292 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1294 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
1295 } elseif ($tmpvat != $tmpprodvat) {
1297 if ($price_base_type !=
'HT') {
1298 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
1300 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
1308 $outputlangs = $langs;
1310 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
1311 $newlang =
GETPOST(
'lang_id',
'aZ09');
1313 if (empty($newlang)) {
1314 $newlang =
$object->thirdparty->default_lang;
1316 if (!empty($newlang)) {
1318 $outputlangs->setDefaultLang($newlang);
1321 $desc = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1323 $desc = $prod->description;
1332 $desc = $product_desc;
1338 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1342 $outputlangs = $langs;
1344 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
1345 $newlang =
GETPOST(
'lang_id',
'alpha');
1347 if (empty($newlang)) {
1348 $newlang =
$object->thirdparty->default_lang;
1350 if (!empty($newlang)) {
1352 $outputlangs->setDefaultLang($newlang);
1353 $outputlangs->load(
'products');
1355 if (!empty($prod->customcode)) {
1356 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1358 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1361 if (!empty($prod->country_code)) {
1362 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $outputlangs, 0);
1365 if (!empty($prod->customcode)) {
1366 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1368 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1371 if (!empty($prod->country_code)) {
1372 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $langs, 0);
1379 $type = $prod->type;
1380 $fk_unit = $prod->fk_unit;
1384 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1385 if (empty($tva_tx)) {
1388 $tva_tx = str_replace(
'*',
'', $tva_tx);
1389 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1390 $desc = $product_desc;
1392 $fk_unit =
GETPOST(
'units',
'alpha');
1393 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1394 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1396 if ($pu_ttc && !$pu_ht) {
1397 $price_base_type =
'TTC';
1418 $pu_equivalent = $pu_ht;
1419 $pu_equivalent_ttc = $pu_ttc;
1420 $currency_tx =
$object->multicurrency_tx;
1424 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1425 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1427 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1428 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1446 if ($usermustrespectpricemin) {
1447 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) <
price2num($price_min)) && $price_base_type ==
'HT') {
1448 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1451 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) <
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1452 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1460 $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);
1472 $outputlangs = $langs;
1475 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1476 $outputlangs->setDefaultLang($newlang);
1478 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1481 unset($_POST[
'prod_entry_mode']);
1483 unset($_POST[
'qty']);
1484 unset($_POST[
'type']);
1485 unset($_POST[
'remise_percent']);
1486 unset($_POST[
'price_ht']);
1487 unset($_POST[
'multicurrency_price_ht']);
1488 unset($_POST[
'price_ttc']);
1489 unset($_POST[
'tva_tx']);
1490 unset($_POST[
'product_ref']);
1491 unset($_POST[
'product_label']);
1492 unset($_POST[
'product_desc']);
1493 unset($_POST[
'fournprice']);
1494 unset($_POST[
'buying_price']);
1495 unset($_POST[
'np_marginRate']);
1496 unset($_POST[
'np_markRate']);
1497 unset($_POST[
'dp_desc']);
1498 unset($_POST[
'idprod']);
1499 unset($_POST[
'units']);
1501 unset($_POST[
'date_starthour']);
1502 unset($_POST[
'date_startmin']);
1503 unset($_POST[
'date_startsec']);
1504 unset($_POST[
'date_startday']);
1505 unset($_POST[
'date_startmonth']);
1506 unset($_POST[
'date_startyear']);
1507 unset($_POST[
'date_endhour']);
1508 unset($_POST[
'date_endmin']);
1509 unset($_POST[
'date_endsec']);
1510 unset($_POST[
'date_endday']);
1511 unset($_POST[
'date_endmonth']);
1512 unset($_POST[
'date_endyear']);
1520 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1528 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1534 $vat_rate = str_replace(
'*',
'', $vat_rate);
1551 if (empty($remise_percent)) {
1552 $remise_percent = 0;
1556 $pu_equivalent = $pu_ht;
1557 $pu_equivalent_ttc = $pu_ttc;
1559 $currency_tx =
$object->multicurrency_tx;
1563 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1564 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1566 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1567 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1582 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1583 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1585 if (is_array($extralabelsline)) {
1587 foreach ($extralabelsline as $key => $value) {
1588 unset($_POST[
"options_".$key]);
1600 if (!empty($productid)) {
1602 $res = $product->fetch($productid);
1604 $type = $product->type;
1607 $price_min = $product->price_min;
1609 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1611 $price_min_ttc = $product->price_min_ttc;
1613 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1620 if ($usermustrespectpricemin) {
1621 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (float)
price2num($price_min)) && $price_base_type ==
'HT') {
1622 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1625 $action =
'editline';
1626 } 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') {
1627 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
1630 $action =
'editline';
1635 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1639 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1647 if (!$user->hasRight(
'margins',
'creer')) {
1648 foreach (
$object->lines as &$line) {
1650 $fournprice = $line->fk_fournprice;
1651 $buyingprice = $line->pa_ht;
1660 $price_base_type =
'HT';
1661 if (empty($pu) && !empty($pu_ttc)) {
1663 $price_base_type =
'TTC';
1666 $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);
1673 $outputlangs = $langs;
1676 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1677 $outputlangs->setDefaultLang($newlang);
1683 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1686 unset($_POST[
'qty']);
1687 unset($_POST[
'type']);
1688 unset($_POST[
'productid']);
1689 unset($_POST[
'remise_percent']);
1690 unset($_POST[
'price_ht']);
1691 unset($_POST[
'multicurrency_price_ht']);
1692 unset($_POST[
'price_ttc']);
1693 unset($_POST[
'tva_tx']);
1694 unset($_POST[
'product_ref']);
1695 unset($_POST[
'product_label']);
1696 unset($_POST[
'product_desc']);
1697 unset($_POST[
'fournprice']);
1698 unset($_POST[
'buying_price']);
1700 unset($_POST[
'date_starthour']);
1701 unset($_POST[
'date_startmin']);
1702 unset($_POST[
'date_startsec']);
1703 unset($_POST[
'date_startday']);
1704 unset($_POST[
'date_startmonth']);
1705 unset($_POST[
'date_startyear']);
1706 unset($_POST[
'date_endhour']);
1707 unset($_POST[
'date_endmin']);
1708 unset($_POST[
'date_endsec']);
1709 unset($_POST[
'date_endday']);
1710 unset($_POST[
'date_endmonth']);
1711 unset($_POST[
'date_endyear']);
1718 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
1719 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1721 } elseif ($action ==
'classin' && $usercancreate) {
1724 } elseif ($action ==
'setavailability' && $usercancreate) {
1727 } elseif ($action ==
'setdemandreason' && $usercancreate) {
1730 } elseif ($action ==
'setconditions' && $usercancreate) {
1732 $sql =
"SELECT code ";
1733 $sql .=
"FROM " . $db->prefix() .
"c_payment_term";
1734 $sql .=
" WHERE rowid = " . ((int)
GETPOST(
'cond_reglement_id',
'int'));
1735 $result = $db->query($sql);
1737 $obj = $db->fetch_object($result);
1738 if ($obj->code ==
'DEP30PCTDEL') {
1750 } elseif ($action ==
'setmode' && $usercancreate) {
1753 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
1755 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
1756 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
1759 } elseif ($action ==
'setbankaccount' && $usercancreate) {
1762 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
1765 } elseif ($action ==
'setwarehouse' && $usercancreate) {
1768 } elseif ($action ==
'update_extras' && $usercancreate) {
1770 $attribute_name =
GETPOST(
'attribute',
'restricthtml');
1773 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
1778 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
1785 $action =
'edit_extras';
1790 if ($action ==
'addcontact' && $usercancreate) {
1794 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1798 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1801 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1802 $langs->load(
"errors");
1803 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1808 } elseif ($action ==
'swapstatut' && $usercancreate) {
1810 if (
$object->fetch($id) > 0) {
1815 } elseif ($action ==
'deletecontact' && $usercancreate) {
1818 $result =
$object->delete_contact($lineid);
1821 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1830 $upload_dir = !empty(
$conf->propal->multidir_output[
$object->entity]) ?
$conf->propal->multidir_output[
$object->entity] :
$conf->propal->dir_output;
1831 $permissiontoadd = $usercancreate;
1832 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1840$form =
new Form($db);
1845if (isModEnabled(
'project')) {
1849$title =
$object->ref.
" - ".$langs->trans(
'Card');
1850if ($action ==
'create') {
1851 $title = $langs->trans(
"NewPropal");
1853$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
1860if ($action ==
'create') {
1861 $currency_code =
$conf->currency;
1867 $res = $soc->fetch($socid);
1870 $currency_code =
$conf->currency;
1872 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1873 $deposit_percent =
GETPOST(
'cond_reglement_id_deposit_percent',
'alpha');
1874 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1876 $datepropal = (empty($datepropal) ? (!
getDolGlobalString(
'MAIN_AUTOFILL_DATE_PROPOSAL') ? -1 :
'') : $datepropal);
1880 if (!empty($origin) && !empty($originid)) {
1882 $element = $subelement = $origin;
1884 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1885 $element = $regs[1];
1886 $subelement = $regs[2];
1889 if ($element ==
'project') {
1890 $projectid = $originid;
1893 if ($element ==
'order' || $element ==
'commande') {
1894 $element = $subelement =
'commande';
1896 if ($element ==
'propal') {
1897 $element =
'comm/propal';
1898 $subelement =
'propal';
1900 if ($element ==
'contract') {
1901 $element = $subelement =
'contrat';
1903 if ($element ==
'shipping') {
1904 $element = $subelement =
'expedition';
1909 $classname = ucfirst($subelement);
1910 $objectsrc =
new $classname($db);
1911 '@phan-var-force Commande|Propal|Contrat|Expedition $objectsrc';
1912 $objectsrc->fetch($originid);
1913 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1914 $objectsrc->fetch_lines();
1916 $objectsrc->fetch_thirdparty();
1918 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
1919 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
1921 $soc = $objectsrc->thirdparty;
1923 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1924 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1925 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : 0));
1928 $objectsrc->fetch_optionals();
1929 $object->array_options = $objectsrc->array_options;
1931 if (isModEnabled(
"multicurrency")) {
1932 if (!empty($objectsrc->multicurrency_code)) {
1933 $currency_code = $objectsrc->multicurrency_code;
1935 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
1936 $currency_tx = $objectsrc->multicurrency_tx;
1941 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
1942 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
1943 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
1944 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
1945 $shipping_method_id = $soc->shipping_method_id;
1946 $warehouse_id = $soc->fk_warehouse;
1947 $remise_percent = $soc->remise_percent;
1949 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
1950 $currency_code = $soc->multicurrency_code;
1955 if (!
GETPOST(
'changecompany')) {
1956 if (GETPOSTISSET(
'cond_reglement_id')) {
1957 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1959 if (GETPOSTISSET(
'deposit_percent')) {
1962 if (GETPOSTISSET(
'mode_reglement_id')) {
1963 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1965 if (GETPOSTISSET(
'cond_reglement_id')) {
1971 if ($soc->fk_warehouse > 0) {
1972 $warehouse_id = $soc->fk_warehouse;
1974 if (isModEnabled(
'stock') && empty($warehouse_id) &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER')) {
1979 $warehouse_id = $user->fk_warehouse;
1983 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1984 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1985 print
'<input type="hidden" name="action" value="add">';
1986 print
'<input type="hidden" name="changecompany" value="0">';
1987 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1988 if ($origin !=
'project' && $originid) {
1989 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
1990 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
1991 } elseif ($origin ==
'project' && !empty($projectid)) {
1992 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
1998 $parameters = array();
2000 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
2001 if (empty($reshook)) {
2002 print
'<table class="border centpercent">';
2005 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
2008 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
2009 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
2013 print
'<tr class="field_socid">';
2014 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
2015 $shipping_method_id = 0;
2018 print
'<td class="valuefieldcreate">';
2019 print $soc->getNomUrl(1,
'customer');
2020 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
2022 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2023 $shipping_method_id = $soc->shipping_method_id;
2027 print
'<td class="valuefieldcreate">';
2028 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
2029 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
2033 $(document).ready(function() {
2034 $("#socid").change(function() {
2035 console.log("We have changed the company - Reload page");
2036 var socid = $(this).val();
2038 $("input[name=action]").val("create");
2039 $("input[name=changecompany]").val("1");
2040 $("form[name=addprop]").submit();
2045 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>';
2052 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
2053 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2055 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2059 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
2061 $absolute_discount = $soc->getAvailableDiscounts();
2065 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
2066 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2072 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
2073 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2074 print $form->selectDate($newdatepropal ? $newdatepropal : $datepropal,
'', 0, 0, 0,
"addprop", 1, 1);
2078 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>';
2081 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2082 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2084 print $form->getSelectConditionsPaiements($cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2088 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2089 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2090 print $form->select_types_paiements($mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2094 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2095 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2096 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2101 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2102 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2103 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2107 if (isModEnabled(
"shipping")) {
2108 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2109 $shipping_method_id = $soc->shipping_method_id;
2111 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2112 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2113 $form->selectShippingMethod((GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2117 $formproduct =
null;
2119 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2120 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2122 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2123 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2128 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2129 if (isModEnabled(
'order')) {
2130 print
' ('.$langs->trans(
'AfterOrder').
')';
2132 print
'</td><td class="valuefieldcreate">';
2133 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2134 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2138 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2139 print
'<td class="valuefieldcreate">';
2140 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2142 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2143 $syear = date(
"Y", $tmpdte);
2144 $smonth = date(
"m", $tmpdte);
2145 $sday = date(
"d", $tmpdte);
2146 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2148 $tmp_date_delivery =
GETPOST(
'date_delivery') ? : -1;
2149 print $form->selectDate($tmp_date_delivery,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2154 if (isModEnabled(
'project') && is_object($formproject)) {
2155 $langs->load(
"projects");
2156 print
'<tr class="field_projectid">';
2157 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2158 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');
2159 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>';
2165 if (isModEnabled(
'incoterm')) {
2166 print
'<tr class="field_incoterm_id">';
2167 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2168 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2169 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2170 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2175 print
'<tr class="field_model">';
2176 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2177 print
'<td class="valuefieldcreate">';
2178 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2181 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2185 if (isModEnabled(
"multicurrency")) {
2186 print
'<tr class="field_currency">';
2187 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2188 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2189 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0);
2194 print
'<tr class="field_note_public">';
2195 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2196 print
'<td class="valuefieldcreate">';
2197 $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');
2198 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2199 print $doleditor->Create(1);
2202 if (empty($user->socid)) {
2203 print
'<tr class="field_note_private">';
2204 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2205 print
'<td class="valuefieldcreate">';
2206 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2207 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2208 print $doleditor->Create(1);
2214 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2217 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2219 if ($origin ==
'contrat') {
2223 $objectsrc->update_price(1,
'auto', 1);
2226 print
"\n<!-- ".$classname.
" info -->";
2228 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2229 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2230 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2231 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2232 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2234 $newclassname = $classname;
2235 if ($newclassname ==
'Propal') {
2236 $newclassname =
'CommercialProposal';
2237 } elseif ($newclassname ==
'Commande') {
2238 $newclassname =
'Order';
2239 } elseif ($newclassname ==
'Expedition') {
2240 $newclassname =
'Sending';
2241 } elseif ($newclassname ==
'Fichinter') {
2242 $newclassname =
'Intervention';
2245 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2246 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1,
$conf->currency).
'</td></tr>';
2247 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2248 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2249 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2252 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2253 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2255 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency).
"</td></tr>";
2257 if (isModEnabled(
"multicurrency")) {
2258 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2259 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2260 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2272 print
'<input type="hidden" name="createmode" value="empty">';
2276 print
'<br><table>';
2280 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2281 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2283 $liste_propal = array();
2284 $liste_propal [0] =
'';
2286 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2287 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2288 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2289 $sql .=
" WHERE s.rowid = p.fk_soc";
2290 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2291 $sql .=
" AND p.fk_statut <> 0";
2292 $sql .=
" ORDER BY Id";
2294 $resql = $db->query($sql);
2296 $num = $db->num_rows($resql);
2299 $row = $db->fetch_row($resql);
2300 $propalRefAndSocName = $row[1].
" - ".$row[2];
2301 $liste_propal[$row[0]] = $propalRefAndSocName;
2304 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2310 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2311 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2318 $langs->load(
"bills");
2320 print $form->buttonsSaveCancel(
"CreateDraft");
2326 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2329 $title = $langs->trans(
'ProductsAndServices');
2332 print
'<div class="div-table-responsive-no-min">';
2333 print
'<table class="noborder centpercent">';
2335 $objectsrc->printOriginLinesList();
2352 print
dol_get_fiche_head($head,
'comm', $langs->trans(
'Proposal'), -1,
'propal', 0,
'',
'', 0,
'', 1);
2357 if ($action ==
'clone') {
2359 $filter =
'(s.client:IN:1,2,3)';
2360 $formquestion = array(
2363 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0, array(), 0,
'maxwidth300')),
2364 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2365 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2368 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2371 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
2374 if ($action ==
'closeas') {
2376 $formquestion = array();
2378 $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)));
2380 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2382 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2387 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2389 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2390 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2394 $eligibleForDepositGeneration =
true;
2396 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2397 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2398 '@phan-var-force Facture $invoice';
2400 $eligibleForDepositGeneration =
false;
2406 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2407 foreach (
$object->linkedObjects[
'commande'] as $order) {
2408 $order->fetchObjectLinked();
2410 if (array_key_exists(
'facture', $order->linkedObjects)) {
2411 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2412 '@phan-var-force Facture $invoice';
2414 $eligibleForDepositGeneration =
false;
2423 if ($eligibleForDepositGeneration) {
2424 $formquestion[] = array(
2425 'type' =>
'checkbox',
2426 'tdclass' =>
'showonlyifsigned',
2427 'name' =>
'generate_deposit',
2428 'morecss' =>
'margintoponly marginbottomonly',
2429 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2432 $formquestion[] = array(
2434 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2436 'label' => $langs->trans(
'DateInvoice'),
2442 $formquestion[] = array(
2444 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2445 'name' =>
'date_pointoftax',
2446 'label' => $langs->trans(
'DatePointOfTax'),
2452 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2454 $formquestion[] = array(
2456 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2457 'name' =>
'cond_reglement_id',
2458 'label' => $langs->trans(
'PaymentTerm'),
2459 'value' => $paymentTermsSelect
2462 $formquestion[] = array(
2463 'type' =>
'checkbox',
2464 'tdclass' =>
'showonlyifgeneratedeposit',
2465 'name' =>
'validate_generated_deposit',
2466 'morecss' =>
'margintoponly marginbottomonly',
2467 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2470 $formquestion[] = array(
2471 'type' =>
'onecolumn',
2474 let signedValue = ' . $object::STATUS_SIGNED .
';
2476 $(document).ready(function() {
2477 $("[name=generate_deposit]").change(function () {
2478 let $self = $(this);
2479 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2481 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2490 $("#statut").change(function() {
2491 let $target = $(".showonlyifsigned").parent(".tagtr");
2493 if ($(this).val() == signedValue) {
2499 $("[name=generate_deposit]").trigger("change");
2504 $("#statut").trigger("change");
2513 if (isModEnabled(
'notification')) {
2514 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2515 $notify =
new Notify($db);
2516 $formquestion = array_merge($formquestion, array(
2517 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2522 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2524 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2526 } elseif ($action ==
'cancel') {
2528 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2529 } elseif ($action ==
'delete') {
2531 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2532 } elseif ($action ==
'reopen') {
2534 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2535 } elseif ($action ==
'ask_deleteline') {
2537 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2538 } elseif ($action ==
'validate') {
2543 $ref = substr(
$object->ref, 1, 4);
2544 if ($ref ==
'PROV' || $ref ==
'') {
2545 $numref =
$object->getNextNumRef($soc);
2546 if (empty($numref)) {
2554 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2555 if (isModEnabled(
'notification')) {
2556 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2557 $notify =
new Notify($db);
2559 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2564 foreach (
$object->lines as $line) {
2565 $res = $line->fetch_product();
2567 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2573 if ($nbMandated > 0) {
2575 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2578 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2583 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2588 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2589 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2590 if (empty($reshook)) {
2591 $formconfirm .= $hookmanager->resPrint;
2592 } elseif ($reshook > 0) {
2593 $formconfirm = $hookmanager->resPrint;
2602 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2604 $morehtmlref =
'<div class="refidno">';
2606 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2607 $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);
2609 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2611 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2614 if (isModEnabled(
'project')) {
2615 $langs->load(
"projects");
2616 $morehtmlref .=
'<br>';
2617 if ($usercancreate) {
2618 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2619 if ($action !=
'classify') {
2620 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2622 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2624 if (!empty(
$object->fk_project)) {
2626 $proj->fetch(
$object->fk_project);
2627 $morehtmlref .= $proj->getNomUrl(1);
2629 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2634 $morehtmlref .=
'</div>';
2637 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2640 $parameters = array();
2642 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
2643 if (empty($reshook)) {
2644 print
'<div class="fichecenter">';
2645 print
'<div class="fichehalfleft">';
2646 print
'<div class="underbanner clearboth"></div>';
2648 print
'<table class="border tableforfield centpercent">';
2652 $filterabsolutediscount =
"fk_facture_source IS NULL";
2653 $filtercreditnote =
"fk_facture_source IS NOT NULL";
2655 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
2656 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
2659 print
'<tr><td class="titlefieldmax45">'.$langs->trans(
'Discounts').
'</td><td>';
2661 $absolute_discount = $soc->getAvailableDiscounts(
null, $filterabsolutediscount);
2662 $absolute_creditnote = $soc->getAvailableDiscounts(
null, $filtercreditnote);
2663 $absolute_discount =
price2num($absolute_discount,
'MT');
2664 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
2670 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
2671 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2687 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, $editenable);
2688 print
'</td><td class="valuefield">';
2689 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
2690 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2691 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2692 print
'<input type="hidden" name="action" value="setdate">';
2693 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2694 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
2695 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2709 print
'<table class="nobordernopadding centpercent"><tr><td>';
2710 print $langs->trans(
'DateEndPropal');
2712 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
2713 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>';
2715 print
'</tr></table>';
2716 print
'</td><td class="valuefield">';
2717 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
2718 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2719 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2720 print
'<input type="hidden" name="action" value="setecheance">';
2721 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2722 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
2723 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2726 if (!empty(
$object->fin_validite)) {
2740 print
'<table class="nobordernopadding centpercent"><tr><td>';
2741 print $langs->trans(
'PaymentConditionsShort');
2743 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
2744 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>';
2746 print
'</tr></table>';
2747 print
'</td><td class="valuefield">';
2748 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
2749 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
2751 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
2757 print
'<tr class="field_mode_reglement_id">';
2759 print
'<table class="nobordernopadding centpercent"><tr><td>';
2760 print $langs->trans(
'PaymentMode');
2762 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
2763 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>';
2765 print
'</tr></table>';
2766 print
'</td><td class="valuefieldcreate">';
2767 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
2768 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
2770 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'none');
2775 $langs->load(
'deliveries');
2777 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2778 print
'</td><td class="valuefieldedit">';
2779 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2784 print
'<tr class="fielddeliverydelay"><td>';
2785 print
'<table class="nobordernopadding centpercent"><tr><td>';
2786 if (isModEnabled(
'order')) {
2787 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
2789 print $langs->trans(
'AvailabilityPeriod');
2792 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
2793 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>';
2795 print
'</tr></table>';
2796 print
'</td><td class="valuefield">';
2797 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
2798 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'availability_id', 1);
2800 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'none', 1);
2807 if (isModEnabled(
"shipping")) {
2809 print
'<table class="nobordernopadding centpercent"><tr><td>';
2810 print $langs->trans(
'SendingMethod');
2812 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
2813 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>';
2815 print
'</tr></table>';
2816 print
'</td><td class="valuefield">';
2817 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
2818 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'shipping_method_id', 1);
2820 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'none');
2827 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2828 $langs->load(
'stocks');
2829 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2831 print
'<tr class="field_warehouse_id"><td>';
2832 $editenable = $usercancreate;
2833 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
2834 print
'</td><td class="valuefieldcreate">';
2835 if ($action ==
'editwarehouse') {
2836 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
2838 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
2846 print
'<table class="nobordernopadding centpercent"><tr><td>';
2847 print $langs->trans(
'Source');
2849 if ($action !=
'editdemandreason' && $usercancreate) {
2850 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>';
2852 print
'</tr></table>';
2853 print
'</td><td class="valuefield">';
2854 if ($action ==
'editdemandreason' && $usercancreate) {
2855 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'demand_reason_id', 1);
2857 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'none');
2862 if ($soc->outstanding_limit) {
2865 print $langs->trans(
'OutstandingBill');
2866 print
'</td><td class="valuefield">';
2867 $arrayoutstandingbills = $soc->getOutstandingBills();
2868 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
2869 print
price($arrayoutstandingbills[
'opened']).
' / ';
2870 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1,
$conf->currency);
2875 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2878 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2879 print $langs->trans(
'BankAccount');
2881 if ($action !=
'editbankaccount' && $usercancreate) {
2882 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>';
2884 print
'</tr></table>';
2885 print
'</td><td class="valuefield">';
2886 if ($action ==
'editbankaccount') {
2887 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
2889 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
2896 $tmparray =
$object->getTotalWeightVolume();
2897 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
2898 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
2900 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
2901 print
'<td class="valuefield">';
2906 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
2907 print
'<td class="valuefield">';
2914 if (isModEnabled(
'incoterm')) {
2916 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2917 print $langs->trans(
'IncotermLabel');
2918 print
'<td><td class="right">';
2919 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
2920 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2924 print
'</td></tr></table>';
2926 print
'<td class="valuefield">';
2927 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
2928 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2930 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
2936 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2941 print
'<div class="fichehalfright">';
2942 print
'<div class="underbanner clearboth"></div>';
2944 print
'<table class="border tableforfield centpercent">';
2946 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_currency_amount.tpl.php';
2949 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
2950 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2951 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2952 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2957 print
'<td>' . $langs->trans(
'AmountVAT') .
'</td>';
2958 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2959 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2960 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2964 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
2966 print
'<td>' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
2967 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2968 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2971 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2976 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
2978 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
2979 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2980 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2983 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2989 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
2990 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1,
$conf->currency) .
'</td>';
2991 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code !=
$conf->currency)) {
2992 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2999 if (isModEnabled(
'margin')) {
3000 $formmargin->displayMarginInfos(
$object);
3006 print
'<div class="clearboth"></div><br>';
3009 $blocname =
'contacts';
3010 $title = $langs->trans(
'ContactsAddresses');
3011 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3015 $blocname =
'notes';
3016 $title = $langs->trans(
'Notes');
3017 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3025 $result =
$object->getLinesArray();
3029 global $inputalsopricewithtax;
3030 $inputalsopricewithtax = 1;
3032 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
3033 <input type="hidden" name="token" value="' .
newToken().
'">
3034 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3035 <input type="hidden" name="mode" value="">
3036 <input type="hidden" name="page_y" value="">
3037 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3038 <input type="hidden" name="id" value="' .
$object->id.
'">
3042 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3045 print
'<div class="div-table-responsive-no-min">';
3047 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3051 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3056 if ($action !=
'editline') {
3057 $parameters = array();
3058 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3062 if (empty($reshook)) {
3063 $object->formAddObjectLine(1, $mysoc, $soc);
3066 $parameters = array();
3067 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3086 if ($action !=
'presend') {
3087 $numlines = count(
$object->lines);
3088 print
'<div class="tabsAction">';
3090 $parameters = array();
3091 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3093 if (empty($reshook)) {
3094 if ($action !=
'editline') {
3098 if ($usercanvalidate) {
3099 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>';
3101 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3111 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3116 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3117 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3121 if (empty($user->socid)) {
3123 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3127 $arrayforbutaction = array();
3130 $arrayforbutaction[] = array(
3133 'perm' => $usercancreateorder,
3134 'label' =>
'AddOrder',
3135 'url' =>
'/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3145 $arrayforbutaction[] = array(
3148 'perm' => $usercancreatepurchaseorder,
3149 'label' =>
'AddPurchaseOrder',
3150 'url' =>
'/fourn/commande/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3160 $arrayforbutaction[] = array(
3161 'lang' =>
'interventions',
3163 'perm' => $usercancreateintervention,
3164 'label' =>
'AddIntervention',
3165 'url' =>
'/fichinter/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3175 $arrayforbutaction[] = array(
3176 'lang' =>
'contracts',
3178 'perm' => $usercancreatecontract,
3179 'label' =>
'AddContract',
3180 'url' =>
'/contrat/card.php?action=create&origin=' . urlencode(
$object->element) .
'&originid=' . ((
int)
$object->id) .
'&socid=' . ((
int)
$object->socid)
3192 $arrayforbutaction[] = [
3193 'lang' =>
'invoice',
3194 'enabled' => isModEnabled(
'invoice'),
3195 'perm' => $usercancreateinvoice,
3196 'label' =>
'CreateBill',
3197 'url' =>
'/compta/facture/card.php?action=create&origin='.urlencode(
$object->element).
'&originid='.((int)
$object->id).
'&socid='.((int)
$object->socid),
3204 $actionButtonsParameters = [
3205 "areDropdownButtons" => !
getDolGlobalInt(
"MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER"),
3206 "backtopage" => $_SERVER[
"PHP_SELF"] .
"?id=" . ((int) $id)
3209 if ($numlines > 0) {
3210 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 1, $actionButtonsParameters);
3212 print
dolGetButtonAction($langs->trans(
"ErrorObjectMustHaveLinesToBeValidated",
$object->ref), $langs->trans(
"Create"),
'default', $arrayforbutaction,
$object->id, 0, $actionButtonsParameters);
3216 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3217 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3218 if ($usercanclose) {
3219 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3221 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3229 if ($usercanclose) {
3230 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3231 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3233 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3234 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3240 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3241 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3247 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3251 if ($usercancreate) {
3252 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>';
3256 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3264 if (
GETPOST(
'modelselected')) {
3265 $action =
'presend';
3268 if ($action !=
'presend') {
3269 print
'<div class="fichecenter"><div class="fichehalfleft">';
3270 print
'<a name="builddoc"></a>';
3276 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3277 $genallowed = $usercanread;
3278 $delallowed = $usercancreate;
3280 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $soc->default_lang,
'',
$object);
3283 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'propal'), 1);
3284 $linktoelem = $tmparray[
'linktoelem'];
3285 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3286 print $htmltoenteralink;
3288 $compatibleImportElementsList =
false;
3290 $compatibleImportElementsList = array(
'commande',
'propal',
'facture');
3292 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3298 print
'<br><!-- Link to sign -->';
3299 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3300 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3303 print
'</div><div class="fichehalfright">';
3307 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3310 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3312 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3314 print
'</div></div>';
3318 $modelmail =
'propal_send';
3319 $defaulttopic =
'SendPropalRef';
3320 $diroutput =
$conf->propal->multidir_output[
$object->entity];
3321 $trackid =
'pro'.$object->id;
3323 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'.
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_clone($object, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
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.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
propal_prepare_head($object)
Prepare array with list of tabs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.