4 * fill in any fifo basic entries that have not been processed..
5 * -- does not fill in values.. - just qty's
8 require_once 'ProcessBase.php';
10 class Pman_Xtuple_Fifo_ProcessValues extends Pman_Xtuple_Fifo_ProcessBase
13 static $cli_desc = "Fill in Fifo dollar values. - use /BIG to only do the large ones..";
16 static $cli_opts = array(
18 'desc' => 'Send the error report to this email address',
26 static $permitError = false;
28 var $loc_only = false;//187; //false;
33 $ff = HTML_FlexyFramework::get();
35 die("run form cli only");
40 function get($v = '',$opts)
44 // set up the failure code..
45 PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($this, 'onPearError'));
47 // we have to have a pointer to work out where we left off..
48 // this process can go by invdetail_id ASC..
50 // clear up trailing voided coheads..
52 echo "Finding bad calcs\n";
53 //DB_DataObject::debugLevel(1);
54 $id = DB_DataObject::Factory('invfifo');
56 distinct(invhist_itemsite_id) as invhist_itemsite_id, invdetail_location_id
61 invfifo_cost_before > invfifo_cost_after
63 invfifo_cost_before < 0
66 invfifo_cost_before = 0
68 invfifo_qty_before > 0
72 -- landed unit cost is zero or negative -- when it's not void..
74 invfifo_landedunitcost <= 0.0
80 GROUP BY invhist_itemsite_id, invdetail_location_id
86 while ($id->fetch()) {
87 $id->invhist_itemsite_id *=1;
88 if(empty($id->invhist_itemsite_id)){
91 $is[] = $id->invhist_itemsite_id ;
94 'itemsite_id' => $id->invhist_itemsite_id,
95 'location_id' => $id->invdetail_location_id,
100 echo "Deleting postions on bad calcs\n";
101 $id = DB_DataObject::Factory('invfifo');
102 $id->query("delete from invfifopos where invfifopos_itemsite_id IN (". implode(',', $is) .')');
107 echo "Filling stock level on bad calcs ". count($is) . "\n";
110 foreach ($bads as $bad){
111 // SELECT invfifo_fill_all(128, 2319)
112 $id = DB_DataObject::Factory('invfifo');
113 $id->query("SELECT invfifo_fill_all({$bad['location_id']}, {$bad['itemsite_id']})");
118 //DB_DAtaObject::debugLevel(1);
120 echo "running process\n";
121 $this->runStandard($is);
128 //DB_DAtaObject::debugLevel(1);
129 $id = DB_DataObject::Factory('invfifo');
131 $id->query("SELECT invfifopos_itemsite_id FROM invfifopos WHERE invfifopos_lastadjustment != 0.0 ORDER BY invfifopos_lastadjustment ASC");
133 while ($id->fetch()) {
134 $is[] = $id->invfifopos_itemsite_id;
138 echo "running process\n";
139 $this->runStandard($is);
147 $id = DB_DataObject::Factory('invfifo');
148 $id->query("delete from invfifopos");
159 $this->runSingle($v);
163 $id = DB_DataObject::Factory('invdetail');
167 $id->selectAdd('distinct(join_invhist.invhist_itemsite_id) as itemsite_id');
168 $id->orderBy('join_invhist.invhist_itemsite_id ASC');
169 if (!empty($this->loc_only)) {
170 $id->invdetail_location_id = $this->loc_only;
173 join_invhist.invhist_itemsite_id IS NOT NULL
175 $is = $id->fetchAll('itemsite_id');
178 //$this->runTest($is);
180 $this->runStandard($is);
185 function runStandard($is) {
189 $id = DB_DataObject::Factory('invdetail');
190 $ftot = $id->count();
196 foreach($is as $n=>$itemsite) {
198 // before we do fifo calcs make sure the qty's are correct.
200 $id = DB_DataObject::Factory('invdetail');
201 $id->query(" SELECT invfifo_fill_all_itemsite({$itemsite}) ");
206 $id = DB_DataObject::Factory('invdetail');
208 $id->whereAdd("join_invhist.invhist_itemsite_id = $itemsite");
209 $fdone += $id->count(); // 0.09 seconds.
211 for($i = 0; $i< $this->efforts ;$i++) {
212 $id = DB_DataObject::Factory('invdetail');
215 $id->query("SELECT invfifo_update_from_invdetail_all($itemsite) as result");
219 if (round($res,2) == 0.00 ) {
224 for ($pp= 0; $pp < min(10, count($past)) ;$pp++) {
225 if ($past[$pp] == $res) {
234 array_unshift($past, $res);
240 $dur = (time() - $start) / 60;
242 $complete = ((($dur/ $fdone) * $ftot) - $dur) / 60;
244 $mu = memory_get_usage();
245 echo "$itemsite - $n/$tot $fdone/$ftot " .
246 "- Memory - $mu | So far : ". number_format($dur,2)."m | est. complet = ". number_format($complete,2)."hours ($res)\n";
258 function runSingle($itemsite )
260 //DB_DataObject::debugLevel(1);
261 for($i = 0; $i< 50;$i++) {
263 $itemsite = (int)$itemsite;
265 $id = DB_DataObject::Factory('invdetail');
266 echo "SELECT invfifo_update_from_invdetail_all($itemsite) as result\n";
267 $id->query("SELECT invfifo_update_from_invdetail_all($itemsite) as result");
269 echo "GOT $id->result\n";
270 if (round($id->result,2) == 0.00 ) {
284 if(empty($this->errMsg)){
288 require_once 'Pman/Core/Mailer.php';
290 $r = new Pman_Core_Mailer(array(
291 'template'=> 'ProcessValues',
294 'person' => $this->opts['send-to'],
295 'message' => $this->errMsg
304 function runTest($is)
306 //DB_DataObject::debugLevel(1);
311 $id = DB_DataObject::Factory('invdetail');
312 $ftot = $id->count();
319 foreach($is as $n=>$itemsite) {
323 $id = DB_DataObject::Factory('invdetail');
325 $id->whereAdd("join_invhist.invhist_itemsite_id = $itemsite AND invfifo_void = 0");
327 invhist_transdate ASC,
331 $fdone += $id->count();// 0.001 seconds.
333 $id->selectAdd('invdetail_id');
334 $ids = $id->fetchAll('invdetail_id'); // 0.01
338 foreach($ids as $nn=>$i) {
339 $st= microtime(true);
340 $id = DB_DataObject::Factory('invdetail');
341 $id->query("SELECT invfifo_update_from_invdetail($i)");
344 echo "$nn/". count($ids) . "\n";
347 $totals[$i] = microtime(true) - $st;
348 //if ($nn > 500) break;