44require
'../../main.inc.php';
45require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
47require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formpropal.class.php';
48require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmargin.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
50require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
51require_once DOL_DOCUMENT_ROOT.
'/core/modules/propale/modules_propale.php';
52require_once DOL_DOCUMENT_ROOT.
'/core/lib/propal.lib.php';
53require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
56if (isModEnabled(
'project')) {
57 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
58 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
61if (isModEnabled(
'variants')) {
62 require_once DOL_DOCUMENT_ROOT.
'/variants/class/ProductCombination.class.php';
66$langs->loadLangs(array(
'companies',
'propal',
'compta',
'bills',
'orders',
'products',
'deliveries',
'sendings',
'other'));
67if (isModEnabled(
'incoterm')) {
68 $langs->load(
'incoterm');
70if (isModEnabled(
'margin')) {
71 $langs->load(
'margins');
79$action =
GETPOST(
'action',
'aZ09');
80$cancel =
GETPOST(
'cancel',
'alpha');
81$origin =
GETPOST(
'origin',
'alpha');
83$confirm =
GETPOST(
'confirm',
'alpha');
84$backtopage =
GETPOST(
'backtopage',
'alpha');
99$extrafields->fetch_name_optionals_label(
$object->table_element);
102if ($id > 0 || !empty($ref)) {
103 $ret =
$object->fetch($id, $ref);
105 $ret =
$object->fetch_thirdparty();
106 if ($ret > 0 && isset(
$object->fk_project)) {
107 $ret =
$object->fetch_project();
117$hookmanager->initHooks(array(
'propalcard',
'globalcard'));
119$usercanread = $user->hasRight(
"propal",
"lire");
120$usercancreate = $user->hasRight(
"propal",
"creer");
121$usercandelete = $user->hasRight(
"propal",
"supprimer");
123$usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'close')));
124$usercanvalidate = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $usercancreate) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'validate')));
127$usermustrespectpricemin = ((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance')) || !
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS'));
128$usercancreateorder = $user->hasRight(
'commande',
'creer');
129$usercancreateinvoice = $user->hasRight(
'facture',
'creer');
130$usercancreatecontract = $user->hasRight(
'contrat',
'creer');
131$usercancreateintervention = $user->hasRight(
'ficheinter',
'creer');
132$usercancreatepurchaseorder = ($user->hasRight(
'fournisseur',
'commande',
'creer') || $user->hasRight(
'supplier_order',
'creer'));
134$permissionnote = $usercancreate;
135$permissiondellink = $usercancreate;
136$permissiontoedit = $usercancreate;
139if (!empty($user->socid)) {
140 $socid = $user->socid;
149$parameters = array(
'socid' => $socid);
150$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
154if (empty($reshook)) {
155 $backurlforlist = DOL_URL_ROOT.
'/comm/propal/list.php';
157 if (empty($backtopage) || ($cancel && empty($id))) {
158 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
159 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
160 $backtopage = $backurlforlist;
162 $backtopage = DOL_URL_ROOT.
'/comm/propal/card.php?id='.((!empty($id) && $id > 0) ? $id :
'__ID__');
168 if (!empty($backtopageforcancel)) {
169 header(
"Location: ".$backtopageforcancel);
171 } elseif (!empty($backtopage)) {
172 header(
"Location: ".$backtopage);
178 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
180 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
182 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
185 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $usercancreate) {
187 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'IdThirdParty')),
null,
'errors');
200 $date_delivery_old =
$object->delivery_date;
201 if (!empty($date_delivery_old) && !empty($date_delivery)) {
212 $difference = $date_delivery - $old_date_delivery;
213 if ($difference != 0) {
214 $object->delivery_date = $date_delivery;
215 foreach (
$object->lines as $line) {
216 if (isset($line->date_start)) {
217 $line->date_start = $line->date_start + $difference;
219 if (isset($line->date_end)) {
220 $line->date_end = $line->date_end + $difference;
227 $result =
$object->createFromClone($user, $socid, (GETPOSTISSET(
'entity') ?
GETPOSTINT(
'entity') : null), (
GETPOSTINT(
'update_prices') ? true : false), (
GETPOSTINT(
'update_desc') ? true : false));
229 $warningMsgLineList = array();
231 foreach (
$object->lines as $line) {
232 if (!is_object($line->product)) {
233 $line->fetch_product();
235 if (is_object($line->product) && $line->product->id > 0) {
236 if (empty($line->product->status)) {
237 $warningMsgLineList[$line->id] = $langs->trans(
'WarningLineProductNotToSell', $line->product->ref);
241 if (!empty($warningMsgLineList)) {
245 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
248 if (count(
$object->errors) > 0) {
255 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $usercanclose) {
257 $result =
$object->setCancel($user);
259 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
262 $langs->load(
"errors");
265 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $usercandelete) {
267 $result =
$object->delete($user);
269 header(
'Location: '.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1');
272 $langs->load(
"errors");
275 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
277 $result =
$object->deleteLine($lineid);
282 $langs->load(
"errors");
288 $outputlangs = $langs;
291 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
292 $outputlangs->setDefaultLang($newlang);
298 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
301 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
303 } elseif ($action ==
'confirm_validate' && $confirm ==
'yes' && $usercanvalidate) {
306 $result =
$object->valid($user);
308 $result =
$object->closeProposal($user, $object::STATUS_SIGNED);
312 $outputlangs = $langs;
315 $newlang =
GETPOST(
'lang_id',
'aZ09');
318 $newlang =
$object->thirdparty->default_lang;
320 if (!empty($newlang)) {
322 $outputlangs->setDefaultLang($newlang);
330 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
333 $langs->load(
"errors");
334 if (count(
$object->errors) > 0) {
340 } elseif ($action ==
'setdate' && $usercancreate) {
345 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
349 $result =
$object->set_date($user, $datep);
350 if ($result > 0 && !empty(
$object->duree_validite) && !empty(
$object->fin_validite)) {
351 $datev = $datep + (
$object->duree_validite * 24 * 3600);
352 $result =
$object->set_echeance($user, $datev, 1);
357 $outputlangs = $langs;
360 $newlang =
GETPOST(
'lang_id',
'aZ09');
363 $newlang =
$object->thirdparty->default_lang;
365 if (!empty($newlang)) {
367 $outputlangs->setDefaultLang($newlang);
375 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
378 } elseif ($action ==
'setecheance' && $usercancreate) {
382 $outputlangs = $langs;
385 $newlang =
GETPOST(
'lang_id',
'aZ09');
388 $newlang =
$object->thirdparty->default_lang;
390 if (!empty($newlang)) {
392 $outputlangs->setDefaultLang($newlang);
400 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
405 } elseif ($action ==
'setdate_livraison' && $usercancreate) {
410 } elseif ($action ==
'setref_client' && $usercancreate) {
416 } elseif ($action ==
'set_incoterms' && isModEnabled(
'incoterm') && $usercancreate) {
419 } elseif ($action ==
'add' && $usercancreate) {
429 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DatePropal")),
null,
'errors');
433 if (empty($duration)) {
434 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ValidityDuration")),
null,
'errors');
440 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Customer")),
null,
'errors');
455 $object->delivery_date = $date_delivery;
461 $object->duree_validite = $duration;
471 $object->user_author_id = $user->id;
477 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
486 $object->delivery_date = $date_delivery;
504 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
510 if (isModEnabled(
"multicurrency")) {
511 $object->multicurrency_code =
GETPOST(
'multicurrency_code',
'alpha');
515 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
523 if ($origin && $originid) {
525 $element = $subelement = $origin;
527 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
529 $subelement = $regs[2];
533 if ($element ==
'order') {
534 $element = $subelement =
'commande';
536 if ($element ==
'propal') {
537 $element =
'comm/propal';
538 $subelement =
'propal';
540 if ($element ==
'contract') {
541 $element = $subelement =
'contrat';
543 if ($element ==
'inter') {
544 $element = $subelement =
'ficheinter';
546 if ($element ==
'shipping') {
547 $element = $subelement =
'expedition';
551 $object->origin_id = $originid;
556 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
563 $classname = ucfirst($subelement);
564 $srcobject =
new $classname($db);
567 $result = $srcobject->fetch(
$object->origin_id);
570 $lines = $srcobject->lines;
571 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
572 $srcobject->fetch_lines();
573 $lines = $srcobject->lines;
577 $num = count($lines);
578 for ($i = 0; $i < $num; $i++) {
579 $label = (!empty($lines[$i]->label) ? $lines[$i]->label :
'');
580 $desc = (!empty($lines[$i]->desc) ? $lines[$i]->desc :
'');
583 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
587 if ($lines[$i]->date_debut_prevue) {
588 $date_start = $lines[$i]->date_debut_prevue;
590 if ($lines[$i]->date_debut_reel) {
591 $date_start = $lines[$i]->date_debut_reel;
593 if ($lines[$i]->date_start) {
594 $date_start = $lines[$i]->date_start;
599 if ($lines[$i]->date_fin_prevue) {
600 $date_end = $lines[$i]->date_fin_prevue;
602 if ($lines[$i]->date_fin_reel) {
603 $date_end = $lines[$i]->date_fin_reel;
605 if ($lines[$i]->date_end) {
606 $date_end = $lines[$i]->date_end;
610 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
615 if (method_exists($lines[$i],
'fetch_optionals')) {
616 $lines[$i]->fetch_optionals();
617 $array_options = $lines[$i]->array_options;
620 $tva_tx = $lines[$i]->tva_tx;
621 if (!empty($lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
622 $tva_tx .=
' ('.$lines[$i]->vat_src_code.
')';
625 $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);
636 if ($result > 0 && $lines[$i]->product_type == 9) {
637 $fk_parent_line = $result;
642 $parameters = array(
'objFrom' => $srcobject);
643 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
664 if (
GETPOST(
'contactid') > 0) {
665 $result =
$object->add_contact(
GETPOST(
'contactid'),
'CUSTOMER',
'external');
673 $result =
$object->add_contact($user->id,
'SALESREPFOLL',
'internal');
676 setEventMessages($langs->trans(
"ErrorFailedToAddUserAsContact"),
null,
'errors');
685 $outputlangs = $langs;
688 $newlang =
GETPOST(
'lang_id',
'aZ09');
691 $newlang =
$object->thirdparty->default_lang;
693 if (!empty($newlang)) {
695 $outputlangs->setDefaultLang($newlang);
700 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
706 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.$id);
719 } elseif ($action ==
'classifybilled' && $usercanclose) {
723 $result =
$object->classifyBilled($user, 0,
'');
734 } elseif ($action ==
'confirm_closeas' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
737 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"CloseAs")),
null,
'errors');
739 } elseif (
GETPOSTINT(
'statut') == $object::STATUS_SIGNED ||
GETPOSTINT(
'statut') == $object::STATUS_NOTSIGNED) {
740 $locationTarget =
'';
754 $locationTarget = DOL_URL_ROOT .
'/comm/propal/card.php?id=' .
$object->id;
759 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
762 !$error &&
GETPOSTINT(
'statut') == $object::STATUS_SIGNED &&
GETPOST(
'generate_deposit') ==
'on'
763 && !empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')
765 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
768 $forceFields = array();
770 if (GETPOSTISSET(
'date_pointoftax')) {
778 $locationTarget = DOL_URL_ROOT .
'/compta/facture/card.php?id=' . $deposit->id;
789 $ret = $deposit->fetch($deposit->id);
790 $outputlangs = $langs;
794 $outputlangs->setDefaultLang($deposit->thirdparty->default_lang);
795 $outputlangs->load(
'products');
798 $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
805 if ($locationTarget) {
806 header(
'Location: ' . $locationTarget);
818 } elseif ($action ==
'confirm_reopen' && $usercanclose && !
GETPOST(
'cancel',
'alpha')) {
825 $result =
$object->reopen($user, $newstatus);
842 $fromElement =
GETPOST(
'fromelement');
843 $fromElementid =
GETPOST(
'fromelementid');
844 $importLines =
GETPOST(
'line_checkbox');
846 if (!empty($importLines) && is_array($importLines) && !empty($fromElement) && ctype_alpha($fromElement) && !empty($fromElementid)) {
847 if ($fromElement ==
'commande') {
849 $lineClassName =
'OrderLine';
850 } elseif ($fromElement ==
'propal') {
851 dol_include_once(
'/comm/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
852 $lineClassName =
'PropaleLigne';
853 } elseif ($fromElement ==
'facture') {
854 dol_include_once(
'/compta/'.$fromElement.
'/class/'.$fromElement.
'.class.php');
855 $lineClassName =
'FactureLigne';
857 $nextRang = count(
$object->lines) + 1;
860 foreach ($importLines as $lineId) {
861 $lineId = intval($lineId);
862 $originLine =
new $lineClassName($db);
863 if (intval($fromElementid) > 0 && $originLine->fetch($lineId) > 0) {
864 $originLine->fetch_optionals();
865 $desc = $originLine->desc;
866 $pu_ht = $originLine->subprice;
867 $qty = $originLine->qty;
868 $txtva = $originLine->tva_tx;
869 $txlocaltax1 = $originLine->localtax1_tx;
870 $txlocaltax2 = $originLine->localtax2_tx;
871 $fk_product = $originLine->fk_product;
872 $remise_percent = $originLine->remise_percent;
873 $date_start = $originLine->date_start;
874 $date_end = $originLine->date_end;
875 $fk_code_ventilation = 0;
876 $info_bits = $originLine->info_bits;
877 $fk_remise_except = $originLine->fk_remise_except;
878 $price_base_type =
'HT';
880 $type = $originLine->product_type;
882 $special_code = $originLine->special_code;
883 $origin = $originLine->element;
884 $origin_id = $originLine->id;
886 $fk_fournprice = $originLine->fk_fournprice;
887 $pa_ht = $originLine->pa_ht;
888 $label = $originLine->label;
889 $array_options = $originLine->array_options;
890 $situation_percent = 100;
892 $fk_unit = $originLine->fk_unit;
893 $pu_ht_devise = $originLine->multicurrency_subprice;
895 $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);
913 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
916 $actiontypecode =
'AC_OTH_AUTO';
917 $triggersendname =
'PROPAL_SENTBYMAIL';
918 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROPOSAL_TO';
919 $trackid =
'pro'.$object->id;
920 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
924 if ($action ==
'modif' && $usercancreate) {
925 $result =
$object->setDraft($user);
932 $outputlangs = $langs;
935 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
936 $outputlangs->setDefaultLang($newlang);
942 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
944 } elseif ($action ==
"setabsolutediscount" && $usercancreate) {
953 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'aZ09') && (
GETPOST(
'alldate_start',
'alpha') ||
GETPOST(
'alldate_end',
'alpha')) && $usercancreate) {
957 foreach (
$object->lines as $line) {
958 if ($line->product_type == 1) {
959 $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);
962 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'vatforalllines',
'alpha') !==
'' && $usercancreate) {
964 $vat_rate = (
GETPOST(
'vatforalllines') ?
GETPOST(
'vatforalllines') : 0);
965 $vat_rate = str_replace(
'*',
'', $vat_rate);
968 foreach (
$object->lines as $line) {
969 $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);
971 } elseif ($action ==
'addline' &&
GETPOST(
'submitforalllines',
'alpha') &&
GETPOST(
'remiseforalllines',
'alpha') !==
'' && $usercancreate) {
973 $remise_percent = (
GETPOST(
'remiseforalllines') ?
GETPOST(
'remiseforalllines') : 0);
974 $remise_percent = str_replace(
'*',
'', $remise_percent);
975 foreach (
$object->lines as $line) {
976 $tvatx= $line->tva_tx;
977 if (!empty($line->vat_src_code)) {
978 $tvatx .=
' ('.$line->vat_src_code.
')';
980 $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);
982 } elseif ($action ==
'addline' &&
GETPOST(
'submitforallmargins',
'alpha') &&
GETPOST(
'marginforalllines') !==
'' && $usercancreate) {
984 $margin_rate = (
GETPOST(
'marginforalllines') ?
GETPOST(
'marginforalllines') : 0);
985 foreach (
$object->lines as &$line) {
986 $subprice =
price2num($line->pa_ht * (1 + $margin_rate / 100),
'MU');
988 $prod->fetch($line->fk_product);
989 if ($prod->price_min > $subprice) {
990 $price_subprice =
price($subprice, 0, $outlangs, 1, -1, -1,
'auto');
991 $price_price_min =
price($prod->price_min, 0, $outlangs, 1, -1, -1,
'auto');
992 setEventMessages($prod->ref.
' - '.$prod->label.
' ('.$price_subprice.
' < '.$price_price_min.
' '.strtolower($langs->trans(
"MinPrice")).
')'.
"\n",
null,
'warnings');
995 $multicurrency_subprice = (float) $subprice * $line->multicurrency_subprice / $line->subprice;
997 $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);
999 $line->price = $subprice;
1000 $line->marge_tx = $margin_rate;
1001 $line->marque_tx = $margin_rate * $line->pa_ht / (float) $subprice;
1002 $line->total_ht = $line->qty * (float) $subprice;
1003 $line->total_tva = $line->tva_tx * $line->qty * (float) $subprice;
1004 $line->total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice;
1006 $line->multicurrency_total_ht = $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1007 $line->multicurrency_total_tva = $line->tva_tx * $line->qty * (float) $subprice * $line->multicurrency_subprice / $line->subprice;
1008 $line->multicurrency_total_ttc = (1 + $line->tva_tx) * $line->qty * (
float) $subprice * $line->multicurrency_subprice / $line->subprice;
1010 $line->subprice = $subprice;
1011 $line->multicurrency_subprice = $multicurrency_subprice;
1013 } elseif ($action ==
'addline' && !
GETPOST(
'submitforalllines',
'alpha') && !
GETPOST(
'submitforallmargins',
'alpha') && $usercancreate) {
1016 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1019 $price_ht_devise =
'';
1021 $price_ttc_devise =
'';
1025 if (
GETPOST(
'price_ht') !==
'') {
1028 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
1031 if (
GETPOST(
'price_ttc') !==
'') {
1034 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
1035 $price_ttc_devise =
price2num(
GETPOST(
'multicurrency_price_ttc'),
'CU', 2);
1038 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1039 if ($prod_entry_mode ==
'free') {
1045 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1050 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
1053 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef,
'alpha'),
'', 2) : 0);
1054 if (empty($remise_percent)) {
1055 $remise_percent = 0;
1059 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1060 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1062 if (is_array($extralabelsline)) {
1064 foreach ($extralabelsline as $key => $value) {
1065 unset($_POST[
"options_".$key]);
1069 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1070 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1074 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && $price_ht ===
'' && $price_ht_devise ===
'' && $price_ttc ===
'' && $price_ttc_devise ===
'') {
1075 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"UnitPriceHT")),
null,
'errors');
1078 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
1079 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
1083 if (!$error && isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1084 if ($combinations =
GETPOST(
'combinations',
'array')) {
1088 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1089 $idprod = $res->fk_product_child;
1091 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1097 $propal_qty_requirement = (
getDolGlobalString(
'PROPAL_ENABLE_NEGATIVE_QTY') ? ($qty >= 0 || $qty <= 0) : $qty >= 0);
1098 if (!$error && $propal_qty_requirement && (!empty($product_desc) || (!empty($idprod) && $idprod > 0))) {
1106 $price_base_type = (
GETPOST(
'price_base_type',
'alpha') ?
GETPOST(
'price_base_type',
'alpha') :
'HT');
1115 if (!empty($idprod) && $idprod > 0) {
1117 $prod->fetch($idprod);
1119 $label = ((
GETPOST(
'product_label') &&
GETPOST(
'product_label') != $prod->label) ?
GETPOST(
'product_label') :
'');
1129 $pu_ht = $prod->price;
1130 $pu_ttc = $prod->price_ttc;
1131 $price_min = $prod->price_min;
1132 $price_min_ttc = $prod->price_min_ttc;
1133 $price_base_type = $prod->price_base_type;
1137 $pu_ht = $prod->multiprices[
$object->thirdparty->price_level];
1138 $pu_ttc = $prod->multiprices_ttc[
$object->thirdparty->price_level];
1139 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
1140 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
1141 $price_base_type = $prod->multiprices_base_type[
$object->thirdparty->price_level];
1143 if (isset($prod->multiprices_tva_tx[
$object->thirdparty->price_level])) {
1144 $tva_tx = $prod->multiprices_tva_tx[
$object->thirdparty->price_level];
1146 if (isset($prod->multiprices_recuperableonly[
$object->thirdparty->price_level])) {
1147 $tva_npr = $prod->multiprices_recuperableonly[
$object->thirdparty->price_level];
1152 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
1156 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
1158 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1161 if (count($prodcustprice->lines) > 0) {
1162 $pu_ht =
price($prodcustprice->lines[0]->price);
1163 $pu_ttc =
price($prodcustprice->lines[0]->price_ttc);
1164 $price_min =
price($prodcustprice->lines[0]->price_min);
1165 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
1166 $price_base_type = $prodcustprice->lines[0]->price_base_type;
1179 if ($prod->prices_by_qty[0]) {
1184 foreach ($prod->prices_by_qty_list[0] as $priceforthequantityarray) {
1185 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1189 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1190 $pu_ht = $priceforthequantityarray[
'unitprice'];
1192 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1200 if ($prod->prices_by_qty[
$object->thirdparty->price_level]) {
1205 foreach ($prod->prices_by_qty_list[
$object->thirdparty->price_level] as $priceforthequantityarray) {
1206 if ($priceforthequantityarray[
'rowid'] != $pqp) {
1210 if ($priceforthequantityarray[
'price_base_type'] ==
'HT') {
1211 $pu_ht = $priceforthequantityarray[
'unitprice'];
1213 $pu_ttc = $priceforthequantityarray[
'unitprice'];
1221 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
1222 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
1225 if (!empty($price_ht) || (
string) $price_ht ===
'0') {
1227 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
1228 } elseif (!empty($price_ht_devise) || (
string) $price_ht_devise ===
'0') {
1229 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1232 } elseif (!empty($price_ttc) || (
string) $price_ttc ===
'0') {
1234 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
1235 } elseif ($tmpvat != $tmpprodvat) {
1237 if ($price_base_type !=
'HT') {
1238 $pu_ht =
price2num((
float) $pu_ttc / (1 + ($tmpvat / 100)),
'MU');
1240 $pu_ttc =
price2num((
float) $pu_ht * (1 + ($tmpvat / 100)),
'MU');
1248 $outputlangs = $langs;
1250 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
1251 $newlang =
GETPOST(
'lang_id',
'aZ09');
1253 if (empty($newlang)) {
1254 $newlang =
$object->thirdparty->default_lang;
1256 if (!empty($newlang)) {
1257 $outputlangs =
new Translate(
"", $conf);
1258 $outputlangs->setDefaultLang($newlang);
1261 $desc = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1263 $desc = $prod->description;
1272 $desc = $product_desc;
1278 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1282 $outputlangs = $langs;
1284 if (empty($newlang) &&
GETPOST(
'lang_id',
'alpha')) {
1285 $newlang =
GETPOST(
'lang_id',
'alpha');
1287 if (empty($newlang)) {
1288 $newlang =
$object->thirdparty->default_lang;
1290 if (!empty($newlang)) {
1291 $outputlangs =
new Translate(
"", $conf);
1292 $outputlangs->setDefaultLang($newlang);
1293 $outputlangs->load(
'products');
1295 if (!empty($prod->customcode)) {
1296 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1298 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1301 if (!empty($prod->country_code)) {
1302 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $outputlangs, 0);
1305 if (!empty($prod->customcode)) {
1306 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomCode").
': '.$prod->customcode;
1308 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1311 if (!empty($prod->country_code)) {
1312 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code, 0, $db, $langs, 0);
1319 $type = $prod->type;
1320 $fk_unit = $prod->fk_unit;
1324 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
1325 if (empty($tva_tx)) {
1328 $tva_tx = str_replace(
'*',
'', $tva_tx);
1329 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1330 $desc = $product_desc;
1332 $fk_unit =
GETPOST(
'units',
'alpha');
1333 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
1334 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
1336 if ($pu_ttc && !$pu_ht) {
1337 $price_base_type =
'TTC';
1358 $pu_equivalent = $pu_ht;
1359 $pu_equivalent_ttc = $pu_ttc;
1360 $currency_tx =
$object->multicurrency_tx;
1364 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1365 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1367 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1368 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1386 if ($usermustrespectpricemin) {
1387 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - $remise_percent / 100)) <
price2num($price_min)) && $price_base_type ==
'HT') {
1388 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1391 } elseif ($pu_equivalent_ttc && $price_min_ttc && (((
float)
price2num($pu_equivalent_ttc) * (1 - $remise_percent / 100)) <
price2num($price_min_ttc)) && $price_base_type ==
'TTC') {
1392 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1400 $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);
1407 $outputlangs = $langs;
1409 $outputlangs =
new Translate(
"", $conf);
1410 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1411 $outputlangs->setDefaultLang($newlang);
1417 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1420 unset($_POST[
'prod_entry_mode']);
1422 unset($_POST[
'qty']);
1423 unset($_POST[
'type']);
1424 unset($_POST[
'remise_percent']);
1425 unset($_POST[
'price_ht']);
1426 unset($_POST[
'multicurrency_price_ht']);
1427 unset($_POST[
'price_ttc']);
1428 unset($_POST[
'tva_tx']);
1429 unset($_POST[
'product_ref']);
1430 unset($_POST[
'product_label']);
1431 unset($_POST[
'product_desc']);
1432 unset($_POST[
'fournprice']);
1433 unset($_POST[
'buying_price']);
1434 unset($_POST[
'np_marginRate']);
1435 unset($_POST[
'np_markRate']);
1436 unset($_POST[
'dp_desc']);
1437 unset($_POST[
'idprod']);
1438 unset($_POST[
'units']);
1440 unset($_POST[
'date_starthour']);
1441 unset($_POST[
'date_startmin']);
1442 unset($_POST[
'date_startsec']);
1443 unset($_POST[
'date_startday']);
1444 unset($_POST[
'date_startmonth']);
1445 unset($_POST[
'date_startyear']);
1446 unset($_POST[
'date_endhour']);
1447 unset($_POST[
'date_endmin']);
1448 unset($_POST[
'date_endsec']);
1449 unset($_POST[
'date_endday']);
1450 unset($_POST[
'date_endmonth']);
1451 unset($_POST[
'date_endyear']);
1459 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'save')) {
1467 if (preg_match(
'/\*/',
GETPOST(
'tva_tx'))) {
1473 $vat_rate = str_replace(
'*',
'', $vat_rate);
1490 if (empty($remise_percent)) {
1491 $remise_percent = 0;
1495 $pu_equivalent = $pu_ht;
1496 $pu_equivalent_ttc = $pu_ttc;
1498 $currency_tx =
$object->multicurrency_tx;
1502 if ($pu_ht ==
'' && $pu_ht_devise !=
'' && $currency_tx !=
'') {
1503 $pu_equivalent = (float) $pu_ht_devise * (
float) $currency_tx;
1505 if ($pu_ttc ==
'' && $pu_ttc_devise !=
'' && $currency_tx !=
'') {
1506 $pu_equivalent_ttc = (float) $pu_ttc_devise * (
float) $currency_tx;
1521 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1522 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
1524 if (is_array($extralabelsline)) {
1526 foreach ($extralabelsline as $key => $value) {
1527 unset($_POST[
"options_".$key]);
1539 if (!empty($productid)) {
1541 $res = $product->fetch($productid);
1543 $type = $product->type;
1546 $price_min = $product->price_min;
1548 $price_min = $product->multiprices_min[
$object->thirdparty->price_level];
1550 $price_min_ttc = $product->price_min_ttc;
1552 $price_min_ttc = $product->multiprices_min_ttc[
$object->thirdparty->price_level];
1559 if ($usermustrespectpricemin) {
1560 if ($pu_equivalent && $price_min && (((
float)
price2num($pu_equivalent) * (1 - (
float) $remise_percent / 100)) < (
float)
price2num($price_min)) && $price_base_type ==
'HT') {
1561 $mesg = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1564 $action =
'editline';
1565 } 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') {
1566 $mesg = $langs->trans(
"CantBeLessThanMinPriceInclTax",
price(
price2num($price_min_ttc,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
1569 $action =
'editline';
1574 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1578 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1586 if (!$user->hasRight(
'margins',
'creer')) {
1587 foreach (
$object->lines as &$line) {
1589 $fournprice = $line->fk_fournprice;
1590 $buyingprice = $line->pa_ht;
1599 $price_base_type =
'HT';
1600 if (empty($pu) && !empty($pu_ttc)) {
1602 $price_base_type =
'TTC';
1605 $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);
1612 $outputlangs = $langs;
1614 $outputlangs =
new Translate(
"", $conf);
1615 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') :
$object->thirdparty->default_lang);
1616 $outputlangs->setDefaultLang($newlang);
1622 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1625 unset($_POST[
'qty']);
1626 unset($_POST[
'type']);
1627 unset($_POST[
'productid']);
1628 unset($_POST[
'remise_percent']);
1629 unset($_POST[
'price_ht']);
1630 unset($_POST[
'multicurrency_price_ht']);
1631 unset($_POST[
'price_ttc']);
1632 unset($_POST[
'tva_tx']);
1633 unset($_POST[
'product_ref']);
1634 unset($_POST[
'product_label']);
1635 unset($_POST[
'product_desc']);
1636 unset($_POST[
'fournprice']);
1637 unset($_POST[
'buying_price']);
1639 unset($_POST[
'date_starthour']);
1640 unset($_POST[
'date_startmin']);
1641 unset($_POST[
'date_startsec']);
1642 unset($_POST[
'date_startday']);
1643 unset($_POST[
'date_startmonth']);
1644 unset($_POST[
'date_startyear']);
1645 unset($_POST[
'date_endhour']);
1646 unset($_POST[
'date_endmin']);
1647 unset($_POST[
'date_endsec']);
1648 unset($_POST[
'date_endday']);
1649 unset($_POST[
'date_endmonth']);
1650 unset($_POST[
'date_endyear']);
1657 } elseif ($action ==
'updateline' && $usercancreate &&
GETPOST(
'cancel',
'alpha')) {
1658 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1660 } elseif ($action ==
'classin' && $usercancreate) {
1663 } elseif ($action ==
'setavailability' && $usercancreate) {
1666 } elseif ($action ==
'setdemandreason' && $usercancreate) {
1669 } elseif ($action ==
'setconditions' && $usercancreate) {
1671 $sql =
"SELECT code ";
1672 $sql .=
"FROM " . $db->prefix() .
"c_payment_term";
1673 $sql .=
" WHERE rowid = " . ((int)
GETPOST(
'cond_reglement_id',
'int'));
1674 $result = $db->query($sql);
1676 $obj = $db->fetch_object($result);
1677 if ($obj->code ==
'DEP30PCTDEL') {
1689 } elseif ($action ==
'setmode' && $usercancreate) {
1692 } elseif ($action ==
'setmulticurrencycode' && $usercancreate) {
1694 $result =
$object->setMulticurrencyCode(
GETPOST(
'multicurrency_code',
'alpha'));
1695 } elseif ($action ==
'setmulticurrencyrate' && $usercancreate) {
1698 } elseif ($action ==
'setbankaccount' && $usercancreate) {
1701 } elseif ($action ==
'setshippingmethod' && $usercancreate) {
1704 } elseif ($action ==
'setwarehouse' && $usercancreate) {
1707 } elseif ($action ==
'update_extras' && $usercancreate) {
1709 $attribute_name =
GETPOST(
'attribute',
'restricthtml');
1712 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
1717 $result =
$object->updateExtraField($attribute_name,
'PROPAL_MODIFY');
1724 $action =
'edit_extras';
1729 if ($action ==
'addcontact' && $usercancreate) {
1733 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1737 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1740 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1741 $langs->load(
"errors");
1742 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1747 } elseif ($action ==
'swapstatut' && $usercancreate) {
1749 if (
$object->fetch($id) > 0) {
1754 } elseif ($action ==
'deletecontact' && $usercancreate) {
1757 $result =
$object->delete_contact($lineid);
1760 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1769 $upload_dir = !empty($conf->propal->multidir_output[
$object->entity]) ? $conf->propal->multidir_output[
$object->entity] : $conf->propal->dir_output;
1770 $permissiontoadd = $usercancreate;
1771 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1779$form =
new Form($db);
1783if (isModEnabled(
'project')) {
1787$title =
$object->ref.
" - ".$langs->trans(
'Card');
1788if ($action ==
'create') {
1789 $title = $langs->trans(
"NewPropal");
1791$help_url =
'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos|DE:Modul_Angebote';
1798if ($action ==
'create') {
1799 $currency_code = $conf->currency;
1805 $res = $soc->fetch($socid);
1808 $currency_code = $conf->currency;
1810 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1811 $deposit_percent =
GETPOST(
'cond_reglement_id_deposit_percent',
'alpha');
1812 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1816 if (!empty($origin) && !empty($originid)) {
1818 $element = $subelement = $origin;
1820 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1821 $element = $regs[1];
1822 $subelement = $regs[2];
1825 if ($element ==
'project') {
1826 $projectid = $originid;
1829 if ($element ==
'order' || $element ==
'commande') {
1830 $element = $subelement =
'commande';
1832 if ($element ==
'propal') {
1833 $element =
'comm/propal';
1834 $subelement =
'propal';
1836 if ($element ==
'contract') {
1837 $element = $subelement =
'contrat';
1839 if ($element ==
'shipping') {
1840 $element = $subelement =
'expedition';
1845 $classname = ucfirst($subelement);
1846 $objectsrc =
new $classname($db);
1847 $objectsrc->fetch($originid);
1848 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1849 $objectsrc->fetch_lines();
1851 $objectsrc->fetch_thirdparty();
1853 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
1854 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
1856 $soc = $objectsrc->thirdparty;
1858 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1859 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1860 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : 0));
1863 $objectsrc->fetch_optionals();
1864 $object->array_options = $objectsrc->array_options;
1866 if (isModEnabled(
"multicurrency")) {
1867 if (!empty($objectsrc->multicurrency_code)) {
1868 $currency_code = $objectsrc->multicurrency_code;
1870 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
1871 $currency_tx = $objectsrc->multicurrency_tx;
1876 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
1877 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
1878 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
1879 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
1880 $shipping_method_id = $soc->shipping_method_id;
1881 $warehouse_id = $soc->fk_warehouse;
1882 $remise_percent = $soc->remise_percent;
1884 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
1885 $currency_code = $soc->multicurrency_code;
1890 if (!
GETPOST(
'changecompany')) {
1891 if (GETPOSTISSET(
'cond_reglement_id')) {
1892 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1894 if (GETPOSTISSET(
'deposit_percent')) {
1897 if (GETPOSTISSET(
'mode_reglement_id')) {
1898 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1900 if (GETPOSTISSET(
'cond_reglement_id')) {
1906 if ($soc->fk_warehouse > 0) {
1907 $warehouse_id = $soc->fk_warehouse;
1909 if (isModEnabled(
'stock') && empty($warehouse_id) &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER')) {
1914 $warehouse_id = $user->fk_warehouse;
1918 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1919 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1920 print
'<input type="hidden" name="action" value="add">';
1921 print
'<input type="hidden" name="changecompany" value="0">';
1922 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1923 if ($origin !=
'project' && $originid) {
1924 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
1925 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
1926 } elseif ($origin ==
'project' && !empty($projectid)) {
1927 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
1933 $parameters = array();
1935 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
1936 if (empty($reshook)) {
1937 print
'<table class="border centpercent">';
1940 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
1943 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
1944 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
1948 print
'<tr class="field_socid">';
1949 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
1950 $shipping_method_id = 0;
1952 print
'<td class="valuefieldcreate">';
1953 print $soc->getNomUrl(1,
'customer');
1954 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1956 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
1957 $shipping_method_id = $soc->shipping_method_id;
1961 print
'<td class="valuefieldcreate">';
1962 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
1963 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0,
null, 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
1967 $(document).ready(function() {
1968 $("#socid").change(function() {
1969 console.log("We have changed the company - Reload page");
1970 var socid = $(this).val();
1972 $("input[name=action]").val("create");
1973 $("input[name=changecompany]").val("1");
1974 $("form[name=addprop]").submit();
1979 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>';
1986 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
1987 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
1989 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
1993 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
1995 $absolute_discount = $soc->getAvailableDiscounts();
1999 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
2000 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2005 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
2006 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2007 print $form->selectDate(
'',
'', 0, 0, 0,
"addprop", 1, 1);
2011 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>';
2014 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2015 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2017 print $form->getSelectConditionsPaiements($cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2021 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2022 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2023 print $form->select_types_paiements($mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2027 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2028 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2029 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2034 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2035 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2036 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2040 if (isModEnabled(
"shipping")) {
2041 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2042 $shipping_method_id = $soc->shipping_method_id;
2044 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2045 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2046 $form->selectShippingMethod((GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2051 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2052 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2054 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2055 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2060 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2061 if (isModEnabled(
'order')) {
2062 print
' ('.$langs->trans(
'AfterOrder').
')';
2064 print
'</td><td class="valuefieldcreate">';
2065 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2066 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2070 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2071 print
'<td class="valuefieldcreate">';
2072 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2074 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2075 $syear = date(
"Y", $tmpdte);
2076 $smonth = date(
"m", $tmpdte);
2077 $sday = date(
"d", $tmpdte);
2078 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2080 print $form->selectDate(-1,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2085 if (isModEnabled(
'project')) {
2086 $langs->load(
"projects");
2087 print
'<tr class="field_projectid">';
2088 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2089 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');
2090 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>';
2096 if (isModEnabled(
'incoterm')) {
2097 print
'<tr class="field_incoterm_id">';
2098 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2099 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2100 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2101 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2106 print
'<tr class="field_model">';
2107 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2108 print
'<td class="valuefieldcreate">';
2109 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2112 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2116 if (isModEnabled(
"multicurrency")) {
2117 print
'<tr class="field_currency">';
2118 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2119 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2120 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0);
2125 print
'<tr class="field_note_public">';
2126 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2127 print
'<td class="valuefieldcreate">';
2128 $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');
2129 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2130 print $doleditor->Create(1);
2133 if (empty($user->socid)) {
2134 print
'<tr class="field_note_private">';
2135 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2136 print
'<td class="valuefieldcreate">';
2137 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2138 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2139 print $doleditor->Create(1);
2145 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2148 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2150 if ($origin ==
'contrat') {
2154 $objectsrc->update_price(1,
'auto', 1);
2157 print
"\n<!-- ".$classname.
" info -->";
2159 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2160 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2161 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2162 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2163 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2165 $newclassname = $classname;
2166 if ($newclassname ==
'Propal') {
2167 $newclassname =
'CommercialProposal';
2168 } elseif ($newclassname ==
'Commande') {
2169 $newclassname =
'Order';
2170 } elseif ($newclassname ==
'Expedition') {
2171 $newclassname =
'Sending';
2172 } elseif ($newclassname ==
'Fichinter') {
2173 $newclassname =
'Intervention';
2176 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2177 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1, $conf->currency).
'</td></tr>';
2178 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2179 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2180 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2183 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2184 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2186 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2188 if (isModEnabled(
"multicurrency")) {
2189 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2190 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2191 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2203 print
'<input type="hidden" name="createmode" value="empty">';
2207 print
'<br><table>';
2211 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2212 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2214 $liste_propal = array();
2215 $liste_propal [0] =
'';
2217 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2218 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2219 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2220 $sql .=
" WHERE s.rowid = p.fk_soc";
2221 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2222 $sql .=
" AND p.fk_statut <> 0";
2223 $sql .=
" ORDER BY Id";
2225 $resql = $db->query($sql);
2227 $num = $db->num_rows($resql);
2230 $row = $db->fetch_row($resql);
2231 $propalRefAndSocName = $row[1].
" - ".$row[2];
2232 $liste_propal[$row[0]] = $propalRefAndSocName;
2235 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2241 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2242 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2249 $langs->load(
"bills");
2251 print $form->buttonsSaveCancel(
"CreateDraft");
2257 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2260 $title = $langs->trans(
'ProductsAndServices');
2263 print
'<div class="div-table-responsive-no-min">';
2264 print
'<table class="noborder centpercent">';
2266 $objectsrc->printOriginLinesList();
2288 if ($action ==
'clone') {
2290 $filter =
'(s.client:IN:1,2,3)';
2291 $formquestion = array(
2294 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0,
null, 0,
'maxwidth300')),
2295 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2296 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2299 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2302 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
2305 if ($action ==
'closeas') {
2307 $formquestion = array();
2309 $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)));
2311 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2313 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2318 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2320 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2321 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2325 $eligibleForDepositGeneration =
true;
2327 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2328 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2330 $eligibleForDepositGeneration =
false;
2336 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2337 foreach (
$object->linkedObjects[
'commande'] as $order) {
2338 $order->fetchObjectLinked();
2340 if (array_key_exists(
'facture', $order->linkedObjects)) {
2341 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2343 $eligibleForDepositGeneration =
false;
2352 if ($eligibleForDepositGeneration) {
2353 $formquestion[] = array(
2354 'type' =>
'checkbox',
2355 'tdclass' =>
'showonlyifsigned',
2356 'name' =>
'generate_deposit',
2357 'morecss' =>
'margintoponly marginbottomonly',
2358 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2361 $formquestion[] = array(
2363 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2365 'label' => $langs->trans(
'DateInvoice'),
2371 $formquestion[] = array(
2373 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2374 'name' =>
'date_pointoftax',
2375 'label' => $langs->trans(
'DatePointOfTax'),
2381 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2383 $formquestion[] = array(
2385 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2386 'name' =>
'cond_reglement_id',
2387 'label' => $langs->trans(
'PaymentTerm'),
2388 'value' => $paymentTermsSelect
2391 $formquestion[] = array(
2392 'type' =>
'checkbox',
2393 'tdclass' =>
'showonlyifgeneratedeposit',
2394 'name' =>
'validate_generated_deposit',
2395 'morecss' =>
'margintoponly marginbottomonly',
2396 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2399 $formquestion[] = array(
2400 'type' =>
'onecolumn',
2403 let signedValue = ' . $object::STATUS_SIGNED .
';
2405 $(document).ready(function() {
2406 $("[name=generate_deposit]").change(function () {
2407 let $self = $(this);
2408 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2410 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2419 $("#statut").change(function() {
2420 let $target = $(".showonlyifsigned").parent(".tagtr");
2422 if ($(this).val() == signedValue) {
2428 $("[name=generate_deposit]").trigger("change");
2433 $("#statut").trigger("change");
2442 if (isModEnabled(
'notification')) {
2443 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2444 $notify =
new Notify($db);
2445 $formquestion = array_merge($formquestion, array(
2446 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2451 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2453 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2455 } elseif ($action ==
'cancel') {
2457 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2458 } elseif ($action ==
'delete') {
2460 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2461 } elseif ($action ==
'reopen') {
2463 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2464 } elseif ($action ==
'ask_deleteline') {
2466 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2467 } elseif ($action ==
'validate') {
2472 $ref = substr(
$object->ref, 1, 4);
2473 if ($ref ==
'PROV' || $ref ==
'') {
2474 $numref =
$object->getNextNumRef($soc);
2475 if (empty($numref)) {
2483 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2484 if (isModEnabled(
'notification')) {
2485 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2486 $notify =
new Notify($db);
2488 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2493 foreach (
$object->lines as $line) {
2494 $res = $line->fetch_product();
2496 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2502 if ($nbMandated > 0) {
2504 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2507 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2512 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2517 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2518 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2519 if (empty($reshook)) {
2520 $formconfirm .= $hookmanager->resPrint;
2521 } elseif ($reshook > 0) {
2522 $formconfirm = $hookmanager->resPrint;
2531 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2533 $morehtmlref =
'<div class="refidno">';
2535 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2536 $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);
2538 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2540 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2543 if (isModEnabled(
'project')) {
2544 $langs->load(
"projects");
2545 $morehtmlref .=
'<br>';
2546 if ($usercancreate) {
2547 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2548 if ($action !=
'classify') {
2549 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2551 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2553 if (!empty(
$object->fk_project)) {
2555 $proj->fetch(
$object->fk_project);
2556 $morehtmlref .= $proj->getNomUrl(1);
2558 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2563 $morehtmlref .=
'</div>';
2566 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2569 $parameters = array();
2571 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
2572 if (empty($reshook)) {
2573 print
'<div class="fichecenter">';
2574 print
'<div class="fichehalfleft">';
2575 print
'<div class="underbanner clearboth"></div>';
2577 print
'<table class="border tableforfield centpercent">';
2581 $filterabsolutediscount =
"fk_facture_source IS NULL";
2582 $filtercreditnote =
"fk_facture_source IS NOT NULL";
2584 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
2585 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
2588 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
2590 $absolute_discount = $soc->getAvailableDiscounts(
'', $filterabsolutediscount);
2591 $absolute_creditnote = $soc->getAvailableDiscounts(
'', $filtercreditnote);
2592 $absolute_discount =
price2num($absolute_discount,
'MT');
2593 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
2599 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
2600 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2616 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, $editenable);
2617 print
'</td><td class="valuefield">';
2618 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
2619 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2620 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2621 print
'<input type="hidden" name="action" value="setdate">';
2622 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2623 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
2624 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2638 print
'<table class="nobordernopadding centpercent"><tr><td>';
2639 print $langs->trans(
'DateEndPropal');
2641 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
2642 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>';
2644 print
'</tr></table>';
2645 print
'</td><td class="valuefield">';
2646 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
2647 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2648 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2649 print
'<input type="hidden" name="action" value="setecheance">';
2650 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2651 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
2652 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2655 if (!empty(
$object->fin_validite)) {
2669 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2670 print $langs->trans(
'PaymentConditionsShort');
2672 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
2673 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>';
2675 print
'</tr></table>';
2676 print
'</td><td class="valuefield">';
2677 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
2678 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
2680 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
2686 print
'<tr class="field_mode_reglement_id">';
2687 print
'<td class="titlefieldcreate">';
2688 print
'<table class="nobordernopadding centpercent"><tr><td>';
2689 print $langs->trans(
'PaymentMode');
2691 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
2692 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>';
2694 print
'</tr></table>';
2695 print
'</td><td class="valuefieldcreate">';
2696 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
2697 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
2699 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'none');
2704 $langs->load(
'deliveries');
2706 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2707 print
'</td><td class="valuefieldedit">';
2708 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2713 print
'<tr class="fielddeliverydelay"><td>';
2714 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2715 if (isModEnabled(
'order')) {
2716 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
2718 print $langs->trans(
'AvailabilityPeriod');
2721 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
2722 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>';
2724 print
'</tr></table>';
2725 print
'</td><td class="valuefield">';
2726 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
2727 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'availability_id', 1);
2729 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'none', 1);
2736 if (isModEnabled(
"shipping")) {
2738 print
'<table class="nobordernopadding centpercent"><tr><td>';
2739 print $langs->trans(
'SendingMethod');
2741 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
2742 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>';
2744 print
'</tr></table>';
2745 print
'</td><td class="valuefield">';
2746 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
2747 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'shipping_method_id', 1);
2749 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'none');
2756 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2757 $langs->load(
'stocks');
2758 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2760 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">';
2761 $editenable = $usercancreate;
2762 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
2763 print
'</td><td class="valuefieldcreate">';
2764 if ($action ==
'editwarehouse') {
2765 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
2767 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
2775 print
'<table class="nobordernopadding centpercent"><tr><td>';
2776 print $langs->trans(
'Source');
2778 if ($action !=
'editdemandreason' && $usercancreate) {
2779 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>';
2781 print
'</tr></table>';
2782 print
'</td><td class="valuefield">';
2783 if ($action ==
'editdemandreason' && $usercancreate) {
2784 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'demand_reason_id', 1);
2786 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'none');
2792 if (isModEnabled(
"multicurrency")) {
2796 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2797 print $form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0);
2799 if ($action !=
'editmulticurrencycode' &&
$object->statut == $object::STATUS_DRAFT && $usercancreate) {
2800 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmulticurrencycode&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetMultiCurrencyCode'), 1).
'</a></td>';
2802 print
'</tr></table>';
2803 print
'</td><td class="valuefield">';
2804 if (
$object->statut == $object::STATUS_DRAFT && $action ==
'editmulticurrencycode' && $usercancreate) {
2805 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_code,
'multicurrency_code');
2807 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_code,
'none');
2812 if (
$object->multicurrency_code != $conf->currency ||
$object->multicurrency_tx != 1) {
2815 print
'<table class="nobordernopadding" width="100%"><tr>';
2817 print $form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'',
$object, 0);
2819 if ($action !=
'editmulticurrencyrate' &&
$object->statut == $object::STATUS_DRAFT &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency && $usercancreate) {
2820 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editmulticurrencyrate&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetMultiCurrencyCode'), 1).
'</a></td>';
2822 print
'</tr></table>';
2823 print
'</td><td class="valuefield">';
2824 if (
$object->statut == $object::STATUS_DRAFT && ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') && $usercancreate) {
2825 if ($action ==
'actualizemulticurrencyrate') {
2828 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx,
'multicurrency_tx',
$object->multicurrency_code);
2830 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx,
'none',
$object->multicurrency_code);
2831 if (
$object->statut == $object::STATUS_DRAFT &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency) {
2832 print
'<div class="inline-block"> ';
2833 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
2841 if ($soc->outstanding_limit) {
2844 print $langs->trans(
'OutstandingBill');
2845 print
'</td><td class="valuefield">';
2846 $arrayoutstandingbills = $soc->getOutstandingBills();
2847 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
2848 print
price($arrayoutstandingbills[
'opened']).
' / ';
2849 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1, $conf->currency);
2854 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2857 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2858 print $langs->trans(
'BankAccount');
2860 if ($action !=
'editbankaccount' && $usercancreate) {
2861 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>';
2863 print
'</tr></table>';
2864 print
'</td><td class="valuefield">';
2865 if ($action ==
'editbankaccount') {
2866 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
2868 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
2874 $tmparray =
$object->getTotalWeightVolume();
2875 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
2876 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
2878 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
2879 print
'<td class="valuefield">';
2880 print
showDimensionInBestUnit($totalWeight, 0,
"weight", $langs, isset($conf->global->MAIN_WEIGHT_DEFAULT_ROUND) ? $conf->global->MAIN_WEIGHT_DEFAULT_ROUND : -1, isset($conf->global->MAIN_WEIGHT_DEFAULT_UNIT) ? $conf->global->MAIN_WEIGHT_DEFAULT_UNIT :
'no', 0);
2884 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
2885 print
'<td class="valuefield">';
2886 print
showDimensionInBestUnit($totalVolume, 0,
"volume", $langs, isset($conf->global->MAIN_VOLUME_DEFAULT_ROUND) ? $conf->global->MAIN_VOLUME_DEFAULT_ROUND : -1, isset($conf->global->MAIN_VOLUME_DEFAULT_UNIT) ? $conf->global->MAIN_VOLUME_DEFAULT_UNIT :
'no', 0);
2891 if (isModEnabled(
'incoterm')) {
2893 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2894 print $langs->trans(
'IncotermLabel');
2895 print
'<td><td class="right">';
2896 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
2897 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2901 print
'</td></tr></table>';
2903 print
'<td class="valuefield">';
2904 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
2905 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2907 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
2913 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2918 print
'<div class="fichehalfright">';
2919 print
'<div class="underbanner clearboth"></div>';
2921 print
'<table class="border tableforfield centpercent">';
2924 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
2925 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2926 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2927 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2932 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountVAT') .
'</td>';
2933 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2934 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2935 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2939 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
2941 print
'<td class="titlefieldmiddle">' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
2942 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2943 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2946 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2951 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
2953 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
2954 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2955 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2958 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2964 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
2965 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2966 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2967 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2974 if (isModEnabled(
'margin')) {
2975 $formmargin->displayMarginInfos(
$object);
2981 print
'<div class="clearboth"></div><br>';
2984 $blocname =
'contacts';
2985 $title = $langs->trans(
'ContactsAddresses');
2986 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
2990 $blocname =
'notes';
2991 $title = $langs->trans(
'Notes');
2992 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3000 $result =
$object->getLinesArray();
3004 global $inputalsopricewithtax;
3005 $inputalsopricewithtax = 1;
3007 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
3008 <input type="hidden" name="token" value="' .
newToken().
'">
3009 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3010 <input type="hidden" name="mode" value="">
3011 <input type="hidden" name="page_y" value="">
3012 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3013 <input type="hidden" name="id" value="' .
$object->id.
'">
3017 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3020 print
'<div class="div-table-responsive-no-min">';
3022 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3026 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3031 if ($action !=
'editline') {
3032 $parameters = array();
3033 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3037 if (empty($reshook)) {
3038 $object->formAddObjectLine(1, $mysoc, $soc);
3041 $parameters = array();
3042 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3061 if ($action !=
'presend') {
3062 print
'<div class="tabsAction">';
3064 $parameters = array();
3065 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3067 if (empty($reshook)) {
3068 if ($action !=
'editline') {
3072 if ($usercanvalidate) {
3073 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>';
3075 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3085 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3090 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3091 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3095 if (empty($user->socid)) {
3097 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3103 if ($usercancreateorder) {
3104 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/commande/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid.
'">'.$langs->trans(
"AddOrder").
'</a>';
3111 if ($usercancreatepurchaseorder) {
3112 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/fourn/commande/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid.
'">'.$langs->trans(
"AddPurchaseOrder").
'</a>';
3119 if ($usercancreateintervention) {
3120 $langs->load(
"interventions");
3121 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/fichinter/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid.
'">'.$langs->trans(
"AddIntervention").
'</a>';
3127 $langs->load(
"contracts");
3129 if ($usercancreatecontract) {
3130 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/contrat/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid.
'">'.$langs->trans(
'AddContract').
'</a>';
3136 if (isModEnabled(
'invoice') && $usercancreateinvoice) {
3137 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/compta/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid.
'">'.$langs->trans(
"CreateBill").
'</a>';
3140 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3141 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3142 if ($usercanclose) {
3143 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3145 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3153 if ($usercanclose) {
3154 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3155 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3157 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3158 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3164 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3165 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3171 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3175 if ($usercancreate) {
3176 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>';
3180 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3188 if (
GETPOST(
'modelselected')) {
3189 $action =
'presend';
3192 if ($action !=
'presend') {
3193 print
'<div class="fichecenter"><div class="fichehalfleft">';
3194 print
'<a name="builddoc"></a>';
3200 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3201 $genallowed = $usercanread;
3202 $delallowed = $usercancreate;
3204 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $soc->default_lang,
'',
$object);
3207 $linktoelem = $form->showLinkToObjectBlock(
$object,
null, array(
'propal'));
3209 $compatibleImportElementsList =
false;
3211 $compatibleImportElementsList = array(
'commande',
'propal',
'facture');
3213 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3219 print
'<br><!-- Link to sign -->';
3220 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3221 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3224 print
'</div><div class="fichehalfright">';
3228 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3231 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3233 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3235 print
'</div></div>';
3239 $modelmail =
'propal_send';
3240 $defaulttopic =
'SendPropalRef';
3241 $diroutput = $conf->propal->multidir_output[
$object->entity];
3242 $trackid =
'pro'.$object->id;
3244 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Class to manage a WYSIWYG editor.
static createDepositFromOrigin(CommonObject $origin, $date, $payment_terms_id, User $user, $notrigger=0, $autoValidateDeposit=false, $overrideFields=array())
Creates a deposit from a proposal or an order by grouping lines by VAT rates.
const TYPE_DEPOSIT
Deposit invoice.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage the table of subscription to notifications.
Class ProductCombination Used to represent the relation between a product and one of its variants.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
Class to manage projects.
Class to manage proposals.
const STATUS_DRAFT
Draft status.
const STATUS_SIGNED
Signed quote.
const STATUS_NOTSIGNED
Not signed quote.
const STATUS_BILLED
Billed or processed quote.
const STATUS_CANCELED
Canceled status.
const STATUS_VALIDATED
Validated status.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
getDictionaryValue($tablename, $field, $id, $checkentity=false, $rowidfield='rowid')
Return the value of a filed into a dictionary for the record $id.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
propal_prepare_head($object)
Prepare array with list of tabs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.