[fix] [minor] insert cancelled sl entry for serialized inventory and at the end delete

This commit is contained in:
Nabin Hait 2013-08-20 15:37:33 +05:30
parent c13c193bbc
commit 9653f60e89
8 changed files with 76 additions and 54 deletions

View File

@ -111,7 +111,7 @@ class DocType(SellingController):
def on_cancel(self):
if cint(self.doc.update_stock) == 1:
self.delete_and_repost_sle()
self.update_stock_ledger()
self.update_serial_nos(cancel = True)
sales_com_obj = get_obj(dt = 'Sales Common')

View File

@ -75,6 +75,7 @@ class StockController(AccountsController):
"batch_no": cstr(d.batch_no).strip(),
"serial_no": d.serial_no,
"project": d.project_name,
"is_cancelled": self.doc.docstatus==2 and "Yes" or "No"
}
sl_dict.update(args)
@ -84,29 +85,6 @@ class StockController(AccountsController):
from stock.stock_ledger import make_sl_entries
make_sl_entries(sl_entries, is_amended)
def delete_and_repost_sle(self):
""" Delete Stock Ledger Entries related to this voucher
and repost future Stock Ledger Entries"""
from stock.stock_ledger import update_entries_after
existing_entries = webnotes.conn.sql("""select distinct item_code, warehouse
from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
(self.doc.doctype, self.doc.name), as_dict=1)
# delete entries
webnotes.conn.sql("""delete from `tabStock Ledger Entry`
where voucher_type=%s and voucher_no=%s""", (self.doc.doctype, self.doc.name))
# repost future entries for selected item_code, warehouse
for entries in existing_entries:
update_entries_after({
"item_code": entries.item_code,
"warehouse": entries.warehouse,
"posting_date": self.doc.posting_date,
"posting_time": self.doc.posting_time
})
def get_stock_ledger_entries(self, item_list=None, warehouse_list=None):
out = {}

View File

@ -292,15 +292,11 @@ class DocType(SellingController):
and d.warehouse:
self.update_reserved_qty(d)
if self.doc.docstatus == 1:
sl_entries.append(self.get_sl_entries(d, {
"actual_qty": -1*flt(d['qty']),
}))
sl_entries.append(self.get_sl_entries(d, {
"actual_qty": -1*flt(d['qty']),
}))
if self.doc.docstatus == 1:
self.make_sl_entries(sl_entries)
else:
self.delete_and_repost_sle()
self.make_sl_entries(sl_entries)
def update_reserved_qty(self, d):
if d['reserved_qty'] < 0 :

View File

@ -153,27 +153,23 @@ class DocType(BuyingController):
pr_qty = flt(d.qty) * flt(d.conversion_factor)
self.update_ordered_qty(pr_qty, d)
if self.doc.docstatus == 1:
if pr_qty:
sl_entries.append(self.get_sl_entries(d, {
"actual_qty": flt(pr_qty),
"serial_no": cstr(d.serial_no).strip(),
"incoming_rate": d.valuation_rate
}))
if flt(d.rejected_qty) > 0:
sl_entries.append(self.get_sl_entries(d, {
"warehouse": self.doc.rejected_warehouse,
"actual_qty": flt(d.rejected_qty) * flt(d.conversion_factor),
"serial_no": cstr(d.rejected_serial_no).strip(),
"incoming_rate": d.valuation_rate
}))
if pr_qty:
sl_entries.append(self.get_sl_entries(d, {
"actual_qty": flt(pr_qty),
"serial_no": cstr(d.serial_no).strip(),
"incoming_rate": d.valuation_rate
}))
if flt(d.rejected_qty) > 0:
sl_entries.append(self.get_sl_entries(d, {
"warehouse": self.doc.rejected_warehouse,
"actual_qty": flt(d.rejected_qty) * flt(d.conversion_factor),
"serial_no": cstr(d.rejected_serial_no).strip(),
"incoming_rate": d.valuation_rate
}))
if self.doc.docstatus == 1:
self.bk_flush_supp_wh(sl_entries)
self.make_sl_entries(sl_entries)
else:
self.delete_and_repost_sle()
self.bk_flush_supp_wh(sl_entries)
self.make_sl_entries(sl_entries)
def update_ordered_qty(self, pr_qty, d):
pc_obj = get_obj('Purchase Common')

View File

@ -56,7 +56,7 @@ class DocType(StockController):
self.make_gl_entries()
def on_cancel(self):
self.delete_and_repost_sle()
self.update_stock_ledger()
self.update_serial_no(0)
self.update_production_order(0)
self.make_cancel_gl_entries()

View File

@ -2,7 +2,7 @@
{
"creation": "2013-01-29 19:25:42",
"docstatus": 0,
"modified": "2013-08-20 11:56:25",
"modified": "2013-08-20 15:02:48",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -272,6 +272,15 @@
"search_index": 0,
"width": "150px"
},
{
"doctype": "DocField",
"fieldname": "is_cancelled",
"fieldtype": "Select",
"hidden": 1,
"label": "Is Cancelled",
"options": "\nNo\nYes",
"report_hide": 1
},
{
"amend": 0,
"cancel": 0,

View File

@ -252,6 +252,27 @@ class DocType(StockController):
# append to entries
self.entries.append(args)
def delete_and_repost_sle(self):
""" Delete Stock Ledger Entries related to this voucher
and repost future Stock Ledger Entries"""
existing_entries = webnotes.conn.sql("""select distinct item_code, warehouse
from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
(self.doc.doctype, self.doc.name), as_dict=1)
# delete entries
webnotes.conn.sql("""delete from `tabStock Ledger Entry`
where voucher_type=%s and voucher_no=%s""", (self.doc.doctype, self.doc.name))
# repost future entries for selected item_code, warehouse
for entries in existing_entries:
update_entries_after({
"item_code": entries.item_code,
"warehouse": entries.warehouse,
"posting_date": self.doc.posting_date,
"posting_time": self.doc.posting_time
})
def set_stock_value_difference(self):
"""stock_value_difference is the increment in the stock value"""

