blob: 536df81e8ba805c842a0c7821fd94768f1c08b19 [file] [log] [blame]
Nabin Haiteea2b342013-10-11 18:31:33 +05301# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
2# License: GNU General Public License v3. See license.txt
3
4from __future__ import unicode_literals
5import webnotes
6
7from webnotes.utils import flt
8
9
10def repost():
11 """
12 Repost everything!
13 """
14 webnotes.conn.auto_commit_on_many_writes = 1
15
Nabin Hait4ed7f682013-10-23 11:50:09 +053016 for d in webnotes.conn.sql("""select distinct item_code, warehouse from
17 (select item_code, warehouse from tabBin
18 union
Nabin Haitc2caae52013-10-23 12:02:08 +053019 select item_code, warehouse from `tabStock Ledger Entry`) a"""):
Nabin Hait4ed7f682013-10-23 11:50:09 +053020 repost_stock(d[0], d[1])
Nabin Haiteea2b342013-10-11 18:31:33 +053021
22 webnotes.conn.auto_commit_on_many_writes = 0
23
24def repost_stock(item_code, warehouse):
25 repost_actual_qty(item_code, warehouse)
26
27 if item_code and warehouse:
28 update_bin(item_code, warehouse, {
29 "reserved_qty": get_reserved_qty(item_code, warehouse),
30 "indented_qty": get_indented_qty(item_code, warehouse),
31 "ordered_qty": get_ordered_qty(item_code, warehouse),
32 "planned_qty": get_planned_qty(item_code, warehouse)
33 })
34
35def repost_actual_qty(item_code, warehouse):
36 from stock.stock_ledger import update_entries_after
Nabin Hait5048c982013-10-23 12:14:32 +053037 try:
38 update_entries_after({ "item_code": item_code, "warehouse": warehouse })
39 except:
40 pass
Nabin Haiteea2b342013-10-11 18:31:33 +053041
42def get_reserved_qty(item_code, warehouse):
43 reserved_qty = webnotes.conn.sql("""
44 select
45 sum((dnpi_qty / so_item_qty) * (so_item_qty - so_item_delivered_qty))
46 from
47 (
48 (select
49 qty as dnpi_qty,
50 (
51 select qty from `tabSales Order Item`
52 where name = dnpi.parent_detail_docname
53 ) as so_item_qty,
54 (
55 select ifnull(delivered_qty, 0) from `tabSales Order Item`
56 where name = dnpi.parent_detail_docname
57 ) as so_item_delivered_qty,
58 parent, name
59 from
60 (
61 select qty, parent_detail_docname, parent, name
62 from `tabDelivery Note Packing Item` dnpi_in
63 where item_code = %s and warehouse = %s
64 and parenttype="Sales Order"
65 and item_code != parent_item
66 and exists (select * from `tabSales Order` so
67 where name = dnpi_in.parent and docstatus = 1 and status != 'Stopped')
68 ) dnpi)
69 union
70 (select qty as dnpi_qty, qty as so_item_qty,
71 ifnull(delivered_qty, 0) as so_item_delivered_qty, parent, name
72 from `tabSales Order Item` so_item
73 where item_code = %s and reserved_warehouse = %s
74 and exists(select * from `tabSales Order` so
75 where so.name = so_item.parent and so.docstatus = 1
76 and so.status != 'Stopped'))
77 ) tab
78 where
79 so_item_qty >= so_item_delivered_qty
80 """, (item_code, warehouse, item_code, warehouse))
81
82 return flt(reserved_qty[0][0]) if reserved_qty else 0
83
84def get_indented_qty(item_code, warehouse):
Nabin Hait1a60fd82013-10-14 14:27:08 +053085 indented_qty = webnotes.conn.sql("""select sum(pr_item.qty - ifnull(pr_item.ordered_qty, 0))
Nabin Haiteea2b342013-10-11 18:31:33 +053086 from `tabMaterial Request Item` pr_item, `tabMaterial Request` pr
87 where pr_item.item_code=%s and pr_item.warehouse=%s
Nabin Hait1a60fd82013-10-14 14:27:08 +053088 and pr_item.qty > ifnull(pr_item.ordered_qty, 0) and pr_item.parent=pr.name
Nabin Haiteea2b342013-10-11 18:31:33 +053089 and pr.status!='Stopped' and pr.docstatus=1""", (item_code, warehouse))
90
91 return flt(indented_qty[0][0]) if indented_qty else 0
92
93def get_ordered_qty(item_code, warehouse):
94 ordered_qty = webnotes.conn.sql("""
Nabin Hait1a60fd82013-10-14 14:27:08 +053095 select sum((po_item.qty - ifnull(po_item.received_qty, 0))*po_item.conversion_factor)
Nabin Haiteea2b342013-10-11 18:31:33 +053096 from `tabPurchase Order Item` po_item, `tabPurchase Order` po
97 where po_item.item_code=%s and po_item.warehouse=%s
Nabin Hait1a60fd82013-10-14 14:27:08 +053098 and po_item.qty > ifnull(po_item.received_qty, 0) and po_item.parent=po.name
Nabin Haiteea2b342013-10-11 18:31:33 +053099 and po.status!='Stopped' and po.docstatus=1""", (item_code, warehouse))
100
101 return flt(ordered_qty[0][0]) if ordered_qty else 0
102
103def get_planned_qty(item_code, warehouse):
104 planned_qty = webnotes.conn.sql("""
Nabin Hait1a60fd82013-10-14 14:27:08 +0530105 select sum(ifnull(qty, 0) - ifnull(produced_qty, 0)) from `tabProduction Order`
Nabin Haiteea2b342013-10-11 18:31:33 +0530106 where production_item = %s and fg_warehouse = %s and status != "Stopped"
Nabin Hait1a60fd82013-10-14 14:27:08 +0530107 and docstatus=1 and ifnull(qty, 0) > ifnull(produced_qty, 0)""", (item_code, warehouse))
Nabin Haiteea2b342013-10-11 18:31:33 +0530108
109 return flt(planned_qty[0][0]) if planned_qty else 0
110
111
112def update_bin(item_code, warehouse, qty_dict=None):
113 from stock.utils import get_bin
114 bin = get_bin(item_code, warehouse)
115 mismatch = False
116 for fld, val in qty_dict.items():
117 if flt(bin.doc.fields.get(fld)) != flt(val):
118 bin.doc.fields[fld] = flt(val)
119 mismatch = True
120
121 if mismatch:
122 bin.doc.projected_qty = flt(bin.doc.actual_qty) + flt(bin.doc.ordered_qty) + \
123 flt(bin.doc.indented_qty) + flt(bin.doc.planned_qty) - flt(bin.doc.reserved_qty)
124
125 bin.doc.save()