X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=blobdiff_plain;f=haxe%2FItemScheduler.hx;h=274f562b256a1999e3a04296c2a6d3686f73473c;hb=cac7335b5528b1eca9cc02ca7bc9760a080b676f;hp=75727a2091d62f179eaf39bf5ceebe9884e206b9;hpb=f62ea0e748c0f130e3e50faa67fe195bf7dd9936;p=order_line_extra.git diff --git a/haxe/ItemScheduler.hx b/haxe/ItemScheduler.hx index 75727a2..274f562 100644 --- a/haxe/ItemScheduler.hx +++ b/haxe/ItemScheduler.hx @@ -1,4 +1,5 @@ import php.Lib; +using DateTools; typedef Detail = { id : String, @@ -9,19 +10,27 @@ typedef Detail = { typedef Order = { id:String ,quantity:String - ,priority:Int + ,priority:Date ,delivery_date:String } +enum ScheduleMode { + Update; + Cancel; + Move; +} + class ScheduleParameters { var row_id : String; var rowDetails: Hash; + public var mode:ScheduleMode; function new(rawData : Dynamic) { var data = php.Lib.hashOfAssociativeArray(rawData); row_id = data.get('row_id'); var raw_order : Dynamic = data.get('row_order'); + mode = ScheduleMode.Move; var row_ids = php.Lib.toHaxeArray(raw_order); if (row_ids!= null) { @@ -47,16 +56,27 @@ class ScheduleParameters { } } + public function setMode(action:String) { + mode = switch(action) { + case "update" : + ScheduleMode.Update; + case "cancel" : + ScheduleMode.Cancel; + default: + ScheduleMode.Move; + }; + } + public function position(id: String) : Null { if(rowDetails == null) return null; return rowDetails.get(id).position; } - public function priority(order : {id: String, priority: Int}) : Int { + public function priority(order : {id: String, priority: Date}) : Int { var orderId = ItemScheduler.orderId(order); var orderPosition = position(orderId); - return orderPosition != null ? orderPosition : order.priority; + return orderPosition != null ? orderPosition : cast(order.priority.getTime(), Int); } } @@ -70,7 +90,7 @@ class ItemScheduler { this.stock_id = stock_id; this.startLocation = startLocation; this.parameters = parameters; - qoh = untyped __call__('get_qoh_on_date', this.stock_id, 'DEF'); + qoh = untyped __call__('get_qoh_on_date', this.stock_id, startLocation); } function tableHeader() { @@ -83,7 +103,13 @@ class ItemScheduler { // Sort location by date var locations = this.locations(); locations.sort(function(a, b) { - return cast(a.delivery.getTime() - b.delivery.getTime(), Int ); + var as = a.delivery.getTime(); + var bs = b.delivery.getTime(); + if(as < bs) + return -1; + else if(as > bs) + return 1; + else return 0; }); // Get the start location, it should be the first one @@ -99,10 +125,10 @@ class ItemScheduler { for(order in orders()) { var quantity : Int = Std.parseInt(order.quantity); - while(0 > left && locationIter.hasNext()) { + while(0 >= left && locationIter.hasNext()) { location = locationIter.next(); - var quantityForLocation : Int = location.quantityOnHand(stock_id, null); - if(quantityForLocation == null || quantityForLocation == 0) continue; + var quantityForLocation : Int = location.quantityOnHand(stock_id, null) + location.quantityOnOrder(stock_id); + if(quantityForLocation == null || quantityForLocation == 0 || location.delivery == null) continue; left += quantityForLocation; formatLocation(location, "Delivery", left); } @@ -112,7 +138,7 @@ class ItemScheduler { } // display the left locations - while(0 > left && locationIter.hasNext()) { + while(0 >= left && locationIter.hasNext()) { location = locationIter.next(); var quantityForLocation : Int = location.quantityOnHand(stock_id, null); if(quantityForLocation == null || quantityForLocation == 0) continue; @@ -194,7 +220,7 @@ class ItemScheduler { ,left-location.quantityOnHand(stock_id, null) ,left ,location.code - ,location.delivery + ,location.delivery.getTime() == 0 ? '' : location.delivery.format("%F") ,"" ,"" ]; @@ -213,7 +239,7 @@ return cast(locations(), Array); private function loadOrders() { var tb : String = untyped __php__('TB_PREF'); - var sql : String = "SELECT * + var sql : String = "SELECT * , d.quantity as qty, d.priority AS pp FROM "+tb+"denorm_order_details_queue d JOIN "+tb+"sales_order_details od ON (od.id = d.id) JOIN "+tb+"sales_orders so ON (so.order_no = d.order_id) @@ -228,7 +254,12 @@ function orders():Array { var rows = loadOrders(); var orderList = []; for(row in rows) { - var order:Order = php.Lib.objectOfAssociativeArray(row); + // for some reason, priority is null + // so we use the pp field + var a:Dynamic = php.Lib.objectOfAssociativeArray(row); + var order:Order = a; + order.priority = Date.fromString(a.pp); + order.quantity = a.qty; orderList.push(order); }; @@ -254,6 +285,9 @@ function locations() { if(location.code == startLocation) { location.delivery = Date.fromTime(0); } + else if(location.delivery == null) { + continue; + } _locs.push(location); } @@ -262,8 +296,54 @@ function locations() { } -function purcharseOrders() { -} + function purcharseOrders() { + var TB = FA.tb(); + var sql = 'SELECT SUM(quantity_ordered - quantity_received) as quantity + into_stock_location AS location + FROM '+TB+'purch_order_details + NATURAL JOIN '+TB+'purch_orders + WHERE item_code = "'+this.stock_id+'" + AND quantity_ordered > quantity_received + GROUP by item_code,delivery_date, into_stock_location + ORDER by delivery_date' ; + + return FA.query(sql); + } + + public function needsUpdate():Bool { + return parameters != null && parameters.mode == ScheduleMode.Move; + } + + function update() { + var orders = this.orders(); + var priorities = Lambda.array(Lambda.map(orders, function(o) { return o.priority;})); + priorities.sort(function(a,b) { + var as = a.toString(); + var bs = b.toString(); + if (as < bs) return -1; + if( as > bs) return 1; + return 0; + }); + + var iter = priorities.iterator(); + var p = iter.next(); + var position:Int = 0-priorities.length; + for(order in orders) { + var new_priority = DateTools.delta(p, 1000*position); + untyped __call__ ('update_order_detail_priority', order.id, new_priority.toString()); + + position +=1; + p = iter.next(); + } + untyped __call__ ('update_queue_quantity_for_item', stock_id); + + } + + public function action() { + if(parameters != null && parameters.mode == ScheduleMode.Update) { + update(); + } + } }