cli) { die("run form cli only"); } } function get($v) { // set up the failure code.. PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($this, 'onPearError')); // we have to have a pointer to work out where we left off.. // this process can go by invdetail_id ASC.. if (!empty($v)) { $this->runSingle($v); die("DONE"); } die("single only"); } function runSingle($itemsite ) { // DB_DataObject::debugLevel(1); $itemsite = (int)$itemsite; $start = time(); $id = DB_DataObject::Factory('invdetail'); $id->query("SELECT count(invdetail_id) as nres FROM invdetailview WHERE invhist_itemsite_id = $itemsite AND invfifo_void = 0 "); $id->fetch(); $total = $id->nres; //exit; $id = DB_DataObject::Factory('invdetail'); $id->query("SELECT * FROM invdetailview WHERE invhist_itemsite_id = {$itemsite} AND invfifo_void = 0 AND ( invhist_transtype = 'RP' OR invhist_transtype = 'AD' OR invhist_transtype = 'RS' ) AND invdetail_qty > 0 ORDER BY invhist_transdate ASC, invdetail_id ASC "); while ($id->fetch()) { $all[] = clone($id); } $done = array(); foreach($all as $id) { $idr = DB_DataObject::Factory('invdetail'); $idr->query("SELECT invfifo_update_from_invdetail({$id->invdetail_id},true)"); $done[] = $id->invdetail_id; // fill in all outgoing based on these reciepts.. $done = array_unique(array_merge($done, $this->processOut($id, $done))); } echo "DONE : ". count($done) . " out of $total \n"; //print_R($done); exit; print_R($all); // pass 1 - incomming stock only.. // pass 2 - $locs = array(); while (true) { $id = array_shift($all); switch($id->invhist_transtype) { case 'AD': // adjustment } exit; } exit; } function processOut($idr, $done= array()) { if (empty($done)) { $done = array(0); } $id = DB_DataObject::Factory('invdetail'); $id->query("SELECT * FROM invdetailview WHERE invhist_itemsite_id = {$idr->invhist_itemsite_id} AND invfifo_void = 0 AND invdetail_qty < 0 AND invfifo_qty_before >= {$idr->invfifo_qty_before} AND invfifo_qty_before <= {$idr->invfifo_qty_after} AND invdetail_location_id = {$idr->invdetail_location_id} AND invdetail_id NOT IN (". implode(',', $done) . ") ORDER BY invhist_transdate ASC, invdetail_id ASC "); $all = array(); while($id->fetch()) { $all[] = clone($id); $ret[] = $id->invdetail_id; } // $done = array(); foreach($all as $id) { $idr = DB_DataObject::Factory('invdetail'); $idr->query("SELECT invfifo_update_from_invdetail({$id->invdetail_id},true)"); $done[] = $id->invdetail_id; // if it's a transfer, then flag the reverse as done as well.. if ($id->invhist_transtype == 'RL') { $idr = DB_DataObject::Factory('invdetail'); $idr->query("SELECT * FROM invdetailview WHERE invdetail_invhist_id = {$id->invhist_id} AND invdetail_id != {$id->invdetail_id} "); $idr->fetch(); $done[] = $idr->invdetail_id ; $done = array_unique(array_merge($this->processOut($idr , $done))); } } return $done; } }