[fix] [minor] insert cancelled sl entry for serialized inventory and at the end delete
diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py
index 6b6472a..b97ca3a 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/accounts/doctype/sales_invoice/sales_invoice.py
@@ -111,7 +111,7 @@
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')
diff --git a/controllers/stock_controller.py b/controllers/stock_controller.py
index c54fbb4..0ed2e2e 100644
--- a/controllers/stock_controller.py
+++ b/controllers/stock_controller.py
@@ -75,6 +75,7 @@
"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 @@
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 = {}
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 227d773..9e32f2a 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -292,15 +292,11 @@
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 :
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index e8d468f..3ce0a48 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -153,27 +153,23 @@
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')
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index c3b9a15..3371a5a 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -56,7 +56,7 @@
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()
diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt b/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
index cee1d0e..047f778 100644
--- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
+++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
@@ -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"
},
@@ -273,6 +273,15 @@
"width": "150px"
},
{
+ "doctype": "DocField",
+ "fieldname": "is_cancelled",
+ "fieldtype": "Select",
+ "hidden": 1,
+ "label": "Is Cancelled",
+ "options": "\nNo\nYes",
+ "report_hide": 1
+ },
+ {
"amend": 0,
"cancel": 0,
"create": 0,
diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.py b/stock/doctype/stock_reconciliation/stock_reconciliation.py
index 6bbfe8b..c5fb552 100644
--- a/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -252,6 +252,27 @@
# 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"""
diff --git a/stock/stock_ledger.py b/stock/stock_ledger.py
index 3bb3a00..740120c 100644
--- a/stock/stock_ledger.py
+++ b/stock/stock_ledger.py
@@ -12,7 +12,16 @@
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 @@
})
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 @@
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):