Replaced doc, doc.fields frappe/frappe#478
diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py
index 0587f47..4cc02ab 100644
--- a/erpnext/stock/doctype/bin/bin.py
+++ b/erpnext/stock/doctype/bin/bin.py
@@ -14,19 +14,19 @@
class Bin(Document):
def validate(self):
- if self.doc.fields.get("__islocal") or not self.doc.stock_uom:
- self.doc.stock_uom = frappe.db.get_value('Item', self.doc.item_code, 'stock_uom')
+ if self.get("__islocal") or not self.stock_uom:
+ self.stock_uom = frappe.db.get_value('Item', self.item_code, 'stock_uom')
self.validate_mandatory()
- self.doc.projected_qty = flt(self.doc.actual_qty) + flt(self.doc.ordered_qty) + \
- flt(self.doc.indented_qty) + flt(self.doc.planned_qty) - flt(self.doc.reserved_qty)
+ self.projected_qty = flt(self.actual_qty) + flt(self.ordered_qty) + \
+ flt(self.indented_qty) + flt(self.planned_qty) - flt(self.reserved_qty)
def validate_mandatory(self):
qf = ['actual_qty', 'reserved_qty', 'ordered_qty', 'indented_qty']
for f in qf:
- if (not self.doc.fields.has_key(f)) or (not self.doc.fields[f]):
- self.doc.fields[f] = 0.0
+ if (not self.has_key(f)) or (not self.fields[f]):
+ self.set(f, 0.0)
def update_stock(self, args):
self.update_qty(args)
@@ -39,24 +39,24 @@
# update valuation and qty after transaction for post dated entry
update_entries_after({
- "item_code": self.doc.item_code,
- "warehouse": self.doc.warehouse,
+ "item_code": self.item_code,
+ "warehouse": self.warehouse,
"posting_date": args.get("posting_date"),
"posting_time": args.get("posting_time")
})
def update_qty(self, args):
# update the stock values (for current quantities)
- self.doc.actual_qty = flt(self.doc.actual_qty) + flt(args.get("actual_qty"))
- self.doc.ordered_qty = flt(self.doc.ordered_qty) + flt(args.get("ordered_qty"))
- self.doc.reserved_qty = flt(self.doc.reserved_qty) + flt(args.get("reserved_qty"))
- self.doc.indented_qty = flt(self.doc.indented_qty) + flt(args.get("indented_qty"))
- self.doc.planned_qty = flt(self.doc.planned_qty) + flt(args.get("planned_qty"))
+ self.actual_qty = flt(self.actual_qty) + flt(args.get("actual_qty"))
+ self.ordered_qty = flt(self.ordered_qty) + flt(args.get("ordered_qty"))
+ self.reserved_qty = flt(self.reserved_qty) + flt(args.get("reserved_qty"))
+ self.indented_qty = flt(self.indented_qty) + flt(args.get("indented_qty"))
+ self.planned_qty = flt(self.planned_qty) + flt(args.get("planned_qty"))
- self.doc.projected_qty = flt(self.doc.actual_qty) + flt(self.doc.ordered_qty) + \
- flt(self.doc.indented_qty) + flt(self.doc.planned_qty) - flt(self.doc.reserved_qty)
+ self.projected_qty = flt(self.actual_qty) + flt(self.ordered_qty) + \
+ flt(self.indented_qty) + flt(self.planned_qty) - flt(self.reserved_qty)
- self.doc.save()
+ self.save()
def get_first_sle(self):
sle = frappe.db.sql("""
@@ -65,5 +65,5 @@
and warehouse = %s
order by timestamp(posting_date, posting_time) asc, name asc
limit 1
- """, (self.doc.item_code, self.doc.warehouse), as_dict=1)
+ """, (self.item_code, self.warehouse), as_dict=1)
return sle and sle[0] or None
\ No newline at end of file
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index 8d91e49..617a883 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -32,13 +32,13 @@
def onload(self):
billed_qty = frappe.db.sql("""select sum(ifnull(qty, 0)) from `tabSales Invoice Item`
- where docstatus=1 and delivery_note=%s""", self.doc.name)
+ where docstatus=1 and delivery_note=%s""", self.name)
if billed_qty:
total_qty = sum((item.qty for item in self.get("delivery_note_details")))
- self.doc.fields["__billing_complete"] = billed_qty[0][0] == total_qty
+ self.set("__billing_complete", billed_qty[0][0] == total_qty)
def get_portal_page(self):
- return "shipment" if self.doc.docstatus==1 else None
+ return "shipment" if self.docstatus==1 else None
def set_actual_qty(self):
for d in self.get('delivery_note_details'):
@@ -60,7 +60,7 @@
super(DocType, self).validate()
from erpnext.utilities import validate_status
- validate_status(self.doc.status, ["Draft", "Submitted", "Cancelled"])
+ validate_status(self.status, ["Draft", "Submitted", "Cancelled"])
self.so_required()
self.validate_proj_cust()
@@ -74,8 +74,8 @@
from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
self.doclist = make_packing_list(self, 'delivery_note_details')
- self.doc.status = 'Draft'
- if not self.doc.installation_status: self.doc.installation_status = 'Not Installed'
+ self.status = 'Draft'
+ if not self.installation_status: self.installation_status = 'Not Installed'
def validate_with_previous_doc(self):
items = self.get("delivery_note_details")
@@ -101,12 +101,12 @@
def validate_proj_cust(self):
"""check for does customer belong to same project as entered.."""
- if self.doc.project_name and self.doc.customer:
+ if self.project_name and self.customer:
res = frappe.db.sql("""select name from `tabProject`
where name = %s and (customer = %s or
- ifnull(customer,'')='')""", (self.doc.project_name, self.doc.customer))
+ ifnull(customer,'')='')""", (self.project_name, self.customer))
if not res:
- msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in project - %s."%(self.doc.customer,self.doc.project_name,self.doc.project_name))
+ msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in project - %s."%(self.customer,self.project_name,self.project_name))
raise Exception
def validate_for_items(self):
@@ -150,7 +150,7 @@
self.validate_packed_qty()
# Check for Approving Authority
- get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total, self)
+ get_obj('Authorization Control').validate_approving_authority(self.doctype, self.company, self.grand_total, self)
# update delivered qty in sales order
self.update_prevdoc_status()
@@ -183,17 +183,17 @@
"""
Validate that if packed qty exists, it should be equal to qty
"""
- if not any([flt(d.fields.get('packed_qty')) for d in self.doclist if
+ if not any([flt(d.get('packed_qty')) for d in self.doclist if
d.doctype=='Delivery Note Item']):
return
packing_error_list = []
for d in self.doclist:
if d.doctype != 'Delivery Note Item': continue
- if flt(d.fields.get('qty')) != flt(d.fields.get('packed_qty')):
+ if flt(d.get('qty')) != flt(d.get('packed_qty')):
packing_error_list.append([
- d.fields.get('item_code', ''),
- d.fields.get('qty', 0),
- d.fields.get('packed_qty', 0)
+ d.get('item_code', ''),
+ d.get('qty', 0),
+ d.get('packed_qty', 0)
])
if packing_error_list:
err_msg = "\n".join([("Item: " + d[0] + ", Qty: " + cstr(d[1]) \
@@ -204,7 +204,7 @@
submit_rv = frappe.db.sql("""select t1.name
from `tabSales Invoice` t1,`tabSales Invoice Item` t2
where t1.name = t2.parent and t2.delivery_note = %s and t1.docstatus = 1""",
- (self.doc.name))
+ (self.name))
if submit_rv:
msgprint("Sales Invoice : " + cstr(submit_rv[0][0]) + " has already been submitted !")
raise Exception , "Validation Error."
@@ -212,7 +212,7 @@
submit_in = frappe.db.sql("""select t1.name
from `tabInstallation Note` t1, `tabInstallation Note Item` t2
where t1.name = t2.parent and t2.prevdoc_docname = %s and t1.docstatus = 1""",
- (self.doc.name))
+ (self.name))
if submit_in:
msgprint("Installation Note : "+cstr(submit_in[0][0]) +" has already been submitted !")
raise Exception , "Validation Error."
@@ -222,7 +222,7 @@
Cancel submitted packing slips related to this delivery note
"""
res = frappe.db.sql("""SELECT name FROM `tabPacking Slip` WHERE delivery_note = %s
- AND docstatus = 1""", self.doc.name)
+ AND docstatus = 1""", self.name)
if res:
from frappe.model.bean import Bean
@@ -254,11 +254,11 @@
args = {
"item_code": d['item_code'],
"warehouse": d["reserved_warehouse"],
- "voucher_type": self.doc.doctype,
- "voucher_no": self.doc.name,
- "reserved_qty": (self.doc.docstatus==1 and 1 or -1)*flt(d['reserved_qty']),
- "posting_date": self.doc.posting_date,
- "is_amended": self.doc.amended_from and 'Yes' or 'No'
+ "voucher_type": self.doctype,
+ "voucher_no": self.name,
+ "reserved_qty": (self.docstatus==1 and 1 or -1)*flt(d['reserved_qty']),
+ "posting_date": self.posting_date,
+ "is_amended": self.amended_from and 'Yes' or 'No'
}
update_bin(args)
@@ -269,7 +269,7 @@
if not (d.against_sales_order or d.against_sales_invoice):
amount += d.base_amount
if amount != 0:
- total = (amount/self.doc.net_total)*self.doc.grand_total
+ total = (amount/self.net_total)*self.grand_total
self.check_credit(total)
def get_invoiced_qty_map(delivery_note):
@@ -290,7 +290,7 @@
def update_accounts(source, target):
si = frappe.bean(target)
- si.doc.is_pos = 0
+ si.is_pos = 0
si.run_method("onload_post_render")
si.set_doclist(si.doclist.get({"parentfield": ["!=", "entries"]}) +
diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
index 1ad6507..4c6af1b 100644
--- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
@@ -28,11 +28,11 @@
dn = frappe.bean(copy=test_records[0]).insert()
self.assertRaises(frappe.ValidationError, make_sales_invoice,
- dn.doc.name)
+ dn.name)
- dn = frappe.bean("Delivery Note", dn.doc.name)
+ dn = frappe.bean("Delivery Note", dn.name)
dn.submit()
- si = make_sales_invoice(dn.doc.name)
+ si = make_sales_invoice(dn.name)
self.assertEquals(len(si), len(dn.doclist))
@@ -53,12 +53,12 @@
dn.submit()
stock_value, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
- {"voucher_type": "Delivery Note", "voucher_no": dn.doc.name,
+ {"voucher_type": "Delivery Note", "voucher_no": dn.name,
"item_code": "_Test Item"}, ["stock_value", "stock_value_difference"])
self.assertEqual(stock_value, 0)
self.assertEqual(stock_value_difference, -375)
- self.assertFalse(get_gl_entries("Delivery Note", dn.doc.name))
+ self.assertFalse(get_gl_entries("Delivery Note", dn.name))
def test_delivery_note_gl_entry(self):
self.clear_stock_account_balance()
@@ -76,12 +76,12 @@
{"master_name": dn.doclist[1].warehouse})
from erpnext.accounts.utils import get_balance_on
- prev_bal = get_balance_on(stock_in_hand_account, dn.doc.posting_date)
+ prev_bal = get_balance_on(stock_in_hand_account, dn.posting_date)
dn.insert()
dn.submit()
- gl_entries = get_gl_entries("Delivery Note", dn.doc.name)
+ gl_entries = get_gl_entries("Delivery Note", dn.name)
self.assertTrue(gl_entries)
expected_values = {
stock_in_hand_account: [0.0, 375.0],
@@ -91,19 +91,19 @@
self.assertEquals([gle.debit, gle.credit], expected_values.get(gle.account))
# check stock in hand balance
- bal = get_balance_on(stock_in_hand_account, dn.doc.posting_date)
+ bal = get_balance_on(stock_in_hand_account, dn.posting_date)
self.assertEquals(bal, prev_bal - 375.0)
# back dated purchase receipt
pr = frappe.bean(copy=pr_test_records[0])
- pr.doc.posting_date = "2013-01-01"
+ pr.posting_date = "2013-01-01"
pr.doclist[1].rate = 100
pr.doclist[1].base_amount = 100
pr.insert()
pr.submit()
- gl_entries = get_gl_entries("Delivery Note", dn.doc.name)
+ gl_entries = get_gl_entries("Delivery Note", dn.name)
self.assertTrue(gl_entries)
expected_values = {
stock_in_hand_account: [0.0, 666.67],
@@ -113,7 +113,7 @@
self.assertEquals([gle.debit, gle.credit], expected_values.get(gle.account))
dn.cancel()
- self.assertFalse(get_gl_entries("Delivery Note", dn.doc.name))
+ self.assertFalse(get_gl_entries("Delivery Note", dn.name))
set_perpetual_inventory(0)
def test_delivery_note_gl_entry_packing_item(self):
@@ -131,12 +131,12 @@
{"master_name": dn.doclist[1].warehouse})
from erpnext.accounts.utils import get_balance_on
- prev_bal = get_balance_on(stock_in_hand_account, dn.doc.posting_date)
+ prev_bal = get_balance_on(stock_in_hand_account, dn.posting_date)
dn.insert()
dn.submit()
- gl_entries = get_gl_entries("Delivery Note", dn.doc.name)
+ gl_entries = get_gl_entries("Delivery Note", dn.name)
self.assertTrue(gl_entries)
expected_values = {
@@ -147,11 +147,11 @@
self.assertEquals([gle.debit, gle.credit], expected_values.get(gle.account))
# check stock in hand balance
- bal = get_balance_on(stock_in_hand_account, dn.doc.posting_date)
+ bal = get_balance_on(stock_in_hand_account, dn.posting_date)
self.assertEquals(bal, prev_bal - 525.0)
dn.cancel()
- self.assertFalse(get_gl_entries("Delivery Note", dn.doc.name))
+ self.assertFalse(get_gl_entries("Delivery Note", dn.name))
set_perpetual_inventory(0)
@@ -172,7 +172,7 @@
self.assertEquals(frappe.db.get_value("Serial No", serial_nos[0], "status"), "Delivered")
self.assertFalse(frappe.db.get_value("Serial No", serial_nos[0], "warehouse"))
self.assertEquals(frappe.db.get_value("Serial No", serial_nos[0],
- "delivery_document_no"), dn.doc.name)
+ "delivery_document_no"), dn.name)
return dn
@@ -196,7 +196,7 @@
serial_nos = get_serial_nos(se.doclist[1].serial_no)
sr = frappe.bean("Serial No", serial_nos[0])
- sr.doc.status = "Not Available"
+ sr.status = "Not Available"
sr.save()
dn = frappe.bean(copy=test_records[0])
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 2074925..9f556db 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -14,19 +14,19 @@
class Item(DocListController):
def onload(self):
- self.doc.fields["__sle_exists"] = self.check_if_sle_exists()
+ self.set("__sle_exists", self.check_if_sle_exists())
def autoname(self):
if frappe.db.get_default("item_naming_by")=="Naming Series":
from frappe.model.naming import make_autoname
- self.doc.item_code = make_autoname(self.doc.naming_series+'.#####')
- elif not self.doc.item_code:
+ self.item_code = make_autoname(self.naming_series+'.#####')
+ elif not self.item_code:
msgprint(_("Item Code (item_code) is mandatory because Item naming is not sequential."), raise_exception=1)
- self.doc.name = self.doc.item_code
+ self.name = self.item_code
def validate(self):
- if not self.doc.stock_uom:
+ if not self.stock_uom:
msgprint(_("Please enter Default Unit of Measure"), raise_exception=1)
self.check_warehouse_is_set_for_stock_item()
@@ -41,53 +41,53 @@
self.cant_change()
self.validate_item_type_for_reorder()
- if not self.doc.parent_website_route:
- self.doc.parent_website_route = frappe.get_website_route("Item Group", self.doc.item_group)
+ if not self.parent_website_route:
+ self.parent_website_route = frappe.get_website_route("Item Group", self.item_group)
- if self.doc.name:
- self.old_page_name = frappe.db.get_value('Item', self.doc.name, 'page_name')
+ if self.name:
+ self.old_page_name = frappe.db.get_value('Item', self.name, 'page_name')
def on_update(self):
self.validate_name_with_item_group()
self.update_item_price()
def check_warehouse_is_set_for_stock_item(self):
- if self.doc.is_stock_item=="Yes" and not self.doc.default_warehouse:
+ if self.is_stock_item=="Yes" and not self.default_warehouse:
frappe.msgprint(_("Default Warehouse is mandatory for Stock Item."),
raise_exception=WarehouseNotSet)
def add_default_uom_in_conversion_factor_table(self):
uom_conv_list = [d.uom for d in self.get("uom_conversion_details")]
- if self.doc.stock_uom not in uom_conv_list:
- ch = self.doc.append('uom_conversion_details', {})
- ch.uom = self.doc.stock_uom
+ if self.stock_uom not in uom_conv_list:
+ ch = self.append('uom_conversion_details', {})
+ ch.uom = self.stock_uom
ch.conversion_factor = 1
for d in self.get("uom_conversion_details"):
- if d.conversion_factor == 1 and d.uom != self.doc.stock_uom:
+ if d.conversion_factor == 1 and d.uom != self.stock_uom:
self.doclist.remove(d)
def check_stock_uom_with_bin(self):
- if not self.doc.fields.get("__islocal"):
+ if not self.get("__islocal"):
matched=True
ref_uom = frappe.db.get_value("Stock Ledger Entry",
- {"item_code": self.doc.name}, "stock_uom")
+ {"item_code": self.name}, "stock_uom")
if ref_uom:
- if cstr(ref_uom) != cstr(self.doc.stock_uom):
+ if cstr(ref_uom) != cstr(self.stock_uom):
matched = False
else:
bin_list = frappe.db.sql("select * from tabBin where item_code=%s",
- self.doc.item_code, as_dict=1)
+ self.item_code, as_dict=1)
for bin in bin_list:
if (bin.reserved_qty > 0 or bin.ordered_qty > 0 or bin.indented_qty > 0 \
- or bin.planned_qty > 0) and cstr(bin.stock_uom) != cstr(self.doc.stock_uom):
+ or bin.planned_qty > 0) and cstr(bin.stock_uom) != cstr(self.stock_uom):
matched = False
break
if matched and bin_list:
frappe.db.sql("""update tabBin set stock_uom=%s where item_code=%s""",
- (self.doc.stock_uom, self.doc.name))
+ (self.stock_uom, self.name))
if not matched:
frappe.throw(_("Default Unit of Measure can not be changed directly because you have already made some transaction(s) with another UOM. To change default UOM, use 'UOM Replace Utility' tool under Stock module."))
@@ -101,38 +101,38 @@
else:
check_list.append(cstr(d.uom))
- if d.uom and cstr(d.uom) == cstr(self.doc.stock_uom) and flt(d.conversion_factor) != 1:
+ if d.uom and cstr(d.uom) == cstr(self.stock_uom) and flt(d.conversion_factor) != 1:
msgprint(_("""Conversion Factor of UOM: %s should be equal to 1. As UOM: %s is Stock UOM of Item: %s.""" %
- (d.uom, d.uom, self.doc.name)), raise_exception=1)
- elif d.uom and cstr(d.uom)!= self.doc.stock_uom and flt(d.conversion_factor) == 1:
+ (d.uom, d.uom, self.name)), raise_exception=1)
+ elif d.uom and cstr(d.uom)!= self.stock_uom and flt(d.conversion_factor) == 1:
msgprint(_("""Conversion Factor of UOM: %s should not be equal to 1. As UOM: %s is not Stock UOM of Item: %s""" %
- (d.uom, d.uom, self.doc.name)), raise_exception=1)
+ (d.uom, d.uom, self.name)), raise_exception=1)
def validate_item_type(self):
- if cstr(self.doc.is_manufactured_item) == "No":
- self.doc.is_pro_applicable = "No"
+ if cstr(self.is_manufactured_item) == "No":
+ self.is_pro_applicable = "No"
- if self.doc.is_pro_applicable == 'Yes' and self.doc.is_stock_item == 'No':
+ if self.is_pro_applicable == 'Yes' and self.is_stock_item == 'No':
frappe.throw(_("As Production Order can be made for this item, \
it must be a stock item."))
- if self.doc.has_serial_no == 'Yes' and self.doc.is_stock_item == 'No':
+ if self.has_serial_no == 'Yes' and self.is_stock_item == 'No':
msgprint("'Has Serial No' can not be 'Yes' for non-stock item", raise_exception=1)
def check_for_active_boms(self):
- if self.doc.is_purchase_item != "Yes":
+ if self.is_purchase_item != "Yes":
bom_mat = frappe.db.sql("""select distinct t1.parent
from `tabBOM Item` t1, `tabBOM` t2 where t2.name = t1.parent
and t1.item_code =%s and ifnull(t1.bom_no, '') = '' and t2.is_active = 1
- and t2.docstatus = 1 and t1.docstatus =1 """, self.doc.name)
+ and t2.docstatus = 1 and t1.docstatus =1 """, self.name)
if bom_mat and bom_mat[0][0]:
frappe.throw(_("Item must be a purchase item, \
as it is present in one or many Active BOMs"))
- if self.doc.is_manufactured_item != "Yes":
+ if self.is_manufactured_item != "Yes":
bom = frappe.db.sql("""select name from `tabBOM` where item = %s
- and is_active = 1""", (self.doc.name,))
+ and is_active = 1""", (self.name,))
if bom and bom[0][0]:
frappe.throw(_("""Allow Bill of Materials should be 'Yes'. Because one or many \
active BOMs present for this item"""))
@@ -142,7 +142,7 @@
cust_code=[]
for d in self.get('item_customer_details'):
cust_code.append(d.ref_code)
- self.doc.customer_code=','.join(cust_code)
+ self.customer_code=','.join(cust_code)
def check_item_tax(self):
"""Check whether Tax Rate is not entered twice for same Tax Type"""
@@ -160,53 +160,53 @@
check_list.append(d.tax_type)
def validate_barcode(self):
- if self.doc.barcode:
+ if self.barcode:
duplicate = frappe.db.sql("""select name from tabItem where barcode = %s
- and name != %s""", (self.doc.barcode, self.doc.name))
+ and name != %s""", (self.barcode, self.name))
if duplicate:
msgprint("Barcode: %s already used in item: %s" %
- (self.doc.barcode, cstr(duplicate[0][0])), raise_exception = 1)
+ (self.barcode, cstr(duplicate[0][0])), raise_exception = 1)
def cant_change(self):
- if not self.doc.fields.get("__islocal"):
- vals = frappe.db.get_value("Item", self.doc.name,
+ if not self.get("__islocal"):
+ vals = frappe.db.get_value("Item", self.name,
["has_serial_no", "is_stock_item", "valuation_method"], as_dict=True)
- if vals and ((self.doc.is_stock_item == "No" and vals.is_stock_item == "Yes") or
- vals.has_serial_no != self.doc.has_serial_no or
- cstr(vals.valuation_method) != cstr(self.doc.valuation_method)):
+ if vals and ((self.is_stock_item == "No" and vals.is_stock_item == "Yes") or
+ vals.has_serial_no != self.has_serial_no or
+ cstr(vals.valuation_method) != cstr(self.valuation_method)):
if self.check_if_sle_exists() == "exists":
frappe.throw(_("As there are existing stock transactions for this item, you can not change the values of 'Has Serial No', 'Is Stock Item' and 'Valuation Method'"))
def validate_item_type_for_reorder(self):
- if self.doc.re_order_level or len(self.doclist.get({"parentfield": "item_reorder",
+ if self.re_order_level or len(self.doclist.get({"parentfield": "item_reorder",
"material_request_type": "Purchase"})):
- if not self.doc.is_purchase_item:
+ if not self.is_purchase_item:
frappe.msgprint(_("""To set reorder level, item must be Purchase Item"""),
raise_exception=1)
def check_if_sle_exists(self):
sle = frappe.db.sql("""select name from `tabStock Ledger Entry`
- where item_code = %s""", self.doc.name)
+ where item_code = %s""", self.name)
return sle and 'exists' or 'not exists'
def validate_name_with_item_group(self):
# causes problem with tree build
- if frappe.db.exists("Item Group", self.doc.name):
+ if frappe.db.exists("Item Group", self.name):
frappe.msgprint("An item group exists with same name (%s), \
please change the item name or rename the item group" %
- self.doc.name, raise_exception=1)
+ self.name, raise_exception=1)
def update_item_price(self):
frappe.db.sql("""update `tabItem Price` set item_name=%s,
item_description=%s, modified=NOW() where item_code=%s""",
- (self.doc.item_name, self.doc.description, self.doc.name))
+ (self.item_name, self.description, self.name))
def get_page_title(self):
- if self.doc.name==self.doc.item_name:
- page_name_from = self.doc.name
+ if self.name==self.item_name:
+ page_name_from = self.name
else:
- page_name_from = self.doc.name + " " + self.doc.item_name
+ page_name_from = self.name + " " + self.item_name
return page_name_from
@@ -223,7 +223,7 @@
return ret
def on_trash(self):
- frappe.db.sql("""delete from tabBin where item_code=%s""", self.doc.item_code)
+ frappe.db.sql("""delete from tabBin where item_code=%s""", self.item_code)
def before_rename(self, olddn, newdn, merge=False):
if merge:
@@ -233,7 +233,7 @@
field_list = ["stock_uom", "is_stock_item", "has_serial_no", "has_batch_no"]
new_properties = [cstr(d) for d in frappe.db.get_value("Item", newdn, field_list)]
- if new_properties != [cstr(self.doc.fields[fld]) for fld in field_list]:
+ if new_properties != [cstr(self.fields[fld]) for fld in field_list]:
frappe.throw(_("To merge, following properties must be same for both items")
+ ": \n" + ", ".join([self.meta.get_label(fld) for fld in field_list]))
diff --git a/erpnext/stock/doctype/item/test_item.py b/erpnext/stock/doctype/item/test_item.py
index e86b113..8d99b2f 100644
--- a/erpnext/stock/doctype/item/test_item.py
+++ b/erpnext/stock/doctype/item/test_item.py
@@ -14,8 +14,8 @@
def test_default_warehouse(self):
from erpnext.stock.doctype.item.item import WarehouseNotSet
item = frappe.bean(copy=test_records[0])
- item.doc.is_stock_item = "Yes"
- item.doc.default_warehouse = None
+ item.is_stock_item = "Yes"
+ item.default_warehouse = None
self.assertRaises(WarehouseNotSet, item.insert)
def test_get_item_details(self):
diff --git a/erpnext/stock/doctype/item_price/item_price.py b/erpnext/stock/doctype/item_price/item_price.py
index 3c3972b..8916628 100644
--- a/erpnext/stock/doctype/item_price/item_price.py
+++ b/erpnext/stock/doctype/item_price/item_price.py
@@ -19,39 +19,39 @@
self.update_item_details()
def validate_item(self):
- if not frappe.db.exists("Item", self.doc.item_code):
+ if not frappe.db.exists("Item", self.item_code):
throw("{doctype}: {item} {not_found}".format(**{
"doctype": _("Item"),
- "item": self.doc.item_code,
+ "item": self.item_code,
"not_found": _(" not found")
}))
def validate_price_list(self):
- enabled = frappe.db.get_value("Price List", self.doc.price_list, "enabled")
+ enabled = frappe.db.get_value("Price List", self.price_list, "enabled")
if not enabled:
throw("{message}: {price_list} {disabled}".format(**{
"message": _("Price List"),
- "price_list": self.doc.price_list,
+ "price_list": self.price_list,
"disabled": _("is disabled.")
}))
def check_duplicate_item(self):
if frappe.db.sql("""select name from `tabItem Price`
where item_code=%s and price_list=%s and name!=%s""",
- (self.doc.item_code, self.doc.price_list, self.doc.name)):
+ (self.item_code, self.price_list, self.name)):
throw("{duplicate_item}: {item_code}, {already}: {price_list}".format(**{
"duplicate_item": _("Duplicate Item"),
- "item_code": self.doc.item_code,
+ "item_code": self.item_code,
"already": _("already available in Price List"),
- "price_list": self.doc.price_list
+ "price_list": self.price_list
}), ItemPriceDuplicateItem)
def update_price_list_details(self):
- self.doc.buying, self.doc.selling, self.doc.currency = \
- frappe.db.get_value("Price List", {"name": self.doc.price_list, "enabled": 1},
+ self.buying, self.selling, self.currency = \
+ frappe.db.get_value("Price List", {"name": self.price_list, "enabled": 1},
["buying", "selling", "currency"])
def update_item_details(self):
- self.doc.item_name, self.doc.item_description = frappe.db.get_value("Item",
- self.doc.item_code, ["item_name", "description"])
+ self.item_name, self.item_description = frappe.db.get_value("Item",
+ self.item_code, ["item_name", "description"])
\ No newline at end of file
diff --git a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
index 34cbe3e..2a80a4d 100644
--- a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
+++ b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
@@ -38,7 +38,7 @@
pr_items = pr_bean.get("purchase_tax_details")
for lc in self.get("landed_cost_details"):
- amt = flt(lc.amount) * flt(pr_bean.doc.net_total)/ flt(total_amt)
+ amt = flt(lc.amount) * flt(pr_bean.net_total)/ flt(total_amt)
matched_row = pr_bean.doclist.get({
"parentfield": "other_charges",
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index fda6849..76e6aa2 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -37,7 +37,7 @@
already_indented = frappe.db.sql("""select sum(ifnull(qty, 0))
from `tabMaterial Request Item`
where item_code = %s and sales_order_no = %s and
- docstatus = 1 and parent != %s""", (item, so_no, self.doc.name))
+ docstatus = 1 and parent != %s""", (item, so_no, self.name))
already_indented = already_indented and flt(already_indented[0][0]) or 0
actual_so_qty = frappe.db.sql("""select sum(ifnull(qty, 0)) from `tabSales Order Item`
@@ -51,7 +51,7 @@
def validate_schedule_date(self):
for d in self.get('indent_details'):
- if d.schedule_date < self.doc.transaction_date:
+ if d.schedule_date < self.transaction_date:
frappe.throw(_("Expected Date cannot be before Material Request Date"))
# Validate
@@ -62,11 +62,11 @@
self.validate_schedule_date()
self.validate_uom_is_integer("uom", "qty")
- if not self.doc.status:
- self.doc.status = "Draft"
+ if not self.status:
+ self.status = "Draft"
from erpnext.utilities import validate_status
- validate_status(self.doc.status, ["Draft", "Submitted", "Stopped", "Cancelled"])
+ validate_status(self.status, ["Draft", "Submitted", "Stopped", "Cancelled"])
self.validate_value("material_request_type", "in", ["Purchase", "Transfer"])
@@ -95,7 +95,7 @@
"item_code": d.item_code,
"warehouse": d.warehouse,
"indented_qty": (is_submit and 1 or -1) * flt(qty),
- "posting_date": self.doc.transaction_date
+ "posting_date": self.transaction_date
}
update_bin(args)
@@ -105,12 +105,12 @@
def check_modified_date(self):
mod_db = frappe.db.sql("""select modified from `tabMaterial Request` where name = %s""",
- self.doc.name)
+ self.name)
date_diff = frappe.db.sql("""select TIMEDIFF('%s', '%s')"""
- % (mod_db[0][0], cstr(self.doc.modified)))
+ % (mod_db[0][0], cstr(self.modified)))
if date_diff and date_diff[0][0]:
- frappe.throw(cstr(self.doc.doctype) + " => " + cstr(self.doc.name) + " has been modified. Please Refresh.")
+ frappe.throw(cstr(self.doctype) + " => " + cstr(self.name) + " has been modified. Please Refresh.")
def update_status(self, status):
self.check_modified_date()
@@ -121,7 +121,7 @@
frappe.db.set(self.doc, 'status', cstr(status))
# Step 3:=> Acknowledge User
- msgprint(self.doc.doctype + ": " + self.doc.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)))
+ msgprint(self.doctype + ": " + self.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)))
def on_cancel(self):
@@ -129,18 +129,18 @@
pc_obj = get_obj(dt='Purchase Common')
# Step 2:=> Check for stopped status
- pc_obj.check_for_stopped_status(self.doc.doctype, self.doc.name)
+ pc_obj.check_for_stopped_status(self.doctype, self.name)
# Step 3:=> Check if Purchase Order has been submitted against current Material Request
- pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Order', docname = self.doc.name, detail_doctype = 'Purchase Order Item')
+ pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Order', docname = self.name, detail_doctype = 'Purchase Order Item')
# Step 4:=> Update Bin
- self.update_bin(is_submit = 0, is_stopped = (cstr(self.doc.status) == 'Stopped') and 1 or 0)
+ self.update_bin(is_submit = 0, is_stopped = (cstr(self.status) == 'Stopped') and 1 or 0)
# Step 5:=> Set Status
frappe.db.set(self.doc,'status','Cancelled')
def update_completed_qty(self, mr_items=None):
- if self.doc.material_request_type != "Transfer":
+ if self.material_request_type != "Transfer":
return
item_doclist = self.get("indent_details")
@@ -154,7 +154,7 @@
d.ordered_qty = flt(frappe.db.sql("""select sum(transfer_qty)
from `tabStock Entry Detail` where material_request = %s
and material_request_item = %s and docstatus = 1""",
- (self.doc.name, d.name))[0][0])
+ (self.name, d.name))[0][0])
frappe.db.set_value(d.doctype, d.name, "ordered_qty", d.ordered_qty)
# note: if qty is 0, its row is still counted in len(item_doclist)
@@ -164,11 +164,11 @@
elif d.qty > 0:
per_ordered += flt(d.ordered_qty / flt(d.qty))
- self.doc.per_ordered = flt((per_ordered / flt(len(item_doclist))) * 100.0, 2)
- frappe.db.set_value(self.doc.doctype, self.doc.name, "per_ordered", self.doc.per_ordered)
+ self.per_ordered = flt((per_ordered / flt(len(item_doclist))) * 100.0, 2)
+ frappe.db.set_value(self.doctype, self.name, "per_ordered", self.per_ordered)
def update_completed_qty(bean, method):
- if bean.doc.doctype == "Stock Entry":
+ if bean.doctype == "Stock Entry":
material_request_map = {}
for d in bean.get("mtn_details"):
@@ -179,9 +179,9 @@
mr_obj = frappe.get_obj("Material Request", mr_name, with_children=1)
mr_doctype = frappe.get_meta("Material Request")
- if mr_obj.doc.status in ["Stopped", "Cancelled"]:
- frappe.throw(_("Material Request") + ": %s, " % mr_obj.doc.name
- + _(mr_doctype.get_label("status")) + " = %s. " % _(mr_obj.doc.status)
+ if mr_obj.status in ["Stopped", "Cancelled"]:
+ frappe.throw(_("Material Request") + ": %s, " % mr_obj.name
+ + _(mr_doctype.get_label("status")) + " = %s. " % _(mr_obj.status)
+ _("Cannot continue."), exc=frappe.InvalidStatusError)
_update_requested_qty(bean, mr_obj, mr_items)
@@ -195,7 +195,7 @@
for mr_item_name in mr_items:
mr_item = mr_obj.doclist.getone({"parentfield": "indent_details", "name": mr_item_name})
se_detail = bean.doclist.getone({"parentfield": "mtn_details",
- "material_request": mr_obj.doc.name, "material_request_item": mr_item_name})
+ "material_request": mr_obj.name, "material_request_item": mr_item_name})
mr_item.ordered_qty = flt(mr_item.ordered_qty)
mr_item.qty = flt(mr_item.qty)
@@ -214,7 +214,7 @@
"item_code": se_detail.item_code,
"warehouse": se_detail.t_warehouse,
"indented_qty": (se_detail.docstatus==2 and 1 or -1) * add_indented_qty,
- "posting_date": bean.doc.posting_date,
+ "posting_date": bean.posting_date,
})
def set_missing_values(source, target_doclist):
@@ -270,7 +270,7 @@
po_items = target_doclist.get({"parentfield": "po_details"})
target_doclist = target_doclist.get({"parentfield": ["!=", "po_details"]}) + \
[d for d in po_items
- if d.fields.get("item_code") in supplier_items and d.fields.get("qty") > 0]
+ if d.get("item_code") in supplier_items and d.get("qty") > 0]
return target_doclist
diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py
index a41425b..f70f14c 100644
--- a/erpnext/stock/doctype/material_request/test_material_request.py
+++ b/erpnext/stock/doctype/material_request/test_material_request.py
@@ -18,11 +18,11 @@
mr = frappe.bean(copy=test_records[0]).insert()
self.assertRaises(frappe.ValidationError, make_purchase_order,
- mr.doc.name)
+ mr.name)
- mr = frappe.bean("Material Request", mr.doc.name)
+ mr = frappe.bean("Material Request", mr.name)
mr.submit()
- po = make_purchase_order(mr.doc.name)
+ po = make_purchase_order(mr.name)
self.assertEquals(po[0]["doctype"], "Purchase Order")
self.assertEquals(len(po), len(mr.doclist))
@@ -33,11 +33,11 @@
mr = frappe.bean(copy=test_records[0]).insert()
self.assertRaises(frappe.ValidationError, make_supplier_quotation,
- mr.doc.name)
+ mr.name)
- mr = frappe.bean("Material Request", mr.doc.name)
+ mr = frappe.bean("Material Request", mr.name)
mr.submit()
- sq = make_supplier_quotation(mr.doc.name)
+ sq = make_supplier_quotation(mr.name)
self.assertEquals(sq[0]["doctype"], "Supplier Quotation")
self.assertEquals(len(sq), len(mr.doclist))
@@ -49,12 +49,12 @@
mr = frappe.bean(copy=test_records[0]).insert()
self.assertRaises(frappe.ValidationError, make_stock_entry,
- mr.doc.name)
+ mr.name)
- mr = frappe.bean("Material Request", mr.doc.name)
- mr.doc.material_request_type = "Transfer"
+ mr = frappe.bean("Material Request", mr.name)
+ mr.material_request_type = "Transfer"
mr.submit()
- se = make_stock_entry(mr.doc.name)
+ se = make_stock_entry(mr.name)
self.assertEquals(se[0]["doctype"], "Stock Entry")
self.assertEquals(len(se), len(mr.doclist))
@@ -62,7 +62,7 @@
def _test_expected(self, doclist, expected_values):
for i, expected in enumerate(expected_values):
for fieldname, val in expected.items():
- self.assertEquals(val, doclist[i].fields.get(fieldname))
+ self.assertEquals(val, doclist[i].get(fieldname))
def _test_requested_qty(self, qty1, qty2):
self.assertEqual(flt(frappe.db.get_value("Bin", {"item_code": "_Test Item Home Desktop 100",
@@ -123,7 +123,7 @@
# map a purchase order
from erpnext.stock.doctype.material_request.material_request import make_purchase_order
- po_doclist = make_purchase_order(mr.doc.name)
+ po_doclist = make_purchase_order(mr.name)
po_doclist[0]["supplier"] = "_Test Supplier"
po_doclist[0]["transaction_date"] = "2013-07-07"
po_doclist[1]["qty"] = 27.0
@@ -161,7 +161,7 @@
# submit material request of type Purchase
mr = frappe.bean(copy=test_records[0])
- mr.doc.material_request_type = "Transfer"
+ mr.material_request_type = "Transfer"
mr.insert()
mr.submit()
@@ -173,7 +173,7 @@
from erpnext.stock.doctype.material_request.material_request import make_stock_entry
# map a stock entry
- se_doclist = make_stock_entry(mr.doc.name)
+ se_doclist = make_stock_entry(mr.name)
se_doclist[0].update({
"posting_date": "2013-03-01",
"posting_time": "01:00",
@@ -224,7 +224,7 @@
# submit material request of type Purchase
mr = frappe.bean(copy=test_records[0])
- mr.doc.material_request_type = "Transfer"
+ mr.material_request_type = "Transfer"
mr.insert()
mr.submit()
@@ -236,7 +236,7 @@
# map a stock entry
from erpnext.stock.doctype.material_request.material_request import make_stock_entry
- se_doclist = make_stock_entry(mr.doc.name)
+ se_doclist = make_stock_entry(mr.name)
se_doclist[0].update({
"posting_date": "2013-03-01",
"posting_time": "00:00",
@@ -284,14 +284,14 @@
def test_incorrect_mapping_of_stock_entry(self):
# submit material request of type Purchase
mr = frappe.bean(copy=test_records[0])
- mr.doc.material_request_type = "Transfer"
+ mr.material_request_type = "Transfer"
mr.insert()
mr.submit()
# map a stock entry
from erpnext.stock.doctype.material_request.material_request import make_stock_entry
- se_doclist = make_stock_entry(mr.doc.name)
+ se_doclist = make_stock_entry(mr.name)
se_doclist[0].update({
"posting_date": "2013-03-01",
"posting_time": "00:00",
@@ -318,7 +318,7 @@
def test_warehouse_company_validation(self):
from erpnext.stock.utils import InvalidWarehouseCompany
mr = frappe.bean(copy=test_records[0])
- mr.doc.company = "_Test Company 1"
+ mr.company = "_Test Company 1"
self.assertRaises(InvalidWarehouseCompany, mr.insert)
test_dependencies = ["Currency Exchange"]
diff --git a/erpnext/stock/doctype/packed_item/packed_item.py b/erpnext/stock/doctype/packed_item/packed_item.py
index b7a15b7..6c7ee51 100644
--- a/erpnext/stock/doctype/packed_item/packed_item.py
+++ b/erpnext/stock/doctype/packed_item/packed_item.py
@@ -38,7 +38,7 @@
break
if not exists:
- pi = obj.doc.append('packing_details', {})
+ pi = obj.append('packing_details', {})
pi.parent_item = line.item_code
pi.item_code = packing_item_code
diff --git a/erpnext/stock/doctype/packing_slip/packing_slip.py b/erpnext/stock/doctype/packing_slip/packing_slip.py
index 99a6ee3..c4f69ac 100644
--- a/erpnext/stock/doctype/packing_slip/packing_slip.py
+++ b/erpnext/stock/doctype/packing_slip/packing_slip.py
@@ -31,7 +31,7 @@
"""
Validates if delivery note has status as draft
"""
- if cint(frappe.db.get_value("Delivery Note", self.doc.delivery_note, "docstatus")) != 0:
+ if cint(frappe.db.get_value("Delivery Note", self.delivery_note, "docstatus")) != 0:
msgprint(_("""Invalid Delivery Note. Delivery Note should exist and should be in draft state. Please rectify and try again."""), raise_exception=1)
def validate_items_mandatory(self):
@@ -43,11 +43,11 @@
"""
Validate if case nos overlap. If they do, recommend next case no.
"""
- if not cint(self.doc.from_case_no):
+ if not cint(self.from_case_no):
frappe.msgprint(_("Please specify a valid 'From Case No.'"), raise_exception=1)
- elif not self.doc.to_case_no:
- self.doc.to_case_no = self.doc.from_case_no
- elif self.doc.from_case_no > self.doc.to_case_no:
+ elif not self.to_case_no:
+ self.to_case_no = self.from_case_no
+ elif self.from_case_no > self.to_case_no:
frappe.msgprint(_("'To Case No.' cannot be less than 'From Case No.'"),
raise_exception=1)
@@ -57,7 +57,7 @@
(from_case_no BETWEEN %(from_case_no)s AND %(to_case_no)s
OR to_case_no BETWEEN %(from_case_no)s AND %(to_case_no)s
OR %(from_case_no)s BETWEEN from_case_no AND to_case_no)
- """, self.doc.fields)
+ """, self.fields)
if res:
frappe.msgprint(_("""Case No(s) already in use. Please rectify and try again.
@@ -102,10 +102,10 @@
from `tabDelivery Note Item` dni
where parent=%s %s
group by item_code""" % ("%s", condition),
- tuple([self.doc.delivery_note] + rows), as_dict=1)
+ tuple([self.delivery_note] + rows), as_dict=1)
ps_item_qty = dict([[d.item_code, d.qty] for d in self.doclist])
- no_of_cases = cint(self.doc.to_case_no) - cint(self.doc.from_case_no) + 1
+ no_of_cases = cint(self.to_case_no) - cint(self.from_case_no) + 1
return res, ps_item_qty, no_of_cases
@@ -128,8 +128,8 @@
"""
Fill empty columns in Packing Slip Item
"""
- if not self.doc.from_case_no:
- self.doc.from_case_no = self.get_recommended_case_no()
+ if not self.from_case_no:
+ self.from_case_no = self.get_recommended_case_no()
for d in self.get("item_details"):
res = frappe.db.get_value("Item", d.item_code,
@@ -145,7 +145,7 @@
note
"""
recommended_case_no = frappe.db.sql("""SELECT MAX(to_case_no) FROM `tabPacking Slip`
- WHERE delivery_note = %(delivery_note)s AND docstatus=1""", self.doc.fields)
+ WHERE delivery_note = %(delivery_note)s AND docstatus=1""", self.fields)
return cint(recommended_case_no[0][0]) + 1
@@ -155,7 +155,7 @@
dn_details = self.get_details_for_packing()[0]
for item in dn_details:
if flt(item.qty) > flt(item.packed_qty):
- ch = self.doc.append('item_details', {})
+ ch = self.append('item_details', {})
ch.item_code = item.item_code
ch.item_name = item.item_name
ch.stock_uom = item.stock_uom
diff --git a/erpnext/stock/doctype/price_list/price_list.py b/erpnext/stock/doctype/price_list/price_list.py
index bf49a51..bfb3ea7 100644
--- a/erpnext/stock/doctype/price_list/price_list.py
+++ b/erpnext/stock/doctype/price_list/price_list.py
@@ -10,7 +10,7 @@
class PriceList(DocListController):
def validate(self):
- if not cint(self.doc.buying) and not cint(self.doc.selling):
+ if not cint(self.buying) and not cint(self.selling):
throw(_("Price List must be applicable for Buying or Selling"))
if not self.get("valid_for_territories"):
@@ -29,26 +29,26 @@
self.update_item_price()
def set_default_if_missing(self):
- if cint(self.doc.selling):
+ if cint(self.selling):
if not frappe.db.get_value("Selling Settings", None, "selling_price_list"):
- frappe.set_value("Selling Settings", "Selling Settings", "selling_price_list", self.doc.name)
+ frappe.set_value("Selling Settings", "Selling Settings", "selling_price_list", self.name)
- elif cint(self.doc.buying):
+ elif cint(self.buying):
if not frappe.db.get_value("Buying Settings", None, "buying_price_list"):
- frappe.set_value("Buying Settings", "Buying Settings", "buying_price_list", self.doc.name)
+ frappe.set_value("Buying Settings", "Buying Settings", "buying_price_list", self.name)
def update_item_price(self):
frappe.db.sql("""update `tabItem Price` set currency=%s,
buying=%s, selling=%s, modified=NOW() where price_list=%s""",
- (self.doc.currency, cint(self.doc.buying), cint(self.doc.selling), self.doc.name))
+ (self.currency, cint(self.buying), cint(self.selling), self.name))
def on_trash(self):
def _update_default_price_list(module):
b = frappe.bean(module + " Settings")
price_list_fieldname = module.lower() + "_price_list"
- if self.doc.name == b.doc.fields[price_list_fieldname]:
- b.doc.fields[price_list_fieldname] = None
+ if self.name == b.fields[price_list_fieldname]:
+ b.set(price_list_fieldname, None)
b.save()
for module in ["Selling", "Buying"]:
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index bad59a6..b6e0539 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -30,21 +30,21 @@
def onload(self):
billed_qty = frappe.db.sql("""select sum(ifnull(qty, 0)) from `tabPurchase Invoice Item`
- where purchase_receipt=%s""", self.doc.name)
+ where purchase_receipt=%s""", self.name)
if billed_qty:
total_qty = sum((item.qty for item in self.get("purchase_receipt_details")))
- self.doc.fields["__billing_complete"] = billed_qty[0][0] == total_qty
+ self.set("__billing_complete", billed_qty[0][0] == total_qty)
def validate(self):
super(DocType, self).validate()
self.po_required()
- if not self.doc.status:
- self.doc.status = "Draft"
+ if not self.status:
+ self.status = "Draft"
from erpnext.utilities import validate_status
- validate_status(self.doc.status, ["Draft", "Submitted", "Cancelled"])
+ validate_status(self.status, ["Draft", "Submitted", "Cancelled"])
self.validate_with_previous_doc()
self.validate_rejected_warehouse()
@@ -67,7 +67,7 @@
def validate_rejected_warehouse(self):
for d in self.get("purchase_receipt_details"):
if flt(d.rejected_qty) and not d.rejected_warehouse:
- d.rejected_warehouse = self.doc.rejected_warehouse
+ d.rejected_warehouse = self.rejected_warehouse
if not d.rejected_warehouse:
frappe.throw(_("Rejected Warehouse is mandatory against regected item"))
@@ -92,11 +92,11 @@
def validate_challan_no(self):
"Validate if same challan no exists for same supplier in a submitted purchase receipt"
- if self.doc.challan_no:
+ if self.challan_no:
exists = frappe.db.sql("""
SELECT name FROM `tabPurchase Receipt`
WHERE name!=%s AND supplier=%s AND challan_no=%s
- AND docstatus=1""", (self.doc.name, self.doc.supplier, self.doc.challan_no))
+ AND docstatus=1""", (self.name, self.supplier, self.challan_no))
if exists:
frappe.msgprint("Another Purchase Receipt using the same Challan No. already exists.\
Please enter a valid Challan No.", raise_exception=1)
@@ -178,15 +178,15 @@
update_bin({
"item_code": d.item_code,
"warehouse": ordered_warehouse,
- "posting_date": self.doc.posting_date,
- "ordered_qty": flt(ordered_qty) if self.doc.docstatus==1 else -flt(ordered_qty)
+ "posting_date": self.posting_date,
+ "ordered_qty": flt(ordered_qty) if self.docstatus==1 else -flt(ordered_qty)
})
def get_already_received_qty(self, po, po_detail):
qty = frappe.db.sql("""select sum(qty) from `tabPurchase Receipt Item`
where prevdoc_detail_docname = %s and docstatus = 1
and prevdoc_doctype='Purchase Order' and prevdoc_docname=%s
- and parent != %s""", (po_detail, po, self.doc.name))
+ and parent != %s""", (po_detail, po, self.name))
return qty and flt(qty[0][0]) or 0.0
def get_po_qty_and_warehouse(self, po_detail):
@@ -200,7 +200,7 @@
# when PR is submitted and it has to be increased when PR is cancelled
sl_entries.append(self.get_sl_entries(d, {
"item_code": d.rm_item_code,
- "warehouse": self.doc.supplier_warehouse,
+ "warehouse": self.supplier_warehouse,
"actual_qty": -1*flt(d.consumed_qty),
"incoming_rate": 0
}))
@@ -226,7 +226,7 @@
purchase_controller = frappe.get_obj("Purchase Common")
# Check for Approving Authority
- get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total)
+ get_obj('Authorization Control').validate_approving_authority(self.doctype, self.company, self.grand_total)
# Set status as Submitted
frappe.db.set(self.doc, 'status', 'Submitted')
@@ -248,7 +248,7 @@
submit_rv = frappe.db.sql("""select t1.name
from `tabPurchase Invoice` t1,`tabPurchase Invoice Item` t2
where t1.name = t2.parent and t2.purchase_receipt = %s and t1.docstatus = 1""",
- (self.doc.name))
+ (self.name))
if submit_rv:
msgprint("Purchase Invoice : " + cstr(self.submit_rv[0][0]) + " has already been submitted !")
raise Exception , "Validation Error."
@@ -262,7 +262,7 @@
submitted = frappe.db.sql("""select t1.name
from `tabPurchase Invoice` t1,`tabPurchase Invoice Item` t2
where t1.name = t2.parent and t2.purchase_receipt = %s and t1.docstatus = 1""",
- self.doc.name)
+ self.name)
if submitted:
frappe.throw("Purchase Invoice : " + cstr(submitted[0][0]) +
" has already been submitted !")
@@ -280,8 +280,8 @@
def get_current_stock(self):
for d in self.get('pr_raw_material_details'):
- if self.doc.supplier_warehouse:
- bin = frappe.db.sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.rm_item_code, self.doc.supplier_warehouse), as_dict = 1)
+ if self.supplier_warehouse:
+ bin = frappe.db.sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.rm_item_code, self.supplier_warehouse), as_dict = 1)
d.current_stock = bin and flt(bin[0]['actual_qty']) or 0
def get_rate(self,arg):
diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
index 2a2e821..58b8d7d 100644
--- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -17,11 +17,11 @@
pr = frappe.bean(copy=test_records[0]).insert()
self.assertRaises(frappe.ValidationError, make_purchase_invoice,
- pr.doc.name)
+ pr.name)
- pr = frappe.bean("Purchase Receipt", pr.doc.name)
+ pr = frappe.bean("Purchase Receipt", pr.name)
pr.submit()
- pi = make_purchase_invoice(pr.doc.name)
+ pi = make_purchase_invoice(pr.name)
self.assertEquals(pi[0]["doctype"], "Purchase Invoice")
self.assertEquals(len(pi), len(pr.doclist))
@@ -38,7 +38,7 @@
pr.submit()
stock_value, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
- {"voucher_type": "Purchase Receipt", "voucher_no": pr.doc.name,
+ {"voucher_type": "Purchase Receipt", "voucher_no": pr.name,
"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"},
["stock_value", "stock_value_difference"])
self.assertEqual(stock_value, 375)
@@ -48,7 +48,7 @@
"warehouse": "_Test Warehouse - _TC"}, "stock_value")
self.assertEqual(bin_stock_value, 375)
- self.assertFalse(get_gl_entries("Purchase Receipt", pr.doc.name))
+ self.assertFalse(get_gl_entries("Purchase Receipt", pr.name))
def test_purchase_receipt_gl_entry(self):
self._clear_stock_account_balance()
@@ -60,7 +60,7 @@
pr.insert()
pr.submit()
- gl_entries = get_gl_entries("Purchase Receipt", pr.doc.name)
+ gl_entries = get_gl_entries("Purchase Receipt", pr.name)
self.assertTrue(gl_entries)
@@ -80,7 +80,7 @@
self.assertEquals(expected_values[gle.account][1], gle.credit)
pr.cancel()
- self.assertFalse(get_gl_entries("Purchase Receipt", pr.doc.name))
+ self.assertFalse(get_gl_entries("Purchase Receipt", pr.name))
set_perpetual_inventory(0)
@@ -106,7 +106,7 @@
pr.submit()
self.assertEquals(frappe.db.get_value("Serial No", pr.doclist[1].serial_no,
- "supplier"), pr.doc.supplier)
+ "supplier"), pr.supplier)
return pr
@@ -124,7 +124,7 @@
def set_perpetual_inventory(enable=1):
accounts_settings = frappe.bean("Accounts Settings")
- accounts_settings.doc.auto_accounting_for_stock = enable
+ accounts_settings.auto_accounting_for_stock = enable
accounts_settings.save()
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index 50b1d00..88b2602 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -27,7 +27,7 @@
self.via_stock_ledger = False
def validate(self):
- if self.doc.fields.get("__islocal") and self.doc.warehouse:
+ if self.get("__islocal") and self.warehouse:
frappe.throw(_("New Serial No cannot have Warehouse. Warehouse must be \
set by Stock Entry or Purchase Receipt"), SerialNoCannotCreateDirectError)
@@ -37,29 +37,29 @@
self.on_stock_ledger_entry()
def set_maintenance_status(self):
- if not self.doc.warranty_expiry_date and not self.doc.amc_expiry_date:
- self.doc.maintenance_status = None
+ if not self.warranty_expiry_date and not self.amc_expiry_date:
+ self.maintenance_status = None
- if self.doc.warranty_expiry_date and self.doc.warranty_expiry_date < nowdate():
- self.doc.maintenance_status = "Out of Warranty"
+ if self.warranty_expiry_date and self.warranty_expiry_date < nowdate():
+ self.maintenance_status = "Out of Warranty"
- if self.doc.amc_expiry_date and self.doc.amc_expiry_date < nowdate():
- self.doc.maintenance_status = "Out of AMC"
+ if self.amc_expiry_date and self.amc_expiry_date < nowdate():
+ self.maintenance_status = "Out of AMC"
- if self.doc.amc_expiry_date and self.doc.amc_expiry_date >= nowdate():
- self.doc.maintenance_status = "Under AMC"
+ if self.amc_expiry_date and self.amc_expiry_date >= nowdate():
+ self.maintenance_status = "Under AMC"
- if self.doc.warranty_expiry_date and self.doc.warranty_expiry_date >= nowdate():
- self.doc.maintenance_status = "Under Warranty"
+ if self.warranty_expiry_date and self.warranty_expiry_date >= nowdate():
+ self.maintenance_status = "Under Warranty"
def validate_warehouse(self):
- if not self.doc.fields.get("__islocal"):
+ if not self.get("__islocal"):
item_code, warehouse = frappe.db.get_value("Serial No",
- self.doc.name, ["item_code", "warehouse"])
- if item_code != self.doc.item_code:
+ self.name, ["item_code", "warehouse"])
+ if item_code != self.item_code:
frappe.throw(_("Item Code cannot be changed for Serial No."),
SerialNoCannotCannotChangeError)
- if not self.via_stock_ledger and warehouse != self.doc.warehouse:
+ if not self.via_stock_ledger and warehouse != self.warehouse:
frappe.throw(_("Warehouse cannot be changed for Serial No."),
SerialNoCannotCannotChangeError)
@@ -67,15 +67,15 @@
"""
Validate whether serial no is required for this item
"""
- item = frappe.doc("Item", self.doc.item_code)
+ item = frappe.doc("Item", self.item_code)
if item.has_serial_no!="Yes":
- frappe.throw(_("Item must have 'Has Serial No' as 'Yes'") + ": " + self.doc.item_code)
+ frappe.throw(_("Item must have 'Has Serial No' as 'Yes'") + ": " + self.item_code)
- self.doc.item_group = item.item_group
- self.doc.description = item.description
- self.doc.item_name = item.item_name
- self.doc.brand = item.brand
- self.doc.warranty_period = item.warranty_period
+ self.item_group = item.item_group
+ self.description = item.description
+ self.item_name = item.item_name
+ self.brand = item.brand
+ self.warranty_period = item.warranty_period
def set_status(self, last_sle):
if last_sle:
@@ -87,52 +87,52 @@
if last_sle.actual_qty > 0:
if document_type == "Sales Return":
- self.doc.status = "Sales Returned"
+ self.status = "Sales Returned"
else:
- self.doc.status = "Available"
+ self.status = "Available"
else:
if document_type == "Purchase Return":
- self.doc.status = "Purchase Returned"
+ self.status = "Purchase Returned"
elif last_sle.voucher_type in ("Delivery Note", "Sales Invoice"):
- self.doc.status = "Delivered"
+ self.status = "Delivered"
else:
- self.doc.status = "Not Available"
+ self.status = "Not Available"
else:
- self.doc.status = "Not Available"
+ self.status = "Not Available"
def set_purchase_details(self, purchase_sle):
if purchase_sle:
- self.doc.purchase_document_type = purchase_sle.voucher_type
- self.doc.purchase_document_no = purchase_sle.voucher_no
- self.doc.purchase_date = purchase_sle.posting_date
- self.doc.purchase_time = purchase_sle.posting_time
- self.doc.purchase_rate = purchase_sle.incoming_rate
+ self.purchase_document_type = purchase_sle.voucher_type
+ self.purchase_document_no = purchase_sle.voucher_no
+ self.purchase_date = purchase_sle.posting_date
+ self.purchase_time = purchase_sle.posting_time
+ self.purchase_rate = purchase_sle.incoming_rate
if purchase_sle.voucher_type == "Purchase Receipt":
- self.doc.supplier, self.doc.supplier_name = \
+ self.supplier, self.supplier_name = \
frappe.db.get_value("Purchase Receipt", purchase_sle.voucher_no,
["supplier", "supplier_name"])
else:
for fieldname in ("purchase_document_type", "purchase_document_no",
"purchase_date", "purchase_time", "purchase_rate", "supplier", "supplier_name"):
- self.doc.fields[fieldname] = None
+ self.set(fieldname, None)
def set_sales_details(self, delivery_sle):
if delivery_sle:
- self.doc.delivery_document_type = delivery_sle.voucher_type
- self.doc.delivery_document_no = delivery_sle.voucher_no
- self.doc.delivery_date = delivery_sle.posting_date
- self.doc.delivery_time = delivery_sle.posting_time
- self.doc.customer, self.doc.customer_name = \
+ self.delivery_document_type = delivery_sle.voucher_type
+ self.delivery_document_no = delivery_sle.voucher_no
+ self.delivery_date = delivery_sle.posting_date
+ self.delivery_time = delivery_sle.posting_time
+ self.customer, self.customer_name = \
frappe.db.get_value(delivery_sle.voucher_type, delivery_sle.voucher_no,
["customer", "customer_name"])
- if self.doc.warranty_period:
- self.doc.warranty_expiry_date = add_days(cstr(delivery_sle.posting_date),
- cint(self.doc.warranty_period))
+ if self.warranty_period:
+ self.warranty_expiry_date = add_days(cstr(delivery_sle.posting_date),
+ cint(self.warranty_period))
else:
for fieldname in ("delivery_document_type", "delivery_document_no",
"delivery_date", "delivery_time", "customer", "customer_name",
"warranty_expiry_date"):
- self.doc.fields[fieldname] = None
+ self.set(fieldname, None)
def get_last_sle(self):
entries = {}
@@ -154,8 +154,8 @@
for sle in frappe.db.sql("""select * from `tabStock Ledger Entry`
where serial_no like %s and item_code=%s and ifnull(is_cancelled, 'No')='No'
order by posting_date desc, posting_time desc, name desc""",
- ("%%%s%%" % self.doc.name, self.doc.item_code), as_dict=1):
- if self.doc.name.upper() in get_serial_nos(sle.serial_no):
+ ("%%%s%%" % self.name, self.item_code), as_dict=1):
+ if self.name.upper() in get_serial_nos(sle.serial_no):
if sle.actual_qty > 0:
sle_dict.setdefault("incoming", []).append(sle)
else:
@@ -164,11 +164,11 @@
return sle_dict
def on_trash(self):
- if self.doc.status == 'Delivered':
- frappe.throw(_("Delivered Serial No ") + self.doc.name + _(" can not be deleted"))
- if self.doc.warehouse:
+ if self.status == 'Delivered':
+ frappe.throw(_("Delivered Serial No ") + self.name + _(" can not be deleted"))
+ if self.warehouse:
frappe.throw(_("Cannot delete Serial No in warehouse. \
- First remove from warehouse, then delete.") + ": " + self.doc.name)
+ First remove from warehouse, then delete.") + ": " + self.name)
def before_rename(self, old, new, merge=False):
if merge:
@@ -188,7 +188,7 @@
('\n'.join(serial_nos), item[0]))
def on_stock_ledger_entry(self):
- if self.via_stock_ledger and not self.doc.fields.get("__islocal"):
+ if self.via_stock_ledger and not self.get("__islocal"):
last_sle = self.get_last_sle()
self.set_status(last_sle.get("last_sle"))
self.set_purchase_details(last_sle.get("purchase_sle"))
@@ -226,22 +226,22 @@
if frappe.db.exists("Serial No", serial_no):
sr = frappe.bean("Serial No", serial_no)
- if sr.doc.item_code!=sle.item_code:
+ if sr.item_code!=sle.item_code:
frappe.throw(_("Serial No does not belong to Item") +
(": %s (%s)" % (sle.item_code, serial_no)), SerialNoItemError)
- if sr.doc.warehouse and sle.actual_qty > 0:
- frappe.throw(_("Same Serial No") + ": " + sr.doc.name +
+ if sr.warehouse and sle.actual_qty > 0:
+ frappe.throw(_("Same Serial No") + ": " + sr.name +
_(" can not be received twice"), SerialNoDuplicateError)
if sle.actual_qty < 0:
- if sr.doc.warehouse!=sle.warehouse:
+ if sr.warehouse!=sle.warehouse:
frappe.throw(_("Serial No") + ": " + serial_no +
_(" does not belong to Warehouse") + ": " + sle.warehouse,
SerialNoWarehouseError)
if sle.voucher_type in ("Delivery Note", "Sales Invoice") \
- and sr.doc.status != "Available":
+ and sr.status != "Available":
frappe.throw(_("Serial No status must be 'Available' to Deliver")
+ ": " + serial_no, SerialNoStatusError)
elif sle.actual_qty < 0:
@@ -266,7 +266,7 @@
if frappe.db.exists("Serial No", serial_no):
sr = frappe.bean("Serial No", serial_no)
sr.make_controller().via_stock_ledger = True
- sr.doc.warehouse = sle.warehouse if sle.actual_qty > 0 else None
+ sr.warehouse = sle.warehouse if sle.actual_qty > 0 else None
sr.save()
elif sle.actual_qty > 0:
make_serial_no(serial_no, sle)
@@ -282,21 +282,21 @@
def make_serial_no(serial_no, sle):
sr = frappe.new_bean("Serial No")
- sr.doc.serial_no = serial_no
- sr.doc.item_code = sle.item_code
- sr.doc.warehouse = None
+ sr.serial_no = serial_no
+ sr.item_code = sle.item_code
+ sr.warehouse = None
sr.make_controller().via_stock_ledger = True
sr.insert()
- sr.doc.warehouse = sle.warehouse
- sr.doc.status = "Available"
+ sr.warehouse = sle.warehouse
+ sr.status = "Available"
sr.save()
- frappe.msgprint(_("Serial No created") + ": " + sr.doc.name)
- return sr.doc.name
+ frappe.msgprint(_("Serial No created") + ": " + sr.name)
+ return sr.name
def update_serial_nos_after_submit(controller, parentfield):
stock_ledger_entries = frappe.db.sql("""select voucher_detail_no, serial_no
from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
- (controller.doc.doctype, controller.doc.name), as_dict=True)
+ (controller.doctype, controller.name), as_dict=True)
if not stock_ledger_entries: return
diff --git a/erpnext/stock/doctype/serial_no/test_serial_no.py b/erpnext/stock/doctype/serial_no/test_serial_no.py
index 8b295b4..dc9c155 100644
--- a/erpnext/stock/doctype/serial_no/test_serial_no.py
+++ b/erpnext/stock/doctype/serial_no/test_serial_no.py
@@ -15,15 +15,15 @@
class TestSerialNo(unittest.TestCase):
def test_cannot_create_direct(self):
sr = frappe.new_bean("Serial No")
- sr.doc.item_code = "_Test Serialized Item"
- sr.doc.warehouse = "_Test Warehouse - _TC"
- sr.doc.serial_no = "_TCSER0001"
- sr.doc.purchase_rate = 10
+ sr.item_code = "_Test Serialized Item"
+ sr.warehouse = "_Test Warehouse - _TC"
+ sr.serial_no = "_TCSER0001"
+ sr.purchase_rate = 10
self.assertRaises(SerialNoCannotCreateDirectError, sr.insert)
- sr.doc.warehouse = None
+ sr.warehouse = None
sr.insert()
- self.assertTrue(sr.doc.name)
+ self.assertTrue(sr.name)
- sr.doc.warehouse = "_Test Warehouse - _TC"
- self.assertTrue(SerialNoCannotCannotChangeError, sr.doc.save)
\ No newline at end of file
+ sr.warehouse = "_Test Warehouse - _TC"
+ self.assertTrue(SerialNoCannotCannotChangeError, sr.save)
\ No newline at end of file
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 785ad97..eeb8d82 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -29,8 +29,8 @@
def validate(self):
self.validate_posting_time()
self.validate_purpose()
- pro_obj = self.doc.production_order and \
- get_obj('Production Order', self.doc.production_order) or None
+ pro_obj = self.production_order and \
+ get_obj('Production Order', self.production_order) or None
self.validate_item()
self.validate_uom_is_integer("uom", "qty")
@@ -61,13 +61,13 @@
def validate_fiscal_year(self):
from erpnext.accounts.utils import validate_fiscal_year
- validate_fiscal_year(self.doc.posting_date, self.doc.fiscal_year,
+ validate_fiscal_year(self.posting_date, self.fiscal_year,
self.meta.get_label("posting_date"))
def validate_purpose(self):
valid_purposes = ["Material Issue", "Material Receipt", "Material Transfer",
"Manufacture/Repack", "Subcontract", "Sales Return", "Purchase Return"]
- if self.doc.purpose not in valid_purposes:
+ if self.purpose not in valid_purposes:
msgprint(_("Purpose must be one of ") + comma_or(valid_purposes),
raise_exception=True)
@@ -87,32 +87,32 @@
validate_for_manufacture_repack = any([d.bom_no for d in self.doclist.get(
{"parentfield": "mtn_details"})])
- if self.doc.purpose in source_mandatory and self.doc.purpose not in target_mandatory:
- self.doc.to_warehouse = None
+ if self.purpose in source_mandatory and self.purpose not in target_mandatory:
+ self.to_warehouse = None
for d in self.get('mtn_details'):
d.t_warehouse = None
- elif self.doc.purpose in target_mandatory and self.doc.purpose not in source_mandatory:
- self.doc.from_warehouse = None
+ elif self.purpose in target_mandatory and self.purpose not in source_mandatory:
+ self.from_warehouse = None
for d in self.get('mtn_details'):
d.s_warehouse = None
for d in self.get('mtn_details'):
if not d.s_warehouse and not d.t_warehouse:
- d.s_warehouse = self.doc.from_warehouse
- d.t_warehouse = self.doc.to_warehouse
+ d.s_warehouse = self.from_warehouse
+ d.t_warehouse = self.to_warehouse
if not (d.s_warehouse or d.t_warehouse):
msgprint(_("Atleast one warehouse is mandatory"), raise_exception=1)
- if self.doc.purpose in source_mandatory and not d.s_warehouse:
+ if self.purpose in source_mandatory and not d.s_warehouse:
msgprint(_("Row # ") + "%s: " % cint(d.idx)
+ _("Source Warehouse") + _(" is mandatory"), raise_exception=1)
- if self.doc.purpose in target_mandatory and not d.t_warehouse:
+ if self.purpose in target_mandatory and not d.t_warehouse:
msgprint(_("Row # ") + "%s: " % cint(d.idx)
+ _("Target Warehouse") + _(" is mandatory"), raise_exception=1)
- if self.doc.purpose == "Manufacture/Repack":
+ if self.purpose == "Manufacture/Repack":
if validate_for_manufacture_repack:
if d.bom_no:
d.s_warehouse = None
@@ -121,7 +121,7 @@
msgprint(_("Row # ") + "%s: " % cint(d.idx)
+ _("Target Warehouse") + _(" is mandatory"), raise_exception=1)
- elif pro_obj and cstr(d.t_warehouse) != pro_obj.doc.fg_warehouse:
+ elif pro_obj and cstr(d.t_warehouse) != pro_obj.fg_warehouse:
msgprint(_("Row # ") + "%s: " % cint(d.idx)
+ _("Target Warehouse") + _(" should be same as that in ")
+ _("Production Order"), raise_exception=1)
@@ -138,28 +138,28 @@
def validate_production_order(self, pro_obj=None):
if not pro_obj:
- if self.doc.production_order:
- pro_obj = get_obj('Production Order', self.doc.production_order)
+ if self.production_order:
+ pro_obj = get_obj('Production Order', self.production_order)
else:
return
- if self.doc.purpose == "Manufacture/Repack":
+ if self.purpose == "Manufacture/Repack":
# check for double entry
self.check_duplicate_entry_for_production_order()
- elif self.doc.purpose != "Material Transfer":
- self.doc.production_order = None
+ elif self.purpose != "Material Transfer":
+ self.production_order = None
def check_duplicate_entry_for_production_order(self):
other_ste = [t[0] for t in frappe.db.get_values("Stock Entry", {
- "production_order": self.doc.production_order,
- "purpose": self.doc.purpose,
+ "production_order": self.production_order,
+ "purpose": self.purpose,
"docstatus": ["!=", 2],
- "name": ["!=", self.doc.name]
+ "name": ["!=", self.name]
}, "name")]
if other_ste:
production_item, qty = frappe.db.get_value("Production Order",
- self.doc.production_order, ["production_item", "qty"])
+ self.production_order, ["production_item", "qty"])
args = other_ste + [production_item]
fg_qty_already_entered = frappe.db.sql("""select sum(actual_qty)
from `tabStock Entry Detail`
@@ -169,10 +169,10 @@
if fg_qty_already_entered >= qty:
frappe.throw(_("Stock Entries already created for Production Order ")
- + self.doc.production_order + ":" + ", ".join(other_ste), DuplicateEntryForProductionOrderError)
+ + self.production_order + ":" + ", ".join(other_ste), DuplicateEntryForProductionOrderError)
def set_total_amount(self):
- self.doc.total_amount = sum([flt(item.amount) for item in self.get("mtn_details")])
+ self.total_amount = sum([flt(item.amount) for item in self.get("mtn_details")])
def get_stock_and_rate(self):
"""get stock and incoming rate on posting date"""
@@ -180,8 +180,8 @@
args = frappe._dict({
"item_code": d.item_code,
"warehouse": d.s_warehouse or d.t_warehouse,
- "posting_date": self.doc.posting_date,
- "posting_time": self.doc.posting_time,
+ "posting_date": self.posting_date,
+ "posting_time": self.posting_time,
"qty": d.s_warehouse and -1*d.transfer_qty or d.transfer_qty,
"serial_no": d.serial_no,
"bom_no": d.bom_no,
@@ -197,14 +197,14 @@
def get_incoming_rate(self, args):
incoming_rate = 0
- if self.doc.purpose == "Sales Return" and \
- (self.doc.delivery_note_no or self.doc.sales_invoice_no):
+ if self.purpose == "Sales Return" and \
+ (self.delivery_note_no or self.sales_invoice_no):
sle = frappe.db.sql("""select name, posting_date, posting_time,
actual_qty, stock_value, warehouse from `tabStock Ledger Entry`
where voucher_type = %s and voucher_no = %s and
item_code = %s limit 1""",
- ((self.doc.delivery_note_no and "Delivery Note" or "Sales Invoice"),
- self.doc.delivery_note_no or self.doc.sales_invoice_no, args.item_code), as_dict=1)
+ ((self.delivery_note_no and "Delivery Note" or "Sales Invoice"),
+ self.delivery_note_no or self.sales_invoice_no, args.item_code), as_dict=1)
if sle:
args.update({
"posting_date": sle[0].posting_date,
@@ -237,13 +237,13 @@
def validate_finished_goods(self):
"""validation: finished good quantity should be same as manufacturing quantity"""
for d in self.get('mtn_details'):
- if d.bom_no and flt(d.transfer_qty) != flt(self.doc.fg_completed_qty):
+ if d.bom_no and flt(d.transfer_qty) != flt(self.fg_completed_qty):
msgprint(_("Row #") + " %s: " % d.idx
+ _("Quantity should be equal to Manufacturing Quantity. To fetch items again, click on 'Get Items' button or update the Quantity manually."), raise_exception=1)
def validate_return_reference_doc(self):
"""validate item with reference doc"""
- ref = get_return_doclist_and_details(self.doc.fields)
+ ref = get_return_doclist_and_details(self.fields)
if ref.doclist:
# validate docstatus
@@ -260,8 +260,8 @@
# posting date check
ref_posting_datetime = "%s %s" % (cstr(ref.doclist[0].posting_date),
cstr(ref.doclist[0].posting_time) or "00:00:00")
- this_posting_datetime = "%s %s" % (cstr(self.doc.posting_date),
- cstr(self.doc.posting_time))
+ this_posting_datetime = "%s %s" % (cstr(self.posting_date),
+ cstr(self.posting_time))
if this_posting_datetime < ref_posting_datetime:
from frappe.utils.dateutils import datetime_in_user_format
frappe.msgprint(_("Posting Date Time cannot be before")
@@ -295,12 +295,12 @@
return dict(frappe.db.sql("""select item_code, sum(transfer_qty) as qty
from `tabStock Entry Detail` where parent in (
select name from `tabStock Entry` where `%s`=%s and docstatus=1)
- group by item_code""" % (ref_fieldname, "%s"), (self.doc.fields.get(ref_fieldname),)))
+ group by item_code""" % (ref_fieldname, "%s"), (self.get(ref_fieldname),)))
def update_stock_ledger(self):
sl_entries = []
for d in self.get('mtn_details'):
- if cstr(d.s_warehouse) and self.doc.docstatus == 1:
+ if cstr(d.s_warehouse) and self.docstatus == 1:
sl_entries.append(self.get_sl_entries(d, {
"warehouse": cstr(d.s_warehouse),
"actual_qty": -flt(d.transfer_qty),
@@ -317,53 +317,53 @@
# On cancellation, make stock ledger entry for
# target warehouse first, to update serial no values properly
- if cstr(d.s_warehouse) and self.doc.docstatus == 2:
+ if cstr(d.s_warehouse) and self.docstatus == 2:
sl_entries.append(self.get_sl_entries(d, {
"warehouse": cstr(d.s_warehouse),
"actual_qty": -flt(d.transfer_qty),
"incoming_rate": 0
}))
- self.make_sl_entries(sl_entries, self.doc.amended_from and 'Yes' or 'No')
+ self.make_sl_entries(sl_entries, self.amended_from and 'Yes' or 'No')
def update_production_order(self):
def _validate_production_order(pro_bean):
- if flt(pro_bean.doc.docstatus) != 1:
+ if flt(pro_bean.docstatus) != 1:
frappe.throw(_("Production Order must be submitted") + ": " +
- self.doc.production_order)
+ self.production_order)
- if pro_bean.doc.status == 'Stopped':
+ if pro_bean.status == 'Stopped':
msgprint(_("Transaction not allowed against stopped Production Order") + ": " +
- self.doc.production_order)
+ self.production_order)
- if self.doc.production_order:
- pro_bean = frappe.bean("Production Order", self.doc.production_order)
+ if self.production_order:
+ pro_bean = frappe.bean("Production Order", self.production_order)
_validate_production_order(pro_bean)
self.update_produced_qty(pro_bean)
- if self.doc.purpose == "Manufacture/Repack":
+ if self.purpose == "Manufacture/Repack":
self.update_planned_qty(pro_bean)
def update_produced_qty(self, pro_bean):
- if self.doc.purpose == "Manufacture/Repack":
- produced_qty = flt(pro_bean.doc.produced_qty) + \
- (self.doc.docstatus==1 and 1 or -1 ) * flt(self.doc.fg_completed_qty)
+ if self.purpose == "Manufacture/Repack":
+ produced_qty = flt(pro_bean.produced_qty) + \
+ (self.docstatus==1 and 1 or -1 ) * flt(self.fg_completed_qty)
- if produced_qty > flt(pro_bean.doc.qty):
- frappe.throw(_("Production Order") + ": " + self.doc.production_order + "\n" +
+ if produced_qty > flt(pro_bean.qty):
+ frappe.throw(_("Production Order") + ": " + self.production_order + "\n" +
_("Total Manufactured Qty can not be greater than Planned qty to manufacture")
- + "(%s/%s)" % (produced_qty, flt(pro_bean.doc.qty)), StockOverProductionError)
+ + "(%s/%s)" % (produced_qty, flt(pro_bean.qty)), StockOverProductionError)
- status = 'Completed' if flt(produced_qty) >= flt(pro_bean.doc.qty) else 'In Process'
+ status = 'Completed' if flt(produced_qty) >= flt(pro_bean.qty) else 'In Process'
frappe.db.sql("""update `tabProduction Order` set status=%s, produced_qty=%s
- where name=%s""", (status, produced_qty, self.doc.production_order))
+ where name=%s""", (status, produced_qty, self.production_order))
def update_planned_qty(self, pro_bean):
from erpnext.stock.utils import update_bin
update_bin({
- "item_code": pro_bean.doc.production_item,
- "warehouse": pro_bean.doc.fg_warehouse,
- "posting_date": self.doc.posting_date,
- "planned_qty": (self.doc.docstatus==1 and -1 or 1 ) * flt(self.doc.fg_completed_qty)
+ "item_code": pro_bean.production_item,
+ "warehouse": pro_bean.fg_warehouse,
+ "posting_date": self.posting_date,
+ "planned_qty": (self.docstatus==1 and -1 or 1 ) * flt(self.fg_completed_qty)
})
def get_item_details(self, arg):
@@ -414,8 +414,8 @@
ret = {}
if args.get('warehouse') and args.get('item_code'):
args.update({
- "posting_date": self.doc.posting_date,
- "posting_time": self.doc.posting_time,
+ "posting_date": self.posting_date,
+ "posting_time": self.posting_time,
})
args = frappe._dict(args)
@@ -430,61 +430,61 @@
# self.set('mtn_details', [])
pro_obj = None
- if self.doc.production_order:
+ if self.production_order:
# common validations
- pro_obj = get_obj('Production Order', self.doc.production_order)
+ pro_obj = get_obj('Production Order', self.production_order)
if pro_obj:
self.validate_production_order(pro_obj)
- self.doc.bom_no = pro_obj.doc.bom_no
+ self.bom_no = pro_obj.bom_no
else:
# invalid production order
- self.doc.production_order = None
+ self.production_order = None
- if self.doc.bom_no:
- if self.doc.purpose in ["Material Issue", "Material Transfer", "Manufacture/Repack",
+ if self.bom_no:
+ if self.purpose in ["Material Issue", "Material Transfer", "Manufacture/Repack",
"Subcontract"]:
- if self.doc.production_order and self.doc.purpose == "Material Transfer":
+ if self.production_order and self.purpose == "Material Transfer":
item_dict = self.get_pending_raw_materials(pro_obj)
else:
- if not self.doc.fg_completed_qty:
+ if not self.fg_completed_qty:
frappe.throw(_("Manufacturing Quantity is mandatory"))
- item_dict = self.get_bom_raw_materials(self.doc.fg_completed_qty)
+ item_dict = self.get_bom_raw_materials(self.fg_completed_qty)
for item in item_dict.values():
if pro_obj:
- item["from_warehouse"] = pro_obj.doc.wip_warehouse
+ item["from_warehouse"] = pro_obj.wip_warehouse
item["to_warehouse"] = ""
# add raw materials to Stock Entry Detail table
idx = self.add_to_stock_entry_detail(item_dict)
# add finished good item to Stock Entry Detail table -- along with bom_no
- if self.doc.production_order and self.doc.purpose == "Manufacture/Repack":
- item = frappe.db.get_value("Item", pro_obj.doc.production_item, ["item_name",
+ if self.production_order and self.purpose == "Manufacture/Repack":
+ item = frappe.db.get_value("Item", pro_obj.production_item, ["item_name",
"description", "stock_uom", "expense_account", "buying_cost_center"], as_dict=1)
self.add_to_stock_entry_detail({
- cstr(pro_obj.doc.production_item): {
- "to_warehouse": pro_obj.doc.fg_warehouse,
+ cstr(pro_obj.production_item): {
+ "to_warehouse": pro_obj.fg_warehouse,
"from_warehouse": "",
- "qty": self.doc.fg_completed_qty,
+ "qty": self.fg_completed_qty,
"item_name": item.item_name,
"description": item.description,
"stock_uom": item.stock_uom,
"expense_account": item.expense_account,
"cost_center": item.buying_cost_center,
}
- }, bom_no=pro_obj.doc.bom_no, idx=idx)
+ }, bom_no=pro_obj.bom_no, idx=idx)
- elif self.doc.purpose in ["Material Receipt", "Manufacture/Repack"]:
- if self.doc.purpose=="Material Receipt":
- self.doc.from_warehouse = ""
+ elif self.purpose in ["Material Receipt", "Manufacture/Repack"]:
+ if self.purpose=="Material Receipt":
+ self.from_warehouse = ""
item = frappe.db.sql("""select name, item_name, description,
stock_uom, expense_account, buying_cost_center from `tabItem`
where name=(select item from tabBOM where name=%s)""",
- self.doc.bom_no, as_dict=1)
+ self.bom_no, as_dict=1)
self.add_to_stock_entry_detail({
item[0]["name"] : {
- "qty": self.doc.fg_completed_qty,
+ "qty": self.fg_completed_qty,
"item_name": item[0].item_name,
"description": item[0]["description"],
"stock_uom": item[0]["stock_uom"],
@@ -492,7 +492,7 @@
"expense_account": item[0].expense_account,
"cost_center": item[0].buying_cost_center,
}
- }, bom_no=self.doc.bom_no, idx=idx)
+ }, bom_no=self.bom_no, idx=idx)
self.get_stock_and_rate()
@@ -500,7 +500,7 @@
from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict
# item dict = { item_code: {qty, description, stock_uom} }
- item_dict = get_bom_items_as_dict(self.doc.bom_no, qty=qty, fetch_exploded = self.doc.use_multi_level_bom)
+ item_dict = get_bom_items_as_dict(self.bom_no, qty=qty, fetch_exploded = self.use_multi_level_bom)
for item in item_dict.values():
item.from_warehouse = item.default_warehouse
@@ -515,12 +515,12 @@
item_dict = self.get_bom_raw_materials(1)
issued_item_qty = self.get_issued_qty()
- max_qty = flt(pro_obj.doc.qty)
+ max_qty = flt(pro_obj.qty)
only_pending_fetched = []
for item in item_dict:
pending_to_issue = (max_qty * item_dict[item]["qty"]) - issued_item_qty.get(item, 0)
- desire_to_transfer = flt(self.doc.fg_completed_qty) * item_dict[item]["qty"]
+ desire_to_transfer = flt(self.fg_completed_qty) * item_dict[item]["qty"]
if desire_to_transfer <= pending_to_issue:
item_dict[item]["qty"] = desire_to_transfer
else:
@@ -550,7 +550,7 @@
from `tabStock Entry Detail` t1, `tabStock Entry` t2
where t1.parent = t2.name and t2.production_order = %s and t2.docstatus = 1
and t2.purpose = 'Material Transfer'
- group by t1.item_code""", self.doc.production_order)
+ group by t1.item_code""", self.production_order)
for t in result:
issued_item_qty[t[0]] = flt(t[1])
@@ -558,14 +558,14 @@
def add_to_stock_entry_detail(self, item_dict, bom_no=None, idx=None):
if not idx: idx = 1
- expense_account, cost_center = frappe.db.get_values("Company", self.doc.company, \
+ expense_account, cost_center = frappe.db.get_values("Company", self.company, \
["default_expense_account", "cost_center"])[0]
for d in item_dict:
- se_child = self.doc.append('mtn_details', {})
+ se_child = self.append('mtn_details', {})
se_child.idx = idx
- se_child.s_warehouse = item_dict[d].get("from_warehouse", self.doc.from_warehouse)
- se_child.t_warehouse = item_dict[d].get("to_warehouse", self.doc.to_warehouse)
+ se_child.s_warehouse = item_dict[d].get("from_warehouse", self.from_warehouse)
+ se_child.t_warehouse = item_dict[d].get("to_warehouse", self.to_warehouse)
se_child.item_code = cstr(d)
se_child.item_name = item_dict[d]["item_name"]
se_child.description = item_dict[d]["description"]
@@ -750,10 +750,10 @@
@frappe.whitelist()
def make_return_jv(stock_entry):
se = frappe.bean("Stock Entry", stock_entry)
- if not se.doc.purpose in ["Sales Return", "Purchase Return"]:
+ if not se.purpose in ["Sales Return", "Purchase Return"]:
return
- ref = get_return_doclist_and_details(se.doc.fields)
+ ref = get_return_doclist_and_details(se.fields)
if ref.doclist[0].doctype == "Delivery Note":
result = make_return_jv_from_delivery_note(se, ref)
@@ -766,10 +766,10 @@
jv_list = [{
"__islocal": 1,
"doctype": "Journal Voucher",
- "posting_date": se.doc.posting_date,
- "voucher_type": se.doc.purpose == "Sales Return" and "Credit Note" or "Debit Note",
- "fiscal_year": se.doc.fiscal_year,
- "company": se.doc.company
+ "posting_date": se.posting_date,
+ "voucher_type": se.purpose == "Sales Return" and "Credit Note" or "Debit Note",
+ "fiscal_year": se.fiscal_year,
+ "company": se.company
}]
from erpnext.accounts.utils import get_balance_on
@@ -781,7 +781,7 @@
"account": r.get("account"),
"against_invoice": r.get("against_invoice"),
"against_voucher": r.get("against_voucher"),
- "balance": get_balance_on(r.get("account"), se.doc.posting_date) \
+ "balance": get_balance_on(r.get("account"), se.posting_date) \
if r.get("account") else 0
})
@@ -858,7 +858,7 @@
children.append(account)
if not parent:
- parent = {"account": si.doc.debit_to}
+ parent = {"account": si.debit_to}
break
@@ -911,7 +911,7 @@
children.append(account)
if not parent:
- parent = {"account": pi.doc.credit_to}
+ parent = {"account": pi.credit_to}
break
diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
index dc27cc9..bcdc0fe 100644
--- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
@@ -52,10 +52,10 @@
stock_in_hand_account = frappe.db.get_value("Account", {"account_type": "Warehouse",
"master_name": mr.doclist[1].t_warehouse})
- self.check_stock_ledger_entries("Stock Entry", mr.doc.name,
+ self.check_stock_ledger_entries("Stock Entry", mr.name,
[["_Test Item", "_Test Warehouse - _TC", 50.0]])
- self.check_gl_entries("Stock Entry", mr.doc.name,
+ self.check_gl_entries("Stock Entry", mr.name,
sorted([
[stock_in_hand_account, 5000.0, 0.0],
["Stock Adjustment - _TC", 0.0, 5000.0]
@@ -65,10 +65,10 @@
mr.cancel()
self.assertFalse(frappe.db.sql("""select * from `tabStock Ledger Entry`
- where voucher_type='Stock Entry' and voucher_no=%s""", mr.doc.name))
+ where voucher_type='Stock Entry' and voucher_no=%s""", mr.name))
self.assertFalse(frappe.db.sql("""select * from `tabGL Entry`
- where voucher_type='Stock Entry' and voucher_no=%s""", mr.doc.name))
+ where voucher_type='Stock Entry' and voucher_no=%s""", mr.name))
def test_material_issue_gl_entry(self):
@@ -81,13 +81,13 @@
mi.insert()
mi.submit()
- self.check_stock_ledger_entries("Stock Entry", mi.doc.name,
+ self.check_stock_ledger_entries("Stock Entry", mi.name,
[["_Test Item", "_Test Warehouse - _TC", -40.0]])
stock_in_hand_account = frappe.db.get_value("Account", {"account_type": "Warehouse",
"master_name": mi.doclist[1].s_warehouse})
- self.check_gl_entries("Stock Entry", mi.doc.name,
+ self.check_gl_entries("Stock Entry", mi.name,
sorted([
[stock_in_hand_account, 0.0, 4000.0],
["Stock Adjustment - _TC", 4000.0, 0.0]
@@ -96,10 +96,10 @@
mi.cancel()
self.assertFalse(frappe.db.sql("""select * from `tabStock Ledger Entry`
- where voucher_type='Stock Entry' and voucher_no=%s""", mi.doc.name))
+ where voucher_type='Stock Entry' and voucher_no=%s""", mi.name))
self.assertFalse(frappe.db.sql("""select * from `tabGL Entry`
- where voucher_type='Stock Entry' and voucher_no=%s""", mi.doc.name))
+ where voucher_type='Stock Entry' and voucher_no=%s""", mi.name))
self.assertEquals(frappe.db.get_value("Bin", {"warehouse": mi.doclist[1].s_warehouse,
"item_code": mi.doclist[1].item_code}, "actual_qty"), 50)
@@ -117,7 +117,7 @@
mtn.insert()
mtn.submit()
- self.check_stock_ledger_entries("Stock Entry", mtn.doc.name,
+ self.check_stock_ledger_entries("Stock Entry", mtn.name,
[["_Test Item", "_Test Warehouse - _TC", -45.0], ["_Test Item", "_Test Warehouse 1 - _TC", 45.0]])
stock_in_hand_account = frappe.db.get_value("Account", {"account_type": "Warehouse",
@@ -127,7 +127,7 @@
"master_name": mtn.doclist[1].t_warehouse})
- self.check_gl_entries("Stock Entry", mtn.doc.name,
+ self.check_gl_entries("Stock Entry", mtn.name,
sorted([
[stock_in_hand_account, 0.0, 4500.0],
[fixed_asset_account, 4500.0, 0.0],
@@ -137,10 +137,10 @@
mtn.cancel()
self.assertFalse(frappe.db.sql("""select * from `tabStock Ledger Entry`
- where voucher_type='Stock Entry' and voucher_no=%s""", mtn.doc.name))
+ where voucher_type='Stock Entry' and voucher_no=%s""", mtn.name))
self.assertFalse(frappe.db.sql("""select * from `tabGL Entry`
- where voucher_type='Stock Entry' and voucher_no=%s""", mtn.doc.name))
+ where voucher_type='Stock Entry' and voucher_no=%s""", mtn.name))
def test_repack_no_change_in_valuation(self):
@@ -153,13 +153,13 @@
repack.insert()
repack.submit()
- self.check_stock_ledger_entries("Stock Entry", repack.doc.name,
+ self.check_stock_ledger_entries("Stock Entry", repack.name,
[["_Test Item", "_Test Warehouse - _TC", -50.0],
["_Test Item Home Desktop 100", "_Test Warehouse - _TC", 1]])
gl_entries = frappe.db.sql("""select account, debit, credit
from `tabGL Entry` where voucher_type='Stock Entry' and voucher_no=%s
- order by account desc""", repack.doc.name, as_dict=1)
+ order by account desc""", repack.name, as_dict=1)
self.assertFalse(gl_entries)
set_perpetual_inventory(0)
@@ -178,7 +178,7 @@
stock_in_hand_account = frappe.db.get_value("Account", {"account_type": "Warehouse",
"master_name": repack.doclist[2].t_warehouse})
- self.check_gl_entries("Stock Entry", repack.doc.name,
+ self.check_gl_entries("Stock Entry", repack.name,
sorted([
[stock_in_hand_account, 1000.0, 0.0],
["Stock Adjustment - _TC", 0.0, 1000.0],
@@ -245,8 +245,8 @@
si.submit()
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Sales Return"
- se.doc.sales_invoice_no = si.doc.name
+ se.purpose = "Sales Return"
+ se.sales_invoice_no = si.name
se.doclist[1].qty = returned_qty
se.doclist[1].transfer_qty = returned_qty
self.assertRaises(NotUpdateStockError, se.insert)
@@ -258,7 +258,7 @@
# insert a pos invoice with update stock
si = frappe.bean(copy=sales_invoice_test_records[1])
- si.doc.is_pos = si.doc.update_stock = 1
+ si.is_pos = si.update_stock = 1
si.doclist[1].warehouse = "_Test Warehouse - _TC"
si.doclist[1].item_code = item_code
si.doclist[1].qty = 5.0
@@ -272,10 +272,10 @@
# check if item is validated
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Sales Return"
- se.doc.sales_invoice_no = si.doc.name
- se.doc.posting_date = "2013-03-10"
- se.doc.fiscal_year = "_Test Fiscal Year 2013"
+ se.purpose = "Sales Return"
+ se.sales_invoice_no = si.name
+ se.posting_date = "2013-03-10"
+ se.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].item_code = "_Test Item Home Desktop 200"
se.doclist[1].qty = returned_qty
se.doclist[1].transfer_qty = returned_qty
@@ -285,10 +285,10 @@
# try again
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Sales Return"
- se.doc.posting_date = "2013-03-10"
- se.doc.fiscal_year = "_Test Fiscal Year 2013"
- se.doc.sales_invoice_no = si.doc.name
+ se.purpose = "Sales Return"
+ se.posting_date = "2013-03-10"
+ se.fiscal_year = "_Test Fiscal Year 2013"
+ se.sales_invoice_no = si.name
se.doclist[1].qty = returned_qty
se.doclist[1].transfer_qty = returned_qty
# in both cases item code remains _Test Item when returning
@@ -330,11 +330,11 @@
self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1)
- si_doclist = make_sales_invoice(dn.doc.name)
+ si_doclist = make_sales_invoice(dn.name)
si = frappe.bean(si_doclist)
- si.doc.posting_date = dn.doc.posting_date
- si.doc.debit_to = "_Test Customer - _TC"
+ si.posting_date = dn.posting_date
+ si.debit_to = "_Test Customer - _TC"
for d in si.get("entries"):
d.income_account = "Sales - _TC"
d.cost_center = "_Test Cost Center - _TC"
@@ -343,10 +343,10 @@
# insert and submit stock entry for sales return
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Sales Return"
- se.doc.delivery_note_no = dn.doc.name
- se.doc.posting_date = "2013-03-10"
- se.doc.fiscal_year = "_Test Fiscal Year 2013"
+ se.purpose = "Sales Return"
+ se.delivery_note_no = dn.name
+ se.posting_date = "2013-03-10"
+ se.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].qty = se.doclist[1].transfer_qty = returned_qty
se.insert()
@@ -367,11 +367,11 @@
def _test_sales_return_jv(self, se):
from erpnext.stock.doctype.stock_entry.stock_entry import make_return_jv
- jv_list = make_return_jv(se.doc.name)
+ jv_list = make_return_jv(se.name)
self.assertEqual(len(jv_list), 3)
self.assertEqual(jv_list[0].get("voucher_type"), "Credit Note")
- self.assertEqual(jv_list[0].get("posting_date"), se.doc.posting_date)
+ self.assertEqual(jv_list[0].get("posting_date"), se.posting_date)
self.assertEqual(jv_list[1].get("account"), "_Test Customer - _TC")
self.assertEqual(jv_list[2].get("account"), "Sales - _TC")
self.assertTrue(jv_list[1].get("against_invoice"))
@@ -416,11 +416,11 @@
so.insert()
so.submit()
- dn_doclist = make_delivery_note(so.doc.name)
+ dn_doclist = make_delivery_note(so.name)
dn = frappe.bean(dn_doclist)
- dn.doc.status = "Draft"
- dn.doc.posting_date = so.doc.delivery_date
+ dn.status = "Draft"
+ dn.posting_date = so.delivery_date
dn.insert()
dn.submit()
@@ -428,11 +428,11 @@
self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1)
- si_doclist = make_sales_invoice(so.doc.name)
+ si_doclist = make_sales_invoice(so.name)
si = frappe.bean(si_doclist)
- si.doc.posting_date = dn.doc.posting_date
- si.doc.debit_to = "_Test Customer - _TC"
+ si.posting_date = dn.posting_date
+ si.debit_to = "_Test Customer - _TC"
for d in si.get("entries"):
d.income_account = "Sales - _TC"
d.cost_center = "_Test Cost Center - _TC"
@@ -441,10 +441,10 @@
# insert and submit stock entry for sales return
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Sales Return"
- se.doc.delivery_note_no = dn.doc.name
- se.doc.posting_date = "2013-03-10"
- se.doc.fiscal_year = "_Test Fiscal Year 2013"
+ se.purpose = "Sales Return"
+ se.delivery_note_no = dn.name
+ se.posting_date = "2013-03-10"
+ se.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].qty = se.doclist[1].transfer_qty = returned_qty
se.insert()
@@ -474,11 +474,11 @@
self.assertEquals(actual_qty_0 + 5, actual_qty_1)
- pi_doclist = make_purchase_invoice(pr.doc.name)
+ pi_doclist = make_purchase_invoice(pr.name)
pi = frappe.bean(pi_doclist)
- pi.doc.posting_date = pr.doc.posting_date
- pi.doc.credit_to = "_Test Supplier - _TC"
+ pi.posting_date = pr.posting_date
+ pi.credit_to = "_Test Supplier - _TC"
for d in pi.get("entries"):
d.expense_account = "_Test Account Cost for Goods Sold - _TC"
d.cost_center = "_Test Cost Center - _TC"
@@ -487,16 +487,16 @@
d.cost_center = "_Test Cost Center - _TC"
pi.run_method("calculate_taxes_and_totals")
- pi.doc.bill_no = "NA"
+ pi.bill_no = "NA"
pi.insert()
pi.submit()
# submit purchase return
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Purchase Return"
- se.doc.purchase_receipt_no = pr.doc.name
- se.doc.posting_date = "2013-03-01"
- se.doc.fiscal_year = "_Test Fiscal Year 2013"
+ se.purpose = "Purchase Return"
+ se.purchase_receipt_no = pr.name
+ se.posting_date = "2013-03-01"
+ se.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].qty = se.doclist[1].transfer_qty = 5
se.doclist[1].s_warehouse = "_Test Warehouse - _TC"
se.insert()
@@ -508,7 +508,7 @@
frappe.db.set_default("company", self.old_default_company)
- return se, pr.doc.name
+ return se, pr.name
def test_over_stock_return(self):
from erpnext.stock.doctype.stock_entry.stock_entry import StockOverReturnError
@@ -519,10 +519,10 @@
# submit purchase return - return another 6 qtys so that exception is raised
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Purchase Return"
- se.doc.purchase_receipt_no = pr_docname
- se.doc.posting_date = "2013-03-01"
- se.doc.fiscal_year = "_Test Fiscal Year 2013"
+ se.purpose = "Purchase Return"
+ se.purchase_receipt_no = pr_docname
+ se.posting_date = "2013-03-01"
+ se.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].qty = se.doclist[1].transfer_qty = 6
se.doclist[1].s_warehouse = "_Test Warehouse - _TC"
@@ -530,11 +530,11 @@
def _test_purchase_return_jv(self, se):
from erpnext.stock.doctype.stock_entry.stock_entry import make_return_jv
- jv_list = make_return_jv(se.doc.name)
+ jv_list = make_return_jv(se.name)
self.assertEqual(len(jv_list), 3)
self.assertEqual(jv_list[0].get("voucher_type"), "Debit Note")
- self.assertEqual(jv_list[0].get("posting_date"), se.doc.posting_date)
+ self.assertEqual(jv_list[0].get("posting_date"), se.posting_date)
self.assertEqual(jv_list[1].get("account"), "_Test Supplier - _TC")
self.assertEqual(jv_list[2].get("account"), "_Test Account Cost for Goods Sold - _TC")
self.assertTrue(jv_list[1].get("against_voucher"))
@@ -560,16 +560,16 @@
# submit purchase receipt
po = frappe.bean(copy=purchase_order_test_records[0])
- po.doc.is_subcontracted = None
+ po.is_subcontracted = None
po.doclist[1].item_code = "_Test Item"
po.doclist[1].rate = 50
po.insert()
po.submit()
- pr_doclist = make_purchase_receipt(po.doc.name)
+ pr_doclist = make_purchase_receipt(po.name)
pr = frappe.bean(pr_doclist)
- pr.doc.posting_date = po.doc.transaction_date
+ pr.posting_date = po.transaction_date
pr.insert()
pr.submit()
@@ -577,11 +577,11 @@
self.assertEquals(actual_qty_0 + 10, actual_qty_1)
- pi_doclist = make_purchase_invoice(po.doc.name)
+ pi_doclist = make_purchase_invoice(po.name)
pi = frappe.bean(pi_doclist)
- pi.doc.posting_date = pr.doc.posting_date
- pi.doc.credit_to = "_Test Supplier - _TC"
+ pi.posting_date = pr.posting_date
+ pi.credit_to = "_Test Supplier - _TC"
for d in pi.get("entries"):
d.expense_account = "_Test Account Cost for Goods Sold - _TC"
d.cost_center = "_Test Cost Center - _TC"
@@ -589,16 +589,16 @@
d.cost_center = "_Test Cost Center - _TC"
pi.run_method("calculate_taxes_and_totals")
- pi.doc.bill_no = "NA"
+ pi.bill_no = "NA"
pi.insert()
pi.submit()
# submit purchase return
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Purchase Return"
- se.doc.purchase_receipt_no = pr.doc.name
- se.doc.posting_date = "2013-03-01"
- se.doc.fiscal_year = "_Test Fiscal Year 2013"
+ se.purpose = "Purchase Return"
+ se.purchase_receipt_no = pr.name
+ se.posting_date = "2013-03-01"
+ se.fiscal_year = "_Test Fiscal Year 2013"
se.doclist[1].qty = se.doclist[1].transfer_qty = 5
se.doclist[1].s_warehouse = "_Test Warehouse - _TC"
se.insert()
@@ -610,7 +610,7 @@
frappe.db.set_default("company", self.old_default_company)
- return se, pr.doc.name
+ return se, pr.name
def _clear_stock_account_balance(self):
frappe.db.sql("delete from `tabStock Ledger Entry`")
@@ -671,7 +671,7 @@
def test_serial_no_not_exists(self):
self._clear_stock_account_balance()
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Material Issue"
+ se.purpose = "Material Issue"
se.doclist[1].item_code = "_Test Serialized Item"
se.doclist[1].qty = 2
se.doclist[1].s_warehouse = "_Test Warehouse 1 - _TC"
@@ -709,7 +709,7 @@
self.test_serial_by_series()
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Material Transfer"
+ se.purpose = "Material Transfer"
se.doclist[1].item_code = "_Test Serialized Item"
se.doclist[1].qty = 1
se.doclist[1].transfer_qty = 1
@@ -725,7 +725,7 @@
serial_no = get_serial_nos(se.doclist[1].serial_no)[0]
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Material Transfer"
+ se.purpose = "Material Transfer"
se.doclist[1].item_code = "_Test Serialized Item With Series"
se.doclist[1].qty = 1
se.doclist[1].transfer_qty = 1
@@ -744,7 +744,7 @@
make_serialized_item()
se = frappe.bean(copy=test_records[0])
- se.doc.purpose = "Material Transfer"
+ se.purpose = "Material Transfer"
se.doclist[1].item_code = "_Test Serialized Item With Series"
se.doclist[1].qty = 1
se.doclist[1].transfer_qty = 1
@@ -790,13 +790,13 @@
frappe.set_user("test@example.com")
st1 = frappe.bean(copy=test_records[0])
- st1.doc.company = "_Test Company 1"
+ st1.company = "_Test Company 1"
st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1"
self.assertRaises(BeanPermissionError, st1.insert)
frappe.set_user("test2@example.com")
st1 = frappe.bean(copy=test_records[0])
- st1.doc.company = "_Test Company 1"
+ st1.company = "_Test Company 1"
st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1"
st1.insert()
st1.submit()
diff --git a/erpnext/stock/doctype/stock_ledger/stock_ledger.py b/erpnext/stock/doctype/stock_ledger/stock_ledger.py
index 966e7ab..d0fe60a 100644
--- a/erpnext/stock/doctype/stock_ledger/stock_ledger.py
+++ b/erpnext/stock/doctype/stock_ledger/stock_ledger.py
@@ -45,7 +45,7 @@
sle = frappe.bean([args])
sle.ignore_permissions = 1
sle.insert()
- return sle.doc.name
+ return sle.name
def repost(self):
"""
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index dfc75d5..69217b8 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -17,11 +17,11 @@
from erpnext.stock.utils import validate_warehouse_company
self.validate_mandatory()
self.validate_item()
- validate_warehouse_company(self.doc.warehouse, self.doc.company)
+ validate_warehouse_company(self.warehouse, self.company)
self.scrub_posting_time()
from erpnext.accounts.utils import validate_fiscal_year
- validate_fiscal_year(self.doc.posting_date, self.doc.fiscal_year,
+ validate_fiscal_year(self.posting_date, self.fiscal_year,
self.meta.get_label("posting_date"))
def on_submit(self):
@@ -33,75 +33,75 @@
#check for item quantity available in stock
def actual_amt_check(self):
- if self.doc.batch_no:
+ if self.batch_no:
batch_bal_after_transaction = flt(frappe.db.sql("""select sum(actual_qty)
from `tabStock Ledger Entry`
where warehouse=%s and item_code=%s and batch_no=%s""",
- (self.doc.warehouse, self.doc.item_code, self.doc.batch_no))[0][0])
+ (self.warehouse, self.item_code, self.batch_no))[0][0])
if batch_bal_after_transaction < 0:
- self.doc.fields.update({
- 'batch_bal': batch_bal_after_transaction - self.doc.actual_qty
+ self.update({
+ 'batch_bal': batch_bal_after_transaction - self.actual_qty
})
frappe.throw("""Not enough quantity (requested: %(actual_qty)s, \
current: %(batch_bal)s in Batch <b>%(batch_no)s</b> for Item \
<b>%(item_code)s</b> at Warehouse <b>%(warehouse)s</b> \
- as on %(posting_date)s %(posting_time)s""" % self.doc.fields)
+ as on %(posting_date)s %(posting_time)s""" % self.fields)
- self.doc.fields.pop('batch_bal')
+ self.pop('batch_bal')
def validate_mandatory(self):
mandatory = ['warehouse','posting_date','voucher_type','voucher_no','actual_qty','company']
for k in mandatory:
- if not self.doc.fields.get(k):
+ if not self.get(k):
msgprint("Stock Ledger Entry: '%s' is mandatory" % k, raise_exception = 1)
elif k == 'warehouse':
- if not frappe.db.exists("Warehouse", self.doc.fields.get(k)):
+ if not frappe.db.exists("Warehouse", self.get(k)):
msgprint("Warehouse: '%s' does not exist in the system. Please check." %
- self.doc.fields.get(k), raise_exception = 1)
+ self.get(k), raise_exception = 1)
def validate_item(self):
item_det = frappe.db.sql("""select name, has_batch_no, docstatus,
is_stock_item, has_serial_no, serial_no_series
from tabItem where name=%s""",
- self.doc.item_code, as_dict=True)[0]
+ self.item_code, as_dict=True)[0]
if item_det.is_stock_item != 'Yes':
- frappe.throw("""Item: "%s" is not a Stock Item.""" % self.doc.item_code)
+ frappe.throw("""Item: "%s" is not a Stock Item.""" % self.item_code)
# check if batch number is required
- if item_det.has_batch_no =='Yes' and self.doc.voucher_type != 'Stock Reconciliation':
- if not self.doc.batch_no:
- frappe.throw("Batch number is mandatory for Item '%s'" % self.doc.item_code)
+ if item_det.has_batch_no =='Yes' and self.voucher_type != 'Stock Reconciliation':
+ if not self.batch_no:
+ frappe.throw("Batch number is mandatory for Item '%s'" % self.item_code)
# check if batch belongs to item
if not frappe.db.get_value("Batch",
- {"item": self.doc.item_code, "name": self.doc.batch_no}):
+ {"item": self.item_code, "name": self.batch_no}):
frappe.throw("'%s' is not a valid Batch Number for Item '%s'" %
- (self.doc.batch_no, self.doc.item_code))
+ (self.batch_no, self.item_code))
- if not self.doc.stock_uom:
- self.doc.stock_uom = item_det.stock_uom
+ if not self.stock_uom:
+ self.stock_uom = item_det.stock_uom
def check_stock_frozen_date(self):
stock_frozen_upto = frappe.db.get_value('Stock Settings', None, 'stock_frozen_upto') or ''
if stock_frozen_upto:
stock_auth_role = frappe.db.get_value('Stock Settings', None,'stock_auth_role')
- if getdate(self.doc.posting_date) <= getdate(stock_frozen_upto) and not stock_auth_role in frappe.user.get_roles():
+ if getdate(self.posting_date) <= getdate(stock_frozen_upto) and not stock_auth_role in frappe.user.get_roles():
msgprint("You are not authorized to do / modify back dated stock entries before %s" % getdate(stock_frozen_upto).strftime('%d-%m-%Y'), raise_exception=StockFreezeError)
stock_frozen_upto_days = int(frappe.db.get_value('Stock Settings', None, 'stock_frozen_upto_days') or 0)
if stock_frozen_upto_days:
stock_auth_role = frappe.db.get_value('Stock Settings', None,'stock_auth_role')
- older_than_x_days_ago = (add_days(getdate(self.doc.posting_date), stock_frozen_upto_days) <= date.today())
+ older_than_x_days_ago = (add_days(getdate(self.posting_date), stock_frozen_upto_days) <= date.today())
if older_than_x_days_ago and not stock_auth_role in frappe.user.get_roles():
msgprint("You are not authorized to do / modify back dated stock entries older than %d days ago" %stock_frozen_upto_days, raise_exception=StockFreezeError)
def scrub_posting_time(self):
- if not self.doc.posting_time or self.doc.posting_time == '00:0':
- self.doc.posting_time = '00:00'
+ if not self.posting_time or self.posting_time == '00:0':
+ self.posting_time = '00:00'
def on_doctype_update():
if not frappe.db.sql("""show index from `tabStock Ledger Entry`
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
index c4195c6..60f37e1 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -28,10 +28,10 @@
self.make_cancel_gl_entries()
def validate_data(self):
- if not self.doc.reconciliation_json:
+ if not self.reconciliation_json:
return
- data = json.loads(self.doc.reconciliation_json)
+ data = json.loads(self.reconciliation_json)
# strip out extra columns (if any)
data = [row[:4] for row in data]
@@ -45,7 +45,7 @@
if data.index(self.head_row) != 0:
head_row_no = data.index(self.head_row)
data = data[head_row_no:]
- self.doc.reconciliation_json = json.dumps(data)
+ self.reconciliation_json = json.dumps(data)
def _get_msg(row_num, msg):
return _("Row # ") + ("%d: " % (row_num+head_row_no+2)) + _(msg)
@@ -124,18 +124,18 @@
row_template = ["item_code", "warehouse", "qty", "valuation_rate"]
- if not self.doc.reconciliation_json:
+ if not self.reconciliation_json:
msgprint(_("""Stock Reconciliation file not uploaded"""), raise_exception=1)
- data = json.loads(self.doc.reconciliation_json)
+ data = json.loads(self.reconciliation_json)
for row_num, row in enumerate(data[data.index(self.head_row)+1:]):
row = frappe._dict(zip(row_template, row))
row["row_num"] = row_num
previous_sle = get_previous_sle({
"item_code": row.item_code,
"warehouse": row.warehouse,
- "posting_date": self.doc.posting_date,
- "posting_time": self.doc.posting_time
+ "posting_date": self.posting_date,
+ "posting_time": self.posting_time
})
# check valuation rate mandatory
@@ -238,14 +238,14 @@
"doctype": "Stock Ledger Entry",
"item_code": row.item_code,
"warehouse": row.warehouse,
- "posting_date": self.doc.posting_date,
- "posting_time": self.doc.posting_time,
- "voucher_type": self.doc.doctype,
- "voucher_no": self.doc.name,
- "company": self.doc.company,
+ "posting_date": self.posting_date,
+ "posting_time": self.posting_time,
+ "voucher_type": self.doctype,
+ "voucher_no": self.name,
+ "company": self.company,
"stock_uom": frappe.db.get_value("Item", row.item_code, "stock_uom"),
"voucher_detail_no": row.voucher_detail_no,
- "fiscal_year": self.doc.fiscal_year,
+ "fiscal_year": self.fiscal_year,
"is_cancelled": "No"
})
args.update(opts)
@@ -260,37 +260,37 @@
existing_entries = frappe.db.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)
+ (self.doctype, self.name), as_dict=1)
# delete entries
frappe.db.sql("""delete from `tabStock Ledger Entry`
- where voucher_type=%s and voucher_no=%s""", (self.doc.doctype, self.doc.name))
+ where voucher_type=%s and voucher_no=%s""", (self.doctype, self.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
+ "posting_date": self.posting_date,
+ "posting_time": self.posting_time
})
def get_gl_entries(self, warehouse_account=None):
- if not self.doc.cost_center:
+ if not self.cost_center:
msgprint(_("Please enter Cost Center"), raise_exception=1)
return super(DocType, self).get_gl_entries(warehouse_account,
- self.doc.expense_account, self.doc.cost_center)
+ self.expense_account, self.cost_center)
def validate_expense_account(self):
if not cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
return
- if not self.doc.expense_account:
+ if not self.expense_account:
msgprint(_("Please enter Expense Account"), raise_exception=1)
elif not frappe.db.sql("""select * from `tabStock Ledger Entry`"""):
- if frappe.db.get_value("Account", self.doc.expense_account,
+ if frappe.db.get_value("Account", self.expense_account,
"report_type") == "Profit and Loss":
msgprint(_("""Expense Account can not be a PL Account, as this stock \
reconciliation is an opening entry. \
diff --git a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
index 558e1f1..ca1519c 100644
--- a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
@@ -52,7 +52,7 @@
# no gl entries
gl_entries = frappe.db.sql("""select name from `tabGL Entry`
where voucher_type = 'Stock Reconciliation' and voucher_no = %s""",
- stock_reco.doc.name)
+ stock_reco.name)
self.assertFalse(gl_entries)
@@ -99,7 +99,7 @@
# no gl entries
gl_entries = frappe.db.sql("""select name from `tabGL Entry`
where voucher_type = 'Stock Reconciliation' and voucher_no = %s""",
- stock_reco.doc.name)
+ stock_reco.name)
self.assertFalse(gl_entries)
def test_reco_fifo_gl_entries(self):
@@ -226,8 +226,8 @@
pr.submit()
pr1 = frappe.bean(copy=stock_entry)
- pr1.doc.posting_date = "2012-12-15"
- pr1.doc.posting_time = "02:00"
+ pr1.posting_date = "2012-12-15"
+ pr1.posting_time = "02:00"
pr1.doclist[1].qty = 10
pr1.doclist[1].transfer_qty = 10
pr1.doclist[1].incoming_rate = 700
@@ -235,9 +235,9 @@
pr1.submit()
pr2 = frappe.bean(copy=stock_entry)
- pr2.doc.posting_date = "2012-12-25"
- pr2.doc.posting_time = "03:00"
- pr2.doc.purpose = "Material Issue"
+ pr2.posting_date = "2012-12-25"
+ pr2.posting_time = "03:00"
+ pr2.purpose = "Material Issue"
pr2.doclist[1].s_warehouse = "_Test Warehouse - _TC"
pr2.doclist[1].t_warehouse = None
pr2.doclist[1].qty = 15
@@ -247,9 +247,9 @@
pr2.submit()
pr3 = frappe.bean(copy=stock_entry)
- pr3.doc.posting_date = "2012-12-31"
- pr3.doc.posting_time = "08:00"
- pr3.doc.purpose = "Material Issue"
+ pr3.posting_date = "2012-12-31"
+ pr3.posting_time = "08:00"
+ pr3.purpose = "Material Issue"
pr3.doclist[1].s_warehouse = "_Test Warehouse - _TC"
pr3.doclist[1].t_warehouse = None
pr3.doclist[1].qty = 20
@@ -260,9 +260,9 @@
pr4 = frappe.bean(copy=stock_entry)
- pr4.doc.posting_date = "2013-01-05"
- pr4.doc.fiscal_year = "_Test Fiscal Year 2013"
- pr4.doc.posting_time = "07:00"
+ pr4.posting_date = "2013-01-05"
+ pr4.fiscal_year = "_Test Fiscal Year 2013"
+ pr4.posting_time = "07:00"
pr4.doclist[1].qty = 15
pr4.doclist[1].transfer_qty = 15
pr4.doclist[1].incoming_rate = 1200
diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.py b/erpnext/stock/doctype/stock_settings/stock_settings.py
index cb266ed..b505394 100644
--- a/erpnext/stock/doctype/stock_settings/stock_settings.py
+++ b/erpnext/stock/doctype/stock_settings/stock_settings.py
@@ -14,14 +14,14 @@
def validate(self):
for key in ["item_naming_by", "item_group", "stock_uom",
"allow_negative_stock"]:
- frappe.db.set_default(key, self.doc.fields.get(key, ""))
+ frappe.db.set_default(key, self.get(key, ""))
from erpnext.setup.doctype.naming_series.naming_series import set_by_naming_series
set_by_naming_series("Item", "item_code",
- self.doc.get("item_naming_by")=="Naming Series", hide_name_field=True)
+ self.get("item_naming_by")=="Naming Series", hide_name_field=True)
stock_frozen_limit = 356
- submitted_stock_frozen = self.doc.stock_frozen_upto_days
+ submitted_stock_frozen = self.stock_frozen_upto_days
if submitted_stock_frozen > stock_frozen_limit:
- self.doc.stock_frozen_upto_days = stock_frozen_limit
+ self.stock_frozen_upto_days = stock_frozen_limit
frappe.msgprint (_("`Freeze Stocks Older Than` should be smaller than %d days.") %stock_frozen_limit)
diff --git a/erpnext/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py b/erpnext/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
index 62c80d2..6c49ed9 100644
--- a/erpnext/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
+++ b/erpnext/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
@@ -14,38 +14,38 @@
self.doc, self.doclist = d,dl
def validate_mandatory(self):
- if not cstr(self.doc.item_code):
+ if not cstr(self.item_code):
msgprint("Please Enter an Item.")
raise Exception
- if not cstr(self.doc.new_stock_uom):
+ if not cstr(self.new_stock_uom):
msgprint("Please Enter New Stock UOM.")
raise Exception
- if cstr(self.doc.current_stock_uom) == cstr(self.doc.new_stock_uom):
+ if cstr(self.current_stock_uom) == cstr(self.new_stock_uom):
msgprint("Current Stock UOM and Stock UOM are same.")
raise Exception
# check conversion factor
- if not flt(self.doc.conversion_factor):
+ if not flt(self.conversion_factor):
msgprint("Please Enter Conversion Factor.")
raise Exception
- stock_uom = frappe.db.get_value("Item", self.doc.item_code, "stock_uom")
- if cstr(self.doc.new_stock_uom) == cstr(stock_uom):
- msgprint("Item Master is already updated with New Stock UOM " + cstr(self.doc.new_stock_uom))
+ stock_uom = frappe.db.get_value("Item", self.item_code, "stock_uom")
+ if cstr(self.new_stock_uom) == cstr(stock_uom):
+ msgprint("Item Master is already updated with New Stock UOM " + cstr(self.new_stock_uom))
raise Exception
def update_item_master(self):
- item_bean = frappe.bean("Item", self.doc.item_code)
- item_bean.doc.stock_uom = self.doc.new_stock_uom
+ item_bean = frappe.bean("Item", self.item_code)
+ item_bean.stock_uom = self.new_stock_uom
item_bean.save()
- msgprint(_("Default UOM updated in item ") + self.doc.item_code)
+ msgprint(_("Default UOM updated in item ") + self.item_code)
def update_bin(self):
# update bin
- if flt(self.doc.conversion_factor) != flt(1):
+ if flt(self.conversion_factor) != flt(1):
frappe.db.sql("""update `tabBin`
set stock_uom = %s,
indented_qty = ifnull(indented_qty,0) * %s,
@@ -54,12 +54,12 @@
planned_qty = ifnull(planned_qty,0) * %s,
projected_qty = actual_qty + ordered_qty + indented_qty +
planned_qty - reserved_qty
- where item_code = %s""", (self.doc.new_stock_uom, self.doc.conversion_factor,
- self.doc.conversion_factor, self.doc.conversion_factor,
- self.doc.conversion_factor, self.doc.item_code))
+ where item_code = %s""", (self.new_stock_uom, self.conversion_factor,
+ self.conversion_factor, self.conversion_factor,
+ self.conversion_factor, self.item_code))
else:
frappe.db.sql("update `tabBin` set stock_uom = %s where item_code = %s",
- (self.doc.new_stock_uom, self.doc.item_code) )
+ (self.new_stock_uom, self.item_code) )
# acknowledge user
msgprint(" All Bins Updated Successfully.")
@@ -68,23 +68,23 @@
# update stock ledger entry
from erpnext.stock.stock_ledger import update_entries_after
- if flt(self.doc.conversion_factor) != flt(1):
+ if flt(self.conversion_factor) != flt(1):
frappe.db.sql("""update `tabStock Ledger Entry`
set stock_uom = %s, actual_qty = ifnull(actual_qty,0) * %s
where item_code = %s""",
- (self.doc.new_stock_uom, self.doc.conversion_factor, self.doc.item_code))
+ (self.new_stock_uom, self.conversion_factor, self.item_code))
else:
frappe.db.sql("""update `tabStock Ledger Entry` set stock_uom=%s
- where item_code=%s""", (self.doc.new_stock_uom, self.doc.item_code))
+ where item_code=%s""", (self.new_stock_uom, self.item_code))
# acknowledge user
msgprint("Stock Ledger Entries Updated Successfully.")
# update item valuation
- if flt(self.doc.conversion_factor) != flt(1):
+ if flt(self.conversion_factor) != flt(1):
wh = frappe.db.sql("select name from `tabWarehouse`")
for w in wh:
- update_entries_after({"item_code": self.doc.item_code, "warehouse": w[0]})
+ update_entries_after({"item_code": self.item_code, "warehouse": w[0]})
# acknowledge user
msgprint("Item Valuation Updated Successfully.")
@@ -102,8 +102,8 @@
def validate_uom_integer_type(self):
- current_is_integer = frappe.db.get_value("UOM", self.doc.current_stock_uom, "must_be_whole_number")
- new_is_integer = frappe.db.get_value("UOM", self.doc.new_stock_uom, "must_be_whole_number")
+ current_is_integer = frappe.db.get_value("UOM", self.current_stock_uom, "must_be_whole_number")
+ new_is_integer = frappe.db.get_value("UOM", self.new_stock_uom, "must_be_whole_number")
if current_is_integer and not new_is_integer:
frappe.msgprint("New UOM must be of type Whole Number", raise_exception=True)
@@ -111,7 +111,7 @@
if not current_is_integer and new_is_integer:
frappe.msgprint("New UOM must NOT be of type Whole Number", raise_exception=True)
- if current_is_integer and new_is_integer and cint(self.doc.conversion_factor)!=self.doc.conversion_factor:
+ if current_is_integer and new_is_integer and cint(self.conversion_factor)!=self.conversion_factor:
frappe.msgprint("Conversion Factor cannot be fraction", raise_exception=True)
@frappe.whitelist()
diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py
index d098cfe..d621985 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.py
+++ b/erpnext/stock/doctype/warehouse/warehouse.py
@@ -11,25 +11,25 @@
class Warehouse(Document):
def autoname(self):
- suffix = " - " + frappe.db.get_value("Company", self.doc.company, "abbr")
- if not self.doc.warehouse_name.endswith(suffix):
- self.doc.name = self.doc.warehouse_name + suffix
+ suffix = " - " + frappe.db.get_value("Company", self.company, "abbr")
+ if not self.warehouse_name.endswith(suffix):
+ self.name = self.warehouse_name + suffix
def validate(self):
- if self.doc.email_id and not validate_email_add(self.doc.email_id):
+ if self.email_id and not validate_email_add(self.email_id):
throw(_("Please enter valid Email Id"))
self.update_parent_account()
def update_parent_account(self):
- if not self.doc.__islocal and (self.doc.create_account_under !=
- frappe.db.get_value("Warehouse", self.doc.name, "create_account_under")):
+ if not self.__islocal and (self.create_account_under !=
+ frappe.db.get_value("Warehouse", self.name, "create_account_under")):
warehouse_account = frappe.db.get_value("Account",
- {"account_type": "Warehouse", "company": self.doc.company,
- "master_name": self.doc.name}, ["name", "parent_account"])
- if warehouse_account and warehouse_account[1] != self.doc.create_account_under:
+ {"account_type": "Warehouse", "company": self.company,
+ "master_name": self.name}, ["name", "parent_account"])
+ if warehouse_account and warehouse_account[1] != self.create_account_under:
acc_bean = frappe.bean("Account", warehouse_account[0])
- acc_bean.doc.parent_account = self.doc.create_account_under
+ acc_bean.parent_account = self.create_account_under
acc_bean.save()
def on_update(self):
@@ -38,74 +38,74 @@
def create_account_head(self):
if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
if not frappe.db.get_value("Account", {"account_type": "Warehouse",
- "master_name": self.doc.name}) and not frappe.db.get_value("Account",
- {"account_name": self.doc.warehouse_name}):
- if self.doc.fields.get("__islocal") or not frappe.db.get_value(
- "Stock Ledger Entry", {"warehouse": self.doc.name}):
+ "master_name": self.name}) and not frappe.db.get_value("Account",
+ {"account_name": self.warehouse_name}):
+ if self.get("__islocal") or not frappe.db.get_value(
+ "Stock Ledger Entry", {"warehouse": self.name}):
self.validate_parent_account()
ac_bean = frappe.bean({
"doctype": "Account",
- 'account_name': self.doc.warehouse_name,
- 'parent_account': self.doc.create_account_under,
+ 'account_name': self.warehouse_name,
+ 'parent_account': self.create_account_under,
'group_or_ledger':'Ledger',
- 'company':self.doc.company,
+ 'company':self.company,
"account_type": "Warehouse",
- "master_name": self.doc.name,
+ "master_name": self.name,
"freeze_account": "No"
})
ac_bean.ignore_permissions = True
ac_bean.insert()
- msgprint(_("Account Head") + ": " + ac_bean.doc.name + _(" created"))
+ msgprint(_("Account Head") + ": " + ac_bean.name + _(" created"))
def validate_parent_account(self):
- if not self.doc.create_account_under:
+ if not self.create_account_under:
parent_account = frappe.db.get_value("Account",
- {"account_name": "Stock Assets", "company": self.doc.company})
+ {"account_name": "Stock Assets", "company": self.company})
if parent_account:
- self.doc.create_account_under = parent_account
+ self.create_account_under = parent_account
else:
frappe.throw(_("Please enter account group under which account \
- for warehouse ") + self.doc.name +_(" will be created"))
+ for warehouse ") + self.name +_(" will be created"))
def on_trash(self):
# delete bin
bins = frappe.db.sql("select * from `tabBin` where warehouse = %s",
- self.doc.name, as_dict=1)
+ self.name, as_dict=1)
for d in bins:
if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or \
d['indented_qty'] or d['projected_qty'] or d['planned_qty']:
throw("""Warehouse: %s can not be deleted as qty exists for item: %s"""
- % (self.doc.name, d['item_code']))
+ % (self.name, d['item_code']))
else:
frappe.db.sql("delete from `tabBin` where name = %s", d['name'])
warehouse_account = frappe.db.get_value("Account",
- {"account_type": "Warehouse", "master_name": self.doc.name})
+ {"account_type": "Warehouse", "master_name": self.name})
if warehouse_account:
frappe.delete_doc("Account", warehouse_account)
if frappe.db.sql("""select name from `tabStock Ledger Entry`
- where warehouse = %s""", self.doc.name):
+ where warehouse = %s""", self.name):
throw(_("""Warehouse can not be deleted as stock ledger entry
exists for this warehouse."""))
def before_rename(self, olddn, newdn, merge=False):
# Add company abbr if not provided
from erpnext.setup.doctype.company.company import get_name_with_abbr
- new_warehouse = get_name_with_abbr(newdn, self.doc.company)
+ new_warehouse = get_name_with_abbr(newdn, self.company)
if merge:
if not frappe.db.exists("Warehouse", new_warehouse):
frappe.throw(_("Warehouse ") + new_warehouse +_(" does not exists"))
- if self.doc.company != frappe.db.get_value("Warehouse", new_warehouse, "company"):
+ if self.company != frappe.db.get_value("Warehouse", new_warehouse, "company"):
frappe.throw(_("Both Warehouse must belong to same Company"))
frappe.db.sql("delete from `tabBin` where warehouse=%s", olddn)
from erpnext.accounts.utils import rename_account_for
- rename_account_for("Warehouse", olddn, newdn, merge, self.doc.company)
+ rename_account_for("Warehouse", olddn, newdn, merge, self.company)
return new_warehouse
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 3cd49d9..1bf431a 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -68,7 +68,7 @@
apply_pricing_rule(out, args)
if args.get("doctype") in ("Sales Invoice", "Delivery Note"):
- if item_bean.doc.has_serial_no == "Yes" and not args.serial_no:
+ if item_bean.has_serial_no == "Yes" and not args.serial_no:
out.serial_no = get_serial_nos_by_fifo(args, item_bean)
if args.transaction_date and item.lead_time_days:
@@ -153,7 +153,7 @@
})
for fieldname in ("item_name", "item_group", "barcode", "brand", "stock_uom"):
- out[fieldname] = item.fields.get(fieldname)
+ out[fieldname] = item.get(fieldname)
return out
@@ -174,7 +174,7 @@
if not out.price_list_rate and args.transaction_type == "buying":
from erpnext.stock.doctype.item.item import get_last_purchase_details
- out.update(get_last_purchase_details(item_bean.doc.name,
+ out.update(get_last_purchase_details(item_bean.name,
args.docname, args.conversion_rate))
def validate_price_list(args):
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index 4628b5b..e812285 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -53,7 +53,7 @@
sle.ignore_permissions = 1
sle.insert()
sle.submit()
- return sle.doc.name
+ return sle.name
def delete_cancelled_entry(voucher_type, voucher_no):
frappe.db.sql("""delete from `tabStock Ledger Entry`
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index e5099c4..981f674 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -297,7 +297,7 @@
msg="""<h3>Following Material Requests has been raised automatically \
based on item reorder level:</h3>"""
for mr in mr_list:
- msg += "<p><b><u>" + mr.doc.name + """</u></b></p><table class='table table-bordered'><tr>
+ msg += "<p><b><u>" + mr.name + """</u></b></p><table class='table table-bordered'><tr>
<th>Item Code</th><th>Warehouse</th><th>Qty</th><th>UOM</th></tr>"""
for item in mr.get("indent_details"):
msg += "<tr><td>" + item.item_code + "</td><td>" + item.warehouse + "</td><td>" + \