View File

@ -12,7 +12,16 @@ class NegativeStockError(webnotes.ValidationError): pass
def make_sl_entries(sl_entries, is_amended=None):
from stock.utils import update_bin
cancel = True if sl_entries[0].get("is_cancelled") == "Yes" else False
if cancel:
set_as_cancel(sl_entries[0].get('voucher_no'), sl_entries[0].get('voucher_type'))
for sle in sl_entries:
sle_id = None
if sle.get('is_cancelled') == 'Yes':
sle['actual_qty'] = -flt(sle['actual_qty'])
if sle.get("actual_qty"):
sle_id = make_entry(sle)
@ -23,6 +32,15 @@ def make_sl_entries(sl_entries, is_amended=None):
})
update_bin(args)
if cancel:
delete_cancelled_entry(sl_entries[0].get('voucher_no'), sl_entries[0].get('voucher_type'))
def set_as_cancel(voucher_type, voucher_no):
webnotes.conn.sql("""update `tabStock Ledger Entry` set is_cancelled='Yes',
modified=%s, modified_by=%s
where voucher_no=%s and voucher_type=%s""",
(now(), webnotes.session.user, voucher_type, voucher_no))
def make_entry(args):
args.update({"doctype": "Stock Ledger Entry"})
sle = webnotes.bean([args])
@ -30,6 +48,10 @@ def make_entry(args):
sle.insert()
# sle.submit()
return sle.doc.name
def delete_cancelled_entry(voucher_type, voucher_no):
webnotes.conn.sql("""delete from `tabStock Ledger Entry`
where voucher_type=%s and voucher_no=%s""", (voucher_type, voucher_no))
_exceptions = []
def update_entries_after(args, verbose=1):