3 require_once($path_to_root.'/'.'modules/order_line_extra/includes/sql_set.inc');
4 require_once($path_to_root.'/'.'sales/includes/sales_db.inc');
5 function process_picking_flag() {
6 $id = find_submit('_chgpck', false);
7 if ($id != null && $id != -1 && isset($_POST['pick'])) {
8 $id = str_replace("_update", "", $id);
9 change_pck_flag($id, isset($_POST['pick'][$id]));
13 function change_pck_flag($id, $value=null)
15 if($value === null) $value = true;
18 $picker = new Picker();
19 list($debtor_no, $branch_code) = explode('_', $id);
21 // insert or remove pick order form pick table initial_quantity
22 if($picker->picked($debtor_no, $branch_code)) {
23 $picker->deleteAllForBranch($debtor_no, $branch_code);
26 $picker->insertAllForBranch($debtor_no, $branch_code);
28 $Ajax->activate('order_line_view');
32 class Picker extends OrderAction {
33 function __construct($data=null) {
34 if($data === null) $data = array();
35 parent::__construct($data);
37 function picked($debtor_no, $branch_code) {
39 FROM ".TB_PREF."sales_orders so
40 NATURAL JOIN ".TB_PREF."sales_order_details sod
41 JOIN ".TB_PREF."topick p on (sod.id = p.detail_id)
42 WHERE debtor_no = $debtor_no AND branch_code = $branch_code
45 return db_num_rows(db_query($sql)) > 0;
49 function getBranch($detail_id) {
50 $sql = "SELECT stk_code AS stock_id
51 , order_no AS order_id
54 , quantity-qty_sent AS quantity
55 FROM ".TB_PREF."sales_orders so
56 NATURAL JOIN ".TB_PREF."sales_order_details sod
57 WHERE sod.id = $detail_id
59 $result = db_query($sql);
60 $row = db_fetch($result);
65 function insertForDetail($detail_id) {
66 display_warning("picked $detail_id");
67 $branch = $this->getBranch($detail_id);
68 $debtor_no = $branch->debtor_no;
69 $branch_code = $branch->branch_code;
70 $this->deleteForDetail($detail_id);
71 $pick_location = OrderXtraConfig::$default_location;
72 $sql = "SELECT d.stock_id
74 , d.quantity AS quantity
75 ,IF(".OrderXtraConfig::sql_held_condition().", d.quantity, 0) held
77 ,tp.quantity AS total_picked
80 FROM ".TB_PREF."sales_order_details sod
81 NATURAL JOIN ".TB_PREF."sales_orders so
82 JOIN ".TB_PREF."denorm_order_details_queue d ON (sod.id = d.id)
83 JOIN ".TB_PREF."denorm_qoh qoh ON (qoh.stock_id = sod.stk_code AND loc_code = '$pick_location')
84 LEFT JOIN (".totalpick_query().") tp ON (tp.stock_id = sod.stk_code)
85 WHERE sod.id = $detail_id
87 $result = db_query($sql, $sql);
88 while($row=db_fetch($result)) {
89 foreach($row as $key => $value) { $$key = $value; }
90 $available = max(min($quantity-$held, $qoh-$quantity_before-$total_picked-$held) ,0 );
92 if($available || OrderXtraConfig::$autopick_null)
93 insert_pick($stock_id, $order_id, $detail_id, $debtor_no, $branch_code, $available, $quantity);
97 function insertAllForBranch($debtor_no, $branch_code) {
98 $this->deleteAllForBranch($debtor_no, $branch_code);
99 $pick_location = OrderXtraConfig::$default_location;
100 $sql = "SELECT d.stock_id
102 , d.quantity AS quantity
103 ,IF(".OrderXtraConfig::sql_held_condition().", d.quantity, 0) held
105 ,tp.quantity AS total_picked
108 FROM ".TB_PREF."sales_order_details sod
109 NATURAL JOIN ".TB_PREF."sales_orders so
110 JOIN ".TB_PREF."denorm_order_details_queue d ON (sod.id = d.id)
111 JOIN ".TB_PREF."denorm_qoh qoh ON (qoh.stock_id = sod.stk_code AND loc_code = '$pick_location')
112 LEFT JOIN (".totalpick_query().") tp ON (tp.stock_id = sod.stk_code)
113 WHERE debtor_no = $debtor_no AND branch_code = $branch_code
115 $result = db_query($sql, $sql);
116 while($row=db_fetch($result)) {
117 foreach($row as $key => $value) { $$key = $value; }
118 $available = max(min($quantity-$held, $qoh-$quantity_before-$total_picked-$held) ,0 );
120 if($available || OrderXtraConfig::$autopick_null)
121 insert_pick($stock_id, $order_id, $detail_id, $debtor_no, $branch_code, $available, $quantity);
125 function deleteForDetail($detail_id) {
126 $sql = "DELETE ".TB_PREF."topick p
127 FROM ".TB_PREF."topick p
128 JOIN ".TB_PREF."sales_order_details sod on (sod.id = p.detail_id)
129 NATURAL JOIN ".TB_PREF."sales_orders so
130 WHERE sod.id = $detail_id
135 function deleteAllForBranch($debtor_no, $branch_code) {
136 $sql = "DELETE ".TB_PREF."topick p
137 FROM ".TB_PREF."topick p
138 JOIN ".TB_PREF."sales_order_details sod on (sod.id = p.detail_id)
139 NATURAL JOIN ".TB_PREF."sales_orders so
140 WHERE debtor_no = $debtor_no AND branch_code = $branch_code
145 function pickAllDetails() {
146 foreach($this->detail_ids as $detail_id) {
147 $this->insertForDetail($detail_id);
150 function unpickAllDetails() {
151 foreach($this->detail_ids as $detail_id) {
152 $this->deleteForDetail($detail_id);
158 function pick_query($detail_id=null) {
159 $sql = "SELECT detail_id, -sum(quantity) as quantity
160 FROM ".TB_PREF."topick
161 WHERE type IN ('order', 'booked')";
162 if($detail_id) $sql .= " AND detail_id = $detail_id";
163 else $sql .= " GROUP BY detail_id ";
169 /* query to get the total picked quantity */
170 function totalpick_query($stock_id=null) {
171 $sql = "SELECT sku AS stock_id, -sum(quantity) as quantity
172 FROM ".TB_PREF."topick
173 WHERE type IN ('order', 'booked')";
174 if($stock_id) $sql .= " AND sku = $stock_id";
175 else $sql .= " GROUP BY stock_id ";
180 function insert_pick($sku, $order_id, $detail_id, $debtor_no, $branch_code, $to_pick, $quantity, $qoh_location=null) {
181 if($qoh_location == null) $qoh_location = OrderXtraConfig::$default_location;
182 $item_link = "/modules/order_line_extra/item_schedule.php?stock_id=$sku";
183 $order_link = "/sales/sales_order_entry.php?OrderNumber=$order_id";
184 $base = substr($sku, 0, 8);
185 $variation = substr($sku, 9);
186 $branch = get_cust_branch($debtor_no, $branch_code);
187 $location = $branch['branch_ref'];
188 $booked = $quantity - $to_pick;
190 $sql = "INSERT INTO ".TB_PREF."topick SET
191 order_id = $order_id,
192 order_link = '$order_link',
193 location = '$location',
196 variation = '$variation',
197 item_link = '$item_link',
198 quantity = -{$quantity},
199 detail_id = $detail_id,
201 db_query($sql, 'There was a problem inserting the picking information.');
203 # add booked quantity. Insert them as picked so they won't have to be picked
204 $sql = "INSERT INTO ".TB_PREF."topick SET
205 order_id = $order_id,
206 order_link = '$order_link',
207 location = '$location',
209 item_link = '$item_link',
211 variation = '$variation',
213 detail_id = $detail_id,
215 db_query($sql, 'There was a problem inserting the picking information.');
218 $qoh = get_qoh_on_date($sku, $qoh_location);
219 $sql = "INSERT INTO ".TB_PREF."topick SET
220 order_id = $order_id,
221 order_link = '$order_link',
222 location = '$location',
224 item_link = '$item_link',
226 variation = '$variation',
228 detail_id = $detail_id,
230 db_query($sql, 'There was a problem inserting the picking information.');
234 function delete_pick($detail_id) {
235 $sql = "DELETE FROM ".TB_PREF."topick
236 WHERE detail_id = $detail_id
238 return db_query($sql);
241 function update_pick($detail_id, $to_pick) {
243 delete_pick($detail_id);
245 if($to_pick ==0) return;
247 $sql = "SELECT stk_code AS stock_id
248 , order_no AS order_id
251 , quantity-qty_sent AS quantity
252 FROM ".TB_PREF."sales_orders so
253 NATURAL JOIN ".TB_PREF."sales_order_details sod
254 WHERE sod.id = $detail_id
256 $result = db_query($sql);
257 $row = db_fetch($result);
259 foreach($row as $key => $value) { $$key = $value; }
261 insert_pick($stock_id, $order_id, $detail_id, $debtor_no, $branch_code, $to_pick, $quantity);
264 function clean_pickup_for_dispatch($cart) {
265 foreach($cart->line_items as $line) {
266 delete_pick($line->src_id);