37require_once DOL_DOCUMENT_ROOT.
'/core/class/commonorder.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
40if (isModEnabled(
'productbatch')) {
41 require_once DOL_DOCUMENT_ROOT.
'/product/class/productbatch.class.php';
53 public $element =
'order_supplier';
58 public $table_element =
'commande_fournisseur';
63 public $table_element_line =
'commande_fournisseurdet';
68 public $fk_element =
'fk_commande';
73 public $picto =
'supplier_order';
79 public $ismultientitymanaged = 1;
85 public $restrictiononfksoc = 1;
106 public $ref_supplier;
133 public $statuts_short;
140 public $date_creation;
142 public $date_approve;
143 public $date_approve2;
144 public $date_commande;
150 public $date_livraison;
155 public $delivery_date;
159 public $total_localtax1;
160 public $total_localtax2;
169 public $cond_reglement_id;
170 public $cond_reglement_code;
171 public $cond_reglement_label;
172 public $cond_reglement_doc;
182 public $mode_reglement_id;
187 public $mode_reglement_code;
192 public $mode_reglement;
193 public $user_author_id;
194 public $user_valid_id;
195 public $user_approve_id;
196 public $user_approve_id2;
200 public $extraparams = array();
205 public $lines = array();
215 public $linked_objects = array();
221 public $fk_multicurrency;
223 public $multicurrency_code;
224 public $multicurrency_tx;
225 public $multicurrency_total_ht;
226 public $multicurrency_total_tva;
227 public $multicurrency_total_ttc;
258 'rowid' =>array(
'type'=>
'integer',
'label'=>
'TechnicalID',
'enabled'=>1,
'visible'=>0,
'notnull'=>1,
'position'=>10),
259 'ref' =>array(
'type'=>
'varchar(255)',
'label'=>
'Ref',
'enabled'=>1,
'visible'=>1,
'showoncombobox'=>1,
'position'=>25,
'searchall'=>1),
260 'ref_ext' =>array(
'type'=>
'varchar(255)',
'label'=>
'Ref ext',
'enabled'=>1,
'visible'=>0,
'position'=>35),
261 'ref_supplier' =>array(
'type'=>
'varchar(255)',
'label'=>
'RefOrderSupplierShort',
'enabled'=>1,
'visible'=>1,
'position'=>40,
'searchall'=>1),
262 'fk_projet' =>array(
'type'=>
'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)',
'label'=>
'Project',
'enabled'=>
"isModEnabled('project')",
'visible'=>-1,
'position'=>45),
263 'date_valid' =>array(
'type'=>
'datetime',
'label'=>
'DateValidation',
'enabled'=>1,
'visible'=>-1,
'position'=>710),
264 'date_approve' =>array(
'type'=>
'datetime',
'label'=>
'DateApprove',
'enabled'=>1,
'visible'=>-1,
'position'=>720),
265 'date_approve2' =>array(
'type'=>
'datetime',
'label'=>
'DateApprove2',
'enabled'=>1,
'visible'=>3,
'position'=>725),
266 'date_commande' =>array(
'type'=>
'date',
'label'=>
'OrderDateShort',
'enabled'=>1,
'visible'=>1,
'position'=>70),
267 'date_livraison' =>array(
'type'=>
'datetime',
'label'=>
'DeliveryDate',
'enabled'=>
'empty($conf->global->ORDER_DISABLE_DELIVERY_DATE)',
'visible'=>1,
'position'=>74),
268 'fk_user_author' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserAuthor',
'enabled'=>1,
'visible'=>3,
'position'=>41),
269 'fk_user_modif' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserModif',
'enabled'=>1,
'visible'=>3,
'notnull'=>-1,
'position'=>80),
270 'fk_user_valid' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserValidation',
'enabled'=>1,
'visible'=>3,
'position'=>711),
271 'fk_user_approve' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserApproval',
'enabled'=>1,
'visible'=>3,
'position'=>721),
272 'fk_user_approve2' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserApproval2',
'enabled'=>1,
'visible'=>3,
'position'=>726),
273 'source' =>array(
'type'=>
'smallint(6)',
'label'=>
'Source',
'enabled'=>1,
'visible'=>3,
'notnull'=>1,
'position'=>100),
274 'billed' =>array(
'type'=>
'smallint(6)',
'label'=>
'Billed',
'enabled'=>1,
'visible'=>1,
'position'=>710),
275 'total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'AmountHT',
'enabled'=>1,
'visible'=>1,
'position'=>130,
'isameasure'=>1),
276 'total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'AmountVAT',
'enabled'=>1,
'visible'=>1,
'position'=>135,
'isameasure'=>1),
277 'localtax1' =>array(
'type'=>
'double(24,8)',
'label'=>
'LT1',
'enabled'=>1,
'visible'=>3,
'position'=>140,
'isameasure'=>1),
278 'localtax2' =>array(
'type'=>
'double(24,8)',
'label'=>
'LT2',
'enabled'=>1,
'visible'=>3,
'position'=>145,
'isameasure'=>1),
279 'total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'AmountTTC',
'enabled'=>1,
'visible'=>-1,
'position'=>150,
'isameasure'=>1),
280 'note_public' =>array(
'type'=>
'html',
'label'=>
'NotePublic',
'enabled'=>1,
'visible'=>0,
'position'=>750,
'searchall'=>1),
281 'note_private' =>array(
'type'=>
'html',
'label'=>
'NotePrivate',
'enabled'=>1,
'visible'=>0,
'position'=>760,
'searchall'=>1),
282 'model_pdf' =>array(
'type'=>
'varchar(255)',
'label'=>
'ModelPDF',
'enabled'=>1,
'visible'=>0,
'position'=>165),
283 'fk_input_method' =>array(
'type'=>
'integer',
'label'=>
'OrderMode',
'enabled'=>1,
'visible'=>3,
'position'=>170),
284 'fk_cond_reglement' =>array(
'type'=>
'integer',
'label'=>
'PaymentTerm',
'enabled'=>1,
'visible'=>3,
'position'=>175),
285 'fk_mode_reglement' =>array(
'type'=>
'integer',
'label'=>
'PaymentMode',
'enabled'=>1,
'visible'=>3,
'position'=>180),
286 'extraparams' =>array(
'type'=>
'varchar(255)',
'label'=>
'Extraparams',
'enabled'=>1,
'visible'=>0,
'position'=>190),
287 'fk_account' =>array(
'type'=>
'integer',
'label'=>
'BankAccount',
'enabled'=>
'isModEnabled("banque")',
'visible'=>3,
'position'=>200),
288 'fk_incoterms' =>array(
'type'=>
'integer',
'label'=>
'IncotermCode',
'enabled'=>1,
'visible'=>3,
'position'=>205),
289 'location_incoterms' =>array(
'type'=>
'varchar(255)',
'label'=>
'IncotermLocation',
'enabled'=>1,
'visible'=>3,
'position'=>210),
290 'fk_multicurrency' =>array(
'type'=>
'integer',
'label'=>
'Fk multicurrency',
'enabled'=>1,
'visible'=>0,
'position'=>215),
291 'multicurrency_code' =>array(
'type'=>
'varchar(255)',
'label'=>
'Currency',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>220),
292 'multicurrency_tx' =>array(
'type'=>
'double(24,8)',
'label'=>
'CurrencyRate',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>225),
293 'multicurrency_total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyAmountHT',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>230),
294 'multicurrency_total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyAmountVAT',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>235),
295 'multicurrency_total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyAmountTTC',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>240),
296 'date_creation' =>array(
'type'=>
'datetime',
'label'=>
'Date creation',
'enabled'=>1,
'visible'=>-1,
'position'=>500),
297 'fk_soc' =>array(
'type'=>
'integer:Societe:societe/class/societe.class.php',
'label'=>
'ThirdParty',
'enabled'=>
'isModEnabled("societe")',
'visible'=>1,
'notnull'=>1,
'position'=>50),
298 'entity' =>array(
'type'=>
'integer',
'label'=>
'Entity',
'default'=>1,
'enabled'=>1,
'visible'=>0,
'notnull'=>1,
'position'=>1000,
'index'=>1),
299 'tms'=>array(
'type'=>
'datetime',
'label'=>
"DateModificationShort",
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>501),
300 'last_main_doc' =>array(
'type'=>
'varchar(255)',
'label'=>
'LastMainDoc',
'enabled'=>1,
'visible'=>0,
'position'=>700),
301 'fk_statut' =>array(
'type'=>
'smallint(6)',
'label'=>
'Status',
'enabled'=>1,
'visible'=>1,
'position'=>701),
302 'import_key' =>array(
'type'=>
'varchar(14)',
'label'=>
'ImportId',
'enabled'=>1,
'visible'=>0,
'position'=>900),
377 public function fetch($id, $ref =
'')
382 if (empty($id) && empty($ref)) {
386 $sql =
"SELECT c.rowid, c.entity, c.ref, ref_supplier, c.fk_soc, c.fk_statut, c.amount_ht, c.total_ht, c.total_ttc, c.total_tva,";
387 $sql .=
" c.localtax1, c.localtax2, ";
388 $sql .=
" c.date_creation, c.date_valid, c.date_approve, c.date_approve2,";
389 $sql .=
" c.fk_user_author, c.fk_user_valid, c.fk_user_approve, c.fk_user_approve2,";
390 $sql .=
" c.date_commande as date_commande, c.date_livraison as delivery_date, c.fk_cond_reglement, c.fk_mode_reglement, c.fk_projet as fk_project, c.remise_percent, c.source, c.fk_input_method,";
391 $sql .=
" c.fk_account,";
392 $sql .=
" c.note_private, c.note_public, c.model_pdf, c.extraparams, c.billed,";
393 $sql .=
" c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc,";
394 $sql .=
" cm.libelle as methode_commande,";
395 $sql .=
" cr.code as cond_reglement_code, cr.libelle as cond_reglement_label, cr.libelle_facture as cond_reglement_doc,";
396 $sql .=
" p.code as mode_reglement_code, p.libelle as mode_reglement_libelle";
397 $sql .=
', c.fk_incoterms, c.location_incoterms';
398 $sql .=
', i.libelle as label_incoterms';
399 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseur as c";
400 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_payment_term as cr ON c.fk_cond_reglement = cr.rowid";
401 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as p ON c.fk_mode_reglement = p.id";
402 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_input_method as cm ON cm.rowid = c.fk_input_method";
403 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON c.fk_incoterms = i.rowid';
406 $sql .=
" WHERE c.entity IN (".getEntity(
'supplier_order').
")";
408 $sql .=
" WHERE c.rowid=".((int) $id);
412 $sql .=
" AND c.ref='".$this->db->escape($ref).
"'";
415 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
416 $resql = $this->db->query($sql);
418 $obj = $this->db->fetch_object($resql);
420 $this->error =
'Bill with id '.$id.
' not found';
421 dol_syslog(get_class($this).
'::fetch '.$this->error);
425 $this->
id = $obj->rowid;
426 $this->entity = $obj->entity;
428 $this->
ref = $obj->ref;
429 $this->ref_supplier = $obj->ref_supplier;
431 $this->socid = $obj->fk_soc;
432 $this->thirdparty =
null;
434 $this->fourn_id = $obj->fk_soc;
435 $this->
statut = $obj->fk_statut;
436 $this->status = $obj->fk_statut;
437 $this->billed = $obj->billed;
438 $this->user_author_id = $obj->fk_user_author;
439 $this->user_valid_id = $obj->fk_user_valid;
440 $this->user_approve_id = $obj->fk_user_approve;
441 $this->user_approve_id2 = $obj->fk_user_approve2;
442 $this->total_ht = $obj->total_ht;
443 $this->total_tva = $obj->total_tva;
444 $this->total_localtax1 = $obj->localtax1;
445 $this->total_localtax2 = $obj->localtax2;
446 $this->total_ttc = $obj->total_ttc;
447 $this->date_creation = $this->db->jdate($obj->date_creation);
448 $this->date_valid = $this->db->jdate($obj->date_valid);
449 $this->date_approve = $this->db->jdate($obj->date_approve);
450 $this->date_approve2 = $this->db->jdate($obj->date_approve2);
451 $this->date_commande = $this->db->jdate($obj->date_commande);
452 if (isset($obj->date_commande)) {
453 $this->date = $this->date_commande;
455 $this->date = $this->date_creation;
457 $this->date_livraison = $this->db->jdate($obj->delivery_date);
458 $this->delivery_date = $this->db->jdate($obj->delivery_date);
459 $this->remise_percent = $obj->remise_percent;
460 $this->methode_commande_id = $obj->fk_input_method;
461 $this->methode_commande = $obj->methode_commande;
463 $this->source = $obj->source;
464 $this->fk_project = $obj->fk_project;
465 $this->cond_reglement_id = $obj->fk_cond_reglement;
466 $this->cond_reglement_code = $obj->cond_reglement_code;
467 $this->cond_reglement = $obj->cond_reglement_label;
468 $this->cond_reglement_label = $obj->cond_reglement_label;
469 $this->cond_reglement_doc = $obj->cond_reglement_doc;
470 $this->fk_account = $obj->fk_account;
471 $this->mode_reglement_id = $obj->fk_mode_reglement;
472 $this->mode_reglement_code = $obj->mode_reglement_code;
473 $this->mode_reglement = $obj->mode_reglement_libelle;
474 $this->note = $obj->note_private;
475 $this->note_private = $obj->note_private;
476 $this->note_public = $obj->note_public;
477 $this->model_pdf = $obj->model_pdf;
478 $this->modelpdf = $obj->model_pdf;
481 $this->fk_incoterms = $obj->fk_incoterms;
482 $this->location_incoterms = $obj->location_incoterms;
483 $this->label_incoterms = $obj->label_incoterms;
486 $this->fk_multicurrency = $obj->fk_multicurrency;
487 $this->multicurrency_code = $obj->multicurrency_code;
488 $this->multicurrency_tx = $obj->multicurrency_tx;
489 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
490 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
491 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
493 $this->extraparams = isset($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
495 $this->db->free($resql);
502 $this->brouillon = 1;
516 $this->error = $this->db->error().
" sql=".$sql;
533 $this->lines = array();
535 $sql =
"SELECT l.rowid, l.fk_commande, l.ref as ref_supplier, l.fk_product, l.product_type, l.label, l.description, l.qty,";
536 $sql .=
" l.vat_src_code, l.tva_tx, l.remise_percent, l.subprice,";
537 $sql .=
" l.localtax1_tx, l. localtax2_tx, l.localtax1_type, l. localtax2_type, l.total_localtax1, l.total_localtax2,";
538 $sql .=
" l.total_ht, l.total_tva, l.total_ttc, l.info_bits, l.special_code, l.fk_parent_line, l.rang,";
539 $sql .=
" p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.description as product_desc, p.tobatch as product_tobatch, p.barcode as product_barcode,";
540 $sql .=
" l.fk_unit,";
541 $sql .=
" l.date_start, l.date_end,";
542 $sql .=
' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc';
543 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseurdet as l";
544 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON l.fk_product = p.rowid';
545 $sql .=
" WHERE l.fk_commande = ".((int) $this->
id);
547 $sql .=
' AND p.fk_product_type = 0';
549 $sql .=
" ORDER BY l.rang, l.rowid";
552 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
554 $result = $this->db->query($sql);
556 $num = $this->db->num_rows($result);
560 $objp = $this->db->fetch_object($result);
564 $line->id = $objp->rowid;
565 $line->fk_commande = $objp->fk_commande;
566 $line->desc = $objp->description;
567 $line->description = $objp->description;
568 $line->qty = $objp->qty;
569 $line->tva_tx = $objp->tva_tx;
570 $line->localtax1_tx = $objp->localtax1_tx;
571 $line->localtax2_tx = $objp->localtax2_tx;
572 $line->localtax1_type = $objp->localtax1_type;
573 $line->localtax2_type = $objp->localtax2_type;
574 $line->subprice = $objp->subprice;
575 $line->pu_ht = $objp->subprice;
576 $line->remise_percent = $objp->remise_percent;
578 $line->vat_src_code = $objp->vat_src_code;
579 $line->total_ht = $objp->total_ht;
580 $line->total_tva = $objp->total_tva;
581 $line->total_localtax1 = $objp->total_localtax1;
582 $line->total_localtax2 = $objp->total_localtax2;
583 $line->total_ttc = $objp->total_ttc;
584 $line->product_type = $objp->product_type;
586 $line->fk_product = $objp->fk_product;
588 $line->libelle = $objp->product_label;
589 $line->product_label = $objp->product_label;
590 $line->product_desc = $objp->product_desc;
591 $line->product_tobatch = $objp->product_tobatch;
592 $line->product_barcode = $objp->product_barcode;
594 $line->ref = $objp->product_ref;
595 $line->product_ref = $objp->product_ref;
596 $line->ref_fourn = $objp->ref_supplier;
597 $line->ref_supplier = $objp->ref_supplier;
599 if (!empty($conf->global->PRODUCT_USE_SUPPLIER_PACKAGING)) {
604 $sqlsearchpackage =
'SELECT rowid, packaging FROM '.MAIN_DB_PREFIX.
"product_fournisseur_price";
605 $sqlsearchpackage .=
' WHERE entity IN ('.getEntity(
'product_fournisseur_price').
")";
606 $sqlsearchpackage .=
" AND fk_product = ".((int) $objp->fk_product);
607 $sqlsearchpackage .=
" AND ref_fourn = '".$this->db->escape($objp->ref_supplier).
"'";
608 $sqlsearchpackage .=
" AND quantity <= ".((float) $objp->qty);
609 $sqlsearchpackage .=
" AND (packaging IS NULL OR packaging = 0 OR packaging <= ".((float) $objp->qty).
")";
610 $sqlsearchpackage .=
" AND fk_soc = ".((int) $this->socid);
611 $sqlsearchpackage .=
" ORDER BY packaging ASC";
612 $sqlsearchpackage .=
" LIMIT 1";
614 $resqlsearchpackage = $this->db->query($sqlsearchpackage);
615 if ($resqlsearchpackage) {
616 $objsearchpackage = $this->db->fetch_object($resqlsearchpackage);
617 if ($objsearchpackage) {
618 $line->fk_fournprice = $objsearchpackage->rowid;
619 $line->packaging = $objsearchpackage->packaging;
622 $this->error = $this->db->lasterror();
627 $line->date_start = $this->db->jdate($objp->date_start);
628 $line->date_end = $this->db->jdate($objp->date_end);
629 $line->fk_unit = $objp->fk_unit;
632 $line->fk_multicurrency = $objp->fk_multicurrency;
633 $line->multicurrency_code = $objp->multicurrency_code;
634 $line->multicurrency_subprice = $objp->multicurrency_subprice;
635 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
636 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
637 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
639 $line->info_bits = $objp->info_bits;
640 $line->special_code = $objp->special_code;
641 $line->fk_parent_line = $objp->fk_parent_line;
643 $line->rang = $objp->rang;
647 $line->fetch_optionals();
649 $this->lines[$i] = $line;
653 $this->db->free($result);
657 $this->error = $this->db->error().
" sql=".$sql;
670 public function valid($user, $idwarehouse = 0, $notrigger = 0)
672 global $langs, $conf;
673 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
679 if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ($user->hasRight(
"fournisseur",
"commande",
"creer") || $user->hasRight(
"supplier_order",
"creer")))
680 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $user->hasRight(
"fournisseur",
"supplier_order_advance",
"validate"))) {
685 $soc->fetch($this->fourn_id);
688 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
695 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"commande_fournisseur";
696 $sql .=
" SET ref='".$this->db->escape($num).
"',";
697 $sql .=
" fk_statut = ".self::STATUS_VALIDATED.
",";
698 $sql .=
" date_valid='".$this->db->idate(
dol_now()).
"',";
699 $sql .=
" fk_user_valid = ".((int) $user->id);
700 $sql .=
" WHERE rowid = ".((int) $this->
id);
701 $sql .=
" AND fk_statut = ".self::STATUS_DRAFT;
703 $resql = $this->db->query($sql);
709 if (!$error && !$notrigger) {
711 $result = $this->
call_trigger(
'ORDER_SUPPLIER_VALIDATE', $user);
719 $this->oldref = $this->ref;
722 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
724 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'fournisseur/commande/".$this->db->escape($this->newref).
"'";
725 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'fournisseur/commande/".$this->db->escape($this->
ref).
"' and entity = ".((int) $conf->entity);
726 $resql = $this->db->query($sql);
728 $error++; $this->error = $this->db->lasterror();
730 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'fournisseur/commande/".$this->db->escape($this->newref).
"'";
731 $sql .=
" WHERE filepath = 'fournisseur/commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
732 $resql = $this->db->query($sql);
734 $error++; $this->error = $this->db->lasterror();
740 $dirsource = $conf->fournisseur->commande->dir_output.
'/'.$oldref;
741 $dirdest = $conf->fournisseur->commande->dir_output.
'/'.$newref;
742 if (!$error && file_exists($dirsource)) {
743 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
745 if (@rename($dirsource, $dirdest)) {
748 $listoffiles =
dol_dir_list($conf->fournisseur->commande->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
749 foreach ($listoffiles as $fileentry) {
750 $dirsource = $fileentry[
'name'];
751 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
752 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
753 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
754 @rename($dirsource, $dirdest);
771 $this->db->rollback();
775 $this->error =
'NotAuthorized';
776 dol_syslog(get_class($this).
"::valid ".$this->error, LOG_ERR);
801 public function LibStatut($status, $mode = 0, $billed = 0)
804 global $conf, $langs, $hookmanager;
806 if (empty($this->statuts) || empty($this->statuts_short)) {
807 $langs->load(
'orders');
809 $this->statuts[0] =
'StatusSupplierOrderDraft';
810 $this->statuts[1] =
'StatusSupplierOrderValidated';
811 $this->statuts[2] =
'StatusSupplierOrderApproved';
812 if (empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) {
813 $this->statuts[3] =
'StatusSupplierOrderOnProcess';
815 $this->statuts[3] =
'StatusSupplierOrderOnProcessWithValidation';
817 $this->statuts[4] =
'StatusSupplierOrderReceivedPartially';
818 $this->statuts[5] =
'StatusSupplierOrderReceivedAll';
819 $this->statuts[6] =
'StatusSupplierOrderCanceled';
820 $this->statuts[7] =
'StatusSupplierOrderCanceled';
821 $this->statuts[9] =
'StatusSupplierOrderRefused';
824 $this->statuts_short[0] =
'StatusSupplierOrderDraftShort';
825 $this->statuts_short[1] =
'StatusSupplierOrderValidatedShort';
826 $this->statuts_short[2] =
'StatusSupplierOrderApprovedShort';
827 $this->statuts_short[3] =
'StatusSupplierOrderOnProcessShort';
828 $this->statuts_short[4] =
'StatusSupplierOrderReceivedPartiallyShort';
829 $this->statuts_short[5] =
'StatusSupplierOrderReceivedAllShort';
830 $this->statuts_short[6] =
'StatusSupplierOrderCanceledShort';
831 $this->statuts_short[7] =
'StatusSupplierOrderCanceledShort';
832 $this->statuts_short[9] =
'StatusSupplierOrderRefusedShort';
835 $statustrans = array(
847 $statusClass =
'status0';
848 if (!empty($statustrans[$status])) {
849 $statusClass = $statustrans[$status];
854 $billedtext =
' - '.$langs->trans(
"Billed");
856 if ($status == 5 && $billed) {
857 $statusClass =
'status6';
860 $statusLong = $langs->transnoentitiesnoconv($this->statuts[$status]).$billedtext;
861 $statusShort = $langs->transnoentitiesnoconv($this->statuts_short[$status]);
863 $parameters = array(
'status' => $status,
'mode' => $mode,
'billed' => $billed);
864 $reshook = $hookmanager->executeHooks(
'LibStatut', $parameters, $this);
866 return $hookmanager->resPrint;
869 return dolGetStatus($statusLong, $statusShort,
'', $statusClass, $mode);
881 global $conf, $langs, $user;
883 $langs->loadLangs([
'bills',
'orders']);
886 $nofetch = !empty($params[
'nofetch']);
888 if ($user->hasRight(
"fournisseur",
"commande",
"read")) {
889 $datas[
'picto'] =
'<u class="paddingrightonly">'.$langs->trans(
"SupplierOrder").
'</u>';
890 if (isset($this->
statut)) {
891 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
893 if (!empty($this->
ref)) {
894 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
896 if (!empty($this->ref_supplier)) {
897 $datas[
'refsupplier'] =
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_supplier;
900 $langs->load(
'companies');
901 if (empty($this->thirdparty)) {
904 $datas[
'supplier'] =
'<br><b>'.$langs->trans(
'Supplier').
':</b> '.$this->thirdparty->getNomUrl(1,
'', 0, 1);
906 if (!empty($this->total_ht)) {
907 $datas[
'totalht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
909 if (!empty($this->total_tva)) {
910 $datas[
'totaltva'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
912 if (!empty($this->total_ttc)) {
913 $datas[
'totalttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
915 if (!empty($this->date)) {
916 $datas[
'date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->date,
'day');
918 if (!empty($this->delivery_date)) {
919 $datas[
'deliverydate'] =
'<br><b>'.$langs->trans(
'DeliveryDate').
':</b> '.
dol_print_date($this->delivery_date,
'dayhour');
935 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
937 global $langs, $conf, $user, $hookmanager;
942 'objecttype' => $this->element,
946 $classfortooltip =
'classfortooltip';
949 $classfortooltip =
'classforajaxtooltip';
950 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
956 $url = DOL_URL_ROOT.
'/fourn/commande/card.php?id='.$this->id;
958 if ($option !==
'nolink') {
960 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
961 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
962 $add_save_lastsearch_values = 1;
964 if ($add_save_lastsearch_values) {
965 $url .=
'&save_lastsearch_values=1';
970 if (empty($notooltip)) {
971 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
972 $label = $langs->trans(
"ShowOrder");
973 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
975 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
976 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
979 $linkstart =
'<a href="'.$url.
'"';
980 $linkstart .= $linkclose.
'>';
983 $result .= $linkstart;
985 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
987 if ($withpicto != 2) {
988 $result .= $this->ref;
992 if ($addlinktonotes) {
993 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
996 $result .=
' <span class="note inline-block">';
997 $result .=
'<a href="'.DOL_URL_ROOT.
'/fourn/commande/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
1002 $result .=
'</span>';
1007 $hookmanager->initHooks(array($this->element .
'dao'));
1008 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
1009 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1011 $result = $hookmanager->resPrint;
1013 $result .= $hookmanager->resPrint;
1028 global $db, $langs, $conf;
1029 $langs->load(
"orders");
1031 if (!empty($conf->global->COMMANDE_SUPPLIER_ADDON_NUMBER)) {
1038 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
1040 foreach ($dirmodels as $reldir) {
1041 $dir =
dol_buildpath($reldir.
"core/modules/supplier_order/");
1044 $mybool |= @include_once $dir.$file;
1047 if ($mybool ===
false) {
1052 $obj =
new $classname();
1053 $numref = $obj->getNextValue($soc, $this);
1055 if ($numref !=
"") {
1058 $this->error = $obj->error;
1062 $this->error =
"Error_COMMANDE_SUPPLIER_ADDON_NotDefined";
1076 if ($this->billed) {
1082 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande_fournisseur SET billed = 1';
1085 if ($this->db->query($sql)) {
1088 $result = $this->
call_trigger(
'ORDER_SUPPLIER_CLASSIFY_BILLED', $user);
1098 $this->db->commit();
1101 $this->db->rollback();
1107 $this->db->rollback();
1120 public function approve($user, $idwarehouse = 0, $secondlevel = 0)
1122 global $langs, $conf;
1123 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1129 if ($user->hasRight(
"fournisseur",
"commande",
"approuver")) {
1135 $soc =
new Societe($this->db);
1136 $soc->fetch($this->fourn_id);
1139 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1147 $movetoapprovestatus =
true;
1150 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande_fournisseur";
1151 $sql .=
" SET ref='".$this->db->escape($num).
"',";
1152 if (empty($secondlevel)) {
1153 $sql .=
" date_approve='".$this->db->idate($now).
"',";
1154 $sql .=
" fk_user_approve = ".$user->id;
1155 if (!empty($conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED) && $this->total_ht >= $conf->global->SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED) {
1156 if (empty($this->user_approve_id2)) {
1157 $movetoapprovestatus =
false;
1158 $comment =
' (first level)';
1163 $sql .=
" date_approve2='".$this->db->idate($now).
"',";
1164 $sql .=
" fk_user_approve2 = ".((int) $user->id);
1165 if (empty($this->user_approve_id)) {
1166 $movetoapprovestatus =
false;
1168 $comment =
' (second level)';
1171 if ($movetoapprovestatus) {
1172 $sql .=
", fk_statut = ".self::STATUS_ACCEPTED;
1174 $sql .=
", fk_statut = ".self::STATUS_VALIDATED;
1176 $sql .=
" WHERE rowid = ".((int) $this->
id);
1177 $sql .=
" AND fk_statut = ".self::STATUS_VALIDATED;
1179 if ($this->db->query($sql)) {
1180 if (!empty($conf->global->SUPPLIER_ORDER_AUTOADD_USER_CONTACT)) {
1181 $result = $this->
add_contact($user->id,
'SALESREPFOLL',
'internal', 1);
1182 if ($result < 0 && $result != -2) {
1188 if (!$error && $movetoapprovestatus && isModEnabled(
'stock') && !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER)) {
1189 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
1190 $langs->load(
"agenda");
1192 $cpt = count($this->lines);
1193 for ($i = 0; $i < $cpt; $i++) {
1195 if ($this->lines[$i]->fk_product > 0) {
1196 $this->line = $this->lines[$i];
1198 $mouvP->origin = &$this;
1199 $mouvP->setOrigin($this->element, $this->
id);
1201 $up_ht_disc = $this->lines[$i]->subprice;
1202 if (!empty($this->lines[$i]->remise_percent) && empty($conf->global->STOCK_EXCLUDE_DISCOUNT_FOR_PMP)) {
1203 $up_ht_disc =
price2num($up_ht_disc * (100 - $this->lines[$i]->remise_percent) / 100,
'MU');
1205 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans(
"OrderApprovedInDolibarr", $this->ref));
1216 $result = $this->
call_trigger(
'ORDER_SUPPLIER_APPROVE', $user);
1224 $this->
ref = $this->newref;
1226 if ($movetoapprovestatus) {
1231 if (empty($secondlevel)) {
1232 $this->date_approve = $now;
1233 $this->user_approve_id = $user->id;
1236 $this->date_approve2 = $now;
1237 $this->user_approve_id2 = $user->id;
1240 $this->db->commit();
1243 $this->db->rollback();
1247 $this->db->rollback();
1248 $this->error = $this->db->lasterror();
1252 dol_syslog(get_class($this).
"::approve Not Authorized", LOG_ERR);
1265 global $conf, $langs;
1271 if ($user->hasRight(
"fournisseur",
"commande",
"approuver")) {
1275 $sql .=
" WHERE rowid = ".((int) $this->
id);
1277 if ($this->db->query($sql)) {
1282 $result = $this->
call_trigger(
'ORDER_SUPPLIER_REFUSE', $user);
1285 $this->db->rollback();
1287 $this->db->commit();
1292 $this->db->rollback();
1293 $this->error = $this->db->lasterror();
1294 dol_syslog(get_class($this).
"::refuse Error -1");
1298 dol_syslog(get_class($this).
"::refuse Not Authorized");
1312 public function Cancel($user, $idwarehouse = -1)
1315 global $langs, $conf;
1321 if ($user->hasRight(
"fournisseur",
"commande",
"commander")) {
1326 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande_fournisseur SET fk_statut = ".((int) $statut);
1327 $sql .=
" WHERE rowid = ".((int) $this->
id);
1328 dol_syslog(get_class($this).
"::cancel", LOG_DEBUG);
1329 if ($this->db->query($sql)) {
1333 $result = $this->
call_trigger(
'ORDER_SUPPLIER_CANCEL', $user);
1340 $this->db->commit();
1343 $this->db->rollback();
1347 $this->db->rollback();
1348 $this->error = $this->db->lasterror();
1349 dol_syslog(get_class($this).
"::cancel ".$this->error);
1353 dol_syslog(get_class($this).
"::cancel Not Authorized");
1367 public function commande($user, $date, $methode, $comment =
'')
1372 if ($user->hasRight(
"fournisseur",
"commande",
"commander")) {
1375 $newnoteprivate = $this->note_private;
1377 $newnoteprivate =
dol_concatdesc($newnoteprivate, $langs->trans(
"Comment").
': '.$comment);
1380 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande_fournisseur";
1381 $sql .=
" SET fk_statut=".self::STATUS_ORDERSENT.
", fk_input_method=".$methode.
", date_commande='".$this->db->idate($date).
"', ";
1382 $sql .=
" note_private='".$this->db->escape($newnoteprivate).
"'";
1383 $sql .=
" WHERE rowid=".((int) $this->
id);
1385 dol_syslog(get_class($this).
"::commande", LOG_DEBUG);
1386 if ($this->db->query($sql)) {
1388 $this->methode_commande_id = $methode;
1389 $this->date_commande = $date;
1390 $this->context = array(
'comments' => $comment);
1393 $result = $this->
call_trigger(
'ORDER_SUPPLIER_SUBMIT', $user);
1400 $this->error = $this->db->lasterror();
1401 $this->errors[] = $this->db->lasterror();
1405 $this->db->commit();
1407 $this->db->rollback();
1411 $this->error = $langs->trans(
'NotAuthorized');
1412 $this->errors[] = $langs->trans(
'NotAuthorized');
1413 dol_syslog(get_class($this).
"::commande User not Authorized", LOG_WARNING);
1416 return ($error ? -1 : 1);
1426 public function create($user, $notrigger = 0)
1428 global $langs, $conf, $hookmanager;
1436 $date = ($this->date_commande ? $this->date_commande : $this->date);
1440 $delivery_date = empty($this->delivery_date) ? $this->date_livraison : $this->delivery_date;
1443 if (empty($this->source)) {
1448 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
1453 if (empty($this->fk_multicurrency)) {
1454 $this->multicurrency_code = $conf->currency;
1455 $this->fk_multicurrency = 0;
1456 $this->multicurrency_tx = 1;
1460 $this->brouillon = 1;
1464 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"commande_fournisseur (";
1466 $sql .=
", ref_supplier";
1467 $sql .=
", note_private";
1468 $sql .=
", note_public";
1471 $sql .=
", fk_projet";
1472 $sql .=
", date_creation";
1473 $sql .=
", date_livraison";
1474 $sql .=
", fk_user_author";
1475 $sql .=
", fk_statut";
1477 $sql .=
", model_pdf";
1478 $sql .=
", fk_mode_reglement";
1479 $sql .=
", fk_cond_reglement";
1480 $sql .=
", fk_account";
1481 $sql .=
", fk_incoterms, location_incoterms";
1482 $sql .=
", fk_multicurrency";
1483 $sql .=
", multicurrency_code";
1484 $sql .=
", multicurrency_tx";
1486 $sql .=
" VALUES (";
1488 $sql .=
", '".$this->db->escape($this->ref_supplier).
"'";
1489 $sql .=
", '".$this->db->escape($this->note_private).
"'";
1490 $sql .=
", '".$this->db->escape($this->note_public).
"'";
1491 $sql .=
", ".setEntity($this);
1492 $sql .=
", ".((int) $this->socid);
1493 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
1494 $sql .=
", '".$this->db->idate($date).
"'";
1495 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
1496 $sql .=
", ".((int) $user->id);
1497 $sql .=
", ".self::STATUS_DRAFT;
1498 $sql .=
", ".((int) $this->source);
1499 $sql .=
", '".$this->db->escape(
getDolGlobalString(
'COMMANDE_SUPPLIER_ADDON_PDF')).
"'";
1500 $sql .=
", ".($this->mode_reglement_id > 0 ? $this->mode_reglement_id :
'null');
1501 $sql .=
", ".($this->cond_reglement_id > 0 ? $this->cond_reglement_id :
'null');
1502 $sql .=
", ".($this->fk_account > 0 ? $this->fk_account :
'NULL');
1503 $sql .=
", ".(int) $this->fk_incoterms;
1504 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
1505 $sql .=
", ".(int) $this->fk_multicurrency;
1506 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
1507 $sql .=
", ".(double) $this->multicurrency_tx;
1510 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1511 if ($this->db->query($sql)) {
1512 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"commande_fournisseur");
1515 $num = count($this->lines);
1518 for ($i = 0; $i < $num; $i++) {
1519 $line = $this->lines[$i];
1520 if (!is_object($line)) {
1521 $line = (object) $line;
1533 $line->localtax1_tx,
1534 $line->localtax2_tx,
1538 $line->remise_percent,
1541 $line->product_type,
1546 $line->array_options,
1548 $line->multicurrency_subprice,
1555 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
1556 $this->db->rollback();
1561 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande_fournisseur";
1562 $sql .=
" SET ref='(PROV".$this->id.
")'";
1563 $sql .=
" WHERE rowid=".((int) $this->
id);
1564 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1565 if ($this->db->query($sql)) {
1568 $this->
ref =
"(PROV".$this->id.
")";
1570 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1571 $this->linked_objects = $this->linkedObjectsIds;
1575 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
1576 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1577 if (is_array($tmp_origin_id)) {
1578 foreach ($tmp_origin_id as $origin_id) {
1587 $origin_id = $tmp_origin_id;
1605 if (!$error && !$notrigger) {
1607 $result = $this->
call_trigger(
'ORDER_SUPPLIER_CREATE', $user);
1609 $this->db->rollback();
1617 $this->db->commit();
1620 $this->db->rollback();
1624 $this->error = $this->db->lasterror();
1625 $this->db->rollback();
1630 $this->error =
'Failed to get ID of inserted line';
1635 $this->error = $this->db->lasterror();
1636 $this->db->rollback();
1656 if (isset($this->
ref)) {
1657 $this->
ref = trim($this->
ref);
1659 if (isset($this->ref_supplier)) {
1660 $this->ref_supplier = trim($this->ref_supplier);
1662 if (isset($this->note_private)) {
1663 $this->note_private = trim($this->note_private);
1665 if (isset($this->note_public)) {
1666 $this->note_public = trim($this->note_public);
1668 if (isset($this->model_pdf)) {
1669 $this->model_pdf = trim($this->model_pdf);
1671 if (isset($this->import_key)) {
1672 $this->import_key = trim($this->import_key);
1676 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element.
" SET";
1678 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
1679 $sql .=
" ref_supplier=".(isset($this->ref_supplier) ?
"'".$this->db->escape($this->ref_supplier).
"'" :
"null").
",";
1680 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
1681 $sql .=
" fk_soc=".(isset($this->socid) ? $this->socid :
"null").
",";
1682 $sql .=
" date_commande=".(strval($this->date_commande) !=
'' ?
"'".$this->db->idate($this->date_commande).
"'" :
'null').
",";
1683 $sql .=
" date_valid=".(strval($this->date_validation) !=
'' ?
"'".$this->db->idate($this->date_validation).
"'" :
'null').
",";
1684 $sql .=
" total_tva=".(isset($this->total_tva) ? $this->total_tva :
"null").
",";
1685 $sql .=
" localtax1=".(isset($this->total_localtax1) ? $this->total_localtax1 :
"null").
",";
1686 $sql .=
" localtax2=".(isset($this->total_localtax2) ? $this->total_localtax2 :
"null").
",";
1687 $sql .=
" total_ht=".(isset($this->total_ht) ? $this->total_ht :
"null").
",";
1688 $sql .=
" total_ttc=".(isset($this->total_ttc) ? $this->total_ttc :
"null").
",";
1689 $sql .=
" fk_statut=".(isset($this->
statut) ? $this->
statut :
"null").
",";
1690 $sql .=
" fk_user_author=".(isset($this->user_author_id) ? $this->user_author_id :
"null").
",";
1691 $sql .=
" fk_user_valid=".(isset($this->user_valid) && $this->user_valid > 0 ? $this->user_valid :
"null").
",";
1692 $sql .=
" fk_projet=".(isset($this->fk_project) ? $this->fk_project :
"null").
",";
1693 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? $this->cond_reglement_id :
"null").
",";
1694 $sql .=
" fk_mode_reglement=".(isset($this->mode_reglement_id) ? $this->mode_reglement_id :
"null").
",";
1695 $sql .=
" date_livraison=".(strval($this->delivery_date) !=
'' ?
"'".$this->db->idate($this->delivery_date).
"'" :
'null').
",";
1697 $sql .=
" fk_account=".($this->fk_account > 0 ? $this->fk_account :
"null").
",";
1699 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
1700 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
1701 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
1702 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null");
1704 $sql .=
" WHERE rowid=".((int) $this->
id);
1708 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
1709 $resql = $this->db->query($sql);
1712 $this->errors[] =
"Error ".$this->db->lasterror();
1722 if (!$error && !$notrigger) {
1724 $result = $this->
call_trigger(
'ORDER_SUPPLIER_MODIFY', $user);
1733 foreach ($this->errors as $errmsg) {
1734 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1735 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1737 $this->db->rollback();
1740 $this->db->commit();
1755 global $conf, $user, $hookmanager;
1762 foreach ($this->lines as $line) {
1763 $line->fetch_optionals();
1767 $objFrom = clone $this;
1770 if (!empty($socid) && $socid != $this->socid) {
1771 $objsoc =
new Societe($this->db);
1773 if ($objsoc->fetch($socid) > 0) {
1774 $this->socid = $objsoc->id;
1775 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1776 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1777 $this->fk_project = 0;
1778 $this->fk_delivery_address = 0;
1788 $this->user_author_id = $user->id;
1789 $this->user_valid = 0;
1790 $this->date_creation =
'';
1791 $this->date_validation =
'';
1792 $this->ref_supplier =
'';
1793 $this->user_approve_id =
'';
1794 $this->user_approve_id2 =
'';
1795 $this->date_approve =
'';
1796 $this->date_approve2 =
'';
1799 $this->context[
'createfromclone'] =
'createfromclone';
1800 $result = $this->
create($user, $notrigger);
1807 if (is_object($hookmanager)) {
1808 $parameters = array(
'objFrom'=>$objFrom);
1810 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1818 unset($this->context[
'createfromclone']);
1822 $this->db->commit();
1825 $this->db->rollback();
1859 public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0.0, $txlocaltax2 = 0.0, $fk_product = 0, $fk_prod_fourn_price = 0, $ref_supplier =
'', $remise_percent = 0.0, $price_base_type =
'HT', $pu_ttc = 0.0, $type = 0, $info_bits = 0, $notrigger =
false, $date_start =
null, $date_end =
null, $array_options = 0, $fk_unit =
null, $pu_ht_devise = 0, $origin =
'', $origin_id = 0, $rang = -1, $special_code = 0)
1861 global $langs, $mysoc, $conf;
1863 dol_syslog(get_class($this).
"::addline $desc, $pu_ht, $qty, $txtva, $txlocaltax1, $txlocaltax2, $fk_product, $fk_prod_fourn_price, $ref_supplier, $remise_percent, $price_base_type, $pu_ttc, $type, $info_bits, $notrigger, $date_start, $date_end, $fk_unit, $pu_ht_devise, $origin, $origin_id");
1864 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1866 if ($this->
statut == self::STATUS_DRAFT) {
1867 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1876 if (empty($txtva)) {
1882 if (empty($txlocaltax1)) {
1885 if (empty($txlocaltax2)) {
1888 if (empty($remise_percent)) {
1889 $remise_percent = 0;
1892 $remise_percent =
price2num($remise_percent);
1895 $pu_ht_devise =
price2num($pu_ht_devise);
1897 if (!preg_match(
'/\((.*)\)/', $txtva)) {
1902 if ($price_base_type ==
'HT') {
1907 $desc = trim($desc);
1910 if ($qty < 0 && !$fk_product) {
1911 $this->error = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product"));
1917 if ($date_start && $date_end && $date_start > $date_end) {
1918 $langs->load(
"errors");
1919 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
1926 $product_type = $type;
1929 if ($fk_product > 0) {
1930 if (!empty($conf->global->SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY)) {
1932 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" fk_prod_fourn_price=".$fk_prod_fourn_price.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
1934 if ($prod->fetch($fk_product) > 0) {
1935 $product_type = $prod->type;
1936 $label = $prod->label;
1940 $result = $prod->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', (isset($this->fk_soc) ? $this->fk_soc : $this->socid));
1944 if ($result > 0 && ($origin ==
'commande' || $pu ===
'')) {
1945 $pu = $prod->fourn_pu;
1946 $ref_supplier = $prod->ref_supplier;
1948 if ($remise_percent == 0 && $prod->remise_percent != 0) {
1949 $remise_percent = $prod->remise_percent;
1953 $langs->load(
"errors");
1954 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
1955 $this->db->rollback();
1956 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
1961 if ($result == -1) {
1962 $langs->load(
"errors");
1963 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
1964 $this->db->rollback();
1965 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
1969 $this->error = $prod->error;
1970 $this->db->rollback();
1971 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
1975 $this->error = $prod->error;
1976 $this->db->rollback();
1982 if (!empty($conf->global->PRODUCT_USE_SUPPLIER_PACKAGING)) {
1983 $prod =
new Product($this->db);
1984 $prod->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', (empty($this->fk_soc) ? $this->socid : $this->fk_soc));
1986 if ($qty < $prod->packaging) {
1987 $qty = $prod->packaging;
1989 if (!empty($prod->packaging) && ($qty % $prod->packaging) > 0) {
1990 $coeff = intval($qty / $prod->packaging) + 1;
1991 $qty = $prod->packaging * $coeff;
1992 setEventMessages($langs->trans(
'QtyRecalculatedWithPackaging'),
null,
'mesgs');
1998 if (isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
2007 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
2008 $vat_src_code = $reg[1];
2009 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
2017 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $product_type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
2019 $total_ht = $tabprice[0];
2020 $total_tva = $tabprice[1];
2021 $total_ttc = $tabprice[2];
2022 $total_localtax1 = $tabprice[9];
2023 $total_localtax2 = $tabprice[10];
2024 $pu = $pu_ht = $tabprice[3];
2027 $multicurrency_total_ht = $tabprice[16];
2028 $multicurrency_total_tva = $tabprice[17];
2029 $multicurrency_total_ttc = $tabprice[18];
2030 $pu_ht_devise = $tabprice[19];
2032 $localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
2033 $localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
2037 $rang = $rangmax + 1;
2043 $this->line->context = $this->context;
2045 $this->line->fk_commande = $this->id;
2046 $this->line->label = $label;
2047 $this->line->ref_fourn = $ref_supplier;
2048 $this->line->ref_supplier = $ref_supplier;
2049 $this->line->desc = $desc;
2050 $this->line->qty = $qty;
2051 $this->line->tva_tx = $txtva;
2052 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
2053 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
2054 $this->line->localtax1_type = $localtax1_type;
2055 $this->line->localtax2_type = $localtax2_type;
2056 $this->line->fk_product = $fk_product;
2057 $this->line->product_type = $product_type;
2058 $this->line->remise_percent = $remise_percent;
2059 $this->line->subprice = $pu_ht;
2060 $this->line->rang = $rang;
2061 $this->line->info_bits = $info_bits;
2063 $this->line->vat_src_code = $vat_src_code;
2064 $this->line->total_ht = $total_ht;
2065 $this->line->total_tva = $total_tva;
2066 $this->line->total_localtax1 = $total_localtax1;
2067 $this->line->total_localtax2 = $total_localtax2;
2068 $this->line->total_ttc = $total_ttc;
2069 $this->line->product_type = $type;
2070 $this->line->special_code = (!empty($special_code) ? $special_code : 0);
2071 $this->line->origin = $origin;
2072 $this->line->origin_id = $origin_id;
2073 $this->line->fk_unit = $fk_unit;
2075 $this->line->date_start = $date_start;
2076 $this->line->date_end = $date_end;
2079 $this->line->fk_multicurrency = $this->fk_multicurrency;
2080 $this->line->multicurrency_code = $this->multicurrency_code;
2081 $this->line->multicurrency_subprice = $pu_ht_devise;
2082 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
2083 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
2084 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
2086 $this->line->subprice = $pu_ht;
2087 $this->line->price = $this->line->subprice;
2089 $this->line->remise_percent = $remise_percent;
2091 if (is_array($array_options) && count($array_options) > 0) {
2092 $this->line->array_options = $array_options;
2095 $result = $this->line->insert($notrigger);
2098 if (!empty($fk_parent_line)) {
2100 } elseif ($rang > 0 && $rang <= count($this->lines)) {
2101 $linecount = count($this->lines);
2102 for ($ii = $rang; $ii <= $linecount; $ii++) {
2108 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
2110 $this->db->commit();
2111 return $this->line->id;
2113 $this->db->rollback();
2117 $this->error = $this->line->error;
2118 $this->errors = $this->line->errors;
2119 dol_syslog(get_class($this).
"::addline error=".$this->error, LOG_ERR);
2120 $this->db->rollback();
2145 public function dispatchProduct($user, $product, $qty, $entrepot, $price = 0, $comment =
'', $eatby =
'', $sellby =
'', $batch =
'', $fk_commandefourndet = 0, $notrigger = 0, $fk_reception = 0)
2147 global $conf, $langs;
2150 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
2153 if ($entrepot <= 0) {
2154 $this->error =
'ErrorBadValueForParameterWarehouse';
2158 $this->error =
'ErrorBadValueForParameterQty';
2162 $dispatchstatus = 1;
2163 if (!empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) {
2164 $dispatchstatus = 0;
2171 if (($this->
statut == self::STATUS_ORDERSENT || $this->
statut == self::STATUS_RECEIVED_PARTIALLY || $this->
statut == self::STATUS_RECEIVED_COMPLETELY)) {
2174 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"commande_fournisseur_dispatch";
2175 $sql .=
" (fk_commande, fk_product, qty, fk_entrepot, fk_user, datec, fk_commandefourndet, status, comment, eatby, sellby, batch, fk_reception) VALUES";
2176 $sql .=
" ('".$this->id.
"','".$product.
"','".$qty.
"',".($entrepot > 0 ?
"'".$entrepot.
"'" :
"null").
",'".$user->id.
"','".$this->db->idate($now).
"','".$fk_commandefourndet.
"', ".$dispatchstatus.
", '".$this->db->escape($comment).
"', ";
2177 $sql .= ($eatby ?
"'".$this->db->idate($eatby).
"'" :
"null").
", ".($sellby ?
"'".$this->db->idate($sellby).
"'" :
"null").
", ".($batch ?
"'".$this->db->escape($batch).
"'" :
"null").
", ".($fk_reception > 0 ?
"'".$this->db->escape($fk_reception).
"'" :
"null");
2180 dol_syslog(get_class($this).
"::dispatchProduct", LOG_DEBUG);
2181 $resql = $this->db->query($sql);
2184 global $conf, $langs, $user;
2186 $result = $this->
call_trigger(
'LINEORDER_SUPPLIER_DISPATCH', $user);
2193 $this->error = $this->db->lasterror();
2198 if (!$error && $entrepot > 0 && isModEnabled(
'stock') && !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) {
2202 $mouv->origin = &$this;
2203 $mouv->setOrigin($this->element, $this->
id);
2206 if (!empty($conf->global->SUPPLIER_ORDER_ALLOW_NEGATIVE_QTY_FOR_SUPPLIER_ORDER_RETURN) && $qty < 0) {
2207 $result = $mouv->livraison($user, $product, $entrepot, $qty*(-1), $price, $comment, $now, $eatby, $sellby, $batch, 0, $inventorycode);
2209 $result = $mouv->reception($user, $product, $entrepot, $qty, $price, $comment, $eatby, $sellby, $batch,
'', 0, $inventorycode);
2213 $this->error = $mouv->error;
2214 $this->errors = $mouv->errors;
2215 dol_syslog(get_class($this).
"::dispatchProduct ".$this->error.
" ".join(
',', $this->errors), LOG_ERR);
2222 $this->db->commit();
2225 $this->db->rollback();
2229 $this->error =
'BadStatusForObject';
2243 if ($this->
statut == 0) {
2246 if ($line->fetch($idline) <= 0) {
2252 foreach ($dispatchedLines as $dispatchLine) {
2253 if ($dispatchLine[
'orderlineid'] == $idline) {
2254 $this->error =
"LineAlreadyDispatched";
2255 $this->errors[] = $this->error;
2260 if ($line->delete($notrigger) > 0) {
2264 $this->error = $line->error;
2265 $this->errors = $line->errors;
2280 public function delete(
User $user, $notrigger = 0)
2282 global $langs, $conf;
2283 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2289 if (empty($notrigger)) {
2291 $result = $this->
call_trigger(
'ORDER_SUPPLIER_DELETE', $user);
2293 $this->errors[] =
'ErrorWhenRunningTrigger';
2294 dol_syslog(get_class($this).
"::delete ".$this->error, LOG_ERR);
2295 $this->db->rollback();
2303 if (!empty($this->linkedObjects) && array_key_exists(
'reception', $this->linkedObjects)) {
2304 foreach ($this->linkedObjects[
'reception'] as $element) {
2305 if ($element->statut >= 0) {
2306 $this->errors[] = $langs->trans(
'ReceptionExist');
2313 $main = $this->db->prefix().
'commande_fournisseurdet';
2314 $ef = $main.
"_extrafields";
2315 $sql =
"DELETE FROM ".$this->db->sanitize($ef).
" WHERE fk_object IN (SELECT rowid FROM ".$this->db->sanitize($main).
" WHERE fk_commande = ".((int) $this->
id).
")";
2316 dol_syslog(get_class($this).
"::delete extrafields lines", LOG_DEBUG);
2317 if (!$this->db->query($sql)) {
2318 $this->error = $this->db->lasterror();
2319 $this->errors[] = $this->db->lasterror();
2324 $sql1 =
"UPDATE ".$this->db->prefix().
"commandedet SET fk_commandefourndet = NULL WHERE fk_commandefourndet IN (SELECT rowid FROM ".$this->db->sanitize($main).
" WHERE fk_commande = ".((int) $this->
id).
")";
2325 dol_syslog(__METHOD__.
" linked order lines", LOG_DEBUG);
2326 if (!$this->db->query($sql1)) {
2328 $this->error = $this->db->lasterror();
2329 $this->errors[] = $this->db->lasterror();
2333 $sql =
"DELETE FROM ".$this->db->prefix().
"commande_fournisseurdet WHERE fk_commande =".((int) $this->
id);
2334 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
2335 if (!$this->db->query($sql)) {
2336 $this->error = $this->db->lasterror();
2337 $this->errors[] = $this->db->lasterror();
2341 $sql =
"DELETE FROM ".$this->db->prefix().
"commande_fournisseur WHERE rowid =".((int) $this->
id);
2342 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
2343 if ($resql = $this->db->query($sql)) {
2344 if ($this->db->affected_rows($resql) < 1) {
2345 $this->error = $this->db->lasterror();
2346 $this->errors[] = $this->db->lasterror();
2350 $this->error = $this->db->lasterror();
2351 $this->errors[] = $this->db->lasterror();
2359 $this->error =
'FailToDeleteExtraFields';
2360 $this->errors[] =
'FailToDeleteExtraFields';
2362 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
2369 $this->error =
'FailToDeleteObjectLinked';
2370 $this->errors[] =
'FailToDeleteObjectLinked';
2380 if ($conf->fournisseur->commande->dir_output) {
2381 $dir = $conf->fournisseur->commande->dir_output.
"/".$ref;
2382 $file = $dir.
"/".$ref.
".pdf";
2383 if (file_exists($file)) {
2385 $this->error =
'ErrorFailToDeleteFile';
2386 $this->errors[] =
'ErrorFailToDeleteFile';
2390 if (file_exists($dir)) {
2393 $this->error =
'ErrorFailToDeleteDir';
2394 $this->errors[] =
'ErrorFailToDeleteDir';
2402 dol_syslog(get_class($this).
"::delete $this->id by $user->id", LOG_DEBUG);
2403 $this->db->commit();
2406 dol_syslog(get_class($this).
"::delete ".$this->error, LOG_ERR);
2407 $this->db->rollback();
2421 $sql =
"SELECT rowid, libelle";
2422 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_input_method";
2423 $sql .=
" WHERE active = 1";
2425 $resql = $this->db->query($sql);
2428 $num = $this->db->num_rows($resql);
2429 $this->methodes_commande = array();
2431 $row = $this->db->fetch_row($resql);
2433 $this->methodes_commande[$row[0]] = $row[1];
2456 $sql =
"SELECT p.ref, p.label,";
2457 $sql .=
" e.rowid as warehouse_id, e.ref as entrepot,";
2458 $sql .=
" cfd.rowid as dispatchedlineid, cfd.fk_product, cfd.qty, cfd.eatby, cfd.sellby, cfd.batch, cfd.comment, cfd.status, cfd.fk_commandefourndet";
2459 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product as p,";
2460 $sql .=
" ".MAIN_DB_PREFIX.
"commande_fournisseur_dispatch as cfd";
2461 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"entrepot as e ON cfd.fk_entrepot = e.rowid";
2462 $sql .=
" WHERE cfd.fk_commande = ".((int) $this->
id);
2463 $sql .=
" AND cfd.fk_product = p.rowid";
2465 $sql .=
" AND cfd.status = ".((int) $status);
2467 $sql .=
" ORDER BY cfd.rowid ASC";
2469 $resql = $this->db->query($sql);
2471 $num = $this->db->num_rows($resql);
2475 $objp = $this->db->fetch_object($resql);
2478 'id' => $objp->dispatchedlineid,
2479 'productid' => $objp->fk_product,
2480 'warehouseid' => $objp->warehouse_id,
2481 'qty' => $objp->qty,
2482 'orderlineid' => $objp->fk_commandefourndet
2489 dol_print_error($this->db,
'Failed to execute request to get dispatched lines');
2508 global $conf, $langs;
2515 $usercanreceive = 0;
2516 if (!isModEnabled(
'reception')) {
2517 $usercanreceive = $user->hasRight(
"fournisseur",
"commande",
"receptionner");
2519 $usercanreceive = $user->hasRight(
"reception",
"creer");
2522 if ($usercanreceive) {
2524 if ($type ==
'par') {
2526 } elseif ($type ==
'tot') {
2528 } elseif ($type ==
'nev') {
2530 } elseif ($type ==
'can') {
2534 dol_syslog(get_class($this).
"::Livraison Error -2", LOG_ERR);
2539 if (!empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) {
2541 if (!$error && ($type ==
'tot')) {
2543 if (count($dispatchedlinearray) > 0) {
2546 $this->errors[] =
'ErrorCantSetReceptionToTotalDoneWithReceptionToApprove';
2547 dol_syslog(
'ErrorCantSetReceptionToTotalDoneWithReceptionToApprove', LOG_DEBUG);
2550 if (!$error && !empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS_NEED_APPROVE) && ($type ==
'tot')) {
2552 if (count($dispatchedlinearray) > 0) {
2555 $this->errors[] =
'ErrorCantSetReceptionToTotalDoneWithReceptionDenied';
2556 dol_syslog(
'ErrorCantSetReceptionToTotalDoneWithReceptionDenied', LOG_DEBUG);
2563 if (empty($error)) {
2566 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande_fournisseur";
2567 $sql .=
" SET fk_statut = ".((int) $statut);
2568 $sql .=
" WHERE rowid = ".((int) $this->
id);
2569 $sql .=
" AND fk_statut IN (".self::STATUS_ORDERSENT.
",".self::STATUS_RECEIVED_PARTIALLY.
")";
2571 dol_syslog(get_class($this).
"::Livraison", LOG_DEBUG);
2572 $resql = $this->db->query($sql);
2575 $old_statut = $this->statut;
2577 $this->actionmsg2 = $comment;
2580 $result_trigger = $this->
call_trigger(
'ORDER_SUPPLIER_RECEIVE', $user);
2581 if ($result_trigger < 0) {
2586 if (empty($error)) {
2587 $this->db->commit();
2589 $this->
statut = $old_statut;
2590 $this->db->rollback();
2591 $this->error = $this->db->lasterror();
2595 $this->db->rollback();
2596 $this->error = $this->db->lasterror();
2601 $this->error = $langs->trans(
'NotAuthorized');
2602 $this->errors[] = $langs->trans(
'NotAuthorized');
2603 dol_syslog(get_class($this).
"::Livraison Not Authorized");
2635 if ($user->hasRight(
"fournisseur",
"commande",
"creer") || $user->hasRight(
"supplier_order",
"creer")) {
2640 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande_fournisseur";
2641 $sql .=
" SET date_livraison = ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
2642 $sql .=
" WHERE rowid = ".((int) $this->
id);
2645 $resql = $this->db->query($sql);
2647 $this->errors[] = $this->db->error();
2652 $this->oldcopy = clone $this;
2653 $this->date_livraison = $delivery_date;
2654 $this->delivery_date = $delivery_date;
2657 if (!$notrigger && empty($error)) {
2659 $result = $this->
call_trigger(
'ORDER_SUPPLIER_MODIFY', $user);
2667 $this->db->commit();
2670 foreach ($this->errors as $errmsg) {
2671 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2672 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2674 $this->db->rollback();
2694 if ($user->hasRight(
"fournisseur",
"commande",
"creer") || $user->hasRight(
"supplier_order",
"creer")) {
2699 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande_fournisseur";
2700 $sql .=
" SET fk_projet = ".($id_projet > 0 ? (int) $id_projet :
'null');
2701 $sql .=
" WHERE rowid = ".((int) $this->
id);
2704 $resql = $this->db->query($sql);
2706 $this->errors[] = $this->db->error();
2711 $this->oldcopy = clone $this;
2712 $this->fk_projet = $id_projet;
2713 $this->fk_project = $id_projet;
2716 if (!$notrigger && empty($error)) {
2718 $result = $this->
call_trigger(
'ORDER_SUPPLIER_MODIFY', $user);
2726 $this->db->commit();
2729 foreach ($this->errors as $errmsg) {
2730 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2731 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2733 $this->db->rollback();
2751 $comclient =
new Commande($this->db);
2752 $comclient->fetch($comclientid);
2756 $this->lines = array();
2758 $num = count($comclient->lines);
2759 for ($i = 0; $i < $num; $i++) {
2760 $prod =
new Product($this->db);
2763 if ($prod->fetch($comclient->lines[$i]->fk_product) > 0) {
2764 $label = $prod->label;
2768 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"commande_fournisseurdet";
2769 $sql .=
" (fk_commande, label, description, fk_product, price, qty, tva_tx, localtax1_tx, localtax2_tx, remise_percent, subprice, remise, ref)";
2770 $sql .=
" VALUES (".((int) $idc).
", '".$this->db->escape($label).
"', '".$this->db->escape($comclient->lines[$i]->desc).
"'";
2771 $sql .=
",".$comclient->lines[$i]->fk_product.
", ".
price2num($comclient->lines[$i]->price,
'MU');
2772 $sql .=
", ".price2num($comclient->lines[$i]->qty,
'MS').
", ".
price2num($comclient->lines[$i]->tva_tx, 5).
", ".
price2num($comclient->lines[$i]->localtax1_tx, 5).
", ".
price2num($comclient->lines[$i]->localtax2_tx, 5).
", ".
price2num($comclient->lines[$i]->remise_percent, 3);
2773 $sql .=
", '".price2num($comclient->lines[$i]->subprice,
'MT').
"','0', '".$this->db->escape($ref).
"');";
2774 if ($this->db->query($sql)) {
2791 global $conf, $langs;
2796 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande_fournisseur';
2797 $sql .=
" SET fk_statut = ".$status;
2798 $sql .=
" WHERE rowid = ".((int) $this->
id);
2800 dol_syslog(get_class($this).
"::setStatus", LOG_DEBUG);
2801 $resql = $this->db->query($sql);
2804 $triggerName = array();
2805 $triggerName[0] =
'DRAFT';
2806 $triggerName[1] =
'VALIDATED';
2807 $triggerName[2] =
'APPROVED';
2808 $triggerName[3] =
'ORDERED';
2809 $triggerName[4] =
'RECEIVED_PARTIALLY';
2810 $triggerName[5] =
'RECEIVED_COMPLETELY';
2811 $triggerName[6] =
'CANCELED';
2812 $triggerName[7] =
'CANCELED';
2813 $triggerName[9] =
'REFUSED';
2816 $result = $this->
call_trigger(
"ORDER_SUPPLIER_STATUS_".$triggerName[$status], $user);
2823 $this->error = $this->db->lasterror();
2824 dol_syslog(get_class($this).
"::setStatus ".$this->error);
2829 $this->db->commit();
2832 $this->db->rollback();
2860 public function updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $price_base_type =
'HT', $info_bits = 0, $type = 0, $notrigger = 0, $date_start =
'', $date_end =
'', $array_options = 0, $fk_unit =
null, $pu_ht_devise = 0, $ref_supplier =
'')
2862 global $mysoc, $conf, $langs;
2863 dol_syslog(get_class($this).
"::updateline $rowid, $desc, $pu, $qty, $remise_percent, $txtva, $price_base_type, $info_bits, $type, $fk_unit");
2864 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2868 if ($this->brouillon) {
2873 if (empty($info_bits)) {
2876 if (empty($txtva)) {
2879 if (empty($txlocaltax1)) {
2882 if (empty($txlocaltax2)) {
2885 if (empty($remise)) {
2888 if (empty($remise_percent)) {
2889 $remise_percent = 0;
2892 $remise_percent =
price2num($remise_percent);
2898 $pu_ht_devise =
price2num($pu_ht_devise);
2899 if (!preg_match(
'/\((.*)\)/', $txtva)) {
2909 if ($date_start && $date_end && $date_start > $date_end) {
2910 $langs->load(
"errors");
2911 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
2927 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
2928 $vat_src_code = $reg[1];
2929 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
2932 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
2933 $total_ht = $tabprice[0];
2934 $total_tva = $tabprice[1];
2935 $total_ttc = $tabprice[2];
2936 $total_localtax1 = $tabprice[9];
2937 $total_localtax2 = $tabprice[10];
2938 $pu_ht = $tabprice[3];
2939 $pu_tva = $tabprice[4];
2940 $pu_ttc = $tabprice[5];
2943 $multicurrency_total_ht = $tabprice[16];
2944 $multicurrency_total_tva = $tabprice[17];
2945 $multicurrency_total_ttc = $tabprice[18];
2946 $pu_ht_devise = $tabprice[19];
2948 $localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
2949 $localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
2953 $this->line->fetch($rowid);
2955 $oldline = clone $this->line;
2956 $this->line->oldline = $oldline;
2958 $this->line->context = $this->context;
2960 $this->line->fk_commande = $this->id;
2962 $this->line->desc = $desc;
2965 if (!empty($conf->global->PRODUCT_USE_SUPPLIER_PACKAGING)) {
2966 if ($qty < $this->line->packaging) {
2967 $qty = $this->line->packaging;
2969 if (!empty($this->line->packaging) && ($qty % $this->line->packaging) > 0) {
2970 $coeff = intval($qty / $this->line->packaging) + 1;
2971 $qty = $this->line->packaging * $coeff;
2972 setEventMessage($langs->trans(
'QtyRecalculatedWithPackaging'),
'mesgs');
2977 $this->line->qty = $qty;
2978 $this->line->ref_supplier = $ref_supplier;
2980 $this->line->vat_src_code = $vat_src_code;
2981 $this->line->tva_tx = $txtva;
2982 $this->line->localtax1_tx = $txlocaltax1;
2983 $this->line->localtax2_tx = $txlocaltax2;
2984 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
2985 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
2986 $this->line->remise_percent = $remise_percent;
2987 $this->line->subprice = $pu_ht;
2988 $this->line->info_bits = $info_bits;
2989 $this->line->total_ht = $total_ht;
2990 $this->line->total_tva = $total_tva;
2991 $this->line->total_localtax1 = $total_localtax1;
2992 $this->line->total_localtax2 = $total_localtax2;
2993 $this->line->total_ttc = $total_ttc;
2994 $this->line->product_type = $type;
2995 $this->line->special_code = $oldline->special_code;
2996 $this->line->rang = $oldline->rang;
2997 $this->line->origin = $this->origin;
2998 $this->line->fk_unit = $fk_unit;
3000 $this->line->date_start = $date_start;
3001 $this->line->date_end = $date_end;
3004 $this->line->fk_multicurrency = $this->fk_multicurrency;
3005 $this->line->multicurrency_code = $this->multicurrency_code;
3006 $this->line->multicurrency_subprice = $pu_ht_devise;
3007 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
3008 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
3009 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
3011 $this->line->subprice = $pu_ht;
3012 $this->line->price = $this->line->subprice;
3014 $this->line->remise_percent = $remise_percent;
3016 if (is_array($array_options) && count($array_options) > 0) {
3018 foreach ($array_options as $key => $value) {
3019 $this->line->array_options[$key] = $array_options[$key];
3023 $result = $this->line->update($notrigger);
3029 $this->db->commit();
3032 $this->errors[] = $this->line->error;
3033 $this->errors = array_merge($this->errors, $this->line->errors);
3034 $this->error = $this->db->lasterror();
3035 $this->db->rollback();
3039 $this->error =
"Order status makes operation forbidden";
3040 dol_syslog(get_class($this).
"::updateline ".$this->error, LOG_ERR);
3055 global $user, $langs, $conf;
3057 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
3059 dol_syslog(get_class($this).
"::initAsSpecimen");
3066 $sql =
"SELECT rowid";
3067 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
3068 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
3069 $sql .= $this->db->order(
"rowid",
"ASC");
3070 $sql .= $this->db->plimit(1);
3071 $resql = $this->db->query($sql);
3072 if ($resql && $this->db->num_rows($resql)) {
3073 $obj = $this->db->fetch_object($resql);
3074 $prodid = $obj->rowid;
3079 $this->
ref =
'SPECIMEN';
3080 $this->specimen = 1;
3083 $this->date_commande = $now;
3084 $this->date_lim_reglement = $this->date + 3600 * 24 * 30;
3085 $this->cond_reglement_code =
'RECEP';
3086 $this->mode_reglement_code =
'CHQ';
3088 $this->note_public =
'This is a comment (public)';
3089 $this->note_private =
'This is a comment (private)';
3091 $this->multicurrency_tx = 1;
3092 $this->multicurrency_code = $conf->currency;
3099 while ($xnbp < $nbp) {
3101 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
3103 $line->subprice = 100;
3105 $line->tva_tx = 19.6;
3106 $line->localtax1_tx = 0;
3107 $line->localtax2_tx = 0;
3109 $line->total_ht = 50;
3110 $line->total_ttc = 59.8;
3111 $line->total_tva = 9.8;
3112 $line->remise_percent = 50;
3114 $line->total_ht = 100;
3115 $line->total_ttc = 119.6;
3116 $line->total_tva = 19.6;
3117 $line->remise_percent = 00;
3119 $line->fk_product = $prodid;
3121 $this->lines[$xnbp] = $line;
3123 $this->total_ht += $line->total_ht;
3124 $this->total_tva += $line->total_tva;
3125 $this->total_ttc += $line->total_ttc;
3139 $sql =
'SELECT c.rowid, date_creation as datec, tms as datem, date_valid as date_validation, date_approve as datea, date_approve2 as datea2,';
3140 $sql .=
' fk_user_author, fk_user_modif, fk_user_valid, fk_user_approve, fk_user_approve2';
3141 $sql .=
' FROM '.MAIN_DB_PREFIX.
'commande_fournisseur as c';
3142 $sql .=
' WHERE c.rowid = '.((int) $id);
3144 $result = $this->db->query($sql);
3146 if ($this->db->num_rows($result)) {
3147 $obj = $this->db->fetch_object($result);
3148 $this->
id = $obj->rowid;
3149 if ($obj->fk_user_author) {
3150 $this->user_creation_id = $obj->fk_user_author;
3152 if ($obj->fk_user_valid) {
3153 $this->user_validation_id = $obj->fk_user_valid;
3155 if ($obj->fk_user_modif) {
3156 $this->user_modification_id = $obj->fk_user_modif;
3158 if ($obj->fk_user_approve) {
3159 $this->user_approve_id = $obj->fk_user_approve;
3161 if ($obj->fk_user_approve2) {
3162 $this->user_approve_id2 = $obj->fk_user_approve2;
3165 $this->date_creation = $this->db->jdate($obj->datec);
3166 $this->date_modification = $this->db->jdate($obj->datem);
3167 $this->date_approve = $this->db->jdate($obj->datea);
3168 $this->date_approve2 = $this->db->jdate($obj->datea2);
3169 $this->date_validation = $this->db->jdate($obj->date_validation);
3171 $this->db->free($result);
3186 global $conf, $user;
3188 $this->nb = array();
3191 $sql =
"SELECT count(co.rowid) as nb";
3192 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseur as co";
3193 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON co.fk_soc = s.rowid";
3194 if (!$user->hasRight(
"societe",
"client",
"voir") && !$user->socid) {
3195 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
3196 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3199 $sql .=
" ".$clause.
" co.entity IN (".
getEntity(
'supplier_order').
")";
3201 $resql = $this->db->query($sql);
3203 while ($obj = $this->db->fetch_object($resql)) {
3204 $this->nb[
"supplier_orders"] = $obj->nb;
3206 $this->db->free($resql);
3210 $this->error = $this->db->error();
3226 global $conf, $langs;
3228 $sql =
"SELECT c.rowid, c.date_creation as datec, c.date_commande, c.fk_statut, c.date_livraison as delivery_date, c.total_ht";
3229 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseur as c";
3230 if (!$user->hasRight(
"societe",
"client",
"voir") && !$user->socid) {
3231 $sql .=
" JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON c.fk_soc = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
3233 $sql .=
" WHERE c.entity = ".$conf->entity;
3234 if ($mode ===
'awaiting') {
3235 $sql .=
" AND c.fk_statut IN (".self::STATUS_ORDERSENT.
", ".self::STATUS_RECEIVED_PARTIALLY.
")";
3237 $sql .=
" AND c.fk_statut IN (".self::STATUS_VALIDATED.
", ".self::STATUS_ACCEPTED.
")";
3240 $sql .=
" AND c.fk_soc = ".((int) $user->socid);
3243 $resql = $this->db->query($sql);
3248 $response->warning_delay = $conf->commande->fournisseur->warning_delay / 60 / 60 / 24;
3249 $response->label = $langs->trans(
"SuppliersOrdersToProcess");
3250 $response->labelShort = $langs->trans(
"Opened");
3251 $response->url = DOL_URL_ROOT.
'/fourn/commande/list.php?search_status=1,2&mainmenu=commercial&leftmenu=orders_suppliers';
3254 if ($mode ===
'awaiting') {
3255 $response->label = $langs->trans(
"SuppliersOrdersAwaitingReception");
3256 $response->labelShort = $langs->trans(
"AwaitingReception");
3257 $response->url = DOL_URL_ROOT.
'/fourn/commande/list.php?search_status=3,4&mainmenu=commercial&leftmenu=orders_suppliers';
3260 while ($obj = $this->db->fetch_object($resql)) {
3261 $commandestatic->delivery_date = $this->db->jdate($obj->delivery_date);
3262 $commandestatic->date_commande = $this->db->jdate($obj->date_commande);
3263 $commandestatic->statut = $obj->fk_statut;
3265 $response->nbtodo++;
3266 $response->total += $obj->total_ht;
3268 if ($commandestatic->hasDelay()) {
3269 $response->nbtodolate++;
3275 $this->error = $this->db->error();
3290 if ($this->methode_commande_id > 0) {
3291 $sql =
"SELECT rowid, code, libelle as label";
3292 $sql .=
" FROM ".MAIN_DB_PREFIX.
'c_input_method';
3293 $sql .=
" WHERE active=1 AND rowid = ".((int) $this->methode_commande_id);
3295 $resql = $this->db->query($sql);
3297 if ($this->db->num_rows($resql)) {
3298 $obj = $this->db->fetch_object($resql);
3300 $string = $langs->trans($obj->code);
3301 if ($string == $obj->code) {
3302 $string = $obj->label !=
'-' ? $obj->label :
'';
3325 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
3327 global $conf, $langs;
3332 if (!empty($this->model_pdf)) {
3333 $modele = $this->model_pdf;
3334 } elseif (!empty($conf->global->COMMANDE_SUPPLIER_ADDON_PDF)) {
3339 if (empty($modele)) {
3342 $langs->load(
"suppliers");
3343 $outputlangs->load(
"products");
3345 $modelpath =
"core/modules/supplier_order/doc/";
3346 $result = $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
3359 if (empty($this->lines)) {
3366 foreach ($this->lines as $line) {
3367 if ($line->fk_product > 0) {
3368 $idp = $obj->find_min_price_product_fournisseur($line->fk_product, $line->qty);
3371 if ($obj->delivery_time_days > $nb) {
3372 $nb = $obj->delivery_time_days;
3381 return $nb.
' '.$langs->trans(
'Days');
3393 return $user->hasRight(
"fournisseur",
"commande");
3408 'commande_fournisseur'
3425 'commande_fournisseurdet'
3442 if (empty($this->delivery_date) && !empty($this->date_livraison)) {
3443 $this->delivery_date = $this->date_livraison;
3446 if ($this->
statut == self::STATUS_ORDERSENT || $this->
statut == self::STATUS_RECEIVED_PARTIALLY) {
3448 if (!empty($this->delivery_date)) {
3449 $date_to_test = $this->delivery_date;
3450 return $date_to_test && $date_to_test < ($now - $conf->commande->fournisseur->warning_delay);
3458 $date_to_test = $this->date_commande;
3460 return ($this->
statut > 0 && $this->
statut < 5) && $date_to_test && $date_to_test < ($now - $conf->commande->fournisseur->warning_delay);
3473 global $conf, $langs;
3475 if (empty($this->delivery_date) && !empty($this->date_livraison)) {
3476 $this->delivery_date = $this->date_livraison;
3481 if ($this->
statut == self::STATUS_ORDERSENT || $this->
statut == self::STATUS_RECEIVED_PARTIALLY) {
3482 if (!empty($this->delivery_date)) {
3483 $text = $langs->trans(
"DeliveryDate").
' '.
dol_print_date($this->delivery_date,
'day');
3485 $text = $langs->trans(
"OrderDate").
' '.
dol_print_date($this->date_commande,
'day');
3488 $text = $langs->trans(
"OrderDate").
' '.
dol_print_date($this->date_commande,
'day');
3491 $text .=
' '.($conf->commande->fournisseur->warning_delay > 0 ?
'+' :
'-').
' '.round(abs($conf->commande->fournisseur->warning_delay) / 3600 / 24, 1).
' '.$langs->trans(
"days").
' < '.$langs->trans(
"Today");
3508 global $conf, $langs;
3510 if (isModEnabled(
"supplier_order")) {
3511 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.dispatch.class.php';
3513 $qtydelivered = array();
3514 $qtywished = array();
3517 $filter = array(
't.fk_commande'=>$this->
id);
3518 if (!empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) {
3519 $filter[
't.status'] = 1;
3522 $ret = $supplierorderdispatch->fetchAll(
'',
'', 0, 0, $filter);
3524 $this->error = $supplierorderdispatch->error; $this->errors = $supplierorderdispatch->errors;
3527 if (is_array($supplierorderdispatch->lines) && count($supplierorderdispatch->lines) > 0) {
3528 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
3532 foreach ($supplierorderdispatch->lines as $line) {
3533 $qtydelivered[$line->fk_product] += $line->qty;
3535 foreach ($this->lines as $line) {
3537 if (empty($conf->global->STOCK_SUPPORTS_SERVICES) && $line->product_type > 0) {
3540 $qtywished[$line->fk_product] += $line->qty;
3544 $diff_array = array_diff_assoc($qtydelivered, $qtywished);
3545 $keysinwishednotindelivered = array_diff(array_keys($qtywished), array_keys($qtydelivered));
3546 $keysindeliverednotinwished = array_diff(array_keys($qtydelivered), array_keys($qtywished));
3554 if (count($diff_array) == 0 && count($keysinwishednotindelivered) == 0 && count($keysindeliverednotinwished) == 0) {
3555 if ($closeopenorder) {
3557 $ret = $this->
Livraison($user, $date_liv,
'tot', $comment);
3565 $ret = $this->
Livraison($user, $date_liv,
'par', $comment);
3571 } elseif (!empty($conf->global->SUPPLIER_ORDER_MORE_THAN_WISHED)) {
3576 if (count($diff_array) > 0) {
3580 foreach ($diff_array as $key => $value) {
3582 if ($qtydelivered[$key] >= $qtywished[$key]) {
3589 if ($close == count($diff_array)) {
3591 if ($closeopenorder) {
3592 $ret = $this->
Livraison($user, $date_liv,
'tot', $comment);
3599 $ret = $this->
Livraison($user, $date_liv,
'par', $comment);
3607 $ret = $this->
Livraison($user, $date_liv,
'par', $comment);
3615 $ret = $this->
Livraison($user, $date_liv,
'par', $comment);
3637 $this->receptions = array();
3639 dol_syslog(get_class($this).
"::loadReceptions", LOG_DEBUG);
3641 $sql =
'SELECT cd.rowid, cd.fk_product,';
3642 $sql .=
' sum(cfd.qty) as qty';
3643 $sql .=
' FROM '.MAIN_DB_PREFIX.
'commande_fournisseur_dispatch as cfd,';
3644 if ($filtre_statut >= 0) {
3645 $sql .=
' '.MAIN_DB_PREFIX.
'reception as e,';
3647 $sql .=
' '.MAIN_DB_PREFIX.
'commande_fournisseurdet as cd';
3649 if ($filtre_statut >= 0) {
3650 $sql .=
' cfd.fk_reception = e.rowid AND';
3652 $sql .=
' cfd.fk_commandefourndet = cd.rowid';
3653 $sql .=
' AND cd.fk_commande ='.((int) $this->
id);
3654 if (isset($this->fk_product) && !empty($this->fk_product) > 0) {
3655 $sql .=
' AND cd.fk_product = '.((int) $this->fk_product);
3657 if ($filtre_statut >= 0) {
3658 $sql .=
' AND e.fk_statut >= '.((int) $filtre_statut);
3660 $sql .=
' GROUP BY cd.rowid, cd.fk_product';
3662 $resql = $this->db->query($sql);
3664 $num = $this->db->num_rows($resql);
3667 $obj = $this->db->fetch_object($resql);
3668 empty($this->receptions[$obj->rowid]) ? $this->receptions[$obj->rowid] = $obj->qty : $this->receptions[$obj->rowid] += $obj->qty;
3671 $this->db->free($resql);
3675 $this->error = $this->db->lasterror();
3691 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
3693 $return =
'<div class="box-flex-item box-flex-grow-zero">';
3694 $return .=
'<div class="info-box info-box-sm">';
3695 $return .=
'<span class="info-box-icon bg-infobox-action">';
3697 $return .=
'</span>';
3698 $return .=
'<div class="info-box-content">';
3699 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
3700 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
3701 if (property_exists($this,
'socid') || property_exists($this,
'total_tva')) {
3702 $return .=
'<br><span class="info-box-label amount">'.$this->socid.
'</span>';
3704 if (property_exists($this,
'billed')) {
3705 $return .=
'<br><span class="opacitymedium">'.$langs->trans(
"Billed").
' : </span><span class="info-box-label">'.
yn($this->billed).
'</span>';
3707 if (method_exists($this,
'getLibStatut')) {
3708 $return .=
'<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).
'</div>';
3710 $return .=
'</div>';
3711 $return .=
'</div>';
3712 $return .=
'</div>';
3727 public $element =
'commande_fournisseurdet';
3732 public $table_element =
'commande_fournisseurdet';
3740 public $fk_commande;
3746 public $fk_parent_line;
3754 public $special_code = 0;
3771 public $ref_supplier;
3803 $sql =
'SELECT cd.rowid, cd.fk_commande, cd.fk_product, cd.product_type, cd.description, cd.qty, cd.tva_tx, cd.special_code,';
3804 $sql .=
' cd.localtax1_tx, cd.localtax2_tx, cd.localtax1_type, cd.localtax2_type, cd.ref as ref_supplier,';
3805 $sql .=
' cd.remise, cd.remise_percent, cd.subprice,';
3806 $sql .=
' cd.info_bits, cd.total_ht, cd.total_tva, cd.total_ttc,';
3807 $sql .=
' cd.total_localtax1, cd.total_localtax2,';
3808 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc,';
3809 $sql .=
' cd.date_start, cd.date_end, cd.fk_unit,';
3810 $sql .=
' cd.multicurrency_subprice, cd.multicurrency_total_ht, cd.multicurrency_total_tva, cd.multicurrency_total_ttc,';
3811 $sql .=
' c.fk_soc as socid';
3812 $sql .=
' FROM '.MAIN_DB_PREFIX.
'commande_fournisseur as c, '.MAIN_DB_PREFIX.
'commande_fournisseurdet as cd';
3813 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON cd.fk_product = p.rowid';
3814 $sql .=
' WHERE cd.fk_commande = c.rowid AND cd.rowid = '.((int) $rowid);
3816 $result = $this->db->query($sql);
3818 $objp = $this->db->fetch_object($result);
3820 if (!empty($objp)) {
3821 $this->
rowid = $objp->rowid;
3822 $this->
id = $objp->rowid;
3823 $this->fk_commande = $objp->fk_commande;
3824 $this->desc = $objp->description;
3825 $this->qty = $objp->qty;
3826 $this->ref_fourn = $objp->ref_supplier;
3827 $this->ref_supplier = $objp->ref_supplier;
3828 $this->subprice = $objp->subprice;
3829 $this->tva_tx = $objp->tva_tx;
3830 $this->localtax1_tx = $objp->localtax1_tx;
3831 $this->localtax2_tx = $objp->localtax2_tx;
3832 $this->localtax1_type = $objp->localtax1_type;
3833 $this->localtax2_type = $objp->localtax2_type;
3834 $this->remise = $objp->remise;
3835 $this->remise_percent = $objp->remise_percent;
3836 $this->fk_product = $objp->fk_product;
3837 $this->info_bits = $objp->info_bits;
3838 $this->total_ht = $objp->total_ht;
3839 $this->total_tva = $objp->total_tva;
3840 $this->total_localtax1 = $objp->total_localtax1;
3841 $this->total_localtax2 = $objp->total_localtax2;
3842 $this->total_ttc = $objp->total_ttc;
3843 $this->product_type = $objp->product_type;
3844 $this->special_code = $objp->special_code;
3846 $this->
ref = $objp->product_ref;
3848 $this->product_ref = $objp->product_ref;
3849 $this->product_label = $objp->product_label;
3850 $this->product_desc = $objp->product_desc;
3852 if (!empty($conf->global->PRODUCT_USE_SUPPLIER_PACKAGING)) {
3857 $sqlsearchpackage =
'SELECT rowid, packaging FROM '.MAIN_DB_PREFIX.
"product_fournisseur_price";
3858 $sqlsearchpackage .=
' WHERE entity IN ('.getEntity(
'product_fournisseur_price').
")";
3859 $sqlsearchpackage .=
" AND fk_product = ".((int) $objp->fk_product);
3860 $sqlsearchpackage .=
" AND ref_fourn = '".$this->db->escape($objp->ref_supplier).
"'";
3861 $sqlsearchpackage .=
" AND quantity <= ".((float) $objp->qty);
3862 $sqlsearchpackage .=
" AND (packaging IS NULL OR packaging = 0 OR packaging <= ".((float) $objp->qty).
")";
3863 $sqlsearchpackage .=
" AND fk_soc = ".((int) $objp->socid);
3864 $sqlsearchpackage .=
" ORDER BY packaging ASC";
3865 $sqlsearchpackage .=
" LIMIT 1";
3867 $resqlsearchpackage = $this->db->query($sqlsearchpackage);
3868 if ($resqlsearchpackage) {
3869 $objsearchpackage = $this->db->fetch_object($resqlsearchpackage);
3870 if ($objsearchpackage) {
3871 $this->fk_fournprice = $objsearchpackage->rowid;
3872 $this->packaging = $objsearchpackage->packaging;
3875 $this->error = $this->db->lasterror();
3880 $this->date_start = $this->db->jdate($objp->date_start);
3881 $this->date_end = $this->db->jdate($objp->date_end);
3882 $this->fk_unit = $objp->fk_unit;
3884 $this->multicurrency_subprice = $objp->multicurrency_subprice;
3885 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
3886 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
3887 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
3891 $this->db->free($result);
3894 $this->error =
'Supplier order line with id='.$rowid.
' not found';
3895 dol_syslog(get_class($this).
"::fetch Error ".$this->error, LOG_ERR);
3912 global $conf, $user;
3916 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
3919 if (empty($this->tva_tx)) {
3922 if (empty($this->localtax1_tx)) {
3923 $this->localtax1_tx = 0;
3925 if (empty($this->localtax2_tx)) {
3926 $this->localtax2_tx = 0;
3928 if (empty($this->localtax1_type)) {
3929 $this->localtax1_type =
'0';
3931 if (empty($this->localtax2_type)) {
3932 $this->localtax2_type =
'0';
3934 if (empty($this->total_localtax1)) {
3935 $this->total_localtax1 = 0;
3937 if (empty($this->total_localtax2)) {
3938 $this->total_localtax2 = 0;
3940 if (empty($this->rang)) {
3943 if (empty($this->remise_percent)) {
3944 $this->remise_percent = 0;
3946 if (empty($this->info_bits)) {
3947 $this->info_bits = 0;
3949 if (empty($this->special_code)) {
3950 $this->special_code = 0;
3952 if (empty($this->fk_parent_line)) {
3953 $this->fk_parent_line = 0;
3955 if (empty($this->pa_ht)) {
3960 if (!empty($this->multicurrency_code)) {
3963 if (empty($this->fk_multicurrency)) {
3964 $this->multicurrency_code = $conf->currency;
3965 $this->fk_multicurrency = 0;
3966 $this->multicurrency_tx = 1;
3970 if ($this->product_type < 0) {
3977 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element;
3978 $sql .=
" (fk_commande, label, description, date_start, date_end,";
3979 $sql .=
" fk_product, product_type, special_code, rang,";
3980 $sql .=
" qty, vat_src_code, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, remise_percent, subprice, ref,";
3981 $sql .=
" total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_unit,";
3982 $sql .=
" fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc";
3984 $sql .=
" VALUES (".$this->fk_commande.
", '".$this->db->escape($this->label).
"','".$this->db->escape($this->desc).
"',";
3985 $sql .=
" ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3986 $sql .=
" ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3987 if ($this->fk_product) {
3988 $sql .= $this->fk_product.
",";
3992 $sql .=
"'".$this->db->escape($this->product_type).
"',";
3993 $sql .=
"'".$this->db->escape($this->special_code).
"',";
3994 $sql .=
"'".$this->db->escape($this->rang).
"',";
3995 $sql .=
"'".$this->db->escape($this->qty).
"', ";
3996 $sql .=
" ".(empty($this->vat_src_code) ?
"''" :
"'".$this->db->escape($this->vat_src_code).
"'").
",";
3997 $sql .=
" ".price2num($this->tva_tx).
", ";
3998 $sql .=
" ".price2num($this->localtax1_tx).
",";
3999 $sql .=
" ".price2num($this->localtax2_tx).
",";
4000 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
4001 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
4002 $sql .=
" ".((float) $this->remise_percent).
", ".
price2num($this->subprice,
'MU').
", '".$this->db->escape($this->ref_supplier).
"',";
4003 $sql .=
" ".price2num($this->total_ht).
",";
4004 $sql .=
" ".price2num($this->total_tva).
",";
4005 $sql .=
" ".price2num($this->total_localtax1).
",";
4006 $sql .=
" ".price2num($this->total_localtax2).
",";
4007 $sql .=
" ".price2num($this->total_ttc).
",";
4008 $sql .= ($this->fk_unit ?
"'".$this->db->escape($this->fk_unit).
"'" :
"null");
4009 $sql .=
", ".($this->fk_multicurrency ? ((int) $this->fk_multicurrency) :
"null");
4010 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
4011 $sql .=
", ".($this->multicurrency_subprice ?
price2num($this->multicurrency_subprice) :
'0');
4012 $sql .=
", ".($this->multicurrency_total_ht ?
price2num($this->multicurrency_total_ht) :
'0');
4013 $sql .=
", ".($this->multicurrency_total_tva ?
price2num($this->multicurrency_total_tva) :
'0');
4014 $sql .=
", ".($this->multicurrency_total_ttc ?
price2num($this->multicurrency_total_ttc) :
'0');
4017 dol_syslog(get_class($this).
"::insert", LOG_DEBUG);
4018 $resql = $this->db->query($sql);
4020 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
4021 $this->
rowid = $this->id;
4030 if (!$error && !$notrigger) {
4032 $result = $this->
call_trigger(
'LINEORDER_SUPPLIER_CREATE', $user);
4040 $this->db->commit();
4044 foreach ($this->errors as $errmsg) {
4045 dol_syslog(get_class($this).
"::delete ".$errmsg, LOG_ERR);
4046 $this->errors[] = ($this->errors ?
', '.$errmsg : $errmsg);
4048 $this->db->rollback();
4051 $this->errors[] = $this->db->error();
4052 $this->db->rollback();
4064 global $conf, $user;
4071 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element.
" SET";
4072 $sql .=
" description='".$this->db->escape($this->desc).
"'";
4073 $sql .=
", ref='".$this->db->escape($this->ref_supplier).
"'";
4074 $sql .=
", subprice='".price2num($this->subprice).
"'";
4076 $sql .=
", remise_percent='".price2num($this->remise_percent).
"'";
4078 $sql .=
", vat_src_code = '".(empty($this->vat_src_code) ?
'' : $this->vat_src_code).
"'";
4079 $sql .=
", tva_tx='".price2num($this->tva_tx).
"'";
4080 $sql .=
", localtax1_tx='".price2num($this->localtax1_tx).
"'";
4081 $sql .=
", localtax2_tx='".price2num($this->localtax2_tx).
"'";
4082 $sql .=
", localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
4083 $sql .=
", localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
4084 $sql .=
", qty='".price2num($this->qty).
"'";
4085 $sql .=
", date_start=".(!empty($this->date_start) ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
4086 $sql .=
", date_end=".(!empty($this->date_end) ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
4087 $sql .=
", info_bits='".$this->db->escape($this->info_bits).
"'";
4088 $sql .=
", total_ht='".price2num($this->total_ht).
"'";
4089 $sql .=
", total_tva='".price2num($this->total_tva).
"'";
4090 $sql .=
", total_localtax1='".price2num($this->total_localtax1).
"'";
4091 $sql .=
", total_localtax2='".price2num($this->total_localtax2).
"'";
4092 $sql .=
", total_ttc='".price2num($this->total_ttc).
"'";
4093 $sql .=
", product_type=".$this->product_type;
4094 $sql .=
", special_code=".(!empty($this->special_code) ? $this->special_code : 0);
4095 $sql .= ($this->fk_unit ?
", fk_unit='".$this->db->escape($this->fk_unit).
"'" :
", fk_unit=null");
4098 $sql .=
", multicurrency_subprice=".price2num($this->multicurrency_subprice);
4099 $sql .=
", multicurrency_total_ht=".price2num($this->multicurrency_total_ht);
4100 $sql .=
", multicurrency_total_tva=".price2num($this->multicurrency_total_tva);
4101 $sql .=
", multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc);
4103 $sql .=
" WHERE rowid = ".((int) $this->
id);
4105 dol_syslog(get_class($this).
"::updateline", LOG_DEBUG);
4106 $resql = $this->db->query($sql);
4115 if (!$error && !$notrigger) {
4117 $result = $this->
call_trigger(
'LINEORDER_SUPPLIER_MODIFY', $user);
4119 $this->db->rollback();
4126 $this->db->commit();
4129 $this->db->rollback();
4133 $this->error = $this->db->lasterror();
4134 $this->db->rollback();
4145 public function delete($notrigger = 0)
4156 $this->db->rollback();
4160 $sql1 =
"UPDATE ".MAIN_DB_PREFIX.
"commandedet SET fk_commandefourndet = NULL WHERE fk_commandefourndet=".((int) $this->
id);
4161 $resql = $this->db->query($sql1);
4163 $this->db->rollback();
4167 $sql2 =
'DELETE FROM '.MAIN_DB_PREFIX.
"commande_fournisseurdet WHERE rowid=".((int) $this->
id);
4170 $resql = $this->db->query($sql2);
4174 $result = $this->
call_trigger(
'LINEORDER_SUPPLIER_DELETE', $user);
4182 $this->db->commit();
4186 foreach ($this->errors as $errmsg) {
4187 dol_syslog(get_class($this).
"::delete ".$errmsg, LOG_ERR);
4188 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
4190 $this->db->rollback();
4193 $this->error = $this->db->lasterror();
Class to manage table commandefournisseurdispatch.
Class to manage predefined suppliers products.
const STATUS_CANCELED_AFTER_ORDER
Order canceled/never received.
const STATUS_RECEIVED_PARTIALLY
Received partially.
setDeliveryDate($user, $delivery_date, $notrigger=0)
Set the planned delivery date.
updateFromCommandeClient($user, $idc, $comclientid)
Update a supplier order from a sales order.
deleteline($idline, $notrigger=0)
Delete line.
load_state_board()
Charge indicateurs this->nb de tableau de bord.
getNomUrl($withpicto=0, $option='', $notooltip=0, $save_lastsearch_value=-1, $addlinktonotes=0)
Return clicable name (with picto eventually)
loadReceptions($filtre_statut=-1)
Load array this->receptions of lines of shipments with nb of products sent for each order line Note: ...
$fields
'type' field format ('integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortf...
refuse($user)
Refuse an order.
set_date_livraison($user, $delivery_date, $notrigger=0)
Set delivery date.
getKanbanView($option='', $arraydata=null)
Return clicable link of object (with eventually picto)
info($id)
Charge les informations d'ordre info dans l'objet facture.
const STATUS_CANCELED
Order canceled.
getNextNumRef($soc)
Returns the following order reference not used depending on the numbering model activated defined wit...
fetch_lines($only_product=0)
Load array lines.
getInputMethod()
Returns the translated input method of object (defined if $this->methode_commande_id > 0).
const STATUS_VALIDATED
Validated status.
const STATUS_RECEIVED_COMPLETELY
Received completely.
addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0, $fk_product=0, $fk_prod_fourn_price=0, $ref_supplier='', $remise_percent=0.0, $price_base_type='HT', $pu_ttc=0.0, $type=0, $info_bits=0, $notrigger=false, $date_start=null, $date_end=null, $array_options=0, $fk_unit=null, $pu_ht_devise=0, $origin='', $origin_id=0, $rang=-1, $special_code=0)
Add order line.
calcAndSetStatusDispatch(User $user, $closeopenorder=1, $comment='')
Calc status regarding to dispatched stock.
updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0, $txlocaltax2=0, $price_base_type='HT', $info_bits=0, $type=0, $notrigger=0, $date_start='', $date_end='', $array_options=0, $fk_unit=null, $pu_ht_devise=0, $ref_supplier='')
Update line.
set_id_projet($user, $id_projet, $notrigger=0)
Set the id projet.
const STATUS_DRAFT
Draft status.
showDelay()
Show the customer delayed info.
getTooltipContentArray($params)
getTooltipContentArray
approve($user, $idwarehouse=0, $secondlevel=0)
Approve a supplier order.
__construct($db)
Constructor.
Cancel($user, $idwarehouse=-1)
Cancel an approved order.
dispatchProduct($user, $product, $qty, $entrepot, $price=0, $comment='', $eatby='', $sellby='', $batch='', $fk_commandefourndet=0, $notrigger=0, $fk_reception=0)
Save a receiving into the tracking table of receiving (commande_fournisseur_dispatch) and add product...
valid($user, $idwarehouse=0, $notrigger=0)
Validate an order.
create($user, $notrigger=0)
Create order with draft status.
update(User $user, $notrigger=0)
Update Supplier Order.
createFromClone(User $user, $socid=0, $notrigger=0)
Load an object from its id and create a new one in database.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template model.
const STATUS_ACCEPTED
Accepted.
const STATUS_ORDERSENT
Order sent, shipment on process.
commande($user, $date, $methode, $comment='')
Submit a supplier order to supplier.
getRights()
Returns the rights used for this class.
load_board($user, $mode='opened')
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
getMaxDeliveryTimeDay($langs)
Return the max number delivery delay in day.
fetch($id, $ref='')
Get object and lines from database.
Livraison($user, $date, $type, $comment)
Set a delivery in database for this supplier order.
getDispachedLines($status=-1)
Return array of dispatched lines waiting to be approved for this order.
classifyBilled(User $user)
Class invoiced the supplier order.
initAsSpecimen()
Initialise an instance with random values.
static replaceProduct(DoliDB $db, $origin_id, $dest_id)
Function used to replace a product id with another one.
const SOURCE_ID_REPLENISHMENT
The constant used into source field to track the order was generated by the replenishement feature.
setStatus($user, $status)
Tag order with a particular status.
const STATUS_REFUSED
Refused.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
getLibStatut($mode=0)
Return label of the status of object.
get_methodes_commande()
Get list of order methods.
hasDelay()
Is the supplier order delayed? We suppose a purchase ordered as late if a the purchase order has been...
LibStatut($status, $mode=0, $billed=0)
Return label of a status.
Class to manage line orders.
update($notrigger=0)
Update the line object into db.
insert($notrigger=0)
Insert line into database.
fetch($rowid)
Load line order.
__construct($db)
Constructor.
Class to manage customers orders.
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
Save a new position (field rang) for details lines.
deleteEcmFiles($mode=0)
Delete related files of object in database.
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
fetch_thirdparty($force_thirdparty_id=0)
Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty.
setErrorsFromObject($object)
setErrorsFromObject
updateRangOfLine($rowid, $rang)
Update position of line (rang)
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid='', $f_user=null, $notrigger=0)
Delete all links between an object $this.
update_price($exclspec=0, $roundingadjust='none', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
deleteExtraFields()
Delete all extra fields values for the current object.
fetchObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $clause='OR', $alsosametype=1, $orderby='sourcetype', $loadalsoobjects=1)
Fetch array of objects linked to current object (object of enabled modules only).
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
static commonReplaceProduct(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a product id with another one.
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
add_contact($fk_socpeople, $type_contact, $source='external', $notrigger=0)
Add a link between element $this->element and a contact.
Superclass for orders classes.
Superclass for orders classes.
Class to manage Dolibarr database access.
Class to manage stock movements.
static getIdFromCode($dbs, $code)
Get id of currency from code.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage predefined suppliers products.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
print $langs trans("Ref").' m m m statut
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
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.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
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...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e rowid
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller='', $localtaxes_array='', $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.