array( 'desc' => 'Send the error report to this email address', 'default' => '', 'short' => 't', 'min' => 0, 'max' => 1, ) ); static $permitError = false; var $loc_only = false;//187; //false; var $efforts = 10; function getAuth() { $ff = HTML_FlexyFramework::get(); if (!$ff->cli) { die("run form cli only"); } } function get($v = '',$opts) { $this->opts = $opts; // 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.. // clear up trailing voided coheads.. echo "Finding bad calcs\n"; //DB_DataObject::debugLevel(1); $id = DB_DataObject::Factory('invfifo'); $id->query("SELECT distinct(invhist_itemsite_id) as invhist_itemsite_id, invdetail_location_id FROM invdetailview WHERE ( invfifo_cost_before > invfifo_cost_after OR invfifo_cost_before < 0 OR ( invfifo_cost_before = 0 and invfifo_qty_before > 0 ) OR ( -- landed unit cost is zero or negative -- when it's not void.. invfifo_landedunitcost <= 0.0 ) ) AND invfifo_void = 0 GROUP BY invhist_itemsite_id, invdetail_location_id "); $is = array(); $bads = array(); while ($id->fetch()) { $id->invhist_itemsite_id *=1; if(empty($id->invhist_itemsite_id)){ continue; } $is[] = $id->invhist_itemsite_id ; $bads[] = array( 'itemsite_id' => $id->invhist_itemsite_id, 'location_id' => $id->invdetail_location_id, ); } if (count($is)) { echo "Deleting postions on bad calcs\n"; $id = DB_DataObject::Factory('invfifo'); $id->query("delete from invfifopos where invfifopos_itemsite_id IN (". implode(',', $is) .')'); } echo "Filling stock level on bad calcs ". count($is) . "\n"; foreach ($bads as $bad){ // SELECT invfifo_fill_all(128, 2319) $id = DB_DataObject::Factory('invfifo'); $id->query("SELECT invfifo_fill_all({$bad['location_id']}, {$bad['itemsite_id']})"); } if ($v == 'BAD') { //DB_DAtaObject::debugLevel(1); $this->efforts =10; echo "running process\n"; $this->runStandard($is); die("DONE"); } if ($v == 'BIG') { //DB_DAtaObject::debugLevel(1); $id = DB_DataObject::Factory('invfifo'); $id->query("SELECT invfifopos_itemsite_id FROM invfifopos WHERE invfifopos_lastadjustment != 0.0 ORDER BY invfifopos_lastadjustment ASC"); $is = array(); while ($id->fetch()) { $is[] = $id->invfifopos_itemsite_id; } $id->free(); $this->efforts =10; echo "running process\n"; $this->runStandard($is); die("DONE"); } if ($v == 'RESET') { $id = DB_DataObject::Factory('invfifo'); $id->query("delete from invfifopos"); $v = ''; } if (!empty($v)) { $this->runSingle($v); die("DONE"); } $id = DB_DataObject::Factory('invdetail'); $id->autoJoin(); $id->selectAdd(); $id->selectAdd('distinct(join_invhist.invhist_itemsite_id) as itemsite_id'); $id->orderBy('join_invhist.invhist_itemsite_id ASC'); if (!empty($this->loc_only)) { $id->invdetail_location_id = $this->loc_only; } $id->whereAdd(" join_invhist.invhist_itemsite_id IS NOT NULL "); $is = $id->fetchAll('itemsite_id'); $id->free(); //$this->runTest($is); $this->runStandard($is); die("DONE"); } function runStandard($is) { $tot = count($is); $start = time(); $id = DB_DataObject::Factory('invdetail'); $ftot = $id->count(); $fdone = 0; foreach($is as $n=>$itemsite) { // before we do fifo calcs make sure the qty's are correct. $id = DB_DataObject::Factory('invdetail'); $id->query(" SELECT invfifo_fill_all_itemsite({$itemsite}) "); $id = DB_DataObject::Factory('invdetail'); $id->autoJoin(); $id->whereAdd("join_invhist.invhist_itemsite_id = $itemsite"); $fdone += $id->count(); // 0.09 seconds. $past = array(); for($i = 0; $i< $this->efforts ;$i++) { $id = DB_DataObject::Factory('invdetail'); $id->query("SELECT invfifo_update_from_invdetail_all($itemsite) as result"); $id->fetch(); $res= $id->result; $id->free(); if (round($res,2) == 0.00 ) { break; } echo ".... $res\n"; $match =0; for ($pp= 0; $pp < min(10, count($past)) ;$pp++) { if ($past[$pp] == $res) { $match++; continue; } break; } if ($match == 10) { break; } array_unshift($past, $res); } //if (!($n % 10)) { $dur = (time() - $start) / 60; $complete = ((($dur/ $fdone) * $ftot) - $dur) / 60; $mu = memory_get_usage(); echo "$itemsite - $n/$tot $fdone/$ftot " . "- Memory - $mu | So far : ". number_format($dur,2)."m | est. complet = ". number_format($complete,2)."hours ($res)\n"; //} //sleep(1); } $this->sendErr(); die("DONE"); } function runSingle($itemsite ) { //DB_DataObject::debugLevel(1); for($i = 0; $i< 50;$i++) { $itemsite = (int)$itemsite; $start = time(); $id = DB_DataObject::Factory('invdetail'); echo "SELECT invfifo_update_from_invdetail_all($itemsite) as result\n"; $id->query("SELECT invfifo_update_from_invdetail_all($itemsite) as result"); $id->fetch(); echo "GOT $id->result\n"; if (round($id->result,2) == 0.00 ) { break; } } $this->sendErr(); exit; } function sendErr() { if(empty($this->errMsg)){ return; } require_once 'Pman/Core/Mailer.php'; $r = new Pman_Core_Mailer(array( 'template'=> 'ProcessValues', 'page' => $this, 'contents' => array( 'person' => $this->opts['send-to'], 'message' => $this->errMsg ) )); $sent = $r->send(); } // 226619 -- slow.. function runTest($is) { //DB_DataObject::debugLevel(1); $tot = count($is); $start = time(); $id = DB_DataObject::Factory('invdetail'); $ftot = $id->count(); // biggies... //1559 $fdone = 0; foreach($is as $n=>$itemsite) { // $itemsite = 1559; $id = DB_DataObject::Factory('invdetail'); $id->autoJoin(); $id->whereAdd("join_invhist.invhist_itemsite_id = $itemsite AND invfifo_void = 0"); $id->orderBy(' invhist_transdate ASC, invdetail_id ASC '); $fdone += $id->count();// 0.001 seconds. $id->selectAdd(); $id->selectAdd('invdetail_id'); $ids = $id->fetchAll('invdetail_id'); // 0.01 foreach($ids as $nn=>$i) { $st= microtime(true); $id = DB_DataObject::Factory('invdetail'); $id->query("SELECT invfifo_update_from_invdetail($i)"); $id->free(); if (!($nn % 10)) { echo "$nn/". count($ids) . "\n"; } $totals[$i] = microtime(true) - $st; //if ($nn > 500) break; } asort($totals); print_r($totals); exit; } die("DONE"); } }