[enhancement] update landed cost on PI via landed cost voucher when update stock is set on PI
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
index 46843b3..d47bedb 100755
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
@@ -2181,6 +2181,112 @@
{
"allow_on_submit": 0,
"bold": 0,
+ "collapsible": 0,
+ "fieldname": "raw_materials_supplied",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Raw Materials Supplied",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "default": "No",
+ "fieldname": "is_subcontracted",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Raw Materials Supplied",
+ "length": 0,
+ "no_copy": 0,
+ "options": "No\nYes",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "supplier_warehouse",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Supplier Warehouse",
+ "length": 0,
+ "no_copy": 1,
+ "options": "Warehouse",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "print_width": "50px",
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0,
+ "width": "50px"
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "supplied_items",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Supplied Items",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Purchase Receipt Item Supplied",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
"collapsible": 1,
"fieldname": "printing_settings",
"fieldtype": "Section Break",
@@ -2496,6 +2602,33 @@
{
"allow_on_submit": 0,
"bold": 0,
+ "collapsible": 0,
+ "description": "Warehouse where you are maintaining stock of rejected items",
+ "fieldname": "rejected_warehouse",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Rejected Warehouse",
+ "length": 0,
+ "no_copy": 1,
+ "options": "Warehouse",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
"collapsible": 1,
"collapsible_depends_on": "is_recurring",
"depends_on": "eval:doc.docstatus<2",
@@ -2986,4 +3119,4 @@
"timeline_field": "supplier",
"title_field": "title",
"track_seen": 0
-}
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 3cdb0e7..a8a0d84 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -51,14 +51,6 @@
if (self.is_paid == 1):
self.validate_cash()
- # validate stock items
- if (self.update_stock == 1):
- self.validate_purchase_return()
- self.validate_rejected_warehouse()
- self.validate_accepted_rejected_qty()
- pc_obj = frappe.get_doc('Purchase Common')
- pc_obj.validate_for_items(self)
-
self.check_active_purchase_items()
self.check_conversion_rate()
self.validate_credit_to_acc()
@@ -279,9 +271,15 @@
'source_field': '-1 * qty',
# 'percent_join_field': 'prevdoc_docname',
# 'overflow_type': 'receipt',
- 'extra_cond': """ and exists (select name from `tabPurchase Invoice` where name=`tabPurchase Invoice Item`.parent and is_return=1)"""
+ 'extra_cond': """ and exists (select name from `tabPurchase Invoice`
+ where name=`tabPurchase Invoice Item`.parent and update_stock=1 and is_return=1)"""
}
])
+
+ def validate_purchase_receipt(self):
+ for item in self.get("items"):
+ if item.purchase_receipt:
+ frappe.throw(_("Stock cannot be updated against Purchase Receipt {0}").format(item.purchase_receipt))
def on_submit(self):
self.check_prev_docstatus()
@@ -290,7 +288,6 @@
frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype,
self.company, self.base_grand_total)
- # make purchase receipt
if (self.update_stock == 1):
# from erpnext.stock.doctype.purchase_receipt.purchase_receipt import update_stock_ledger
self.update_stock_ledger()
@@ -427,9 +424,15 @@
for item in self.get("items"):
if flt(item.base_net_amount):
account_currency = get_account_currency(item.expense_account)
+
+ if auto_accounting_for_stock and self.update_stock:
+ expense_account = warehouse_account[item.warehouse]["name"]
+ else:
+ expense_account = item.expense_account
+
gl_entries.append(
self.get_gl_dict({
- "account": item.expense_account if not self.update_stock else warehouse_account[item.warehouse]["name"],
+ "account": expense_account,
"against": self.supplier,
"debit": item.base_net_amount,
"debit_in_account_currency": item.base_net_amount \
diff --git a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
index 28b84eb..f9f7660 100755
--- a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
+++ b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
@@ -1286,6 +1286,32 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "fieldname": "bom",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "BOM",
+ "length": 0,
+ "no_copy": 0,
+ "options": "BOM",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "col_break6",
"fieldtype": "Column Break",
"hidden": 0,
@@ -1435,7 +1461,7 @@
"unique": 0
},
{
- "allow_on_submit": 0,
+ "allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"fieldname": "valuation_rate",
@@ -1483,6 +1509,31 @@
"search_index": 0,
"set_only_once": 0,
"unique": 0
+ },
+ {
+ "allow_on_submit": 1,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "landed_cost_voucher_amount",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Landed Cost Voucher Amount",
+ "length": 0,
+ "no_copy": 1,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
}
],
"hide_heading": 0,
@@ -1494,7 +1545,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2016-03-28 05:05:27.752823",
+ "modified": "2016-04-07 16:38:30.502386",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice Item",
@@ -1503,5 +1554,6 @@
"read_only": 0,
"read_only_onload": 0,
"sort_field": "modified",
- "sort_order": "DESC"
+ "sort_order": "DESC",
+ "track_seen": 0
}
\ No newline at end of file
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index 1bb968c..9c9f1c3 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -32,6 +32,23 @@
self.set_qty_as_per_stock_uom()
self.validate_stock_or_nonstock_items()
self.validate_warehouse()
+
+ if self.doctype=="Purchase Invoice" and getattr(self, "update_stock"):
+ self.validate_purchase_receipt()
+
+ if self.doctype=="Purchase Receipt" or (self.doctype=="Purchase Invoice" and getattr(self, "update_stock")):
+ self.validate_purchase_return()
+ self.validate_rejected_warehouse()
+ self.validate_accepted_rejected_qty()
+
+ pc_obj = frappe.get_doc('Purchase Common')
+ pc_obj.validate_for_items(self)
+
+ #sub-contracting
+ self.validate_for_subcontracting()
+ self.create_raw_materials_supplied("supplied_items")
+ self.set_landed_cost_voucher_amount()
+ self.update_valuation_rate("items")
def set_missing_values(self, for_validate=False):
super(BuyingController, self).set_missing_values(for_validate)
@@ -60,6 +77,13 @@
if tax_for_valuation:
frappe.throw(_("Tax Category can not be 'Valuation' or 'Valuation and Total' as all items are non-stock items"))
+ def set_landed_cost_voucher_amount(self):
+ for d in self.get("items"):
+ lc_voucher_amount = frappe.db.sql("""select sum(applicable_charges)
+ from `tabLanded Cost Item`
+ where docstatus = 1 and purchase_receipt_item = %s""", d.name)
+ d.landed_cost_voucher_amount = lc_voucher_amount[0][0] if lc_voucher_amount else 0.0
+
def set_total_in_words(self):
from frappe.utils import money_in_words
company_currency = get_company_currency(self.company)
@@ -108,10 +132,10 @@
item.conversion_factor = get_conversion_factor(item.item_code, item.uom).get("conversion_factor") or 1.0
qty_in_stock_uom = flt(item.qty * item.conversion_factor)
- rm_supp_cost = flt(item.rm_supp_cost) if self.doctype=="Purchase Receipt" else 0.0
+ rm_supp_cost = flt(item.rm_supp_cost) if self.doctype in ["Purchase Receipt", "Purchase Invoice"] else 0.0
landed_cost_voucher_amount = flt(item.landed_cost_voucher_amount) \
- if self.doctype == "Purchase Receipt" else 0.0
+ if self.doctype in ["Purchase Receipt", "Purchase Invoice"] else 0.0
item.valuation_rate = ((item.base_net_amount + item.item_tax_amount + rm_supp_cost
+ landed_cost_voucher_amount) / qty_in_stock_uom)
@@ -123,7 +147,7 @@
frappe.throw(_("Please enter 'Is Subcontracted' as Yes or No"))
if self.is_subcontracted == "Yes":
- if self.doctype == "Purchase Receipt" and not self.supplier_warehouse:
+ if self.doctype in ["Purchase Receipt", "Purchase Invoice"] and not self.supplier_warehouse:
frappe.throw(_("Supplier Warehouse mandatory for sub-contracted Purchase Receipt"))
for item in self.get("items"):
@@ -139,7 +163,7 @@
if self.is_subcontracted=="Yes":
parent_items = []
for item in self.get("items"):
- if self.doctype == "Purchase Receipt":
+ if self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
item.rm_supp_cost = 0.0
if item.item_code in self.sub_contracted_items:
self.update_raw_materials_supplied(item, raw_material_table)
@@ -149,7 +173,7 @@
self.cleanup_raw_materials_supplied(parent_items, raw_material_table)
- elif self.doctype == "Purchase Receipt":
+ elif self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
for item in self.get("items"):
item.rm_supp_cost = 0.0
@@ -179,7 +203,7 @@
rm.conversion_factor = item.conversion_factor
- if self.doctype == "Purchase Receipt":
+ if self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
rm.consumed_qty = required_qty
rm.description = bom_item.description
if item.batch_no and not rm.batch_no:
@@ -272,7 +296,9 @@
def validate_rejected_warehouse(self):
for d in self.get("items"):
if flt(d.rejected_qty) and not d.rejected_warehouse:
- d.rejected_warehouse = self.rejected_warehouse
+ if self.rejected_warehouse:
+ d.rejected_warehouse = self.rejected_warehouse
+
if not d.rejected_warehouse:
frappe.throw(_("Row #{0}: Rejected Warehouse is mandatory against rejected Item {1}").format(d.idx, d.item_code))
diff --git a/erpnext/stock/doctype/landed_cost_item/landed_cost_item.json b/erpnext/stock/doctype/landed_cost_item/landed_cost_item.json
index 9c1a74f..fafcc84 100644
--- a/erpnext/stock/doctype/landed_cost_item/landed_cost_item.json
+++ b/erpnext/stock/doctype/landed_cost_item/landed_cost_item.json
@@ -6,6 +6,7 @@
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
+ "document_type": "Document",
"fields": [
{
"allow_on_submit": 0,
@@ -15,6 +16,7 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Item Code",
@@ -23,6 +25,7 @@
"options": "Item",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 1,
@@ -39,6 +42,7 @@
"fieldtype": "Text Editor",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Description",
@@ -48,6 +52,7 @@
"oldfieldtype": "Data",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"print_width": "300px",
"read_only": 1,
"report_hide": 0,
@@ -61,18 +66,47 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "fieldname": "purchase_receipt",
- "fieldtype": "Link",
+ "fieldname": "receipt_document_type",
+ "fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Purchase Receipt",
+ "label": "Receipt Document Type",
"length": 0,
"no_copy": 1,
- "options": "Purchase Receipt",
+ "options": "Purchase Invoice\nPurchase Receipt",
"permlevel": 0,
+ "precision": "",
"print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "receipt_document",
+ "fieldtype": "Dynamic Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Receipt Document",
+ "length": 0,
+ "no_copy": 1,
+ "options": "receipt_document_type",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
@@ -88,12 +122,14 @@
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -109,6 +145,7 @@
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Qty",
@@ -116,6 +153,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
@@ -131,6 +169,7 @@
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Rate",
@@ -139,6 +178,7 @@
"options": "Company:company:default_currency",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
@@ -154,6 +194,7 @@
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Amount",
@@ -164,6 +205,7 @@
"options": "Company:company:default_currency",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 1,
@@ -179,6 +221,7 @@
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Applicable Charges",
@@ -187,6 +230,7 @@
"options": "Company:company:default_currency",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
@@ -202,6 +246,7 @@
"fieldtype": "Data",
"hidden": 1,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Purchase Receipt Item",
@@ -209,6 +254,7 @@
"no_copy": 1,
"permlevel": 0,
"print_hide": 1,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
@@ -226,12 +272,13 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2015-11-16 06:29:49.057949",
+ "modified": "2016-04-07 16:18:00.859492",
"modified_by": "Administrator",
"module": "Stock",
"name": "Landed Cost Item",
"owner": "wasim@webnotestech.com",
"permissions": [],
"read_only": 0,
- "read_only_onload": 0
+ "read_only_onload": 0,
+ "track_seen": 0
}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json b/erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json
index 165982f..db3b89e 100644
--- a/erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json
+++ b/erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json
@@ -6,25 +6,54 @@
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
+ "document_type": "Document",
"fields": [
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "fieldname": "purchase_receipt",
- "fieldtype": "Link",
+ "fieldname": "receipt_document_type",
+ "fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Receipt Document Type",
+ "length": 0,
+ "no_copy": 0,
+ "options": "\nPurchase Invoice\nPurchase Receipt",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "receipt_document",
+ "fieldtype": "Dynamic Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
- "label": "Purchase Receipt",
+ "label": "Receipt Document",
"length": 0,
"no_copy": 0,
"oldfieldname": "purchase_receipt_no",
"oldfieldtype": "Link",
- "options": "Purchase Receipt",
+ "options": "receipt_document_type",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"print_width": "220px",
"read_only": 0,
"report_hide": 0,
@@ -42,6 +71,7 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Supplier",
@@ -50,6 +80,7 @@
"options": "Supplier",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
@@ -65,12 +96,14 @@
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -87,6 +120,7 @@
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Posting Date",
@@ -94,6 +128,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
@@ -109,6 +144,7 @@
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Grand Total",
@@ -116,6 +152,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
@@ -133,12 +170,13 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2015-11-16 06:29:49.106523",
+ "modified": "2016-04-07 15:14:56.955036",
"modified_by": "Administrator",
"module": "Stock",
"name": "Landed Cost Purchase Receipt",
"owner": "wasim@webnotestech.com",
"permissions": [],
"read_only": 0,
- "read_only_onload": 0
+ "read_only_onload": 0,
+ "track_seen": 0
}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.js b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.js
index 0bb8f90..5a86c89 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.js
+++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.js
@@ -8,20 +8,28 @@
erpnext.stock.LandedCostVoucher = erpnext.stock.StockController.extend({
setup: function() {
var me = this;
- this.frm.fields_dict.purchase_receipts.grid.get_field('purchase_receipt').get_query =
- function() {
+ this.frm.fields_dict.purchase_receipts.grid.get_field('receipt_document').get_query =
+ function(doc, cdt ,cdn) {
+ var d = locals[cdt][cdn]
+
+ var filters = [
+ [d.receipt_document_type, 'docstatus', '=', '1'],
+ [d.receipt_document_type, 'company', '=', me.frm.doc.company],
+ ]
+
+ if(d.receipt_document_type == "Purchase Invoice") {
+ filters.push(["Purchase Invoice", "update_stock", "=", "1"])
+ }
+
if(!me.frm.doc.company) msgprint(__("Please enter company first"));
return {
- filters:[
- ['Purchase Receipt', 'docstatus', '=', '1'],
- ['Purchase Receipt', 'company', '=', me.frm.doc.company],
- ]
+ filters:filters
}
};
- this.frm.add_fetch("purchase_receipt", "supplier", "supplier");
- this.frm.add_fetch("purchase_receipt", "posting_date", "posting_date");
- this.frm.add_fetch("purchase_receipt", "base_grand_total", "grand_total");
+ this.frm.add_fetch("receipt_document", "supplier", "supplier");
+ this.frm.add_fetch("receipt_document", "posting_date", "posting_date");
+ this.frm.add_fetch("receipt_document", "base_grand_total", "grand_total");
},
diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
index 3418c9e..ac59e06 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
+++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
@@ -14,9 +14,9 @@
for pr in self.get("purchase_receipts"):
pr_items = frappe.db.sql("""select pr_item.item_code, pr_item.description,
pr_item.qty, pr_item.base_rate, pr_item.base_amount, pr_item.name
- from `tabPurchase Receipt Item` pr_item where parent = %s
- and exists(select name from tabItem where name = pr_item.item_code and is_stock_item = 1)""",
- pr.purchase_receipt, as_dict=True)
+ from `tab{doctype} Item` pr_item where parent = %s
+ and exists(select name from tabItem where name = pr_item.item_code and is_stock_item = 1)
+ """.format(doctype=pr.receipt_document_type), pr.receipt_document, as_dict=True)
for d in pr_items:
item = self.append("items")
@@ -25,13 +25,13 @@
item.qty = d.qty
item.rate = d.base_rate
item.amount = d.base_amount
- item.purchase_receipt = pr.purchase_receipt
+ item.receipt_document_type = pr.receipt_document_type
+ item.receipt_document = pr.receipt_document
item.purchase_receipt_item = d.name
if self.get("taxes"):
self.set_applicable_charges_for_item()
-
def validate(self):
self.check_mandatory()
self.validate_purchase_receipts()
@@ -43,25 +43,26 @@
def check_mandatory(self):
if not self.get("purchase_receipts"):
- frappe.throw(_("Please enter Purchase Receipts"))
+ frappe.throw(_("Please enter Receipt Document"))
if not self.get("taxes"):
frappe.throw(_("Please enter Taxes and Charges"))
def validate_purchase_receipts(self):
- purchase_receipts = []
+ receipt_documents = []
+
for d in self.get("purchase_receipts"):
- if frappe.db.get_value("Purchase Receipt", d.purchase_receipt, "docstatus") != 1:
- frappe.throw(_("Purchase Receipt must be submitted"))
+ if frappe.db.get_value(d.receipt_document_type, d.receipt_document, "docstatus") != 1:
+ frappe.throw(_("Receipt document must be submitted"))
else:
- purchase_receipts.append(d.purchase_receipt)
+ receipt_documents.append(d.receipt_document)
for item in self.get("items"):
- if not item.purchase_receipt:
+ if not item.receipt_document:
frappe.throw(_("Item must be added using 'Get Items from Purchase Receipts' button"))
- elif item.purchase_receipt not in purchase_receipts:
- frappe.throw(_("Item Row {0}: Purchase Receipt {1} does not exist in above 'Purchase Receipts' table")
- .format(item.idx, item.purchase_receipt))
+ elif item.receipt_document not in receipt_documents:
+ frappe.throw(_("Item Row {idx}: {doctype} {docname} does not exist in above '{doctype}' table")
+ .format(idx=item.idx, doctype=item.receipt_document_type, docname=item.receipt_document))
def set_total_taxes_and_charges(self):
self.total_taxes_and_charges = sum([flt(d.amount) for d in self.get("taxes")])
@@ -83,36 +84,35 @@
self.update_landed_cost()
def update_landed_cost(self):
- purchase_receipts = list(set([d.purchase_receipt for d in self.get("items")]))
- for purchase_receipt in purchase_receipts:
- pr = frappe.get_doc("Purchase Receipt", purchase_receipt)
+ for d in self.get("items"):
+ doc = frappe.get_doc(d.receipt_document_type, d.receipt_document)
# set landed cost voucher amount in pr item
- pr.set_landed_cost_voucher_amount()
+ doc.set_landed_cost_voucher_amount()
# set valuation amount in pr item
- pr.update_valuation_rate("items")
+ doc.update_valuation_rate("items")
# save will update landed_cost_voucher_amount and voucher_amount in PR,
# as those fields are allowed to edit after submit
- pr.save()
+ doc.save()
# update latest valuation rate in serial no
- self.update_rate_in_serial_no(pr)
+ self.update_rate_in_serial_no(doc)
# update stock & gl entries for cancelled state of PR
- pr.docstatus = 2
- pr.update_stock_ledger(allow_negative_stock=True, via_landed_cost_voucher=True)
- pr.make_gl_entries_on_cancel()
+ doc.docstatus = 2
+ doc.update_stock_ledger(allow_negative_stock=True, via_landed_cost_voucher=True)
+ doc.make_gl_entries_on_cancel()
# update stock & gl entries for submit state of PR
- pr.docstatus = 1
- pr.update_stock_ledger(via_landed_cost_voucher=True)
- pr.make_gl_entries()
+ doc.docstatus = 1
+ doc.update_stock_ledger(via_landed_cost_voucher=True)
+ doc.make_gl_entries()
- def update_rate_in_serial_no(self, purchase_receipt):
- for item in purchase_receipt.get("items"):
+ def update_rate_in_serial_no(self, receipt_document):
+ for item in receipt_document.get("items"):
if item.serial_no:
serial_nos = get_serial_nos(item.serial_no)
if serial_nos:
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 1bdbc15..bad1228 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -52,31 +52,13 @@
self.set_status()
self.po_required()
self.validate_with_previous_doc()
- self.validate_purchase_return()
- self.validate_rejected_warehouse()
- self.validate_accepted_rejected_qty()
self.validate_inspection()
self.validate_uom_is_integer("uom", ["qty", "received_qty"])
self.validate_uom_is_integer("stock_uom", "stock_qty")
pc_obj = frappe.get_doc('Purchase Common')
- pc_obj.validate_for_items(self)
self.check_for_closed_status(pc_obj)
- # sub-contracting
- self.validate_for_subcontracting()
- self.create_raw_materials_supplied("supplied_items")
- self.set_landed_cost_voucher_amount()
- self.update_valuation_rate("items")
-
-
- def set_landed_cost_voucher_amount(self):
- for d in self.get("items"):
- lc_voucher_amount = frappe.db.sql("""select sum(applicable_charges)
- from `tabLanded Cost Item`
- where docstatus = 1 and purchase_receipt_item = %s""", d.name)
- d.landed_cost_voucher_amount = lc_voucher_amount[0][0] if lc_voucher_amount else 0.0
-
def validate_with_previous_doc(self):
super(PurchaseReceipt, self).validate_with_previous_doc({
"Purchase Order": {