From eb883ee7a354de28c4257bc604fb7cf378b77bd5 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 5 Jul 2013 15:23:47 +0530 Subject: [PATCH] [mapper] purchase cycle --- .../Delivery Note-Sales Invoice.txt | 147 ----------------- .../Sales Order-Sales Invoice.txt | 149 ------------------ .../purchase_invoice/purchase_invoice.js | 24 ++- .../purchase_invoice/purchase_invoice.py | 20 --- .../purchase_invoice/purchase_invoice.txt | 65 +++++--- .../Material Request-Purchase Order.txt | 125 --------------- .../Material Request-Supplier Quotation.txt | 90 ----------- .../Sales Order-Material Request.txt | 98 ------------ .../doctype/purchase_order/purchase_order.js | 98 +++++------- .../doctype/purchase_order/purchase_order.py | 98 ++++++++++-- .../doctype/purchase_order/purchase_order.txt | 4 +- .../purchase_order/test_purchase_order.py | 31 +++- .../supplier_quotation/supplier_quotation.js | 23 ++- .../supplier_quotation/supplier_quotation.py | 38 +++++ selling/doctype/sales_order/sales_order.py | 3 +- .../material_request/material_request.js | 6 +- .../material_request/material_request.py | 16 +- .../purchase_receipt/purchase_receipt.js | 63 +++----- .../purchase_receipt/purchase_receipt.py | 53 +++++-- .../purchase_receipt/purchase_receipt.txt | 47 +++++- .../purchase_receipt/test_purchase_receipt.py | 15 ++ 21 files changed, 390 insertions(+), 823 deletions(-) delete mode 100644 accounts/DocType Mapper/Delivery Note-Sales Invoice/Delivery Note-Sales Invoice.txt delete mode 100644 accounts/DocType Mapper/Sales Order-Sales Invoice/Sales Order-Sales Invoice.txt delete mode 100644 buying/DocType Mapper/Material Request-Purchase Order/Material Request-Purchase Order.txt delete mode 100644 buying/DocType Mapper/Material Request-Supplier Quotation/Material Request-Supplier Quotation.txt delete mode 100644 buying/DocType Mapper/Sales Order-Material Request/Sales Order-Material Request.txt diff --git a/accounts/DocType Mapper/Delivery Note-Sales Invoice/Delivery Note-Sales Invoice.txt b/accounts/DocType Mapper/Delivery Note-Sales Invoice/Delivery Note-Sales Invoice.txt deleted file mode 100644 index e2f642204d..0000000000 --- a/accounts/DocType Mapper/Delivery Note-Sales Invoice/Delivery Note-Sales Invoice.txt +++ /dev/null @@ -1,147 +0,0 @@ -[ - { - "owner": "Administrator", - "docstatus": 0, - "creation": "2012-04-03 12:49:42", - "modified_by": "Administrator", - "modified": "2012-04-03 12:49:43" - }, - { - "name": "__common__", - "parent": "Delivery Note-Sales Invoice", - "doctype": "Table Mapper Detail", - "parenttype": "DocType Mapper", - "parentfield": "table_mapper_details" - }, - { - "name": "__common__", - "parent": "Delivery Note-Sales Invoice", - "doctype": "Field Mapper Detail", - "parenttype": "DocType Mapper", - "parentfield": "field_mapper_details" - }, - { - "name": "__common__", - "to_doctype": "Sales Invoice", - "module": "Accounts", - "doctype": "DocType Mapper", - "ref_doc_submitted": 1, - "from_doctype": "Delivery Note" - }, - { - "name": "Delivery Note-Sales Invoice", - "doctype": "DocType Mapper" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "qty", - "doctype": "Field Mapper Detail", - "from_field": "eval: obj.basic_rate and (flt(obj.amount) - flt(obj.billed_amt)) / flt(obj.basic_rate) or obj.qty" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "delivery_note", - "doctype": "Field Mapper Detail", - "from_field": "parent" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "dn_detail", - "doctype": "Field Mapper Detail", - "from_field": "name" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "sales_order", - "doctype": "Field Mapper Detail", - "from_field": "prevdoc_docname" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "so_detail", - "doctype": "Field Mapper Detail", - "from_field": "prevdoc_detail_docname" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "amount", - "doctype": "Field Mapper Detail", - "from_field": "eval: flt(obj.amount) - flt(obj.billed_amt)" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "export_amount", - "doctype": "Field Mapper Detail", - "from_field": "eval: (flt(obj.amount) - flt(obj.billed_amt)) * flt(obj.export_rate)/flt(obj.basic_rate)" - }, - { - "map": "No", - "match_id": 0, - "to_field": "naming_series", - "doctype": "Field Mapper Detail", - "from_field": "naming_series" - }, - { - "map": "No", - "match_id": 3, - "to_field": "incentives", - "doctype": "Field Mapper Detail", - "from_field": "incentives" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "serial_no", - "doctype": "Field Mapper Detail", - "from_field": "serial_no" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "export_rate", - "doctype": "Field Mapper Detail", - "from_field": "export_rate", - "checking_operator": "=" - }, - { - "match_id": 0, - "doctype": "Table Mapper Detail", - "from_table": "Delivery Note", - "to_table": "Sales Invoice", - "validation_logic": "docstatus=1" - }, - { - "match_id": 1, - "to_field": "entries", - "doctype": "Table Mapper Detail", - "from_field": "delivery_note_details", - "from_table": "Delivery Note Item", - "to_table": "Sales Invoice Item", - "validation_logic": "(ifnull(amount, 0) = 0 or amount > ifnull(billed_amt, 0)) and docstatus = 1" - }, - { - "match_id": 2, - "to_field": "other_charges", - "doctype": "Table Mapper Detail", - "from_field": "other_charges", - "from_table": "Sales Taxes and Charges", - "to_table": "Sales Taxes and Charges", - "validation_logic": "name is not null" - }, - { - "match_id": 3, - "to_field": "sales_team", - "doctype": "Table Mapper Detail", - "from_field": "sales_team", - "from_table": "Sales Team", - "to_table": "Sales Team", - "validation_logic": "name is not null" - } -] \ No newline at end of file diff --git a/accounts/DocType Mapper/Sales Order-Sales Invoice/Sales Order-Sales Invoice.txt b/accounts/DocType Mapper/Sales Order-Sales Invoice/Sales Order-Sales Invoice.txt deleted file mode 100644 index 4b6257b224..0000000000 --- a/accounts/DocType Mapper/Sales Order-Sales Invoice/Sales Order-Sales Invoice.txt +++ /dev/null @@ -1,149 +0,0 @@ -[ - { - "owner": "Administrator", - "docstatus": 0, - "creation": "2012-04-03 12:49:42", - "modified_by": "Administrator", - "modified": "2012-04-03 12:49:42" - }, - { - "name": "__common__", - "parent": "Sales Order-Sales Invoice", - "doctype": "Table Mapper Detail", - "parenttype": "DocType Mapper", - "parentfield": "table_mapper_details" - }, - { - "name": "__common__", - "parent": "Sales Order-Sales Invoice", - "doctype": "Field Mapper Detail", - "parenttype": "DocType Mapper", - "parentfield": "field_mapper_details" - }, - { - "name": "__common__", - "to_doctype": "Sales Invoice", - "module": "Accounts", - "doctype": "DocType Mapper", - "ref_doc_submitted": 1, - "from_doctype": "Sales Order" - }, - { - "name": "Sales Order-Sales Invoice", - "doctype": "DocType Mapper" - }, - { - "map": "Yes", - "match_id": 0, - "to_field": "customer", - "doctype": "Field Mapper Detail", - "from_field": "customer", - "checking_operator": "=" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "qty", - "doctype": "Field Mapper Detail", - "from_field": "eval: obj.basic_rate and (flt(obj.amount) - flt(obj.billed_amt))/flt(obj.basic_rate) or obj.qty" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "sales_order", - "doctype": "Field Mapper Detail", - "from_field": "parent" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "so_detail", - "doctype": "Field Mapper Detail", - "from_field": "name" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "amount", - "doctype": "Field Mapper Detail", - "from_field": "eval:flt(obj.amount) - flt(obj.billed_amt)" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "export_amount", - "doctype": "Field Mapper Detail", - "from_field": "eval: (flt(obj.amount) - flt(obj.billed_amt))* flt(obj.export_rate)/flt(obj.basic_rate)" - }, - { - "map": "Yes", - "match_id": 0, - "to_field": "project_name", - "doctype": "Field Mapper Detail", - "from_field": "project_name", - "checking_operator": "=" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "warehouse", - "doctype": "Field Mapper Detail", - "from_field": "reserved_warehouse" - }, - { - "map": "No", - "match_id": 0, - "to_field": "naming_series", - "doctype": "Field Mapper Detail", - "from_field": "naming_series" - }, - { - "map": "No", - "match_id": 3, - "to_field": "incentives", - "doctype": "Field Mapper Detail", - "from_field": "incentives" - }, - { - "map": "Yes", - "match_id": 1, - "to_field": "export_rate", - "doctype": "Field Mapper Detail", - "from_field": "export_rate", - "checking_operator": "=" - }, - { - "match_id": 0, - "doctype": "Table Mapper Detail", - "from_table": "Sales Order", - "to_table": "Sales Invoice", - "validation_logic": "docstatus=1" - }, - { - "match_id": 1, - "to_field": "entries", - "doctype": "Table Mapper Detail", - "from_field": "sales_order_detail", - "from_table": "Sales Order Item", - "to_table": "Sales Invoice Item", - "validation_logic": "(ifnull(amount, 0) = 0 or amount > ifnull(billed_amt, 0)) and docstatus = 1" - }, - { - "match_id": 2, - "to_field": "other_charges", - "doctype": "Table Mapper Detail", - "from_field": "other_charges", - "from_table": "Sales Taxes and Charges", - "to_table": "Sales Taxes and Charges", - "validation_logic": "name is not null" - }, - { - "match_id": 3, - "to_field": "sales_team", - "doctype": "Table Mapper Detail", - "from_field": "sales_team", - "from_table": "Sales Team", - "to_table": "Sales Team", - "validation_logic": "name is not null" - } -] \ No newline at end of file diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.js b/accounts/doctype/purchase_invoice/purchase_invoice.js index cf308e3bbd..0e461f1ba1 100644 --- a/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -67,7 +67,23 @@ erpnext.accounts.PurchaseInvoiceController = erpnext.buying.BuyingController.ext allocated_amount: function() { this.calculate_total_advance("Purchase Invoice", "advance_allocation_details"); this.frm.refresh_fields(); + }, + + get_items: function() { + if(doc.purchase_order_main) { + wn.model.map_current_doc({ + method: "buying.doctype.purchase_order.purchase_order.make_purchase_invoice", + source_name: cur_frm.doc.purchase_order_main, + }) + } + else if(doc.purchase_receipt_main) { + wn.model.map_current_doc({ + method: "selling.doctype.purchase_receipt.purchase_receipt.make_purchase_invoice", + source_name: cur_frm.doc.purchase_receipt_main, + }) + } } + }); // for backward compatibility: combine new and previous states @@ -101,14 +117,6 @@ cur_frm.cscript.is_opening = function(doc, dt, dn) { if (doc.is_opening == 'Yes') unhide_field('aging_date'); } -cur_frm.cscript.get_items = function(doc, dt, dn) { - var callback = function(r,rt) { - unhide_field(['supplier_address', 'contact_person']); - cur_frm.refresh_fields(); - } - $c_obj(make_doclist(dt,dn),'pull_details','',callback); -} - cur_frm.cscript.make_bank_voucher = function() { wn.call({ method: "accounts.doctype.journal_voucher.journal_voucher.get_default_bank_cash_account", diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.py b/accounts/doctype/purchase_invoice/purchase_invoice.py index 980d4e817c..059073aeec 100644 --- a/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -126,26 +126,6 @@ class DocType(BuyingController): ret['due_date'] = add_days(cstr(self.doc.posting_date), acc and cint(acc[1]) or 0) return ret - - def pull_details(self): - if self.doc.purchase_receipt_main: - self.validate_duplicate_docname('purchase_receipt') - self.doclist = get_obj('DocType Mapper', 'Purchase Receipt-Purchase Invoice').dt_map('Purchase Receipt', 'Purchase Invoice', self.doc.purchase_receipt_main, self.doc, self.doclist, "[['Purchase Receipt', 'Purchase Invoice'], ['Purchase Receipt Item', 'Purchase Invoice Item'], ['Purchase Taxes and Charges','Purchase Taxes and Charges']]") - - elif self.doc.purchase_order_main: - self.validate_duplicate_docname('purchase_order') - self.doclist = get_obj('DocType Mapper', 'Purchase Order-Purchase Invoice').dt_map('Purchase Order', 'Purchase Invoice', self.doc.purchase_order_main, self.doc, self.doclist, "[['Purchase Order', 'Purchase Invoice'],['Purchase Order Item', 'Purchase Invoice Item'], ['Purchase Taxes and Charges','Purchase Taxes and Charges']]") - - self.get_expense_account('entries') - - ret = self.get_credit_to() - if ret.has_key('credit_to'): - self.doc.credit_to = ret['credit_to'] - - def get_expense_account(self, doctype): - for d in getlist(self.doclist, doctype): - if d.item_code: - d.fields.update(self.get_default_values(d.fields)) def get_advances(self): super(DocType, self).get_advances(self.doc.credit_to, diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.txt b/accounts/doctype/purchase_invoice/purchase_invoice.txt index c3b5061957..424770bd6a 100755 --- a/accounts/doctype/purchase_invoice/purchase_invoice.txt +++ b/accounts/doctype/purchase_invoice/purchase_invoice.txt @@ -2,7 +2,7 @@ { "creation": "2013-05-21 16:16:39", "docstatus": 0, - "modified": "2013-06-11 16:16:38", + "modified": "2013-07-05 14:40:59", "modified_by": "Administrator", "owner": "Administrator" }, @@ -30,7 +30,6 @@ "parent": "Purchase Invoice", "parentfield": "permissions", "parenttype": "DocType", - "permlevel": 0, "read": 1, "report": 1 }, @@ -259,7 +258,6 @@ "fieldtype": "Button", "label": "Get Items", "oldfieldtype": "Button", - "options": "pull_details", "read_only": 0 }, { @@ -827,31 +825,13 @@ "read_only": 0, "reqd": 0 }, - { - "amend": 1, - "cancel": 1, - "create": 1, - "doctype": "DocPerm", - "role": "Accounts User", - "submit": 1, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "doctype": "DocPerm", - "role": "Purchase User", - "submit": 0, - "write": 1 - }, { "amend": 0, "cancel": 0, "create": 0, "doctype": "DocPerm", - "match": "supplier", - "role": "Supplier", + "permlevel": 1, + "role": "Accounts Manager", "submit": 0, "write": 0 }, @@ -860,6 +840,7 @@ "cancel": 1, "create": 1, "doctype": "DocPerm", + "permlevel": 0, "role": "Accounts Manager", "submit": 1, "write": 1 @@ -869,8 +850,44 @@ "cancel": 0, "create": 0, "doctype": "DocPerm", - "role": "Auditor", + "permlevel": 1, + "role": "Accounts User", "submit": 0, "write": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 0, + "doctype": "DocPerm", + "permlevel": 1, + "role": "Purchase User", + "submit": 0 + }, + { + "amend": 0, + "cancel": 0, + "create": 1, + "doctype": "DocPerm", + "permlevel": 0, + "role": "Purchase User", + "submit": 0, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "doctype": "DocPerm", + "permlevel": 0, + "role": "Accounts User", + "submit": 1, + "write": 1 + }, + { + "doctype": "DocPerm", + "match": "supplier", + "permlevel": 0, + "role": "Supplier" } ] \ No newline at end of file diff --git a/buying/DocType Mapper/Material Request-Purchase Order/Material Request-Purchase Order.txt b/buying/DocType Mapper/Material Request-Purchase Order/Material Request-Purchase Order.txt deleted file mode 100644 index 5d01ac0314..0000000000 --- a/buying/DocType Mapper/Material Request-Purchase Order/Material Request-Purchase Order.txt +++ /dev/null @@ -1,125 +0,0 @@ -[ - { - "creation": "2010-08-08 17:09:34", - "docstatus": 0, - "modified": "2013-02-18 13:41:16", - "modified_by": "Administrator", - "owner": "Administrator" - }, - { - "doctype": "Table Mapper Detail", - "name": "__common__", - "parent": "Material Request-Purchase Order", - "parentfield": "table_mapper_details", - "parenttype": "DocType Mapper" - }, - { - "doctype": "Field Mapper Detail", - "name": "__common__", - "parent": "Material Request-Purchase Order", - "parentfield": "field_mapper_details", - "parenttype": "DocType Mapper" - }, - { - "doctype": "DocType Mapper", - "from_doctype": "Material Request", - "module": "Buying", - "name": "__common__", - "ref_doc_submitted": 1, - "to_doctype": "Purchase Order" - }, - { - "doctype": "DocType Mapper", - "name": "Material Request-Purchase Order" - }, - { - "checking_operator": "=", - "doctype": "Field Mapper Detail", - "from_field": "company", - "map": "Yes", - "match_id": 0, - "to_field": "company" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "parenttype", - "map": "Yes", - "match_id": 1, - "to_field": "prevdoc_doctype" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "parent", - "map": "Yes", - "match_id": 1, - "to_field": "prevdoc_docname" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "name", - "map": "Yes", - "match_id": 1, - "to_field": "prevdoc_detail_docname" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "uom", - "map": "Yes", - "match_id": 1, - "to_field": "stock_uom" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "eval:flt(1)", - "map": "Yes", - "match_id": 1, - "to_field": "conversion_factor" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "eval:flt(obj.qty) - flt(obj.ordered_qty)", - "map": "Yes", - "match_id": 1, - "to_field": "stock_qty" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "eval:flt(obj.qty) - flt(obj.ordered_qty)", - "map": "Yes", - "match_id": 1, - "to_field": "qty" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "schedule_date", - "map": "Yes", - "match_id": 1, - "to_field": "schedule_date" - }, - { - "checking_operator": ">=", - "doctype": "Field Mapper Detail", - "from_field": "transaction_date", - "map": "No", - "match_id": 0, - "to_field": "transaction_date" - }, - { - "doctype": "Table Mapper Detail", - "from_table": "Material Request", - "match_id": 0, - "reference_key": "prevdoc_docname", - "to_table": "Purchase Order", - "validation_logic": "docstatus = 1" - }, - { - "doctype": "Table Mapper Detail", - "from_field": "indent_details", - "from_table": "Material Request Item", - "match_id": 1, - "reference_doctype_key": "prevdoc_doctype", - "to_field": "po_details", - "to_table": "Purchase Order Item", - "validation_logic": "qty > ifnull(ordered_qty,0) and docstatus =1" - } -] \ No newline at end of file diff --git a/buying/DocType Mapper/Material Request-Supplier Quotation/Material Request-Supplier Quotation.txt b/buying/DocType Mapper/Material Request-Supplier Quotation/Material Request-Supplier Quotation.txt deleted file mode 100644 index 0e9bc50735..0000000000 --- a/buying/DocType Mapper/Material Request-Supplier Quotation/Material Request-Supplier Quotation.txt +++ /dev/null @@ -1,90 +0,0 @@ -[ - { - "creation": "2012-08-06 20:02:53", - "docstatus": 0, - "modified": "2013-02-18 13:41:13", - "modified_by": "Administrator", - "owner": "Administrator" - }, - { - "doctype": "Table Mapper Detail", - "name": "__common__", - "parent": "Material Request-Supplier Quotation", - "parentfield": "table_mapper_details", - "parenttype": "DocType Mapper" - }, - { - "doctype": "Field Mapper Detail", - "name": "__common__", - "parent": "Material Request-Supplier Quotation", - "parentfield": "field_mapper_details", - "parenttype": "DocType Mapper" - }, - { - "doctype": "DocType Mapper", - "from_doctype": "Material Request", - "module": "Buying", - "name": "__common__", - "ref_doc_submitted": 1, - "to_doctype": "Supplier Quotation" - }, - { - "doctype": "DocType Mapper", - "name": "Material Request-Supplier Quotation" - }, - { - "checking_operator": "=", - "doctype": "Field Mapper Detail", - "from_field": "company", - "map": "Yes", - "match_id": 0, - "to_field": "company" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "parenttype", - "map": "Yes", - "match_id": 1, - "to_field": "prevdoc_doctype" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "parent", - "map": "Yes", - "match_id": 1, - "to_field": "prevdoc_docname" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "name", - "map": "Yes", - "match_id": 1, - "to_field": "prevdoc_detail_docname" - }, - { - "checking_operator": ">=", - "doctype": "Field Mapper Detail", - "from_field": "transaction_date", - "map": "No", - "match_id": 0, - "to_field": "transaction_date" - }, - { - "doctype": "Table Mapper Detail", - "from_table": "Material Request", - "match_id": 0, - "reference_key": "prevdoc_docname", - "to_table": "Supplier Quotation", - "validation_logic": "docstatus = 1" - }, - { - "doctype": "Table Mapper Detail", - "from_field": "indent_details", - "from_table": "Material Request Item", - "match_id": 1, - "reference_doctype_key": "prevdoc_doctype", - "to_field": "quotation_items", - "to_table": "Supplier Quotation Item", - "validation_logic": "docstatus =1" - } -] \ No newline at end of file diff --git a/buying/DocType Mapper/Sales Order-Material Request/Sales Order-Material Request.txt b/buying/DocType Mapper/Sales Order-Material Request/Sales Order-Material Request.txt deleted file mode 100644 index f6423d96a4..0000000000 --- a/buying/DocType Mapper/Sales Order-Material Request/Sales Order-Material Request.txt +++ /dev/null @@ -1,98 +0,0 @@ -[ - { - "creation": "2011-05-20 10:07:55", - "docstatus": 0, - "modified": "2013-02-20 18:20:27", - "modified_by": "Administrator", - "owner": "Administrator" - }, - { - "doctype": "Table Mapper Detail", - "name": "__common__", - "parent": "Sales Order-Material Request", - "parentfield": "table_mapper_details", - "parenttype": "DocType Mapper" - }, - { - "doctype": "Field Mapper Detail", - "name": "__common__", - "parent": "Sales Order-Material Request", - "parentfield": "field_mapper_details", - "parenttype": "DocType Mapper" - }, - { - "doctype": "DocType Mapper", - "from_doctype": "Sales Order", - "module": "Buying", - "name": "__common__", - "ref_doc_submitted": 1, - "to_doctype": "Material Request" - }, - { - "doctype": "DocType Mapper", - "name": "Sales Order-Material Request" - }, - { - "checking_operator": ">=", - "doctype": "Field Mapper Detail", - "from_field": "transaction_date", - "map": "No", - "match_id": 0, - "to_field": "transaction_date" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "eval:\"Purchase\"", - "map": "Yes", - "match_id": 0, - "to_field": "material_request_type" - }, - { - "checking_operator": "=", - "doctype": "Field Mapper Detail", - "from_field": "company", - "map": "Yes", - "match_id": 0, - "to_field": "company" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "parent", - "map": "Yes", - "match_id": 1, - "to_field": "sales_order_no" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "stock_uom", - "map": "Yes", - "match_id": 1, - "to_field": "uom" - }, - { - "doctype": "Field Mapper Detail", - "from_field": "reserved_warehouse", - "map": "Yes", - "match_id": 1, - "to_field": "warehouse" - }, - { - "doctype": "Table Mapper Detail", - "from_field": "sales_order_details", - "from_table": "Sales Order Item", - "match_id": 1, - "reference_doctype_key": "prevdoc_doctype", - "reference_key": "prevdoc_detail_docname", - "to_field": "indent_details", - "to_table": "Material Request Item", - "validation_logic": "docstatus=1" - }, - { - "doctype": "Table Mapper Detail", - "from_table": "Sales Order", - "match_id": 0, - "reference_key": "prevdoc_docname", - "to_table": "Material Request", - "validation_logic": "docstatus = 1" - } -] \ No newline at end of file diff --git a/buying/doctype/purchase_order/purchase_order.js b/buying/doctype/purchase_order/purchase_order.js index fd420cae41..4c2298242c 100644 --- a/buying/doctype/purchase_order/purchase_order.js +++ b/buying/doctype/purchase_order/purchase_order.js @@ -30,15 +30,46 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend( if(doc.docstatus == 1 && doc.status != 'Stopped'){ cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); - if(flt(doc.per_received, 2) < 100) cur_frm.add_custom_button('Make Purchase Receipt', cur_frm.cscript['Make Purchase Receipt']); - if(flt(doc.per_billed, 2) < 100) cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Purchase Invoice']); - if(flt(doc.per_billed, 2) < 100 || doc.per_received < 100) cur_frm.add_custom_button('Stop', cur_frm.cscript['Stop Purchase Order']); + if(flt(doc.per_received, 2) < 100) + cur_frm.add_custom_button('Make Purchase Receipt', this.make_purchase_receipt); + if(flt(doc.per_billed, 2) < 100) + cur_frm.add_custom_button('Make Invoice', this.make_purchase_invoice); + if(flt(doc.per_billed, 2) < 100 || doc.per_received < 100) + cur_frm.add_custom_button('Stop', cur_frm.cscript['Stop Purchase Order']); } if(doc.docstatus == 1 && doc.status == 'Stopped') - cur_frm.add_custom_button('Unstop Purchase Order', cur_frm.cscript['Unstop Purchase Order']); - + cur_frm.add_custom_button('Unstop Purchase Order', + cur_frm.cscript['Unstop Purchase Order']); }, + + get_items: function() { + wn.model.map_current_doc({ + method: "stock.doctype.material_request.material_request.make_purchase_order", + source_name: cur_frm.doc.indent_no, + }) + }, + + make_purchase_receipt: function() { + wn.model.open_mapped_doc({ + method: "buying.doctype.purchase_order.purchase_order.make_purchase_receipt", + source_name: cur_frm.doc.name + }) + }, + + make_purchase_invoice: function() { + wn.model.open_mapped_doc({ + method: "buying.doctype.purchase_order.purchase_order.make_purchase_invoice", + source_name: cur_frm.doc.name + }) + }, + + get_supplier_quotation_items: function() { + wn.model.map_current_doc({ + method: "buying.doctype.supplier_quotation.supplier_quotation.make_purchase_order", + source_name: cur_frm.doc.supplier_quotation, + }) + } }); // for backward compatibility: combine new and previous states @@ -70,58 +101,14 @@ cur_frm.fields_dict['indent_no'].get_query = function(doc) { ORDER BY `name` DESC LIMIT 50'; } - -//========================= Get Last Purhase Rate ===================================== cur_frm.cscript.get_last_purchase_rate = function(doc, cdt, cdn){ - $c_obj(make_doclist(doc.doctype, doc.name), 'get_last_purchase_rate', '', - function(r, rt) { - refresh_field(cur_frm.cscript.fname); - var doc = locals[cdt][cdn]; - cur_frm.cscript.calc_amount( doc, 2); - } - ); - + $c_obj(make_doclist(doc.doctype, doc.name), 'get_last_purchase_rate', '', function(r, rt) { + refresh_field(cur_frm.cscript.fname); + var doc = locals[cdt][cdn]; + cur_frm.cscript.calc_amount( doc, 2); + }); } -cur_frm.cscript.get_items = function(doc, dt, dn) { - wn.model.map_current_doc({ - method: "stock.doctype.material_request.material_request.make_purchase_order", - source_name: cur_frm.doc.indent_no, - }) -} - -cur_frm.cscript['Make Purchase Receipt'] = function() { - n = wn.model.make_new_doc_and_get_name('Purchase Receipt'); - $c('dt_map', args={ - 'docs':wn.model.compress([locals['Purchase Receipt'][n]]), - 'from_doctype': cur_frm.doc.doctype, - 'to_doctype':'Purchase Receipt', - 'from_docname':cur_frm.doc.name, - 'from_to_list':"[['Purchase Order','Purchase Receipt'],['Purchase Order Item','Purchase Receipt Item'],['Purchase Taxes and Charges','Purchase Taxes and Charges']]" - }, function(r,rt) { - loaddoc('Purchase Receipt', n); - } - ); -} - -//========================== Make Purchase Invoice ===================================================== -cur_frm.cscript['Make Purchase Invoice'] = function() { - n = wn.model.make_new_doc_and_get_name('Purchase Invoice'); - $c('dt_map', { - 'docs':wn.model.compress([locals['Purchase Invoice'][n]]), - 'from_doctype':cur_frm.doc.doctype, - 'to_doctype':'Purchase Invoice', - 'from_docname': cur_frm.doc.name, - 'from_to_list':"[['Purchase Order','Purchase Invoice'],['Purchase Order Item','Purchase Invoice Item'],['Purchase Taxes and Charges','Purchase Taxes and Charges']]" - }, function(r,rt) { - loaddoc('Purchase Invoice', n); - } - ); -} - - -// Stop PURCHASE ORDER -// ================================================================================================== cur_frm.cscript['Stop Purchase Order'] = function() { var doc = cur_frm.doc; var check = confirm("Do you really want to STOP " + doc.name); @@ -133,8 +120,6 @@ cur_frm.cscript['Stop Purchase Order'] = function() { } } -// Unstop PURCHASE ORDER -// ================================================================================================== cur_frm.cscript['Unstop Purchase Order'] = function() { var doc = cur_frm.doc; var check = confirm("Do you really want to UNSTOP " + doc.name); @@ -146,7 +131,6 @@ cur_frm.cscript['Unstop Purchase Order'] = function() { } } -//****************** For print sales order no and date************************* cur_frm.pformat.indent_no = function(doc, cdt, cdn){ //function to make row of table diff --git a/buying/doctype/purchase_order/purchase_order.py b/buying/doctype/purchase_order/purchase_order.py index fba448c23d..ac86e250a3 100644 --- a/buying/doctype/purchase_order/purchase_order.py +++ b/buying/doctype/purchase_order/purchase_order.py @@ -71,17 +71,11 @@ class DocType(BuyingController): def get_bin_details(self, arg = ''): return get_obj(dt='Purchase Common').get_bin_details(arg) - def get_supplier_quotation_items(self): - if self.doc.supplier_quotation: - get_obj("DocType Mapper", "Supplier Quotation-Purchase Order").dt_map("Supplier Quotation", - "Purchase Order", self.doc.supplier_quotation, self.doc, self.doclist, - """[['Supplier Quotation', 'Purchase Order'], - ['Supplier Quotation Item', 'Purchase Order Item'], - ['Purchase Taxes and Charges', 'Purchase Taxes and Charges']]""") - for d in getlist(self.doclist, 'po_details'): - if d.prevdoc_detail_docname and not d.schedule_date: - d.schedule_date = webnotes.conn.get_value("Material Request Item", - d.prevdoc_detail_docname, "schedule_date") + def get_schedule_dates(self): + for d in getlist(self.doclist, 'po_details'): + if d.prevdoc_detail_docname and not d.schedule_date: + d.schedule_date = webnotes.conn.get_value("Material Request Item", + d.prevdoc_detail_docname, "schedule_date") def get_last_purchase_rate(self): get_obj('Purchase Common').get_last_purchase_rate(self) @@ -205,4 +199,84 @@ class DocType(BuyingController): pass def get_rate(self,arg): - return get_obj('Purchase Common').get_rate(arg,self) \ No newline at end of file + return get_obj('Purchase Common').get_rate(arg,self) + +@webnotes.whitelist() +def make_purchase_receipt(source_name, target_doclist=None): + from webnotes.model.mapper import get_mapped_doclist + + def set_missing_values(source, target): + bean = webnotes.bean(target) + bean.run_method("set_missing_values") + + def update_item(obj, target, source_parent): + target.conversion_factor = 1 + target.qty = flt(obj.qty) - flt(obj.received_qty) + target.stock_qty = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.conversion_factor) + target.import_amount = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.import_rate) + target.amount = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.purchase_rate) + + doclist = get_mapped_doclist("Purchase Order", source_name, { + "Purchase Order": { + "doctype": "Purchase Receipt", + "validation": { + "docstatus": ["=", 1], + } + }, + "Purchase Order Item": { + "doctype": "Purchase Receipt Item", + "field_map": { + "name": "prevdoc_detail_docname", + "parent": "prevdoc_docname", + "parenttype": "prevdoc_doctype", + }, + "postprocess": update_item, + "condition": lambda doc: doc.received_qty < doc.qty + }, + "Purchase Taxes and Charges": { + "doctype": "Purchase Taxes and Charges", + } + }, target_doclist, set_missing_values) + + return [d.fields for d in doclist] + +@webnotes.whitelist() +def make_purchase_invoice(source_name, target_doclist=None): + from webnotes.model.mapper import get_mapped_doclist + + + def set_missing_values(source, target): + bean = webnotes.bean(target) + bean.run_method("set_missing_values") + bean.run_method("set_supplier_defaults") + + def update_item(obj, target, source_parent): + target.conversion_factor = 1 + target.qty = (flt(obj.amount) - flt(obj.billed_amt)) / flt(obj.purchase_rate) + target.import_amount = (flt(obj.amount) - flt(obj.billed_amt)) / \ + flt(source_parent.conversion_rate) + target.amount = flt(obj.amount) - flt(obj.billed_amt) + + doclist = get_mapped_doclist("Purchase Order", source_name, { + "Purchase Order": { + "doctype": "Purchase Invoice", + "validation": { + "docstatus": ["=", 1], + } + }, + "Purchase Order Item": { + "doctype": "Purchase Invoice Item", + "field_map": { + "name": "po_detail", + "parent": "purchase_order", + "purchase_rate": "rate" + }, + "postprocess": update_item, + "condition": lambda doc: doc.amount==0 or doc.billed_amt < doc.amount + }, + "Purchase Taxes and Charges": { + "doctype": "Purchase Taxes and Charges", + } + }, target_doclist, set_missing_values) + + return [d.fields for d in doclist] \ No newline at end of file diff --git a/buying/doctype/purchase_order/purchase_order.txt b/buying/doctype/purchase_order/purchase_order.txt index 6fd2161399..882de57e8c 100644 --- a/buying/doctype/purchase_order/purchase_order.txt +++ b/buying/doctype/purchase_order/purchase_order.txt @@ -2,7 +2,7 @@ { "creation": "2013-05-21 16:16:39", "docstatus": 0, - "modified": "2013-07-04 18:10:21", + "modified": "2013-07-05 13:02:52", "modified_by": "Administrator", "owner": "Administrator" }, @@ -267,7 +267,7 @@ "fieldtype": "Float", "hidden": 0, "label": "Exchange Rate", - "no_copy": 1, + "no_copy": 0, "oldfieldname": "conversion_rate", "oldfieldtype": "Currency", "print_hide": 1, diff --git a/buying/doctype/purchase_order/test_purchase_order.py b/buying/doctype/purchase_order/test_purchase_order.py index 34286dbd10..85420d8493 100644 --- a/buying/doctype/purchase_order/test_purchase_order.py +++ b/buying/doctype/purchase_order/test_purchase_order.py @@ -19,9 +19,38 @@ from __future__ import unicode_literals import unittest import webnotes import webnotes.defaults -from webnotes.utils import cint class TestPurchaseOrder(unittest.TestCase): + def test_make_purchase_receipt(self): + from buying.doctype.purchase_order.purchase_order import make_purchase_receipt + + po = webnotes.bean(copy=test_records[0]).insert() + + self.assertRaises(webnotes.ValidationError, make_purchase_receipt, + po.doc.name) + + po = webnotes.bean("Purchase Order", po.doc.name) + po.submit() + pr = make_purchase_receipt(po.doc.name) + + self.assertEquals(pr[0]["doctype"], "Purchase Receipt") + self.assertEquals(len(pr), len(test_records[0])) + + def test_make_purchase_invocie(self): + from buying.doctype.purchase_order.purchase_order import make_purchase_invoice + + po = webnotes.bean(copy=test_records[0]).insert() + + self.assertRaises(webnotes.ValidationError, make_purchase_invoice, + po.doc.name) + + po = webnotes.bean("Purchase Order", po.doc.name) + po.submit() + pi = make_purchase_invoice(po.doc.name) + + self.assertEquals(pi[0]["doctype"], "Purchase Invoice") + self.assertEquals(len(pi), len(test_records[0])) + def test_subcontracting(self): po = webnotes.bean(copy=test_records[0]) po.insert() diff --git a/buying/doctype/supplier_quotation/supplier_quotation.js b/buying/doctype/supplier_quotation/supplier_quotation.js index 92db302288..8ecb6ea230 100644 --- a/buying/doctype/supplier_quotation/supplier_quotation.js +++ b/buying/doctype/supplier_quotation/supplier_quotation.js @@ -28,33 +28,28 @@ erpnext.buying.SupplierQuotationController = erpnext.buying.BuyingController.ext this._super(); if (this.frm.doc.docstatus === 1) { - cur_frm.add_custom_button("Make Purchase Order", cur_frm.cscript.make_purchase_order); + cur_frm.add_custom_button("Make Purchase Order", this.make_purchase_order); } }, + get_items: function() { wn.model.map_current_doc({ method: "stock.doctype.material_request.material_request.make_supplier_quotation", source_name: cur_frm.doc.indent_no, }) + }, + + make_purchase_order: function() { + wn.model.open_mapped_doc({ + method: "buying.doctype.supplier_quotation.supplier_quotation.make_purchase_order", + source_name: cur_frm.doc.name + }) } }); // for backward compatibility: combine new and previous states $.extend(cur_frm.cscript, new erpnext.buying.SupplierQuotationController({frm: cur_frm})); -cur_frm.cscript.make_purchase_order = function() { - var new_po_name = wn.model.make_new_doc_and_get_name("Purchase Order"); - $c("dt_map", { - "docs": wn.model.compress([locals['Purchase Order'][new_po_name]]), - "from_doctype": cur_frm.doc.doctype, - "to_doctype": "Purchase Order", - "from_docname": cur_frm.doc.name, - "from_to_list": JSON.stringify([['Supplier Quotation', 'Purchase Order'], - ['Supplier Quotation Item', 'Purchase Order Item'], - ['Purchase Taxes and Charges', 'Purchase Taxes and Charges']]), - }, function(r, rt) { loaddoc("Purchase Order", new_po_name) }); -} - cur_frm.cscript.uom = function(doc, cdt, cdn) { // no need to trigger updation of stock uom, as this field doesn't exist in supplier quotation } diff --git a/buying/doctype/supplier_quotation/supplier_quotation.py b/buying/doctype/supplier_quotation/supplier_quotation.py index b8cf7cbac8..36e8edebd6 100644 --- a/buying/doctype/supplier_quotation/supplier_quotation.py +++ b/buying/doctype/supplier_quotation/supplier_quotation.py @@ -58,3 +58,41 @@ class DocType(BuyingController): pc.validate_for_items(self) pc.get_prevdoc_date(self) pc.validate_reference_value(self) + +@webnotes.whitelist() +def make_purchase_order(source_name, target_doclist=None): + from webnotes.model.mapper import get_mapped_doclist + + def set_missing_values(source, target): + bean = webnotes.bean(target) + bean.run_method("set_missing_values") + bean.run_method("get_schedule_dates") + + def update_item(obj, target, source_parent): + target.conversion_factor = 1 + + doclist = get_mapped_doclist("Supplier Quotation", source_name, { + "Supplier Quotation": { + "doctype": "Purchase Order", + "validation": { + "docstatus": ["=", 1], + } + }, + "Supplier Quotation Item": { + "doctype": "Purchase Order Item", + "field_map": { + "name": "supplier_quotation_item", + "parent": "supplier_quotation", + "uom": "stock_uom", + "prevdoc_detail_docname": "prevdoc_detail_docname", + "prevdoc_doctype": "prevdoc_doctype", + "prevdoc_docname": "prevdoc_docname", + }, + "postprocess": update_item + }, + "Purchase Taxes and Charges": { + "doctype": "Purchase Taxes and Charges", + }, + }, target_doclist, set_missing_values) + + return [d.fields for d in doclist] \ No newline at end of file diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py index b8362b573f..c5e9302724 100644 --- a/selling/doctype/sales_order/sales_order.py +++ b/selling/doctype/sales_order/sales_order.py @@ -450,7 +450,8 @@ def make_sales_invoice(source_name, target_doclist=None): def update_item(obj, target): target.export_amount = (flt(obj.amount) - flt(obj.billed_amt))* flt(obj.export_rate)/flt(obj.basic_rate) - target.qty = obj.basic_rate and (flt(obj.amount) - flt(obj.billed_amt))/flt(obj.basic_rate) or obj.qty + target.qty = obj.basic_rate and \ + (flt(obj.amount) - flt(obj.billed_amt))/flt(obj.basic_rate) or obj.qty target.amount = flt(obj.amount) - flt(obj.billed_amt) def update_accounts(source, target): diff --git a/stock/doctype/material_request/material_request.js b/stock/doctype/material_request/material_request.js index 6de7a295e7..d33ca80f76 100644 --- a/stock/doctype/material_request/material_request.js +++ b/stock/doctype/material_request/material_request.js @@ -37,15 +37,15 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten if(doc.docstatus == 1 && doc.status != 'Stopped'){ if(doc.material_request_type === "Purchase") cur_frm.add_custom_button("Make Supplier Quotation", - cur_frm.cscript.make_supplier_quotation); + this.make_supplier_quotation); if(doc.material_request_type === "Transfer" && doc.status === "Submitted") - cur_frm.add_custom_button("Transfer Material", cur_frm.cscript.make_stock_entry); + cur_frm.add_custom_button("Transfer Material", this.make_stock_entry); if(flt(doc.per_ordered, 2) < 100) { if(doc.material_request_type === "Purchase") cur_frm.add_custom_button('Make Purchase Order', - cur_frm.cscript.make_purchase_order); + this.make_purchase_order); cur_frm.add_custom_button('Stop Material Request', cur_frm.cscript['Stop Material Request']); diff --git a/stock/doctype/material_request/material_request.py b/stock/doctype/material_request/material_request.py index 3f3c212b8e..d423b3c8ff 100644 --- a/stock/doctype/material_request/material_request.py +++ b/stock/doctype/material_request/material_request.py @@ -241,19 +241,17 @@ def _update_requested_qty(controller, mr_obj, mr_items): "posting_date": controller.doc.posting_date, }) - +def set_missing_values(source, target): + po = webnotes.bean(target) + po.run_method("set_missing_values") @webnotes.whitelist() def make_purchase_order(source_name, target_doclist=None): from webnotes.model.mapper import get_mapped_doclist - def update_item(obj, target): + def update_item(obj, target, source_parent): target.conversion_factor = 1 target.qty = flt(obj.qty) - flt(obj.ordered_qty) - - def set_missing_values(source, target): - po = webnotes.bean(target) - po.run_method("set_missing_values") doclist = get_mapped_doclist("Material Request", source_name, { "Material Request": { @@ -281,10 +279,6 @@ def make_purchase_order(source_name, target_doclist=None): def make_supplier_quotation(source_name, target_doclist=None): from webnotes.model.mapper import get_mapped_doclist - def set_missing_values(source, target): - sq = webnotes.bean(target) - sq.run_method("set_missing_values") - doclist = get_mapped_doclist("Material Request", source_name, { "Material Request": { "doctype": "Supplier Quotation", @@ -309,7 +303,7 @@ def make_supplier_quotation(source_name, target_doclist=None): def make_stock_entry(source_name, target_doclist=None): from webnotes.model.mapper import get_mapped_doclist - def set_purpose(source, target): + def set_purpose(source, target, source_parent): target[0].purpose = "Material Transfer" def update_item(source, target): diff --git a/stock/doctype/purchase_receipt/purchase_receipt.js b/stock/doctype/purchase_receipt/purchase_receipt.js index 1f32b7833a..b5e52027d0 100644 --- a/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/stock/doctype/purchase_receipt/purchase_receipt.js @@ -30,7 +30,7 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend if(this.frm.doc.docstatus == 1) { if(flt(this.frm.doc.per_billed, 2) < 100) { cur_frm.add_custom_button('Make Purchase Invoice', - cur_frm.cscript['Make Purchase Invoice']); + this.make_purchase_invoice); } cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']); } @@ -68,7 +68,8 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend wn.model.round_floats_in(item, ["received_qty", "rejected_qty"]); if(item.rejected_qty > item.received_qty) { - msgprint(wn._("Error") + ": " + wn._(wn.meta.get_label(item.doctype, "rejected_qty", item.name)) + msgprint(wn._("Error") + ": " + + wn._(wn.meta.get_label(item.doctype, "rejected_qty", item.name)) + " > " + wn._(wn.meta.get_label(item.doctype, "received_qty", item.name))); item.qty = item.rejected_qty = 0.0; } else { @@ -77,6 +78,21 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend this.qty(doc, cdt, cdn); }, + + make_purchase_invoice: function() { + wn.model.open_mapped_doc({ + method: "stock.doctype.purchase_receipt.purchase_receipt.make_purchase_invoice", + source_name: cur_frm.doc.name + }) + }, + + pull_purchase_order_details: function() { + wn.model.map_current_doc({ + method: "buying.doctype.purchase_order.purchase_order.make_purchase_receipt", + source_name: cur_frm.doc.purchase_order_no, + }) + } + }); // for backward compatibility: combine new and previous states @@ -94,17 +110,6 @@ cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) { return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50'; } -// Get Purchase Order Button -// ----------------- -cur_frm.cscript.pull_purchase_order_details = function(doc, dt, dn) { - $c_obj(make_doclist(dt,dn),'get_po_details','',function(r,rt) { - cur_frm.refresh_fields(); - }); -} - - - -//================ create new contact ============================================================================ cur_frm.cscript.new_contact = function(){ tn = wn.model.make_new_doc_and_get_name('Contact'); locals['Contact'][tn].is_supplier = 1; @@ -112,15 +117,12 @@ cur_frm.cscript.new_contact = function(){ loaddoc('Contact', tn); } -// ***************** Get project name ***************** cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) { return 'SELECT `tabProject`.name FROM `tabProject` \ WHERE `tabProject`.status not in ("Completed", "Cancelled") \ AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50'; } - -//========================= Overloaded query for link batch_no ============================================================= cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('batch_no').get_query= function(doc, cdt, cdn) { var d = locals[cdt][cdn]; if(d.item_code){ @@ -139,12 +141,11 @@ cur_frm.cscript.select_print_heading = function(doc,cdt,cdn){ else cur_frm.pformat.print_heading = "Purchase Receipt"; } -// ***************** Get Print Heading ***************** + cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) { return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50'; } -//================================= Purchase Order No Get Query ==================================== cur_frm.fields_dict['purchase_order_no'].get_query = function(doc) { if (doc.supplier) return 'SELECT DISTINCT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`supplier` = "' +doc.supplier + '" and`tabPurchase Order`.`docstatus` = 1 and `tabPurchase Order`.`status` != "Stopped" and ifnull(`tabPurchase Order`.`per_received`, 0) < 99.99 and `tabPurchase Order`.`currency` = ifnull("' +doc.currency+ '","") and `tabPurchase Order`.company = "'+ doc.company +'" and `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50'; @@ -152,36 +153,10 @@ cur_frm.fields_dict['purchase_order_no'].get_query = function(doc) { return 'SELECT DISTINCT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 and `tabPurchase Order`.`company` = "'+ doc.company +'" and `tabPurchase Order`.`status` != "Stopped" and ifnull(`tabPurchase Order`.`per_received`, 0) < 99.99 and `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50'; } -// QA INspection report get_query -//--------------------------------- - cur_frm.fields_dict.purchase_receipt_details.grid.get_field("qa_no").get_query = function(doc) { return 'SELECT `tabQuality Inspection`.name FROM `tabQuality Inspection` WHERE `tabQuality Inspection`.docstatus = 1 AND `tabQuality Inspection`.%(key)s LIKE "%s"'; } -// On Button Click Functions -// ------------------------------------------------------------------------------ - - -// ================================ Make Purchase Invoice ========================================== -cur_frm.cscript['Make Purchase Invoice'] = function() { - n = wn.model.make_new_doc_and_get_name('Purchase Invoice'); - $c('dt_map', args={ - 'docs':wn.model.compress([locals['Purchase Invoice'][n]]), - 'from_doctype': cur_frm.doc.doctype, - 'to_doctype':'Purchase Invoice', - 'from_docname': cur_frm.doc.name, - 'from_to_list':"[['Purchase Receipt','Purchase Invoice'],['Purchase Receipt Item','Purchase Invoice Item'],['Purchase Taxes and Charges','Purchase Taxes and Charges']]" - }, function(r,rt) { - loaddoc('Purchase Invoice', n); - } - ); -} - - - - -//****************** For print sales order no and date************************* cur_frm.pformat.purchase_order_no = function(doc, cdt, cdn){ //function to make row of table diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py index 49b9bd05ad..af87083d49 100644 --- a/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/stock/doctype/purchase_receipt/purchase_receipt.py @@ -52,11 +52,6 @@ class DocType(BuyingController): def get_bin_details(self, arg = ''): return get_obj(dt='Purchase Common').get_bin_details(arg) - # Pull Purchase Order - def get_po_details(self): - self.validate_prev_docname() - get_obj('DocType Mapper', 'Purchase Order-Purchase Receipt').dt_map('Purchase Order', 'Purchase Receipt', self.doc.purchase_order_no, self.doc, self.doclist, "[['Purchase Order','Purchase Receipt'],['Purchase Order Item', 'Purchase Receipt Item'],['Purchase Taxes and Charges','Purchase Taxes and Charges']]") - # validate if PO has been pulled twice def validate_prev_docname(self): for d in getlist(self.doclist, 'purchase_receipt_details'): @@ -64,9 +59,6 @@ class DocType(BuyingController): msgprint(cstr(self.doc.purchase_order_no) + " Purchase Order details have already been pulled. ") raise Exception - - # validation - #------------------------------------------------------------------------------------------------------------- # validate accepted and rejected qty def validate_accepted_rejected_qty(self): for d in getlist(self.doclist, "purchase_receipt_details"): @@ -333,4 +325,47 @@ class DocType(BuyingController): total_valuation_amount += flt(item.valuation_rate) * \ flt(item.qty) * flt(item.conversion_factor) - return total_valuation_amount \ No newline at end of file + return total_valuation_amount + + +@webnotes.whitelist() +def make_purchase_invoice(source_name, target_doclist=None): + from webnotes.model.mapper import get_mapped_doclist + + def set_missing_values(source, target): + bean = webnotes.bean(target) + bean.run_method("set_missing_values") + bean.run_method("set_supplier_defaults") + + def update_item(obj, target, source_parent): + target.conversion_factor = 1 + target.qty = (flt(obj.amount) - flt(obj.billed_amt)) / flt(obj.purchase_rate) + target.import_amount = (flt(obj.amount) - flt(obj.billed_amt)) / \ + flt(source_parent.conversion_rate) + target.amount = flt(obj.amount) - flt(obj.billed_amt) + + doclist = get_mapped_doclist("Purchase Receipt", source_name, { + "Purchase Receipt": { + "doctype": "Purchase Invoice", + "validation": { + "docstatus": ["=", 1], + } + }, + "Purchase Receipt Item": { + "doctype": "Purchase Invoice Item", + "field_map": { + "name": "pr_detail", + "parent": "purchase_receipt", + "prevdoc_detail_docname": "po_detail", + "prevdoc_docname": "purchase_order", + "purchase_rate": "rate" + }, + "postprocess": update_item, + "condition": lambda doc: doc.amount==0 or doc.billed_amt < doc.amount + }, + "Purchase Taxes and Charges": { + "doctype": "Purchase Taxes and Charges", + } + }, target_doclist, set_missing_values) + + return [d.fields for d in doclist] \ No newline at end of file diff --git a/stock/doctype/purchase_receipt/purchase_receipt.txt b/stock/doctype/purchase_receipt/purchase_receipt.txt index 1fe26143db..03e2fa0aa4 100755 --- a/stock/doctype/purchase_receipt/purchase_receipt.txt +++ b/stock/doctype/purchase_receipt/purchase_receipt.txt @@ -2,7 +2,7 @@ { "creation": "2013-05-21 16:16:39", "docstatus": 0, - "modified": "2013-06-11 16:16:40", + "modified": "2013-07-05 14:38:03", "modified_by": "Administrator", "owner": "Administrator" }, @@ -31,7 +31,6 @@ "parent": "Purchase Receipt", "parentfield": "permissions", "parenttype": "DocType", - "permlevel": 0, "read": 1, "report": 1 }, @@ -262,7 +261,6 @@ "fieldtype": "Button", "label": "Pull Purchase Order Details", "oldfieldtype": "Button", - "options": "get_po_details", "print_hide": 1 }, { @@ -869,19 +867,41 @@ "read_only": 1 }, { - "amend": 1, - "cancel": 1, - "create": 1, + "amend": 0, + "cancel": 0, + "create": 0, "doctype": "DocPerm", + "permlevel": 1, "role": "Material Manager", - "submit": 1, - "write": 1 + "submit": 0, + "write": 0 }, { "amend": 1, "cancel": 1, "create": 1, "doctype": "DocPerm", + "permlevel": 0, + "role": "Material Manager", + "submit": 1, + "write": 1 + }, + { + "amend": 0, + "cancel": 0, + "create": 0, + "doctype": "DocPerm", + "permlevel": 1, + "role": "Material User", + "submit": 0, + "write": 0 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "doctype": "DocPerm", + "permlevel": 0, "role": "Material User", "submit": 1, "write": 1 @@ -891,13 +911,24 @@ "cancel": 1, "create": 1, "doctype": "DocPerm", + "permlevel": 0, "role": "Purchase User", "submit": 1, "write": 1 }, + { + "amend": 0, + "cancel": 0, + "create": 0, + "doctype": "DocPerm", + "permlevel": 1, + "role": "Purchase User", + "submit": 0 + }, { "doctype": "DocPerm", "match": "supplier", + "permlevel": 0, "role": "Supplier" } ] \ No newline at end of file diff --git a/stock/doctype/purchase_receipt/test_purchase_receipt.py b/stock/doctype/purchase_receipt/test_purchase_receipt.py index f3f6da8dd0..9540f7809b 100644 --- a/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -22,6 +22,21 @@ import webnotes.defaults from webnotes.utils import cint class TestPurchaseReceipt(unittest.TestCase): + def test_make_purchase_invocie(self): + from stock.doctype.purchase_receipt.purchase_receipt import make_purchase_invoice + + pr = webnotes.bean(copy=test_records[0]).insert() + + self.assertRaises(webnotes.ValidationError, make_purchase_invoice, + pr.doc.name) + + pr = webnotes.bean("Purchase Receipt", pr.doc.name) + pr.submit() + pi = make_purchase_invoice(pr.doc.name) + + self.assertEquals(pi[0]["doctype"], "Purchase Invoice") + self.assertEquals(len(pi), len(pr.doclist)) + def test_purchase_receipt_no_gl_entry(self): pr = webnotes.bean(copy=test_records[0]) pr.run_method("calculate_taxes_and_totals")