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');
1817 if (!empty($origin) && !empty($originid)) {
1819 $element = $subelement = $origin;
1821 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
1822 $element = $regs[1];
1823 $subelement = $regs[2];
1826 if ($element ==
'project') {
1827 $projectid = $originid;
1831 $project->fetch($projectid);
1832 if ($project->socid > 0) {
1834 $soc->fetch($project->socid);
1838 if ($element ==
'order' || $element ==
'commande') {
1839 $element = $subelement =
'commande';
1841 if ($element ==
'propal') {
1842 $element =
'comm/propal';
1843 $subelement =
'propal';
1845 if ($element ==
'contract') {
1846 $element = $subelement =
'contrat';
1848 if ($element ==
'shipping') {
1849 $element = $subelement =
'expedition';
1854 $classname = ucfirst($subelement);
1855 $objectsrc =
new $classname($db);
1856 $objectsrc->fetch($originid);
1857 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1858 $objectsrc->fetch_lines();
1860 $objectsrc->fetch_thirdparty();
1862 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : 0);
1863 $ref_client = (!empty($objectsrc->ref_client) ? $objectsrc->ref_client :
'');
1865 $soc = $objectsrc->thirdparty;
1867 $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0));
1868 $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0));
1869 $warehouse_id = (!empty($objectsrc->warehouse_id) ? $objectsrc->warehouse_id : (!empty($soc->warehouse_id) ? $soc->warehouse_id : 0));
1872 $objectsrc->fetch_optionals();
1873 $object->array_options = $objectsrc->array_options;
1875 if (isModEnabled(
"multicurrency")) {
1876 if (!empty($objectsrc->multicurrency_code)) {
1877 $currency_code = $objectsrc->multicurrency_code;
1879 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
1880 $currency_tx = $objectsrc->multicurrency_tx;
1888 $cond_reglement_id = empty($soc->cond_reglement_id) ? $cond_reglement_id : $soc->cond_reglement_id;
1889 $deposit_percent = empty($soc->deposit_percent) ? $deposit_percent : $soc->deposit_percent;
1890 $mode_reglement_id = empty($soc->mode_reglement_id) ? $mode_reglement_id : $soc->mode_reglement_id;
1891 $fk_account = empty($soc->fk_account) ? $fk_account : $soc->fk_account;
1892 $shipping_method_id = $soc->shipping_method_id;
1893 $warehouse_id = $soc->fk_warehouse;
1894 $remise_percent = $soc->remise_percent;
1896 if (isModEnabled(
"multicurrency") && !empty($soc->multicurrency_code)) {
1897 $currency_code = $soc->multicurrency_code;
1902 if (!
GETPOST(
'changecompany')) {
1903 if (GETPOSTISSET(
'cond_reglement_id')) {
1904 $cond_reglement_id =
GETPOSTINT(
'cond_reglement_id');
1906 if (GETPOSTISSET(
'deposit_percent')) {
1909 if (GETPOSTISSET(
'mode_reglement_id')) {
1910 $mode_reglement_id =
GETPOSTINT(
'mode_reglement_id');
1912 if (GETPOSTISSET(
'cond_reglement_id')) {
1918 if ($soc->fk_warehouse > 0) {
1919 $warehouse_id = $soc->fk_warehouse;
1921 if (isModEnabled(
'stock') && empty($warehouse_id) &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER')) {
1926 $warehouse_id = $user->fk_warehouse;
1930 print
'<form name="addprop" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1931 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1932 print
'<input type="hidden" name="action" value="add">';
1933 print
'<input type="hidden" name="changecompany" value="0">';
1934 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1935 if ($origin !=
'project' && $originid) {
1936 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
1937 print
'<input type="hidden" name="originid" value="'.$originid.
'">';
1938 } elseif ($origin ==
'project' && !empty($projectid)) {
1939 print
'<input type="hidden" name="projectid" value="'.$projectid.
'">';
1945 $parameters = array();
1947 $reshook = $hookmanager->executeHooks(
'tabContentCreateProposal', $parameters,
$object, $action);
1948 if (empty($reshook)) {
1949 print
'<table class="border centpercent">';
1952 print
'<tr class="field_ref"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td class="valuefieldcreate">'.$langs->trans(
"Draft").
'</td></tr>';
1955 print
'<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans(
'RefCustomer').
'</td><td class="valuefieldcreate">';
1956 print
'<input type="text" name="ref_client" value="'.(!empty($ref_client) ? $ref_client :
GETPOST(
'ref_client')).
'"></td>';
1960 print
'<tr class="field_socid">';
1961 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Customer').
'</td>';
1962 $shipping_method_id = 0;
1964 print
'<td class="valuefieldcreate">';
1965 print $soc->getNomUrl(1,
'customer');
1966 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1968 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
1969 $shipping_method_id = $soc->shipping_method_id;
1973 print
'<td class="valuefieldcreate">';
1974 $filter =
'((s.client:IN:1,2,3) AND (s.status:=:1))';
1975 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid', $filter,
'SelectThirdParty', 1, 0,
null, 0,
'minwidth300 maxwidth500 widthcentpercentminusxx');
1979 $(document).ready(function() {
1980 $("#socid").change(function() {
1981 console.log("We have changed the company - Reload page");
1982 var socid = $(this).val();
1984 $("input[name=action]").val("create");
1985 $("input[name=changecompany]").val("1");
1986 $("form[name=addprop]").submit();
1991 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>';
1998 print
'<tr class="field_contactid"><td class="titlefieldcreate">'.$langs->trans(
"DefaultContact").
'</td><td class="valuefieldcreate">';
1999 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2001 print $form->select_contact($soc->id, $contactid,
'contactid', 1,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
2005 print
'<tr class="field_discount_info"><td class="titlefieldcreate">'.$langs->trans(
'Discounts').
'</td><td class="valuefieldcreate">';
2007 $absolute_discount = $soc->getAvailableDiscounts();
2011 $backtopage = $_SERVER[
"PHP_SELF"].
'?socid='.$thirdparty->id.
'&action='.$action.
'&origin='.urlencode((
string) (
GETPOST(
'origin'))).
'&originid='.urlencode((
string) (
GETPOSTINT(
'originid')));
2012 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2017 print
'<tr class="field_addprop"><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'DatePropal').
'</td><td class="valuefieldcreate">';
2018 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2019 print $form->selectDate(
'',
'', 0, 0, 0,
"addprop", 1, 1);
2023 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>';
2026 print
'<tr class="field_cond_reglement_id"><td class="nowrap">'.$langs->trans(
'PaymentConditionsShort').
'</td><td>';
2027 print
img_picto(
'',
'payment',
'class="pictofixedwidth"');
2029 print $form->getSelectConditionsPaiements($cond_reglement_id,
'cond_reglement_id', 1, 1, 0,
'', $deposit_percent);
2033 print
'<tr class="field_mode_reglement_id"><td class="titlefieldcreate">'.$langs->trans(
'PaymentMode').
'</td><td class="valuefieldcreate">';
2034 print
img_picto(
'',
'bank',
'class="pictofixedwidth"');
2035 print $form->select_types_paiements($mode_reglement_id,
'mode_reglement_id',
'CRDT', 0, 1, 0, 0, 1,
'maxwidth200 widthcentpercentminusx', 1);
2039 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2040 print
'<tr class="field_fk_account"><td class="titlefieldcreate">'.$langs->trans(
'BankAccount').
'</td><td class="valuefieldcreate">';
2041 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"').$form->select_comptes($fk_account,
'fk_account', 0,
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx', 1);
2046 print
'<tr class="field_demand_reason_id"><td class="titlefieldcreate">'.$langs->trans(
'Source').
'</td><td class="valuefieldcreate">';
2047 print
img_picto(
'',
'question',
'class="pictofixedwidth"');
2048 $form->selectInputReason((GETPOSTISSET(
'demand_reason_id') ?
GETPOSTINT(
'demand_reason_id') :
''),
'demand_reason_id',
"SRC_PROP", 1,
'maxwidth200 widthcentpercentminusx');
2052 if (isModEnabled(
"shipping")) {
2053 if (
getDolGlobalString(
'SOCIETE_ASK_FOR_SHIPPING_METHOD') && !empty($soc->shipping_method_id)) {
2054 $shipping_method_id = $soc->shipping_method_id;
2056 print
'<tr class="field_shipping_method_id"><td class="titlefieldcreate">'.$langs->trans(
'SendingMethod').
'</td><td class="valuefieldcreate">';
2057 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
2058 $form->selectShippingMethod((GETPOSTISSET(
'shipping_method_id') ?
GETPOSTINT(
'shipping_method_id') : $shipping_method_id),
'shipping_method_id',
'', 1,
'', 0,
'maxwidth200 widthcentpercentminusx');
2063 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2064 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2066 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">'.$langs->trans(
'Warehouse').
'</td><td class="valuefieldcreate">';
2067 print
img_picto(
'',
'stock',
'class="pictofixedwidth"').$formproduct->selectWarehouses($warehouse_id,
'warehouse_id',
'', 1, 0, 0,
'', 0, 0, array(),
'maxwidth500 widthcentpercentminusxx');
2072 print
'<tr class="field_availability_id"><td class="titlefieldcreate">'.$langs->trans(
'AvailabilityPeriod');
2073 if (isModEnabled(
'order')) {
2074 print
' ('.$langs->trans(
'AfterOrder').
')';
2076 print
'</td><td class="valuefieldcreate">';
2077 print
img_picto(
'',
'clock',
'class="pictofixedwidth"');
2078 $form->selectAvailabilityDelay((GETPOSTISSET(
'availability_id') ?
GETPOSTINT(
'availability_id') :
''),
'availability_id',
'', 1,
'maxwidth200 widthcentpercentminusx');
2082 print
'<tr class="field_date_livraison"><td class="titlefieldcreate">'.$langs->trans(
"DeliveryDate").
'</td>';
2083 print
'<td class="valuefieldcreate">';
2084 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
2086 $tmpdte = time() + (7 *
getDolGlobalInt(
'DATE_LIVRAISON_WEEK_DELAY') * 24 * 60 * 60);
2087 $syear = date(
"Y", $tmpdte);
2088 $smonth = date(
"m", $tmpdte);
2089 $sday = date(
"d", $tmpdte);
2090 print $form->selectDate($syear.
"-".$smonth.
"-".$sday,
'date_livraison', 0, 0, 0,
"addprop");
2092 print $form->selectDate(-1,
'date_livraison', 0, 0, 0,
"addprop", 1, 1);
2097 if (isModEnabled(
'project')) {
2098 $langs->load(
"projects");
2099 print
'<tr class="field_projectid">';
2100 print
'<td class="titlefieldcreate">'.$langs->trans(
"Project").
'</td><td class="valuefieldcreate">';
2101 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');
2102 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>';
2108 if (isModEnabled(
'incoterm')) {
2109 print
'<tr class="field_incoterm_id">';
2110 print
'<td class="titlefieldcreate"><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"), $soc->label_incoterms, 1).
'</label></td>';
2111 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2112 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
2113 print $form->select_incoterms((!empty($soc->fk_incoterms) ? $soc->fk_incoterms :
''), (!empty($soc->location_incoterms) ? $soc->location_incoterms :
''));
2118 print
'<tr class="field_model">';
2119 print
'<td class="titlefieldcreate">'.$langs->trans(
"DefaultModel").
'</td>';
2120 print
'<td class="valuefieldcreate">';
2121 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
2124 print $form->selectarray(
'model', $liste, $preselected, 0, 0, 0,
'', 0, 0, 0,
'',
'maxwidth200 widthcentpercentminusx', 1);
2128 if (isModEnabled(
"multicurrency")) {
2129 print
'<tr class="field_currency">';
2130 print
'<td class="titlefieldcreate">'.$form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0).
'</td>';
2131 print
'<td class="valuefieldcreate maxwidthonsmartphone">';
2132 print
img_picto(
'',
'currency',
'class="pictofixedwidth"').$form->selectMultiCurrency(((GETPOSTISSET(
'multicurrency_code') && !
GETPOST(
'changecompany')) ?
GETPOST(
'multicurrency_code') : $currency_code),
'multicurrency_code', 0);
2137 print
'<tr class="field_note_public">';
2138 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePublic').
'</td>';
2139 print
'<td class="valuefieldcreate">';
2140 $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');
2141 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
2142 print $doleditor->Create(1);
2145 if (empty($user->socid)) {
2146 print
'<tr class="field_note_private">';
2147 print
'<td class="titlefieldcreate tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
2148 print
'<td class="valuefieldcreate">';
2149 $note_private =
$object->getDefaultCreateValueFor(
'note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc)) ? $objectsrc->note_private : null));
2150 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
2151 print $doleditor->Create(1);
2157 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
2160 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2162 if ($origin ==
'contrat') {
2166 $objectsrc->update_price(1,
'auto', 1);
2169 print
"\n<!-- ".$classname.
" info -->";
2171 print
'<input type="hidden" name="amount" value="'.$objectsrc->total_ht.
'">'.
"\n";
2172 print
'<input type="hidden" name="total" value="'.$objectsrc->total_ttc.
'">'.
"\n";
2173 print
'<input type="hidden" name="tva" value="'.$objectsrc->total_tva.
'">'.
"\n";
2174 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
2175 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
2177 $newclassname = $classname;
2178 if ($newclassname ==
'Propal') {
2179 $newclassname =
'CommercialProposal';
2180 } elseif ($newclassname ==
'Commande') {
2181 $newclassname =
'Order';
2182 } elseif ($newclassname ==
'Expedition') {
2183 $newclassname =
'Sending';
2184 } elseif ($newclassname ==
'Fichinter') {
2185 $newclassname =
'Intervention';
2188 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td>'.$objectsrc->getNomUrl(1).
'</td></tr>';
2189 print
'<tr><td>'.$langs->trans(
'AmountHT').
'</td><td>'.
price($objectsrc->total_ht, 0, $langs, 1, -1, -1, $conf->currency).
'</td></tr>';
2190 print
'<tr><td>'.$langs->trans(
'AmountVAT').
'</td><td>'.
price($objectsrc->total_tva, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2191 if ($mysoc->localtax1_assuj ==
"1" || $objectsrc->total_localtax1 != 0) {
2192 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax1, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2195 if ($mysoc->localtax2_assuj ==
"1" || $objectsrc->total_localtax2 != 0) {
2196 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td><td>'.
price($objectsrc->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2198 print
'<tr><td>'.$langs->trans(
'AmountTTC').
'</td><td>'.
price($objectsrc->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).
"</td></tr>";
2200 if (isModEnabled(
"multicurrency")) {
2201 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountHT').
'</td><td>'.
price($objectsrc->multicurrency_total_ht).
'</td></tr>';
2202 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountVAT').
'</td><td>'.
price($objectsrc->multicurrency_total_tva).
"</td></tr>";
2203 print
'<tr><td>'.$langs->trans(
'MulticurrencyAmountTTC').
'</td><td>'.
price($objectsrc->multicurrency_total_ttc).
"</td></tr>";
2215 print
'<input type="hidden" name="createmode" value="empty">';
2219 print
'<br><table>';
2223 print
'<td><input type="radio" name="createmode" value="copy"></td>';
2224 print
'<td>'.$langs->trans(
"CopyPropalFrom").
' </td>';
2226 $liste_propal = array();
2227 $liste_propal [0] =
'';
2229 $sql =
"SELECT p.rowid as id, p.ref, s.nom";
2230 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal p";
2231 $sql .=
", ".MAIN_DB_PREFIX.
"societe s";
2232 $sql .=
" WHERE s.rowid = p.fk_soc";
2233 $sql .=
" AND p.entity IN (".getEntity(
'propal').
")";
2234 $sql .=
" AND p.fk_statut <> 0";
2235 $sql .=
" ORDER BY Id";
2237 $resql = $db->query($sql);
2239 $num = $db->num_rows($resql);
2242 $row = $db->fetch_row($resql);
2243 $propalRefAndSocName = $row[1].
" - ".$row[2];
2244 $liste_propal[$row[0]] = $propalRefAndSocName;
2247 print $form->selectarray(
"copie_propal", $liste_propal, 0);
2253 print
'<tr><td class="tdtop"><input type="radio" name="createmode" value="empty" checked></td>';
2254 print
'<td valign="top" colspan="2">'.$langs->trans(
"CreateEmptyPropal").
'</td></tr>';
2261 $langs->load(
"bills");
2263 print $form->buttonsSaveCancel(
"CreateDraft");
2269 if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
2272 $title = $langs->trans(
'ProductsAndServices');
2275 print
'<div class="div-table-responsive-no-min">';
2276 print
'<table class="noborder centpercent">';
2278 $objectsrc->printOriginLinesList();
2300 if ($action ==
'clone') {
2302 $filter =
'(s.client:IN:1,2,3)';
2303 $formquestion = array(
2306 array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'', 0, 0,
null, 0,
'maxwidth300')),
2307 array(
'type' =>
'checkbox',
'name' =>
'update_prices',
'label' => $langs->trans(
'PuttingPricesUpToDate'),
'value' => 0),
2308 array(
'type' =>
'checkbox',
'name' =>
'update_desc',
'label' => $langs->trans(
'PuttingDescUpToDate'),
'value' => 0),
2311 $formquestion[] = array(
'type' =>
'date',
'name' =>
'date_delivery',
'label' => $langs->trans(
"DeliveryDate"),
'value' =>
$object->delivery_date);
2314 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmClonePropal',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
2317 if ($action ==
'closeas') {
2319 $formquestion = array();
2321 $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)));
2323 $formquestion[] = array(
'type' =>
'text',
'name' =>
'note_private',
'label' => $langs->trans(
"Note"),
'value' =>
'');
2325 if (
getDolGlobalInt(
'PROPOSAL_SUGGEST_DOWN_PAYMENT_INVOICE_CREATION')) {
2330 $deposit_percent_from_payment_terms =
getDictionaryValue(
'c_payment_term',
'deposit_percent',
$object->cond_reglement_id);
2332 if (!empty($deposit_percent_from_payment_terms) && isModEnabled(
'invoice') && $user->hasRight(
'facture',
'creer')) {
2333 require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
2337 $eligibleForDepositGeneration =
true;
2339 if (array_key_exists(
'facture',
$object->linkedObjects)) {
2340 foreach (
$object->linkedObjects[
'facture'] as $invoice) {
2342 $eligibleForDepositGeneration =
false;
2348 if ($eligibleForDepositGeneration && array_key_exists(
'commande',
$object->linkedObjects)) {
2349 foreach (
$object->linkedObjects[
'commande'] as $order) {
2350 $order->fetchObjectLinked();
2352 if (array_key_exists(
'facture', $order->linkedObjects)) {
2353 foreach ($order->linkedObjects[
'facture'] as $invoice) {
2355 $eligibleForDepositGeneration =
false;
2364 if ($eligibleForDepositGeneration) {
2365 $formquestion[] = array(
2366 'type' =>
'checkbox',
2367 'tdclass' =>
'showonlyifsigned',
2368 'name' =>
'generate_deposit',
2369 'morecss' =>
'margintoponly marginbottomonly',
2370 'label' => $form->textwithpicto($langs->trans(
'GenerateDeposit',
$object->deposit_percent), $langs->trans(
'DepositGenerationPermittedByThePaymentTermsSelected'))
2373 $formquestion[] = array(
2375 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2377 'label' => $langs->trans(
'DateInvoice'),
2383 $formquestion[] = array(
2385 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2386 'name' =>
'date_pointoftax',
2387 'label' => $langs->trans(
'DatePointOfTax'),
2393 $paymentTermsSelect = $form->getSelectConditionsPaiements(0,
'cond_reglement_id', -1, 0, 1,
'minwidth200');
2395 $formquestion[] = array(
2397 'tdclass' =>
'fieldrequired showonlyifgeneratedeposit',
2398 'name' =>
'cond_reglement_id',
2399 'label' => $langs->trans(
'PaymentTerm'),
2400 'value' => $paymentTermsSelect
2403 $formquestion[] = array(
2404 'type' =>
'checkbox',
2405 'tdclass' =>
'showonlyifgeneratedeposit',
2406 'name' =>
'validate_generated_deposit',
2407 'morecss' =>
'margintoponly marginbottomonly',
2408 'label' => $langs->trans(
'ValidateGeneratedDeposit')
2411 $formquestion[] = array(
2412 'type' =>
'onecolumn',
2415 let signedValue = ' . $object::STATUS_SIGNED .
';
2417 $(document).ready(function() {
2418 $("[name=generate_deposit]").change(function () {
2419 let $self = $(this);
2420 let $target = $(".showonlyifgeneratedeposit").parent(".tagtr");
2422 if (! $self.parents(".tagtr").is(":hidden") && $self.is(":checked")) {
2431 $("#statut").change(function() {
2432 let $target = $(".showonlyifsigned").parent(".tagtr");
2434 if ($(this).val() == signedValue) {
2440 $("[name=generate_deposit]").trigger("change");
2445 $("#statut").trigger("change");
2454 if (isModEnabled(
'notification')) {
2455 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2456 $notify =
new Notify($db);
2457 $formquestion = array_merge($formquestion, array(
2458 array(
'type' =>
'onecolumn',
'value' => $notify->confirmMessage(
'PROPAL_CLOSE_SIGNED',
$object->socid,
$object)),
2463 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SetAcceptedRefused'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2465 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?statut=3&id=' .
$object->id, $langs->trans(
'Close'),
'',
'confirm_closeas', $formquestion,
'', 1, 250);
2467 } elseif ($action ==
'cancel') {
2469 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
"CancelPropal"), $langs->trans(
'ConfirmCancelPropal',
$object->ref),
'confirm_cancel',
'', 0, 1);
2470 } elseif ($action ==
'delete') {
2472 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteProp'), $langs->trans(
'ConfirmDeleteProp',
$object->ref),
'confirm_delete',
'', 0, 1);
2473 } elseif ($action ==
'reopen') {
2475 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenProp',
$object->ref),
'confirm_reopen',
'', 0, 1);
2476 } elseif ($action ==
'ask_deleteline') {
2478 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteProductLine'), $langs->trans(
'ConfirmDeleteProductLine'),
'confirm_deleteline',
'', 0, 1);
2479 } elseif ($action ==
'validate') {
2484 $ref = substr(
$object->ref, 1, 4);
2485 if ($ref ==
'PROV' || $ref ==
'') {
2486 $numref =
$object->getNextNumRef($soc);
2487 if (empty($numref)) {
2495 $text = $langs->trans(
'ConfirmValidateProp', $numref);
2496 if (isModEnabled(
'notification')) {
2497 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2498 $notify =
new Notify($db);
2500 $text .= $notify->confirmMessage(
'PROPAL_VALIDATE',
$object->socid,
$object);
2505 foreach (
$object->lines as $line) {
2506 $res = $line->fetch_product();
2508 if ($line->product->isService() && $line->product->isMandatoryPeriod() && (empty($line->date_start) || empty($line->date_end))) {
2514 if ($nbMandated > 0) {
2516 setEventMessages($langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate"),
null,
'errors');
2519 $text .=
'<div><span class="clearboth nowraponall warning">'.img_warning().$langs->trans(
"mandatoryPeriodNeedTobeSetMsgValidate").
'</span></div>';
2524 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProp'), $text,
'confirm_validate',
'', 0, 1, 240);
2529 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
2530 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2531 if (empty($reshook)) {
2532 $formconfirm .= $hookmanager->resPrint;
2533 } elseif ($reshook > 0) {
2534 $formconfirm = $hookmanager->resPrint;
2543 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2545 $morehtmlref =
'<div class="refidno">';
2547 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_client',
$object->ref_client,
$object, $usercancreate,
'string',
'', 0, 1);
2548 $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);
2550 $morehtmlref .=
'<br>'.$soc->getNomUrl(1,
'customer');
2552 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/comm/propal/list.php?socid='.$soc->id.
'&search_societe='.urlencode($soc->name).
'">'.$langs->trans(
"OtherProposals").
'</a>)';
2555 if (isModEnabled(
'project')) {
2556 $langs->load(
"projects");
2557 $morehtmlref .=
'<br>';
2558 if ($usercancreate) {
2559 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2560 if ($action !=
'classify') {
2561 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2563 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2565 if (!empty(
$object->fk_project)) {
2567 $proj->fetch(
$object->fk_project);
2568 $morehtmlref .= $proj->getNomUrl(1);
2570 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2575 $morehtmlref .=
'</div>';
2578 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2581 $parameters = array();
2583 $reshook = $hookmanager->executeHooks(
'tabContentViewProposal', $parameters,
$object, $action);
2584 if (empty($reshook)) {
2585 print
'<div class="fichecenter">';
2586 print
'<div class="fichehalfleft">';
2587 print
'<div class="underbanner clearboth"></div>';
2589 print
'<table class="border tableforfield centpercent">';
2593 $filterabsolutediscount =
"fk_facture_source IS NULL";
2594 $filtercreditnote =
"fk_facture_source IS NOT NULL";
2596 $filterabsolutediscount =
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
2597 $filtercreditnote =
"fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
2600 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
2602 $absolute_discount = $soc->getAvailableDiscounts(
'', $filterabsolutediscount);
2603 $absolute_creditnote = $soc->getAvailableDiscounts(
'', $filtercreditnote);
2604 $absolute_discount =
price2num($absolute_discount,
'MT');
2605 $absolute_creditnote =
price2num($absolute_creditnote,
'MT');
2611 $backtopage = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id;
2612 include DOL_DOCUMENT_ROOT.
'/core/tpl/object_discounts.tpl.php';
2628 print $form->editfieldkey(
"DatePropal",
'date',
'',
$object, $editenable);
2629 print
'</td><td class="valuefield">';
2630 if ($action ==
'editdate' && $usercancreate && $caneditfield) {
2631 print
'<form name="editdate" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2632 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2633 print
'<input type="hidden" name="action" value="setdate">';
2634 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2635 print $form->selectDate(
$object->date,
're', 0, 0, 0,
"editdate");
2636 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2650 print
'<table class="nobordernopadding centpercent"><tr><td>';
2651 print $langs->trans(
'DateEndPropal');
2653 if ($action !=
'editecheance' && $usercancreate && $caneditfield) {
2654 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>';
2656 print
'</tr></table>';
2657 print
'</td><td class="valuefield">';
2658 if ($action ==
'editecheance' && $usercancreate && $caneditfield) {
2659 print
'<form name="editecheance" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2660 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2661 print
'<input type="hidden" name="action" value="setecheance">';
2662 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2663 print $form->selectDate(
$object->fin_validite,
'ech', 0, 0, 0,
"editecheance");
2664 print
'<input type="submit" class="button button-edit" value="'.$langs->trans(
'Modify').
'">';
2667 if (!empty(
$object->fin_validite)) {
2681 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2682 print $langs->trans(
'PaymentConditionsShort');
2684 if ($action !=
'editconditions' && $usercancreate && $caneditfield) {
2685 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>';
2687 print
'</tr></table>';
2688 print
'</td><td class="valuefield">';
2689 if ($action ==
'editconditions' && $usercancreate && $caneditfield) {
2690 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'cond_reglement_id', 0,
'', 1,
$object->deposit_percent);
2692 $form->form_conditions_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->cond_reglement_id,
'none', 0,
'', 1,
$object->deposit_percent);
2698 print
'<tr class="field_mode_reglement_id">';
2699 print
'<td class="titlefieldcreate">';
2700 print
'<table class="nobordernopadding centpercent"><tr><td>';
2701 print $langs->trans(
'PaymentMode');
2703 if ($action !=
'editmode' && $usercancreate && $caneditfield) {
2704 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>';
2706 print
'</tr></table>';
2707 print
'</td><td class="valuefieldcreate">';
2708 if ($action ==
'editmode' && $usercancreate && $caneditfield) {
2709 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'mode_reglement_id',
'CRDT', 1, 1);
2711 $form->form_modes_reglement($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->mode_reglement_id,
'none');
2716 $langs->load(
'deliveries');
2718 print $form->editfieldkey($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2719 print
'</td><td class="valuefieldedit">';
2720 print $form->editfieldval($langs->trans(
'DeliveryDate'),
'date_livraison',
$object->delivery_date,
$object, $usercancreate && $caneditfield,
'datepicker');
2725 print
'<tr class="fielddeliverydelay"><td>';
2726 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2727 if (isModEnabled(
'order')) {
2728 print $form->textwithpicto($langs->trans(
'AvailabilityPeriod'), $langs->trans(
'AvailabilityPeriod').
' ('.$langs->trans(
'AfterOrder').
')');
2730 print $langs->trans(
'AvailabilityPeriod');
2733 if ($action !=
'editavailability' && $usercancreate && $caneditfield) {
2734 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>';
2736 print
'</tr></table>';
2737 print
'</td><td class="valuefield">';
2738 if ($action ==
'editavailability' && $usercancreate && $caneditfield) {
2739 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'availability_id', 1);
2741 $form->form_availability($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->availability_id,
'none', 1);
2748 if (isModEnabled(
"shipping")) {
2750 print
'<table class="nobordernopadding centpercent"><tr><td>';
2751 print $langs->trans(
'SendingMethod');
2753 if ($action !=
'editshippingmethod' && $usercancreate && $caneditfield) {
2754 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>';
2756 print
'</tr></table>';
2757 print
'</td><td class="valuefield">';
2758 if ($action ==
'editshippingmethod' && $usercancreate && $caneditfield) {
2759 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'shipping_method_id', 1);
2761 $form->formSelectShippingMethod($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->shipping_method_id,
'none');
2768 if (isModEnabled(
'stock') &&
getDolGlobalString(
'WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
2769 $langs->load(
'stocks');
2770 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
2772 print
'<tr class="field_warehouse_id"><td class="titlefieldcreate">';
2773 $editenable = $usercancreate;
2774 print $form->editfieldkey(
"Warehouse",
'warehouse',
'',
$object, $editenable);
2775 print
'</td><td class="valuefieldcreate">';
2776 if ($action ==
'editwarehouse') {
2777 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'warehouse_id', 1);
2779 $formproduct->formSelectWarehouses($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->warehouse_id,
'none');
2787 print
'<table class="nobordernopadding centpercent"><tr><td>';
2788 print $langs->trans(
'Source');
2790 if ($action !=
'editdemandreason' && $usercancreate) {
2791 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>';
2793 print
'</tr></table>';
2794 print
'</td><td class="valuefield">';
2795 if ($action ==
'editdemandreason' && $usercancreate) {
2796 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'demand_reason_id', 1);
2798 $form->formInputReason($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->demand_reason_id,
'none');
2804 if (isModEnabled(
"multicurrency")) {
2808 print
'<table class="nobordernopadding" width="100%"><tr><td>';
2809 print $form->editfieldkey(
'Currency',
'multicurrency_code',
'',
$object, 0);
2811 if ($action !=
'editmulticurrencycode' &&
$object->statut == $object::STATUS_DRAFT && $usercancreate) {
2812 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>';
2814 print
'</tr></table>';
2815 print
'</td><td class="valuefield">';
2816 if (
$object->statut == $object::STATUS_DRAFT && $action ==
'editmulticurrencycode' && $usercancreate) {
2817 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_code,
'multicurrency_code');
2819 $form->form_multicurrency_code($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_code,
'none');
2824 if (
$object->multicurrency_code != $conf->currency ||
$object->multicurrency_tx != 1) {
2827 print
'<table class="nobordernopadding" width="100%"><tr>';
2829 print $form->editfieldkey(
'CurrencyRate',
'multicurrency_tx',
'',
$object, 0);
2831 if ($action !=
'editmulticurrencyrate' &&
$object->statut == $object::STATUS_DRAFT &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency && $usercancreate) {
2832 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>';
2834 print
'</tr></table>';
2835 print
'</td><td class="valuefield">';
2836 if (
$object->statut == $object::STATUS_DRAFT && ($action ==
'editmulticurrencyrate' || $action ==
'actualizemulticurrencyrate') && $usercancreate) {
2837 if ($action ==
'actualizemulticurrencyrate') {
2840 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx,
'multicurrency_tx',
$object->multicurrency_code);
2842 $form->form_multicurrency_rate($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->multicurrency_tx,
'none',
$object->multicurrency_code);
2843 if (
$object->statut == $object::STATUS_DRAFT &&
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency) {
2844 print
'<div class="inline-block"> ';
2845 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=actualizemulticurrencyrate">'.$langs->trans(
"ActualizeCurrency").
'</a>';
2853 if ($soc->outstanding_limit) {
2856 print $langs->trans(
'OutstandingBill');
2857 print
'</td><td class="valuefield">';
2858 $arrayoutstandingbills = $soc->getOutstandingBills();
2859 print($arrayoutstandingbills[
'opened'] > $soc->outstanding_limit ?
img_warning() :
'');
2860 print
price($arrayoutstandingbills[
'opened']).
' / ';
2861 print
price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1, $conf->currency);
2866 if (
getDolGlobalString(
'BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL') && isModEnabled(
"bank")) {
2869 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2870 print $langs->trans(
'BankAccount');
2872 if ($action !=
'editbankaccount' && $usercancreate) {
2873 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>';
2875 print
'</tr></table>';
2876 print
'</td><td class="valuefield">';
2877 if ($action ==
'editbankaccount') {
2878 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'fk_account', 1);
2880 $form->formSelectAccount($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->fk_account,
'none');
2886 $tmparray =
$object->getTotalWeightVolume();
2887 $totalWeight = isset($tmparray[
'weight']) ? $tmparray[
'weight'] : 0;
2888 $totalVolume = isset($tmparray[
'volume']) ? $tmparray[
'volume'] : 0;
2890 print
'<tr><td>'.$langs->trans(
"CalculatedWeight").
'</td>';
2891 print
'<td class="valuefield">';
2892 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);
2896 print
'<tr><td>'.$langs->trans(
"CalculatedVolume").
'</td>';
2897 print
'<td class="valuefield">';
2898 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);
2903 if (isModEnabled(
'incoterm')) {
2905 print
'<table width="100%" class="nobordernopadding"><tr><td>';
2906 print $langs->trans(
'IncotermLabel');
2907 print
'<td><td class="right">';
2908 if ($action !=
'editincoterm' && $usercancreate && $caneditfield) {
2909 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/comm/propal/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2913 print
'</td></tr></table>';
2915 print
'<td class="valuefield">';
2916 if ($action ==
'editincoterm' && $usercancreate && $caneditfield) {
2917 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2919 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
2925 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2930 print
'<div class="fichehalfright">';
2931 print
'<div class="underbanner clearboth"></div>';
2933 print
'<table class="border tableforfield centpercent">';
2936 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountHT') .
'</td>';
2937 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ht, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2938 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2939 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ht, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2944 print
'<td class="titlefieldmiddle">' . $langs->trans(
'AmountVAT') .
'</td>';
2945 print
'<td class="nowrap amountcard right">' .
price(
$object->total_tva, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2946 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2947 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_tva, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2951 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
2953 print
'<td class="titlefieldmiddle">' . $langs->transcountry(
"AmountLT1", $mysoc->country_code) .
'</td>';
2954 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax1, 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_localtax1, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2963 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
2965 print
'<td>' . $langs->transcountry(
"AmountLT2", $mysoc->country_code) .
'</td>';
2966 print
'<td class="nowrap amountcard right">' .
price(
$object->total_localtax2, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2967 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2970 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_localtax2, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2976 print
'<td>' . $langs->trans(
'AmountTTC') .
'</td>';
2977 print
'<td class="nowrap amountcard right">' .
price(
$object->total_ttc, 0, $langs, 1, -1, -1, $conf->currency) .
'</td>';
2978 if (isModEnabled(
"multicurrency") && (
$object->multicurrency_code &&
$object->multicurrency_code != $conf->currency)) {
2979 print
'<td class="nowrap amountcard right">' .
price(
$object->multicurrency_total_ttc, 0, $langs, 1, -1, -1,
$object->multicurrency_code) .
'</td>';
2986 if (isModEnabled(
'margin')) {
2987 $formmargin->displayMarginInfos(
$object);
2993 print
'<div class="clearboth"></div><br>';
2996 $blocname =
'contacts';
2997 $title = $langs->trans(
'ContactsAddresses');
2998 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3002 $blocname =
'notes';
3003 $title = $langs->trans(
'Notes');
3004 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
3012 $result =
$object->getLinesArray();
3016 global $inputalsopricewithtax;
3017 $inputalsopricewithtax = 1;
3019 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="POST">
3020 <input type="hidden" name="token" value="' .
newToken().
'">
3021 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3022 <input type="hidden" name="mode" value="">
3023 <input type="hidden" name="page_y" value="">
3024 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
3025 <input type="hidden" name="id" value="' .
$object->id.
'">
3029 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3032 print
'<div class="div-table-responsive-no-min">';
3034 print
'<table id="tablelines" class="noborder noshadow centpercent">';
3038 $object->printObjectLines($action, $mysoc,
$object->thirdparty, $lineid, 1);
3043 if ($action !=
'editline') {
3044 $parameters = array();
3045 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
3049 if (empty($reshook)) {
3050 $object->formAddObjectLine(1, $mysoc, $soc);
3053 $parameters = array();
3054 $reshook = $hookmanager->executeHooks(
'formEditObjectLine', $parameters,
$object, $action);
3073 if ($action !=
'presend') {
3074 print
'<div class="tabsAction">';
3076 $parameters = array();
3077 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3079 if (empty($reshook)) {
3080 if ($action !=
'editline') {
3084 if ($usercanvalidate) {
3085 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>';
3087 print
'<a class="butActionRefused classfortooltip" href="#">'.$langs->trans(
'Validate').
'</a>';
3097 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=modif&token='.
newToken().
'">'.$langs->trans(
'Modify').
'</a>';
3102 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#reopen').
'"';
3103 print
'>'.$langs->trans(
'ReOpen').
'</a>';
3107 if (empty($user->socid)) {
3109 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'', $usercansend);
3115 if ($usercancreateorder) {
3116 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>';
3123 if ($usercancreatepurchaseorder) {
3124 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>';
3131 if ($usercancreateintervention) {
3132 $langs->load(
"interventions");
3133 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>';
3139 $langs->load(
"contracts");
3141 if ($usercancreatecontract) {
3142 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>';
3148 if (isModEnabled(
'invoice') && $usercancreateinvoice) {
3149 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>';
3152 $arrayofinvoiceforpropal =
$object->getInvoiceArrayList();
3153 if ((is_array($arrayofinvoiceforpropal) && count($arrayofinvoiceforpropal) > 0) || !
getDolGlobalString(
'WORKFLOW_PROPAL_NEED_INVOICE_TO_BE_CLASSIFIED_BILLED')) {
3154 if ($usercanclose) {
3155 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=classifybilled&token='.
newToken().
'&socid='.
$object->socid.
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3157 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
"ClassifyBilled").
'</a>';
3165 if ($usercanclose) {
3166 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=closeas&token='.
newToken().(!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close').
'"';
3167 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3169 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'"';
3170 print
'>'.$langs->trans(
'SetAcceptedRefused').
'</a>';
3176 print
'<a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&token='.newToken().
'&action=closeas&token='.
newToken() . (!
getDolGlobalString(
'MAIN_JUMP_TAG') ?
'' :
'#close') .
'"';
3177 print
'>' . $langs->trans(
'SetRefusedAndClose') .
'</a>';
3183 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.
newToken().
'">'.$langs->trans(
"CancelPropal").
'</a>';
3187 if ($usercancreate) {
3188 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>';
3192 print
dolGetButtonAction($langs->trans(
"Delete"),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'delete', $usercandelete);
3200 if (
GETPOST(
'modelselected')) {
3201 $action =
'presend';
3204 if ($action !=
'presend') {
3205 print
'<div class="fichecenter"><div class="fichehalfleft">';
3206 print
'<a name="builddoc"></a>';
3212 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3213 $genallowed = $usercanread;
3214 $delallowed = $usercancreate;
3216 print $formfile->showdocuments(
'propal', $objref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $soc->default_lang,
'',
$object);
3219 $linktoelem = $form->showLinkToObjectBlock(
$object,
null, array(
'propal'));
3221 $compatibleImportElementsList =
false;
3223 $compatibleImportElementsList = array(
'commande',
'propal',
'facture');
3225 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem, $compatibleImportElementsList);
3231 print
'<br><!-- Link to sign -->';
3232 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3233 print showOnlineSignatureUrl(
'proposal',
$object->ref,
$object).
'<br>';
3236 print
'</div><div class="fichehalfright">';
3240 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/comm/propal/agenda.php?id='.
$object->id);
3243 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3245 $somethingshown = $formactions->showactions(
$object,
'propal', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3247 print
'</div></div>';
3251 $modelmail =
'propal_send';
3252 $defaulttopic =
'SendPropalRef';
3253 $diroutput = $conf->propal->multidir_output[
$object->entity];
3254 $trackid =
'pro'.$object->id;
3256 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.