3 * Table Definition for recv
5 require_once 'DB/DataObject.php';
7 class Pman_Xtuple_DataObjects_Recvgrp extends DB_DataObject
10 /* the code below is auto generated do not remove the above tag */
12 public $__table = 'recvgrp'; // table name
13 public $recvgrp_id; // int4(4) not_null default_nextval%28recv_recv_id_seq%29 primary_key
14 public $recvgrp_number; // text(-1) not_null
15 public $recvgrp_pohead_id; // text(-1) not_null
16 public $recvgrp_date; // text(-1) not_null
17 public $recvgrp_landed_cost; // text(-1) not_null
18 public $recvgrp_landed_method; // text(-1) not_null
19 public $recvgrp_void; // text(-1) not_null
20 public $recvgrp_location_id;
21 public $recvgrp_receipt_number; // TEXT
23 /* the code above is auto generated do not remove the tag below */
27 function applyFilters($q, $au, $roo)
29 if (!empty($q['_landed_vohead'])) {
30 // fill in the assigned values for
31 $vo = (int)$q['_landed_vohead'];
33 $vohead = DB_DataObject::factory('vohead');
34 $vohead->get($q['_landed_vohead']);
35 $cost = $vohead->costofshipping();
36 $assigned = $vohead->assignedcost();
39 if ( ($cost - $assigned) < 1.0) {
41 recvgrp_id IN (SELECT recvgrpland_recvgrp_id FROM
43 recvgrpland_vohead_id = $vo
49 if (empty($q['_search'])) {
53 recvgrp_date < ('{$vohead->vohead_gldistdate}'::date + INTERVAL '1 MONTH')::date
55 recvgrp_date > ('{$vohead->vohead_gldistdate}'::date - INTERVAL '4 MONTH')::date
60 (SELECT count(recv_qty) FROM recv WHERE recv_recvgrp_id = recvgrp_id AND recv_posted) > 0
62 (recvgrp_void = 0 OR recvgrp_void IS NULL)
65 $this->autoJoinVendor();
69 COALESCE((SELECT sum(currtobase(recvgrpland_curr_id, recvgrpland_cost, vohead_gldistdate))
75 recvgrpland_vohead_id = vohead_id
77 recvgrpland_vohead_id = $vo
79 recvgrpland_recvgrp_id = recvgrp_id
80 ), 0) as assigned_landed,
83 (SELECT sum(recv_qty) FROM recv WHERE recv_recvgrp_id = recvgrp_id AND recv_posted) as recv_qty
90 COALESCE((SELECT sum(recvgrpland_cost) FROM recvgrpland
92 recvgrpland_vohead_id = $vo
94 recvgrpland_recvgrp_id = recvgrp_id
97 join_vendinfo.vend_name ASC
108 (SELECT curr_symbol from curr_symbol where curr_base LIMIT 1) base_curr_symbol,
112 CASE WHEN recvgrpland_glseries = 0 THEN 0 ELSE
113 currtobase(recvgrpland_curr_id, recvgrpland_cost, gltrans_date)
121 gltrans_sequence = recvgrpland_glseries
126 recvgrpland_recvgrp_id = recvgrp_id
129 ),2) as total_landed_cost
134 if (!empty($q['_search'])) {
135 $v = $this->escape($q['_search']);
137 join_vendinfo.vend_name ilike '%{$v}%'
139 recvgrp_number like '%{$v}%'
142 join_recvgrp_pohead_id_pohead_id.pohead_number ilike '%{$v}%'
150 $this->autoJoinPoheadcurr();
153 function autoJoinPoheadcurr()
156 $v = DB_DataObject::Factory('curr_symbol');
158 LEFT JOIN curr_symbol join_pohead_curr_symbol ON
159 join_recvgrp_pohead_id_pohead_id.pohead_curr_id = join_pohead_curr_symbol.curr_id
162 $this->selectAs($v, 'pohead_curr_id_%s', 'join_pohead_curr_symbol');
167 function autoJoinVendor()
170 $v = DB_DataObject::Factory('vendinfo');
172 LEFT JOIN vendinfo join_vendinfo ON join_recvgrp_pohead_id_pohead_id.pohead_vend_id = vend_id
175 $this->selectAs($v, '%s', 'join_vendinfo');
180 function beforeInsert($q, $roo)
182 if (!isset($q['recv_qtys'])) {
183 $roo->jerr("no qtys'");
185 // no more session stuff now...
186 $roo->sessionState(0);
187 $this->factory('cohead')->lockTables();
188 $this->processReceipt($roo,$q);
190 $this->jerr("should not get here");
194 function beforeUpdate($old, $q ,$roo)
196 if (!empty($q['_void'])) {
197 $this->factory('cohead')->lockTables();
201 // only allow modification of landed stuff..
202 foreach($this->table() as $k => $v) {
203 if (!preg_match('/landed/', $k)) {
204 $this->$k = $old->$k;
212 function nextNumber($po) {
215 $rg = DB_DataObject::Factory('recvgrp');
216 if (!$rg->get('recvgrp_number', $po->pohead_number . '-' . $seq)) {
217 return $po->pohead_number . '-' . $seq;
226 function createFromPO($roo, $po, $loc)
230 $items = $po->items();
231 $dt = date('Y-m-d', strtotime($po->pohead_orderdate));
236 $rg = DB_DataObject::Factory('recvgrp');
239 'recvgrp_number' => $this->nextNumber($po),
240 'recvgrp_pohead_id' => $po->pohead_id,
241 'recvgrp_date' => $dt,
242 'recvgrp_landed_cost' => 0,
243 //'recvgrp_landed_method; // text(-1) not_null
244 //$recvgrp_void; // text(-1) not_null
245 'recvgrp_location_id' => $loc->pid()
250 $num = $rg->recvgrp_number;
253 $rg->recvgrp_number = $num; // make sure it's not overwritten..
258 //$notes = $this->escape($q['recv_notes']);
260 foreach($items as $i) {
261 $recv = DB_DataObject::factory('recv');
267 $i->poitem_qty_ordered,
268 'Auto created from Transfer',
276 $rg = DB_DataObject::Factory('recvgrp');
285 $d = DB_DataObjecT::factory('pohead');
286 $d->get($this->recvgrp_pohead_id);
289 // update can not modify reciept...
292 function processReceipt($roo, $q)
295 $po = DB_DataObject::Factory('pohead');
296 if (!$po->get($q['recvgrp_pohead_id'])) {
297 $roo->jerr("invalid pohead");
299 $items = json_decode($q['recv_qtys']);
300 $dt = date('Y-m-d', strtotime($q['recvgrp_date']));
302 $rg = DB_DataObject::Factory('recvgrp');
304 $rg->recvgrp_number = $this->nextNumber($po);
305 $rg->recvgrp_pohead_id = $po->pohead_id;
308 $num = $rg->recvgrp_number;
313 $rg->recvgrp_number = $num; // make sure it's not overwritten..
317 $notes = $this->escape($q['recv_notes']);
319 foreach($items as $i) {
320 $recv = DB_DataObject::factory('recv');
325 $i->recv_orderitem_id,
330 $q['recvgrp_location_id']
335 $roo->addEvent('POSTED', $this);
343 $d = DB_DataObject::Factory('recv');
344 $d->recv_recvgrp_id = $this->pid();
346 return $d->fetchAll();
351 function void($roo, $ret = false)
353 if (!in_array('recvgrp_void', array_keys($this->table()))) {
354 $roo->jerr("system has not been updated with recvgrp_void");
357 if ($this->recvgrp_void) {
358 $roo->jerr("Already void");
361 //-- are there any transfers for this order??
362 $it = DB_DataObject::Factory('invhist_transfer_item');
365 $it->selectAdd('SUM(invhist_transfer_item_qty) as in_transit');
367 join_invhist_transfer_item_invhist_transfer_id_invhist_transfer_id.invhist_transfer_recvgrp_id = {$this->pid()}
369 join_invhist_transfer_item_invhist_transfer_id_invhist_transfer_id.invhist_transfer_id IS NOT NULL
371 invhist_transfer_item_invhist_transfer_id IS NOT NULL
376 if (!empty($it->in_transit)) {
377 $roo->jerr("there is an open transfer relating to this order - please void it first");
380 // check if landed cost assigned to it..
381 $lc = DB_DataObject::Factory('recvgrpland');
382 $lc->recvgrpland_recvgrp_id = $this->recvgrp_id;
386 $landed_count = $lc->count();
388 $olc->whereAdd('recvgrpland_glseries > 0 OR recvgrpland_cost > 0.0');
389 $posted_landed_count = $olc->count();
391 if ($posted_landed_count ) {
393 $head_ids = $olc->fetchAll('recvgrpland_vohead_id');
395 $vohead = DB_DataObject::factory('vohead');
396 $vohead->whereAddIn('vohead_id', $head_ids, 'int');
397 $vonums = $vohead->fetchAll('vohead_number');
399 $roo->jerr("reciept has landed costs assigned to it - void them first " . $landed_count . ' (Vouchers: ' . implode(', ', $vonums) .')');
403 $olc_ids = $lc->fetchAll('recvgrpland_id');
405 foreach($olc_ids as $olc_id) {
406 $lc = DB_DataObject::Factory('recvgrpland');
414 $poid = $this->recvgrp_pohead_id;
416 $rj = DB_DataObject::Factory('rjctcode');
417 if (!$rj->get('rjctcode_code', 'WRONG')) {
418 $roo->jerr('can not find reject code');
421 //DB_DataObject::debugLevel(1);
423 //SELECT enterPoReturn(599, 30, 18) AS result;
424 //poitem_id qty, rejectcode
425 $loc = $this->recvgrp_location_id;
427 $items = $this->items();
429 $roo->jerr("No items where delivered");
432 $this->checkLocationStock($roo);
434 foreach($items as $i) {
437 $ivd = $i->invdetail($roo);
438 $loc = $ivd->invdetail_location_id;
442 $q = DB_DataObject::Factory($this->tableName());
443 $q->query("SELECT enterPoReturn({$i->recv_orderitem_id}, {$i->recv_qty}, {$rj->pid()}, '{$this->recvgrp_date}'::date ) as result");
445 if (empty($q->result) || $q->result < 1) {
446 $roo->jerr("enterPoReturn failed - returned " . $q->result);
449 $q = DB_DataObject::Factory($this->tableName());
450 $q->query("SELECT postPoReturns({$poid},false) AS result");
452 if (empty($q->result) || $q->result < 1) {
453 $roo->jerr("postPoReturns failed - returned " . $q->result);
457 $ld = DB_DataObject::Factory('itemlocdist');
458 $ld->itemlocdist_series = $ild;
459 $rev = $ld->fetchAll();
465 $ld = DB_DataObject::Factory('itemlocdist');
468 'itemlocdist_itemlocdist_id' => $r->itemlocdist_id,
469 'itemlocdist_source_type' => 'L',
470 'itemlocdist_source_id' => $loc , // location.
471 'itemlocdist_qty' => $r->itemlocdist_qty,
472 'itemlocdist_ls_id' => empty($r->itemlocdist_ls_id) ? $this->sqlValue('NULL') : $r->itemlocdist_ls_id,
473 // 'itemlocdist_series' => $ild,
475 $ld->itemlocdist_expiration = $ld->sqlValue('endOfTime()');
479 $q = DB_DataObject::Factory($this->tableName());
480 $q->query("SELECT distributeToLocations({$r->itemlocdist_id}) AS result");
482 if (empty($q->result) || $q->result < 1) {
483 $roo->jerr("distributeToLocations failed - returned " . $q->result);
486 //$ld = DB_DataObject::Factory('itemlocdist');
493 $q = DB_DataObject::Factory($this->tableName());
494 $q->query("SELECT postItemlocseries($ild) AS result");
496 if (empty($q->result) || $q->result < 1) {
497 $roo->jerr("postItemlocseries failed - returned " . $q->result);
501 $this->recvgrp_void = true;
505 $roo->addEvent('VOIDED', $this);
517 function checkLocationStock($roo)
519 if(empty($roo->bootLoader->Xtuple['prevent_negative'])){
523 $items = $this->items();
525 $loc = $this->recvgrp_location_id;
529 foreach ($items as $item){
530 if(empty($item->recv_qty)){
535 $ivd = $item->invdetail($roo);
536 $loc = $ivd->invdetail_location_id;
539 $balance = $item->itemsite()->checkLocationStock($loc);
541 if(empty($balance) || $balance < $item->recv_qty){
542 $stock[] = $item->itemsite()->item()->item_number;
547 $roo->jerr("These items have negative stock " . implode(', ', $stock));
554 // IS THIS NEEDED? - CAN WE VOID AND RE-CREATE...?
556 function voidUntransfered($roo)
560 $poid = $this->recvgrp_pohead_id;
562 $rj = DB_DataObject::Factory('rjctcode');
563 if (!$rj->get('rjctcode_code', 'WRONG')) {
564 $roo->jerr('can not find reject code');
568 //DB_DataObject::debugLevel(1);
570 //SELECT enterPoReturn(599, 30, 18) AS result;
571 //poitem_id qty, rejectcode
572 $loc = $this->recvgrp_location_id;
574 $items = $this->items();
576 $roo->jerr("No items where delivered");
579 foreach($items as $i) {
582 $ivd = $i->invdetail($roo);
583 $loc = $ivd->invdetail_location_id;
587 $q = DB_DataObject::Factory($this->tableName());
588 $q->query("SELECT enterPoReturn({$i->recv_orderitem_id}, {$i->recv_qty}, {$rj->pid()}, '{$this->recvgrp_date}'::date ) as result");
590 if (empty($q->result) || $q->result < 1) {
591 $roo->jerr("enterPoReturn failed - returned " . $q->result);
594 $q = DB_DataObject::Factory($this->tableName());
595 $q->query("SELECT postPoReturns({$poid},false) AS result");
597 if (empty($q->result) || $q->result < 1) {
598 $roo->jerr("postPoReturns failed - returned " . $q->result);
602 $ld = DB_DataObject::Factory('itemlocdist');
603 $ld->itemlocdist_series = $ild;
604 $rev = $ld->fetchAll();
610 $ld = DB_DataObject::Factory('itemlocdist');
613 'itemlocdist_itemlocdist_id' => $r->itemlocdist_id,
614 'itemlocdist_source_type' => 'L',
615 'itemlocdist_source_id' => $loc , // location.
616 'itemlocdist_qty' => $r->itemlocdist_qty,
617 'itemlocdist_ls_id' => empty($r->itemlocdist_ls_id) ? $this->sqlValue('NULL') : $r->itemlocdist_ls_id,
618 // 'itemlocdist_series' => $ild,
620 $ld->itemlocdist_expiration = $ld->sqlValue('endOfTime()');
624 $q = DB_DataObject::Factory($this->tableName());
625 $q->query("SELECT distributeToLocations({$r->itemlocdist_id}) AS result");
627 if (empty($q->result) || $q->result < 1) {
628 $roo->jerr("distributeToLocations failed - returned " . $q->result);
631 //$ld = DB_DataObject::Factory('itemlocdist');
638 $q = DB_DataObject::Factory($this->tableName());
639 $q->query("SELECT postItemlocseries($ild) AS result");
641 if (empty($q->result) || $q->result < 1) {
642 $roo->jerr("postItemlocseries failed - returned " . $q->result);
646 $this->recvgrp_void = true;
649 $roo->addEvent('VOIDED', $this);
664 SET recv_recvgrp_id =
665 CASE WHEN (SELECT count(recvgrp_id) FROM recvgrp WHERE recvgrp_pohead_id = (SELECT poitem_pohead_id FROM poitem where poitem_id = recv_orderitem_id) AND recvgrp_date = recv_date ) = 1 THEN
666 (SELECT recvgrp_id FROM recvgrp WHERE recvgrp_pohead_id = (SELECT poitem_pohead_id FROM poitem where poitem_id = recv_orderitem_id ) AND recvgrp_date = recv_date)
671 recv_recvgrp_id IS NULL;
675 SET recv_recvgrp_id =
685 recvgrp_number = (SELECT tranid from netsuite_itemreceipt WHERE id = (SELECT itemreceipt_id FROM netsuite_itemreceiptitem WHERE id::text = recv_oldid ))
687 recvgrp_pohead_id = (SELECT poitem_pohead_id FROM poitem where poitem_id = recv_orderitem_id) AND recvgrp_date = recv_date
695 recvgrp_number = (SELECT tranid from netsuite_itemreceipt WHERE id = (SELECT itemreceipt_id FROM netsuite_itemreceiptitem WHERE id::text = recv_oldid ))
697 recvgrp_pohead_id = (SELECT poitem_pohead_id FROM poitem where poitem_id = recv_orderitem_id) AND recvgrp_date = recv_date
703 recv_recvgrp_id IS NULL;
707 select recv_id, recv_orderitem_id, (SELECT count(recvgrp_id) FROM recvgrp WHERE recvgrp_pohead_id = (SELECT poitem_pohead_id FROM poitem where poitem_id = recv_orderitem_id) AND recvgrp_date = recv_date ) from recv where recv_recvgrp_id IS NULL;
710 // the remaining ones are our fake vendor bills...