38require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
39require_once DOL_DOCUMENT_ROOT.
"/core/class/commonobjectline.class.php";
40require_once DOL_DOCUMENT_ROOT.
'/core/class/commonincoterm.class.php';
41if (isModEnabled(
"propal")) {
42 require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
44if (isModEnabled(
'order')) {
45 require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
64 public $element =
"reception";
69 public $fk_element =
"fk_reception";
70 public $table_element =
"reception";
71 public $table_element_line =
"receptiondet_batch";
76 public $picto =
'dollyrevert';
82 public $tracking_number;
99 public $user_author_id;
101 public $date_delivery;
113 public $date_reception;
118 public $date_creation;
131 public $lines = array();
136 public $detail_batch;
138 const STATUS_DRAFT = 0;
139 const STATUS_VALIDATED = 1;
140 const STATUS_CLOSED = 2;
153 $this->ismultientitymanaged = 1;
164 global $langs, $conf;
165 $langs->load(
"receptions");
174 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
176 foreach ($dirmodels as $reldir) {
180 $mybool = ((bool) @include_once $dir.$file) || $mybool;
188 $obj =
new $classname();
191 $numref = $obj->getNextValue($soc, $this);
196 dol_print_error($this->db, get_class($this).
"::getNextNumRef ".$obj->error);
200 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_RECEPTION_ADDON_NUMBER_NotDefined");
212 public function create($user, $notrigger = 0)
218 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
223 if (empty($this->fk_project)) {
224 $this->fk_project = 0;
226 if (empty($this->weight_units)) {
227 $this->weight_units = 0;
229 if (empty($this->size_units)) {
230 $this->size_units = 0;
237 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"reception (";
240 $sql .=
", ref_supplier";
241 $sql .=
", date_creation";
242 $sql .=
", fk_user_author";
243 $sql .=
", date_reception";
244 $sql .=
", date_delivery";
246 $sql .=
", fk_projet";
247 $sql .=
", fk_shipping_method";
248 $sql .=
", tracking_number";
253 $sql .=
", weight_units";
254 $sql .=
", size_units";
255 $sql .=
", note_private";
256 $sql .=
", note_public";
257 $sql .=
", model_pdf";
258 $sql .=
", fk_incoterms, location_incoterms";
259 $sql .=
") VALUES (";
261 $sql .=
", ".((int) $conf->entity);
262 $sql .=
", ".($this->ref_supplier ?
"'".$this->db->escape($this->ref_supplier).
"'" :
"null");
263 $sql .=
", '".$this->db->idate($now).
"'";
264 $sql .=
", ".((int) $user->id);
265 $sql .=
", ".($this->date_reception > 0 ?
"'".$this->db->idate($this->date_reception).
"'" :
"null");
266 $sql .=
", ".($this->date_delivery > 0 ?
"'".$this->db->idate($this->date_delivery).
"'" :
"null");
267 $sql .=
", ".((int) $this->socid);
268 $sql .=
", ".((int) $this->fk_project);
269 $sql .=
", ".($this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
"null");
270 $sql .=
", '".$this->db->escape($this->tracking_number).
"'";
271 $sql .=
", ".(is_null($this->weight) ?
"NULL" : ((float) $this->weight));
272 $sql .=
", ".(is_null($this->trueDepth) ?
"NULL" : ((float) $this->trueDepth));
273 $sql .=
", ".(is_null($this->trueWidth) ?
"NULL" : ((float) $this->trueWidth));
274 $sql .=
", ".(is_null($this->trueHeight) ?
"NULL" : ((float) $this->trueHeight));
275 $sql .=
", ".(is_null($this->weight_units) ?
"NULL" : ((float) $this->weight_units));
276 $sql .=
", ".(is_null($this->size_units) ?
"NULL" : ((float) $this->size_units));
277 $sql .=
", ".(!empty($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null");
278 $sql .=
", ".(!empty($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null");
279 $sql .=
", ".(!empty($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null");
280 $sql .=
", ".(int) $this->fk_incoterms;
281 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
284 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
286 $resql = $this->db->query($sql);
289 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"reception");
291 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"reception";
292 $sql .=
" SET ref = '(PROV".((int) $this->
id).
")'";
293 $sql .=
" WHERE rowid = ".((int) $this->
id);
295 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
296 if ($this->db->query($sql)) {
298 $num = count($this->lines);
299 for ($i = 0; $i < $num; $i++) {
300 $this->lines[$i]->fk_reception = $this->id;
302 if (!$this->lines[$i]->
create($user) > 0) {
307 if (!$error && $this->
id && $this->origin_id) {
322 if (!$error && !$notrigger) {
324 $result = $this->
call_trigger(
'RECEPTION_CREATE', $user);
335 foreach ($this->errors as $errmsg) {
336 dol_syslog(get_class($this).
"::create ".$errmsg, LOG_ERR);
337 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
339 $this->db->rollback();
344 $this->error = $this->db->lasterror().
" - sql=$sql";
345 $this->db->rollback();
350 $this->error = $this->db->error().
" - sql=$sql";
351 $this->db->rollback();
366 public function fetch($id, $ref =
'', $ref_ext =
'')
369 if (empty($id) && empty($ref) && empty($ref_ext)) {
373 $sql =
"SELECT e.rowid, e.entity, e.ref, e.fk_soc as socid, e.date_creation, e.ref_supplier, e.ref_ext, e.fk_user_author, e.fk_statut as status, e.billed";
374 $sql .=
", e.weight, e.weight_units, e.size, e.size_units, e.width, e.height";
375 $sql .=
", e.date_reception as date_reception, e.model_pdf, e.date_delivery";
376 $sql .=
", e.fk_shipping_method, e.tracking_number";
377 $sql .=
", el.fk_source as origin_id, el.sourcetype as origin";
378 $sql .=
", e.note_private, e.note_public";
379 $sql .=
', e.fk_incoterms, e.location_incoterms';
380 $sql .=
', i.libelle as label_incoterms';
381 $sql .=
" FROM ".MAIN_DB_PREFIX.
"reception as e";
382 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"element_element as el ON el.fk_target = e.rowid AND el.targettype = '".$this->db->escape($this->element).
"' AND el.sourcetype = 'order_supplier'";
383 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON e.fk_incoterms = i.rowid';
384 $sql .=
" WHERE e.entity IN (".getEntity(
'reception').
")";
386 $sql .=
" AND e.rowid = ".((int) $id);
389 $sql .=
" AND e.ref = '".$this->db->escape($ref).
"'";
392 $sql .=
" AND e.ref_ext = '".$this->db->escape($ref_ext).
"'";
395 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
396 $result = $this->db->query($sql);
398 if ($this->db->num_rows($result)) {
399 $obj = $this->db->fetch_object($result);
401 $this->
id = $obj->rowid;
402 $this->entity = $obj->entity;
403 $this->
ref = $obj->ref;
404 $this->socid = $obj->socid;
405 $this->ref_supplier = $obj->ref_supplier;
406 $this->ref_ext = $obj->ref_ext;
407 $this->
statut = $obj->status;
408 $this->
status = $obj->status;
409 $this->billed = $obj->billed;
411 $this->user_author_id = $obj->fk_user_author;
412 $this->date_creation = $this->db->jdate($obj->date_creation);
413 $this->date = $this->db->jdate($obj->date_reception);
414 $this->date_reception = $this->db->jdate($obj->date_reception);
415 $this->date_delivery = $this->db->jdate($obj->date_delivery);
416 $this->model_pdf = $obj->model_pdf;
417 $this->shipping_method_id = $obj->fk_shipping_method;
418 $this->tracking_number = $obj->tracking_number;
419 $this->origin = ($obj->origin ? $obj->origin :
'commande');
420 $this->origin_type = ($obj->origin ? $obj->origin :
'commande');
421 $this->origin_id = $obj->origin_id;
423 $this->trueWeight = $obj->weight;
424 $this->weight_units = $obj->weight_units;
426 $this->trueWidth = $obj->width;
427 $this->width_units = $obj->size_units;
428 $this->trueHeight = $obj->height;
429 $this->height_units = $obj->size_units;
430 $this->trueDepth = $obj->size;
431 $this->depth_units = $obj->size_units;
433 $this->note_public = $obj->note_public;
434 $this->note_private = $obj->note_private;
437 $this->trueSize = $obj->size.
"x".$obj->width.
"x".$obj->height;
438 $this->size_units = $obj->size_units;
441 $this->fk_incoterms = $obj->fk_incoterms;
442 $this->location_incoterms = $obj->location_incoterms;
443 $this->label_incoterms = $obj->label_incoterms;
445 $this->db->free($result);
461 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
463 $extrafields->fetch_name_optionals_label($this->table_element,
true);
476 dol_syslog(get_class($this).
'::Fetch no reception found', LOG_ERR);
477 $this->error =
'Reception with id '.$id.
' not found';
481 $this->error = $this->db->error();
493 public function valid($user, $notrigger = 0)
495 global $conf, $langs;
497 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
503 dol_syslog(get_class($this).
"::valid no draft status", LOG_WARNING);
507 if (!((!
getDolGlobalInt(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'reception',
'creer'))
508 || (
getDolGlobalInt(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'reception',
'reception_advance',
'validate')))) {
509 $this->error =
'Permission denied';
510 dol_syslog(get_class($this).
"::valid ".$this->error, LOG_ERR);
520 $soc->fetch($this->socid);
524 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
527 $numref = $this->ref;
535 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"reception SET";
536 $sql .=
" ref='".$this->db->escape($numref).
"'";
537 $sql .=
", fk_statut = 1";
538 $sql .=
", date_valid = '".$this->db->idate($now).
"'";
539 $sql .=
", fk_user_valid = ".$user->id;
540 $sql .=
" WHERE rowid = ".((int) $this->
id);
541 dol_syslog(get_class($this).
"::valid update reception", LOG_DEBUG);
542 $resql = $this->db->query($sql);
544 $this->error = $this->db->lasterror();
549 if (!$error && isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_RECEPTION')) {
550 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
552 $langs->load(
"agenda");
556 $sql =
"SELECT cd.fk_product, cd.subprice, cd.remise_percent,";
557 $sql .=
" ed.rowid, ed.qty, ed.fk_entrepot,";
558 $sql .=
" ed.eatby, ed.sellby, ed.batch,";
559 $sql .=
" ed.cost_price";
560 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseurdet as cd,";
561 $sql .=
" ".MAIN_DB_PREFIX.
"receptiondet_batch as ed";
562 $sql .=
" WHERE ed.fk_reception = ".((int) $this->
id);
563 $sql .=
" AND cd.rowid = ed.fk_elementdet";
565 dol_syslog(get_class($this).
"::valid select details", LOG_DEBUG);
566 $resql = $this->db->query($sql);
568 $cpt = $this->db->num_rows($resql);
569 for ($i = 0; $i < $cpt; $i++) {
570 $obj = $this->db->fetch_object($resql);
574 if ($qty == 0 || ($qty < 0 && !
getDolGlobalInt(
'RECEPTION_ALLOW_NEGATIVE_QTY'))) {
577 dol_syslog(get_class($this).
"::valid movement index ".$i.
" ed.rowid=".$obj->rowid);
581 $mouvS->origin = &$this;
582 $mouvS->setOrigin($this->element, $this->
id);
584 if (empty($obj->batch)) {
589 $result = $mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->cost_price, $langs->trans(
"ReceptionValidatedInDolibarr", $numref),
'',
'',
'',
'', 0, $inventorycode);
591 if (intval($result) < 0) {
593 $this->errors[] = $mouvS->error;
594 $this->errors = array_merge($this->errors, $mouvS->errors);
603 $result = $mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->cost_price, $langs->trans(
"ReceptionValidatedInDolibarr", $numref), $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch,
'', 0, $inventorycode);
605 if (intval($result) < 0) {
607 $this->errors[] = $mouvS->error;
608 $this->errors = array_merge($this->errors, $mouvS->errors);
614 $this->db->rollback();
615 $this->error = $this->db->error();
628 $ret = $this->origin_object->Livraison($user,
dol_now(),
'tot',
'');
631 $this->errors = array_merge($this->errors, $this->origin_object->errors);
634 $ret = $this->
setStatut($status, $this->origin_id,
'commande_fournisseur', $trigger_key);
642 if (!$error && !$notrigger) {
644 $result = $this->
call_trigger(
'RECEPTION_VALIDATE', $user);
652 $this->oldref = $this->ref;
655 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
657 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'reception/".$this->db->escape($this->newref).
"'";
658 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'reception/".$this->db->escape($this->
ref).
"' AND entity = ".((int) $conf->entity);
659 $resql = $this->db->query($sql);
662 $this->error = $this->db->lasterror();
664 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'reception/".$this->db->escape($this->newref).
"'";
665 $sql .=
" WHERE filepath = 'reception/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
666 $resql = $this->db->query($sql);
669 $this->error = $this->db->lasterror();
675 $dirsource = $conf->reception->dir_output.
'/'.$oldref;
676 $dirdest = $conf->reception->dir_output.
'/'.$newref;
677 if (!$error && file_exists($dirsource)) {
678 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
680 if (@rename($dirsource, $dirdest)) {
683 $listoffiles =
dol_dir_list($conf->reception->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
684 foreach ($listoffiles as $fileentry) {
685 $dirsource = $fileentry[
'name'];
686 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
687 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
688 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
689 @rename($dirsource, $dirdest);
698 $this->
ref = $numref;
699 $this->
statut = self::STATUS_VALIDATED;
700 $this->
status = self::STATUS_VALIDATED;
707 foreach ($this->errors as $errmsg) {
708 dol_syslog(get_class($this).
"::valid ".$errmsg, LOG_ERR);
709 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
711 $this->db->rollback();
723 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
724 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.dispatch.class.php';
728 if (!empty($this->origin) && $this->origin_id > 0 && ($this->origin ==
'order_supplier' || $this->origin ==
'commandeFournisseur')) {
729 if (empty($this->origin_object)) {
731 if ($this->origin_object instanceof
CommonObject && empty($this->origin_object->lines)) {
732 $res = $this->origin_object->fetch_lines();
733 $this->commandeFournisseur =
null;
737 } elseif ($this->origin_object instanceof
CommandeFournisseur && empty($this->origin_object->lines)) {
738 $res = $this->origin_object->fetch_lines();
746 $qty_received = array();
747 $qty_wished = array();
750 $filter = array(
't.fk_element' => $this->origin_id);
752 $filter[
't.status'] = 1;
755 $ret = $supplierorderdispatch->fetchAll(
'',
'', 0, 0, $filter);
757 $this->error = $supplierorderdispatch->error;
758 $this->errors = $supplierorderdispatch->errors;
762 foreach ($supplierorderdispatch->lines as $dispatch_line) {
763 if (array_key_exists($dispatch_line->fk_product, $qty_received)) {
764 $qty_received[$dispatch_line->fk_product] += $dispatch_line->qty;
766 $qty_received[$dispatch_line->fk_product] = $dispatch_line->qty;
771 foreach ($this->origin_object->lines as $origin_line) {
773 if ((!
getDolGlobalInt(
'STOCK_SUPPORTS_SERVICES') && $origin_line->product_type > 0) || $origin_line->product_type > 1) {
777 $qty_wished[$origin_line->fk_product] += $origin_line->qty;
781 $diff_array = array_diff_assoc($qty_received, $qty_wished);
782 $keys_in_wished_not_in_received = array_diff(array_keys($qty_wished), array_keys($qty_received));
783 $keys_in_received_not_in_wished = array_diff(array_keys($qty_received), array_keys($qty_wished));
785 if (count($diff_array) == 0 && count($keys_in_wished_not_in_received) == 0 && count($keys_in_received_not_in_wished) == 0) {
791 if (count($diff_array) > 0) {
794 foreach ($diff_array as $key => $value) {
796 if ($qty_received[$key] >= $qty_wished[$key]) {
802 if ($close == count($diff_array)) {
829 public function addline($entrepot_id, $id, $qty, $array_options = [], $comment =
'', $eatby =
null, $sellby =
null, $batch =
'', $cost_price = 0)
831 global $conf, $langs, $user;
833 $num = count($this->lines);
836 $line->fk_entrepot = $entrepot_id;
837 $line->fk_commandefourndet = $id;
841 $result = $supplierorderline->fetch($id);
843 $this->error = $supplierorderline->error;
844 $this->errors = $supplierorderline->errors;
849 if (isModEnabled(
'stock') && !empty($supplierorderline->fk_product)) {
850 $fk_product = $supplierorderline->fk_product;
852 if (!($entrepot_id > 0) && !
getDolGlobalInt(
'STOCK_WAREHOUSE_NOT_REQUIRED_FOR_RECEPTIONS')) {
853 $langs->load(
"errors");
854 $this->error = $langs->trans(
"ErrorWarehouseRequiredIntoReceptionLine");
860 $product =
new Product($this->db);
861 $product->fetch($fk_product);
862 if (isModEnabled(
'productbatch')) {
863 $langs->load(
"errors");
864 if (!empty($product->status_batch) && empty($batch)) {
865 $this->error = $langs->trans(
'ErrorProductNeedBatchNumber', $product->ref);
867 } elseif (empty($product->status_batch) && !empty($batch)) {
868 $this->error = $langs->trans(
'ErrorProductDoesNotNeedBatchNumber', $product->ref);
874 if (!empty($errorMsgArr)) {
875 $errorMessage =
'<b>' . $product->ref .
'</b> : ';
876 $errorMessage .=
'<ul>';
877 foreach ($errorMsgArr as $errorMsg) {
878 $errorMessage .=
'<li>' . $errorMsg .
'</li>';
880 $errorMessage .=
'</ul>';
881 $this->error = $errorMessage;
888 $line->array_options = $supplierorderline->array_options;
889 if (!
getDolGlobalInt(
'MAIN_EXTRAFIELDS_DISABLED') && is_array($array_options) && count($array_options) > 0) {
890 foreach ($array_options as $key => $value) {
891 $line->array_options[$key] = $value;
895 $line->fk_product = $fk_product;
896 $line->fk_commande = $supplierorderline->fk_commande;
897 $line->fk_user = $user->id;
898 $line->comment = $comment;
899 $line->batch = $batch;
900 $line->eatby = $eatby;
901 $line->sellby = $sellby;
903 $line->cost_price = $cost_price;
904 $line->fk_reception = $this->id;
906 $this->lines[$num] = $line;
919 public function update($user =
null, $notrigger = 0)
926 if (isset($this->
ref)) {
927 $this->
ref = trim($this->
ref);
929 if (isset($this->entity)) {
930 $this->entity = (int) $this->entity;
932 if (isset($this->ref_supplier)) {
933 $this->ref_supplier = trim($this->ref_supplier);
935 if (isset($this->socid)) {
936 $this->socid = trim($this->socid);
938 if (isset($this->fk_user_author)) {
939 $this->fk_user_author = (int) $this->fk_user_author;
941 if (isset($this->fk_user_valid)) {
942 $this->fk_user_valid = (int) $this->fk_user_valid;
944 if (isset($this->shipping_method_id)) {
945 $this->shipping_method_id = (int) $this->shipping_method_id;
947 if (isset($this->tracking_number)) {
948 $this->tracking_number = trim($this->tracking_number);
950 if (isset($this->
statut)) {
953 if (isset($this->trueDepth)) {
954 $this->trueDepth = trim($this->trueDepth);
956 if (isset($this->trueWidth)) {
957 $this->trueWidth = trim($this->trueWidth);
959 if (isset($this->trueHeight)) {
960 $this->trueHeight = trim($this->trueHeight);
962 if (isset($this->size_units)) {
963 $this->size_units = trim((
string) $this->size_units);
965 if (isset($this->weight_units)) {
966 $this->weight_units = trim((
string) $this->weight_units);
968 if (isset($this->trueWeight)) {
969 $this->weight = trim((
string) $this->trueWeight);
971 if (isset($this->note_private)) {
972 $this->note_private = trim($this->note_private);
974 if (isset($this->note_public)) {
975 $this->note_public = trim($this->note_public);
977 if (isset($this->model_pdf)) {
978 $this->model_pdf = trim($this->model_pdf);
986 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"reception SET";
988 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
989 $sql .=
" ref_supplier=".(isset($this->ref_supplier) ?
"'".$this->db->escape($this->ref_supplier).
"'" :
"null").
",";
990 $sql .=
" fk_soc=".(isset($this->socid) ? $this->socid :
"null").
",";
991 $sql .=
" date_creation=".(dol_strlen($this->date_creation) != 0 ?
"'".$this->db->idate($this->date_creation).
"'" :
'null').
",";
992 $sql .=
" fk_user_author=".(isset($this->fk_user_author) ? $this->fk_user_author :
"null").
",";
993 $sql .=
" date_valid=".(dol_strlen($this->date_valid) != 0 ?
"'".$this->db->idate($this->date_valid).
"'" :
'null').
",";
994 $sql .=
" fk_user_valid=".(isset($this->fk_user_valid) ? $this->fk_user_valid :
"null").
",";
995 $sql .=
" date_reception=".(dol_strlen($this->date_reception) != 0 ?
"'".$this->db->idate($this->date_reception).
"'" :
'null').
",";
996 $sql .=
" date_delivery=".(dol_strlen($this->date_delivery) != 0 ?
"'".$this->db->idate($this->date_delivery).
"'" :
'null').
",";
997 $sql .=
" fk_shipping_method=".((isset($this->shipping_method_id) && $this->shipping_method_id > 0) ? $this->shipping_method_id :
"null").
",";
998 $sql .=
" tracking_number=".(isset($this->tracking_number) ?
"'".$this->db->escape($this->tracking_number).
"'" :
"null").
",";
999 $sql .=
" fk_statut=".(isset($this->
statut) ? $this->
statut :
"null").
",";
1000 $sql .=
" height=".(($this->trueHeight !=
'') ? $this->trueHeight :
"null").
",";
1001 $sql .=
" width=".(($this->trueWidth !=
'') ? $this->trueWidth :
"null").
",";
1002 $sql .=
" size_units=".(isset($this->size_units) ? $this->size_units :
"null").
",";
1003 $sql .=
" size=".(($this->trueDepth !=
'') ? $this->trueDepth :
"null").
",";
1004 $sql .=
" weight_units=".(isset($this->weight_units) ? $this->weight_units :
"null").
",";
1005 $sql .=
" weight=".(($this->trueWeight !=
'') ? $this->trueWeight :
"null").
",";
1006 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
1007 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
1008 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
1009 $sql .=
" entity = ".((int) $conf->entity);
1010 $sql .=
" WHERE rowid=".((int) $this->
id);
1014 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
1015 $resql = $this->db->query($sql);
1018 $this->errors[] =
"Error ".$this->db->lasterror();
1024 $result = $this->
call_trigger(
'RECEPTION_MODIFY', $user);
1034 foreach ($this->errors as $errmsg) {
1035 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1036 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1038 $this->db->rollback();
1041 $this->db->commit();
1054 global $conf, $langs, $user;
1055 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1064 if (isModEnabled(
'stock') && ((
getDolGlobalInt(
'STOCK_CALCULATE_ON_RECEPTION') && $this->
status > self::STATUS_DRAFT) || (
getDolGlobalInt(
'STOCK_CALCULATE_ON_RECEPTION_CLOSE') && $this->
status == self::STATUS_CLOSED))) {
1065 require_once DOL_DOCUMENT_ROOT.
"/product/stock/class/mouvementstock.class.php";
1067 $langs->load(
"agenda");
1070 $sql =
"SELECT cd.fk_product, cd.subprice, ed.qty, ed.fk_entrepot, ed.eatby, ed.sellby, ed.batch, ed.rowid as receptiondet_batch_id";
1071 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseurdet as cd,";
1072 $sql .=
" ".MAIN_DB_PREFIX.
"receptiondet_batch as ed";
1073 $sql .=
" WHERE ed.fk_reception = ".((int) $this->
id);
1074 $sql .=
" AND cd.rowid = ed.fk_elementdet";
1076 dol_syslog(get_class($this).
"::delete select details", LOG_DEBUG);
1077 $resql = $this->db->query($sql);
1079 $cpt = $this->db->num_rows($resql);
1080 for ($i = 0; $i < $cpt; $i++) {
1081 dol_syslog(get_class($this).
"::delete movement index ".$i);
1082 $obj = $this->db->fetch_object($resql);
1086 $mouvS->origin =
null;
1088 $result = $mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $obj->qty, 0, $langs->trans(
"ReceptionDeletedInDolibarr", $this->ref),
'', $obj->eatby ? $this->db->jdate($obj->eatby) :
null, $obj->sellby ? $this->db->jdate($obj->sellby) :
null, $obj->batch);
1091 $this->error = $mouvS->error;
1092 $this->errors = $mouvS->errors;
1097 $this->errors[] =
"Error ".$this->db->lasterror();
1102 $main = MAIN_DB_PREFIX.
'receptiondet_batch';
1103 $ef = $main.
"_extrafields";
1105 $sqlef =
"DELETE FROM ".$ef.
" WHERE fk_object IN (SELECT rowid FROM ".$main.
" WHERE fk_reception = ".((int) $this->
id).
")";
1107 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"receptiondet_batch";
1108 $sql .=
" WHERE fk_reception = ".((int) $this->
id);
1110 if ($this->db->query($sqlef) && $this->db->query($sql)) {
1118 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"reception";
1119 $sql .=
" WHERE rowid = ".((int) $this->
id);
1121 if ($this->db->query($sql)) {
1123 $result = $this->
call_trigger(
'RECEPTION_DELETE', $user);
1129 if (!empty($this->origin) && $this->origin_id > 0) {
1131 if ($this->origin_object->statut == 4) {
1133 $this->origin_object->loadReceptions();
1135 if (count($this->origin_object->receptions) <= 0) {
1136 $this->origin_object->setStatut(3);
1142 $this->db->commit();
1146 if (!empty($conf->reception->dir_output)) {
1147 $dir = $conf->reception->dir_output.
'/'.$ref;
1148 $file = $dir.
'/'.$ref.
'.pdf';
1149 if (file_exists($file)) {
1154 if (file_exists($dir)) {
1156 $this->error = $langs->trans(
"ErrorCanNotDeleteDir", $dir);
1164 $this->db->rollback();
1168 $this->error = $this->db->lasterror().
" - sql=$sql";
1169 $this->db->rollback();
1173 $this->error = $this->db->lasterror().
" - sql=$sql";
1174 $this->db->rollback();
1178 $this->error = $this->db->lasterror().
" - sql=$sql";
1179 $this->db->rollback();
1183 $this->db->rollback();
1197 $this->lines = array();
1199 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.dispatch.class.php';
1201 $sql =
"SELECT rowid FROM ".MAIN_DB_PREFIX.
"receptiondet_batch";
1202 $sql .=
" WHERE fk_reception = ".((int) $this->
id);
1204 $resql = $this->db->query($sql);
1206 if (!empty($resql)) {
1207 while ($obj = $this->db->fetch_object($resql)) {
1210 $line->fetch($obj->rowid);
1213 $line->fetch_product();
1215 $sql_commfourndet =
'SELECT qty, ref, label, description, tva_tx, vat_src_code, subprice, multicurrency_subprice, remise_percent, total_ht, total_ttc, total_tva';
1216 $sql_commfourndet .=
' FROM '.MAIN_DB_PREFIX.
'commande_fournisseurdet';
1217 $sql_commfourndet .=
' WHERE rowid = '.((int) $line->fk_commandefourndet);
1218 $sql_commfourndet .=
' ORDER BY rang';
1220 $resql_commfourndet = $this->db->query($sql_commfourndet);
1221 if (!empty($resql_commfourndet)) {
1222 $obj = $this->db->fetch_object($resql_commfourndet);
1223 $line->qty_asked = $obj->qty;
1224 $line->description = $obj->description;
1225 $line->desc = $obj->description;
1226 $line->tva_tx = $obj->tva_tx;
1227 $line->vat_src_code = $obj->vat_src_code;
1228 $line->subprice = $obj->subprice;
1229 $line->multicurrency_subprice = $obj->multicurrency_subprice;
1230 $line->remise_percent = $obj->remise_percent;
1231 $line->label = !empty($obj->label) ? $obj->label : (is_object($line->product) ? $line->product->label :
'');
1232 $line->ref_supplier = $obj->ref;
1233 $line->total_ht = $obj->total_ht;
1234 $line->total_ttc = $obj->total_ttc;
1235 $line->total_tva = $obj->total_tva;
1237 $line->qty_asked = 0;
1238 $line->description =
'';
1240 $line->label = $obj->label;
1243 $pu_ht = ($line->subprice * $line->qty) * (100 - $line->remise_percent) / 100;
1244 $tva = $pu_ht * $line->tva_tx / 100;
1245 $this->total_ht += $pu_ht;
1246 $this->total_tva += $pu_ht * $line->tva_tx / 100;
1248 $this->total_ttc += $pu_ht + $tva;
1250 if (isModEnabled(
'productbatch') && !empty($line->batch)) {
1252 $detail_batch->eatby = $line->eatby;
1253 $detail_batch->sellby = $line->sellby;
1254 $detail_batch->batch = $line->batch;
1255 $detail_batch->qty = $line->qty;
1257 $line->detail_batch[] = $detail_batch;
1260 $this->lines[] = $line;
1279 public function getNomUrl($withpicto = 0, $option = 0, $max = 0, $short = 0, $notooltip = 0)
1281 global $langs, $hookmanager;
1284 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"Reception").
'</u>';
1285 $label .=
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1286 $label .=
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.($this->ref_supplier ? $this->ref_supplier :
'');
1288 $url = DOL_URL_ROOT.
'/reception/card.php?id='.$this->id;
1295 if (empty($notooltip)) {
1297 $label = $langs->trans(
"Reception");
1298 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
1300 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
1301 $linkclose .=
' class="classfortooltip"';
1304 $linkstart =
'<a href="'.$url.
'"';
1305 $linkstart .= $linkclose.
'>';
1308 $result .= $linkstart;
1310 $result .=
img_object(($notooltip ?
'' : $label), $this->picto,
'', 0, 0, $notooltip ? 0 : 1);
1312 if ($withpicto != 2) {
1313 $result .= $this->ref;
1316 $result .= $linkend;
1319 $hookmanager->initHooks(array($this->element .
'dao'));
1320 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1321 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1323 $result = $hookmanager->resPrint;
1325 $result .= $hookmanager->resPrint;
1355 $this->labelStatus[-1] =
'StatusReceptionCanceled';
1356 $this->labelStatus[0] =
'StatusReceptionDraft';
1358 $this->labelStatus[1] =
'StatusReceptionValidated';
1360 $this->labelStatus[1] =
'StatusReceptionValidatedReceived';
1363 $this->labelStatus[1] =
'StatusReceptionValidatedToReceive';
1365 $this->labelStatus[2] =
'StatusReceptionProcessed';
1368 $this->labelStatusShort[-1] =
'StatusReceptionCanceledShort';
1369 $this->labelStatusShort[0] =
'StatusReceptionDraftShort';
1370 $this->labelStatusShort[1] =
'StatusReceptionValidatedShort';
1371 $this->labelStatusShort[2] =
'StatusReceptionProcessedShort';
1373 $labelStatus = $langs->transnoentitiesnoconv($this->labelStatus[$status]);
1374 $labelStatusShort = $langs->transnoentitiesnoconv($this->labelStatusShort[$status]);
1376 $statusType =
'status'.$status;
1377 if ($status == self::STATUS_VALIDATED) {
1378 $statusType =
'status4';
1380 if ($status == self::STATUS_CLOSED) {
1381 $statusType =
'status6';
1384 return dolGetStatus($labelStatus, $labelStatusShort,
'', $statusType, $mode);
1396 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
1398 $return =
'<div class="box-flex-item box-flex-grow-zero">';
1399 $return .=
'<div class="info-box info-box-sm">';
1400 $return .=
'<div class="info-box-icon bg-infobox-action">';
1402 $return .=
'</div>';
1403 $return .=
'<div class="info-box-content">';
1404 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
1405 if ($selected >= 0) {
1406 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1408 if (property_exists($this,
'thirdparty') && is_object($this->thirdparty)) {
1409 $return .=
'<br><div class="info-box-ref tdoverflowmax150">'.$this->thirdparty->getNomUrl(1).
'</div>';
1414 if (method_exists($this,
'getLibStatut')) {
1415 $return .=
'<div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
1417 $return .=
'</div>';
1418 $return .=
'</div>';
1419 $return .=
'</div>';
1435 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
1436 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.dispatch.class.php';
1439 dol_syslog(get_class($this).
"::initAsSpecimen");
1442 $order->initAsSpecimen();
1446 $this->
ref =
'SPECIMEN';
1447 $this->specimen = 1;
1451 $this->date_creation = $now;
1452 $this->date_valid = $now;
1453 $this->date_delivery = $now;
1454 $this->date_reception = $now + 24 * 3600;
1456 $this->entrepot_id = 0;
1459 $this->origin_id = 1;
1460 $this->origin_type =
'supplier_order';
1461 $this->origin_object = $order;
1463 $this->note_private =
'Private note';
1464 $this->note_public =
'Public note';
1466 $this->tracking_number =
'TRACKID-ABC123';
1468 $this->fk_incoterms = 1;
1472 while ($xnbp < $nbp) {
1474 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
1475 $line->libelle = $langs->trans(
"Description").
" ".$xnbp;
1476 $line->label = $langs->trans(
"Description").
" ".$xnbp;
1479 $line->fk_product = $this->origin_object->lines[$xnbp]->fk_product;
1481 $this->lines[] = $line;
1498 if ($user->hasRight(
'reception',
'creer')) {
1499 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"reception";
1500 $sql .=
" SET date_delivery = ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1501 $sql .=
" WHERE rowid = ".((int) $this->
id);
1503 dol_syslog(get_class($this).
"::setDeliveryDate", LOG_DEBUG);
1504 $resql = $this->db->query($sql);
1506 $this->date_delivery = $delivery_date;
1509 $this->error = $this->db->error();
1527 $this->meths = array();
1529 $sql =
"SELECT em.rowid, em.code, em.libelle";
1530 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_shipment_mode as em";
1531 $sql .=
" WHERE em.active = 1";
1532 $sql .=
" ORDER BY em.libelle ASC";
1534 $resql = $this->db->query($sql);
1536 while ($obj = $this->db->fetch_object($resql)) {
1537 $label = $langs->trans(
'ReceptionMethod'.$obj->code);
1538 $this->meths[$obj->rowid] = ($label !=
'ReceptionMethod'.$obj->code ? $label : $obj->libelle);
1555 $this->listmeths = array();
1558 $sql =
"SELECT em.rowid, em.code, em.libelle, em.description, em.tracking, em.active";
1559 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_shipment_mode as em";
1561 $sql .=
" WHERE em.rowid = ".((int) $id);
1564 $resql = $this->db->query($sql);
1566 while ($obj = $this->db->fetch_object($resql)) {
1567 $this->listmeths[$i][
'rowid'] = $obj->rowid;
1568 $this->listmeths[$i][
'code'] = $obj->code;
1569 $label = $langs->trans(
'ReceptionMethod'.$obj->code);
1570 $this->listmeths[$i][
'libelle'] = ($label !=
'ReceptionMethod'.$obj->code ? $label : $obj->libelle);
1571 $this->listmeths[$i][
'description'] = $obj->description;
1572 $this->listmeths[$i][
'tracking'] = $obj->tracking;
1573 $this->listmeths[$i][
'active'] = $obj->active;
1587 if (!empty($this->shipping_method_id)) {
1588 $sql =
"SELECT em.code, em.tracking";
1589 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_shipment_mode as em";
1590 $sql .=
" WHERE em.rowid = ".((int) $this->shipping_method_id);
1592 $resql = $this->db->query($sql);
1594 if ($obj = $this->db->fetch_object($resql)) {
1595 $tracking = $obj->tracking;
1600 if (!empty($tracking) && !empty($value)) {
1601 $url = str_replace(
'{TRACKID}', $value, $tracking);
1602 $this->tracking_url = sprintf(
'<a target="_blank" rel="noopener noreferrer" href="%s">%s</a>', $url, ($value ? $value :
'url'));
1604 $this->tracking_url = $value;
1615 global $conf, $langs, $user;
1620 if ($this->
statut == Reception::STATUS_CLOSED) {
1621 dol_syslog(get_class($this).
"::setClosed already in closed status", LOG_WARNING);
1627 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'reception SET fk_statut = '.self::STATUS_CLOSED;
1628 $sql .=
" WHERE rowid = ".((int) $this->
id).
' AND fk_statut > 0';
1630 $resql = $this->db->query($sql);
1633 if ($this->origin ==
'order_supplier' && $this->origin_id > 0) {
1634 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
1637 $order->fetch($this->origin_id);
1639 $order->loadReceptions(self::STATUS_CLOSED);
1641 $receptions_match_order = 1;
1642 foreach ($order->lines as $line) {
1643 $lineid = $line->id;
1645 if (($line->product_type == 0 ||
getDolGlobalInt(
'STOCK_SUPPORTS_SERVICES')) && $order->receptions[$lineid] < $qty) {
1646 $receptions_match_order = 0;
1647 $text =
'Qty for order line id '.$lineid.
' is '.$qty.
'. However in the receptions with status Reception::STATUS_CLOSED='.self::STATUS_CLOSED.
' we have qty = '.$order->receptions[$lineid].
', so we can t close order';
1652 if ($receptions_match_order) {
1653 dol_syslog(
"Qty for the ".count($order->lines).
" lines of order have same value for receptions with status Reception::STATUS_CLOSED=".self::STATUS_CLOSED.
', so we close order');
1654 $order->Livraison($user,
dol_now(),
'tot',
'Reception '.$this->
ref);
1658 $this->
statut = self::STATUS_CLOSED;
1659 $this->
status = self::STATUS_CLOSED;
1662 if (!$error && isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_RECEPTION_CLOSE')) {
1663 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
1665 $langs->load(
"agenda");
1669 $sql =
"SELECT cd.fk_product, cd.subprice,";
1670 $sql .=
" ed.rowid, ed.qty, ed.fk_entrepot,";
1671 $sql .=
" ed.eatby, ed.sellby, ed.batch,";
1672 $sql .=
" ed.cost_price";
1673 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseurdet as cd,";
1674 $sql .=
" ".MAIN_DB_PREFIX.
"receptiondet_batch as ed";
1675 $sql .=
" WHERE ed.fk_reception = ".((int) $this->
id);
1676 $sql .=
" AND cd.rowid = ed.fk_elementdet";
1678 dol_syslog(get_class($this).
"::valid select details", LOG_DEBUG);
1679 $resql = $this->db->query($sql);
1682 $cpt = $this->db->num_rows($resql);
1683 for ($i = 0; $i < $cpt; $i++) {
1684 $obj = $this->db->fetch_object($resql);
1691 dol_syslog(get_class($this).
"::valid movement index ".$i.
" ed.rowid=".$obj->rowid.
" edb.rowid=".$obj->edbrowid);
1694 $mouvS->origin = &$this;
1695 $mouvS->setOrigin($this->element, $this->
id);
1697 if (empty($obj->batch)) {
1701 $inventorycode =
'';
1702 $result = $mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->cost_price, $langs->trans(
"ReceptionClassifyClosedInDolibarr", $this->ref),
'',
'',
'',
'', 0, $inventorycode);
1704 $this->error = $mouvS->error;
1705 $this->errors = $mouvS->errors;
1713 $inventorycode =
'';
1714 $result = $mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->cost_price, $langs->trans(
"ReceptionClassifyClosedInDolibarr", $this->ref), $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch,
'', 0, $inventorycode);
1717 $this->error = $mouvS->error;
1718 $this->errors = $mouvS->errors;
1725 $this->error = $this->db->lasterror();
1732 $result = $this->
call_trigger(
'RECEPTION_CLOSED', $user);
1743 $this->db->commit();
1746 $this->
statut = self::STATUS_VALIDATED;
1747 $this->
status = self::STATUS_VALIDATED;
1748 $this->db->rollback();
1765 if ($this->
statut == Reception::STATUS_VALIDATED) {
1770 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'reception SET billed=1';
1771 $sql .=
" WHERE rowid = ".((int) $this->
id).
' AND fk_statut > 0';
1773 $resql = $this->db->query($sql);
1778 $result = $this->
call_trigger(
'RECEPTION_BILLED', $user);
1785 $this->errors[] = $this->db->lasterror;
1788 if (empty($error)) {
1789 $this->db->commit();
1792 $this->db->rollback();
1804 global $conf, $langs, $user;
1810 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'reception SET fk_statut=1, billed=0';
1811 $sql .=
" WHERE rowid = ".((int) $this->
id).
' AND fk_statut > 0';
1813 $resql = $this->db->query($sql);
1815 $this->
statut = self::STATUS_VALIDATED;
1816 $this->
status = self::STATUS_VALIDATED;
1820 if (!$error && isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_RECEPTION_CLOSE')) {
1821 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
1822 $numref = $this->ref;
1823 $langs->load(
"agenda");
1827 $sql =
"SELECT ed.fk_product, cd.subprice,";
1828 $sql .=
" ed.rowid, ed.qty, ed.fk_entrepot,";
1829 $sql .=
" ed.eatby, ed.sellby, ed.batch,";
1830 $sql .=
" ed.cost_price";
1831 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseurdet as cd,";
1832 $sql .=
" ".MAIN_DB_PREFIX.
"receptiondet_batch as ed";
1833 $sql .=
" WHERE ed.fk_reception = ".((int) $this->
id);
1834 $sql .=
" AND cd.rowid = ed.fk_elementdet";
1836 dol_syslog(get_class($this).
"::valid select details", LOG_DEBUG);
1837 $resql = $this->db->query($sql);
1839 $cpt = $this->db->num_rows($resql);
1840 for ($i = 0; $i < $cpt; $i++) {
1841 $obj = $this->db->fetch_object($resql);
1849 dol_syslog(get_class($this).
"::reopen reception movement index ".$i.
" ed.rowid=".$obj->rowid);
1853 $mouvS->origin = &$this;
1854 $mouvS->setOrigin($this->element, $this->
id);
1856 if (empty($obj->batch)) {
1860 $inventorycode =
'';
1861 $result = $mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->cost_price, $langs->trans(
"ReceptionUnClassifyCloseddInDolibarr", $numref),
'',
'',
'',
'', 0, $inventorycode);
1864 $this->error = $mouvS->error;
1865 $this->errors = $mouvS->errors;
1873 $inventorycode =
'';
1874 $result = $mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->cost_price, $langs->trans(
"ReceptionUnClassifyCloseddInDolibarr", $numref),
'', $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch, $obj->fk_origin_stock, $inventorycode);
1876 $this->error = $mouvS->error;
1877 $this->errors = $mouvS->errors;
1884 $this->error = $this->db->lasterror();
1891 $result = $this->
call_trigger(
'RECEPTION_REOPEN', $user);
1897 if (!$error && $this->origin ==
'order_supplier') {
1898 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
1901 $commande->fetch($this->origin_id);
1902 $result = $commande->setStatus($user, 4);
1905 $this->error = $commande->error;
1906 $this->errors = $commande->errors;
1911 $this->errors[] = $this->db->lasterror();
1915 $this->db->commit();
1918 $this->db->rollback();
1932 global $conf, $langs;
1937 if ($this->
statut <= self::STATUS_DRAFT) {
1941 if (!((!
getDolGlobalInt(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'reception',
'creer'))
1942 || (
getDolGlobalInt(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'reception',
'reception_advance',
'validate')))) {
1943 $this->error =
'Permission denied';
1949 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"reception";
1950 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1951 $sql .=
" WHERE rowid = ".((int) $this->
id);
1954 if ($this->db->query($sql)) {
1956 if (!$error && isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_RECEPTION')) {
1957 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
1959 $langs->load(
"agenda");
1963 $sql =
"SELECT cd.fk_product, cd.subprice,";
1964 $sql .=
" ed.rowid, ed.qty, ed.fk_entrepot,";
1965 $sql .=
" ed.eatby, ed.sellby, ed.batch,";
1966 $sql .=
" ed.cost_price";
1967 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseurdet as cd,";
1968 $sql .=
" ".MAIN_DB_PREFIX.
"receptiondet_batch as ed";
1969 $sql .=
" WHERE ed.fk_reception = ".((int) $this->
id);
1970 $sql .=
" AND cd.rowid = ed.fk_elementdet";
1972 dol_syslog(get_class($this).
"::valid select details", LOG_DEBUG);
1973 $resql = $this->db->query($sql);
1975 $cpt = $this->db->num_rows($resql);
1976 for ($i = 0; $i < $cpt; $i++) {
1977 $obj = $this->db->fetch_object($resql);
1981 dol_syslog(get_class($this).
"::reopen reception movement index ".$i.
" ed.rowid=".$obj->rowid);
1985 $mouvS->origin = &$this;
1986 $mouvS->setOrigin($this->element, $this->
id);
1988 if (empty($obj->batch)) {
1992 $inventorycode =
'';
1993 $result = $mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->cost_price, $langs->trans(
"ReceptionBackToDraftInDolibarr", $this->ref),
'',
'',
'',
'', 0, $inventorycode);
1995 $this->error = $mouvS->error;
1996 $this->errors = $mouvS->errors;
2004 $inventorycode =
'';
2005 $result = $mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->cost_price, $langs->trans(
"ReceptionBackToDraftInDolibarr", $this->ref),
'', $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch, 0, $inventorycode);
2007 $this->error = $mouvS->error;
2008 $this->errors = $mouvS->errors;
2015 $this->error = $this->db->lasterror();
2022 $result = $this->
call_trigger(
'RECEPTION_UNVALIDATE', $user);
2027 if ($this->origin ==
'order_supplier') {
2028 if (!empty($this->origin) && $this->origin_id > 0) {
2030 if ($this->origin_object->statut == 4) {
2032 $this->origin_object->fetchObjectLinked();
2034 if (!empty($this->origin_object->linkedObjects[
'reception'])) {
2035 foreach ($this->origin_object->linkedObjects[
'reception'] as $rcption) {
2036 if ($rcption->statut > 0) {
2043 $this->origin_object->setStatut(3);
2051 $this->
statut = self::STATUS_DRAFT;
2052 $this->
status = self::STATUS_DRAFT;
2053 $this->db->commit();
2056 $this->db->rollback();
2060 $this->error = $this->db->error();
2061 $this->db->rollback();
2076 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0)
2078 global $conf, $langs;
2080 $langs->load(
"receptions");
2083 $modele =
'squille';
2085 if ($this->model_pdf) {
2086 $modele = $this->model_pdf;
2092 $modelpath =
"core/modules/reception/doc/";
2096 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref);
2109 $tables = array(
'reception');
2125 'receptiondet_batch'
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Class to manage table ReceptionLineBatch.
Class to manage predefined suppliers products.
const STATUS_RECEIVED_PARTIALLY
Received partially.
const STATUS_RECEIVED_COMPLETELY
Received completely.
Class to manage line orders.
Parent class of all other business classes (invoices, contracts, proposals, 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...
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.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid=0, $f_user=null, $notrigger=0)
Delete all links between an object $this.
setStatut($status, $elementId=null, $elementType='', $trigkey='', $fieldstatus='fk_statut')
Set status of an object.
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.
fetch_origin()
Read linked origin object.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage Dolibarr database access.
Class to manage stock movements.
Class to manage products or services.
static checkSellOrEatByMandatoryFromProductAndDates($product, $sellBy, $eatBy, $onlyFieldName='', $alreadyCheckConf=false)
Check sell or eat by date is mandatory from product and sell-by and eat-by dates.
Class to manage receptions.
setBilled()
Classify the reception as invoiced (used for example by trigger when WORKFLOW_RECEPTION_CLASSIFY_BILL...
fetch_delivery_methods()
Fetch deliveries method and return an array.
getLibStatut($mode=0)
Return status label.
valid($user, $notrigger=0)
Validate object and update stock if option enabled.
getUrlTrackingStatus($value='')
Forge an set tracking url.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
getNomUrl($withpicto=0, $option=0, $max=0, $short=0, $notooltip=0)
Return clicable link of object (with eventually picto)
update($user=null, $notrigger=0)
Update database.
setClosed()
Classify the reception as closed (this records also the stock movement)
getNextNumRef($soc)
Return next contract ref.
static replaceProduct(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a product id with another one.
LibStatut($status, $mode)
Return label of a status.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0)
Create a document onto disk according to template module.
setDeliveryDate($user, $delivery_date)
Set the planned delivery date.
list_delivery_methods($id=0)
Fetch all deliveries method and return an array.
getKanbanView($option='', $arraydata=null)
Return clicable link of object (with eventually picto)
__construct($db)
Constructor.
initAsSpecimen()
Initialise an instance with random values.
create($user, $notrigger=0)
Create reception en base.
fetch($id, $ref='', $ref_ext='')
Get object and lines from database.
reOpen()
Classify the reception as validated/opened.
getStatusDispatch()
Get status from all dispatched lines.
addline($entrepot_id, $id, $qty, $array_options=[], $comment='', $eatby=null, $sellby=null, $batch='', $cost_price=0)
Add an reception line.
setDraft($user)
Set draft status.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
trait CommonIncoterm
Superclass for incoterm classes.
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($utf8_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.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
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.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
$conf db user
Active Directory does not allow anonymous connections.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e e e e e statut