From a8a91cca16b731706367c09266b5de828509acc5 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Mon, 2 Nov 2015 12:57:08 +0530 Subject: [PATCH] [feature] Close feature for Purchase Receipt and Delivery Note --- .../purchase_invoice/purchase_invoice.js | 1 + .../delivered_items_to_be_billed.json | 6 ++++-- .../received_items_to_be_billed.json | 6 ++++-- erpnext/controllers/queries.py | 2 +- erpnext/controllers/status_updater.py | 2 ++ .../installation_note/installation_note.js | 2 +- .../doctype/delivery_note/delivery_note.js | 18 +++++++++++++++--- .../doctype/delivery_note/delivery_note.json | 12 ++++++------ .../doctype/delivery_note/delivery_note.py | 14 ++++++++++++++ .../delivery_note/delivery_note_list.js | 6 ++++-- .../delivery_note/test_delivery_note.py | 9 +++++++++ .../purchase_receipt/purchase_receipt.js | 16 ++++++++++++++-- .../purchase_receipt/purchase_receipt.json | 12 ++++++------ .../purchase_receipt/purchase_receipt.py | 14 +++++++++++++- .../purchase_receipt/purchase_receipt_list.js | 6 ++++-- .../purchase_receipt/test_purchase_receipt.py | 10 +++++++++- 16 files changed, 107 insertions(+), 29 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index 2e3794a238..82b89afb16 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -52,6 +52,7 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ get_query_filters: { supplier: cur_frm.doc.supplier || undefined, docstatus: 1, + status: ["!=", "Closed"], company: cur_frm.doc.company } }) diff --git a/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json index c503f68cf9..41e42f7394 100644 --- a/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json +++ b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json @@ -1,16 +1,18 @@ { + "add_total_row": 0, "apply_user_permissions": 1, "creation": "2013-07-30 17:28:49", + "disabled": 0, "docstatus": 0, "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2015-03-30 05:33:45.353064", + "modified": "2015-11-02 12:32:02.048551", "modified_by": "Administrator", "module": "Accounts", "name": "Delivered Items To Be Billed", "owner": "Administrator", - "query": "select\n `tabDelivery Note`.`name` as \"Delivery Note:Link/Delivery Note:120\",\n\t`tabDelivery Note`.`customer` as \"Customer:Link/Customer:120\",\n\t`tabDelivery Note`.`posting_date` as \"Date:Date\",\n\t`tabDelivery Note`.`project_name` as \"Project\",\n\t`tabDelivery Note Item`.`item_code` as \"Item:Link/Item:120\",\n\t(`tabDelivery Note Item`.`qty` - ifnull((select sum(qty) from `tabSales Invoice Item` \n\t where `tabSales Invoice Item`.docstatus=1 and \n `tabSales Invoice Item`.delivery_note = `tabDelivery Note`.name and\n\t `tabSales Invoice Item`.dn_detail = `tabDelivery Note Item`.name), 0))\n\t\tas \"Qty:Float:110\",\n\t(`tabDelivery Note Item`.`base_amount` - ifnull((select sum(base_amount) from `tabSales Invoice Item` \n where `tabSales Invoice Item`.docstatus=1 and \n `tabSales Invoice Item`.delivery_note = `tabDelivery Note`.name and\n `tabSales Invoice Item`.dn_detail = `tabDelivery Note Item`.name), 0))\n\t\tas \"Amount:Currency:110\",\n\t`tabDelivery Note Item`.`item_name` as \"Item Name::150\",\n\t`tabDelivery Note Item`.`description` as \"Description::200\",\n\t`tabDelivery Note`.`company` as \"Company:Link/Company:\"\nfrom `tabDelivery Note`, `tabDelivery Note Item`\nwhere\n `tabDelivery Note`.docstatus = 1 and\n\t`tabDelivery Note`.`status` != \"Stopped\" and\n `tabDelivery Note`.name = `tabDelivery Note Item`.parent and\n (`tabDelivery Note Item`.qty > ifnull((select sum(qty) from `tabSales Invoice Item` \n where `tabSales Invoice Item`.docstatus=1 and \n `tabSales Invoice Item`.delivery_note = `tabDelivery Note`.name and\n `tabSales Invoice Item`.dn_detail = `tabDelivery Note Item`.name), 0))\norder by `tabDelivery Note`.`name` desc", + "query": "select\n `tabDelivery Note`.`name` as \"Delivery Note:Link/Delivery Note:120\",\n\t`tabDelivery Note`.`customer` as \"Customer:Link/Customer:120\",\n\t`tabDelivery Note`.`posting_date` as \"Date:Date\",\n\t`tabDelivery Note`.`project_name` as \"Project\",\n\t`tabDelivery Note Item`.`item_code` as \"Item:Link/Item:120\",\n\t(`tabDelivery Note Item`.`qty` - ifnull((select sum(qty) from `tabSales Invoice Item` \n\t where `tabSales Invoice Item`.docstatus=1 and \n `tabSales Invoice Item`.delivery_note = `tabDelivery Note`.name and\n\t `tabSales Invoice Item`.dn_detail = `tabDelivery Note Item`.name), 0))\n\t\tas \"Qty:Float:110\",\n\t(`tabDelivery Note Item`.`base_amount` - ifnull((select sum(base_amount) from `tabSales Invoice Item` \n where `tabSales Invoice Item`.docstatus=1 and \n `tabSales Invoice Item`.delivery_note = `tabDelivery Note`.name and\n `tabSales Invoice Item`.dn_detail = `tabDelivery Note Item`.name), 0))\n\t\tas \"Amount:Currency:110\",\n\t`tabDelivery Note Item`.`item_name` as \"Item Name::150\",\n\t`tabDelivery Note Item`.`description` as \"Description::200\",\n\t`tabDelivery Note`.`company` as \"Company:Link/Company:\"\nfrom `tabDelivery Note`, `tabDelivery Note Item`\nwhere\n `tabDelivery Note`.docstatus = 1 and\n\t`tabDelivery Note`.`status` not in (\"Stopped\", \"Closed\") and\n `tabDelivery Note`.name = `tabDelivery Note Item`.parent and\n (`tabDelivery Note Item`.qty > ifnull((select sum(qty) from `tabSales Invoice Item` \n where `tabSales Invoice Item`.docstatus=1 and \n `tabSales Invoice Item`.delivery_note = `tabDelivery Note`.name and\n `tabSales Invoice Item`.dn_detail = `tabDelivery Note Item`.name), 0))\norder by `tabDelivery Note`.`name` desc", "ref_doctype": "Sales Invoice", "report_name": "Delivered Items To Be Billed", "report_type": "Query Report" diff --git a/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json index 697cee019a..97b0985cca 100644 --- a/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json +++ b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json @@ -1,16 +1,18 @@ { + "add_total_row": 0, "apply_user_permissions": 1, "creation": "2013-07-30 18:35:10", + "disabled": 0, "docstatus": 0, "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2015-04-14 11:56:02.323769", + "modified": "2015-11-02 12:33:11.681513", "modified_by": "Administrator", "module": "Accounts", "name": "Received Items To Be Billed", "owner": "Administrator", - "query": "select\n `tabPurchase Receipt`.`name` as \"Purchase Receipt:Link/Purchase Receipt:120\",\n `tabPurchase Receipt`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`tabPurchase Receipt`.`posting_date` as \"Date:Date\",\n\t`tabPurchase Receipt Item`.`project_name` as \"Project\",\n\t`tabPurchase Receipt Item`.`item_code` as \"Item:Link/Item:120\",\n\t(`tabPurchase Receipt Item`.`qty` - ifnull((select sum(qty) from `tabPurchase Invoice Item` \n\t where `tabPurchase Invoice Item`.purchase_receipt = `tabPurchase Receipt`.name and\n `tabPurchase Invoice Item`.docstatus = 1 and\n\t `tabPurchase Invoice Item`.pr_detail = `tabPurchase Receipt Item`.name), 0))\n\t as \"Qty:Float:110\",\n\t(`tabPurchase Receipt Item`.`base_amount` - ifnull((select sum(base_amount) \n from `tabPurchase Invoice Item` \n where `tabPurchase Invoice Item`.purchase_receipt = `tabPurchase Receipt`.name and\n `tabPurchase Invoice Item`.docstatus = 1 and\n `tabPurchase Invoice Item`.pr_detail = `tabPurchase Receipt Item`.name), 0))\n\t as \"Amount:Currency:110\",\n\t`tabPurchase Receipt Item`.`item_name` as \"Item Name::150\",\n\t`tabPurchase Receipt Item`.`description` as \"Description::200\",\n\t`tabPurchase Receipt`.`company` as \"Company:Link/Company:\"\nfrom `tabPurchase Receipt`, `tabPurchase Receipt Item`\nwhere\n `tabPurchase Receipt`.docstatus = 1 and\n `tabPurchase Receipt`.name = `tabPurchase Receipt Item`.parent and\n (`tabPurchase Receipt Item`.qty > ifnull((select sum(qty) from `tabPurchase Invoice Item` \n where `tabPurchase Invoice Item`.purchase_receipt = `tabPurchase Receipt`.name and\n `tabPurchase Invoice Item`.docstatus=1 and \n `tabPurchase Invoice Item`.pr_detail = `tabPurchase Receipt Item`.name), 0))\norder by `tabPurchase Receipt`.`name` desc", + "query": "select\n `tabPurchase Receipt`.`name` as \"Purchase Receipt:Link/Purchase Receipt:120\",\n `tabPurchase Receipt`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`tabPurchase Receipt`.`posting_date` as \"Date:Date\",\n\t`tabPurchase Receipt Item`.`project_name` as \"Project\",\n\t`tabPurchase Receipt Item`.`item_code` as \"Item:Link/Item:120\",\n\t(`tabPurchase Receipt Item`.`qty` - ifnull((select sum(qty) from `tabPurchase Invoice Item` \n\t where `tabPurchase Invoice Item`.purchase_receipt = `tabPurchase Receipt`.name and\n `tabPurchase Invoice Item`.docstatus = 1 and\n\t `tabPurchase Invoice Item`.pr_detail = `tabPurchase Receipt Item`.name), 0))\n\t as \"Qty:Float:110\",\n\t(`tabPurchase Receipt Item`.`base_amount` - ifnull((select sum(base_amount) \n from `tabPurchase Invoice Item` \n where `tabPurchase Invoice Item`.purchase_receipt = `tabPurchase Receipt`.name and\n `tabPurchase Invoice Item`.docstatus = 1 and\n `tabPurchase Invoice Item`.pr_detail = `tabPurchase Receipt Item`.name), 0))\n\t as \"Amount:Currency:110\",\n\t`tabPurchase Receipt Item`.`item_name` as \"Item Name::150\",\n\t`tabPurchase Receipt Item`.`description` as \"Description::200\",\n\t`tabPurchase Receipt`.`company` as \"Company:Link/Company:\"\nfrom `tabPurchase Receipt`, `tabPurchase Receipt Item`\nwhere\n `tabPurchase Receipt`.docstatus = 1 and `tabPurchase Receipt`.status != \"Closed\" and \n `tabPurchase Receipt`.name = `tabPurchase Receipt Item`.parent and\n (`tabPurchase Receipt Item`.qty > ifnull((select sum(qty) from `tabPurchase Invoice Item` \n where `tabPurchase Invoice Item`.purchase_receipt = `tabPurchase Receipt`.name and\n `tabPurchase Invoice Item`.docstatus=1 and \n `tabPurchase Invoice Item`.pr_detail = `tabPurchase Receipt Item`.name), 0))\norder by `tabPurchase Receipt`.`name` desc", "ref_doctype": "Purchase Invoice", "report_name": "Received Items To Be Billed", "report_type": "Query Report" diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index ffc682f03c..0af0b81265 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -216,7 +216,7 @@ def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, return frappe.db.sql("""select `tabDelivery Note`.name, `tabDelivery Note`.customer_name from `tabDelivery Note` where `tabDelivery Note`.`%(key)s` like %(txt)s and - `tabDelivery Note`.docstatus = 1 %(fcond)s and + `tabDelivery Note`.docstatus = 1 and status not in ("Stopped", "Closed") %(fcond)s and (ifnull((select sum(qty) from `tabDelivery Note Item` where `tabDelivery Note Item`.parent=`tabDelivery Note`.name), 0) > ifnull((select sum(qty) from `tabSales Invoice Item` where diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py index 94cddeeac3..8a516bb29d 100644 --- a/erpnext/controllers/status_updater.py +++ b/erpnext/controllers/status_updater.py @@ -51,11 +51,13 @@ status_map = { ["Draft", None], ["Submitted", "eval:self.docstatus==1"], ["Cancelled", "eval:self.docstatus==2"], + ["Closed", "eval:self.status=='Closed'"], ], "Purchase Receipt": [ ["Draft", None], ["Submitted", "eval:self.docstatus==1"], ["Cancelled", "eval:self.docstatus==2"], + ["Closed", "eval:self.status=='Closed'"], ] } diff --git a/erpnext/selling/doctype/installation_note/installation_note.js b/erpnext/selling/doctype/installation_note/installation_note.js index 707cbd7453..d9ca366d98 100644 --- a/erpnext/selling/doctype/installation_note/installation_note.js +++ b/erpnext/selling/doctype/installation_note/installation_note.js @@ -54,7 +54,7 @@ erpnext.selling.InstallationNote = frappe.ui.form.Controller.extend({ source_doctype: "Delivery Note", get_query_filters: { docstatus: 1, - status: ["!=", "Stopped"], + status: ["not in", ["Stopped", "Closed"]], per_installed: ["<", 99.99], customer: cur_frm.doc.customer || undefined, company: cur_frm.doc.company diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 17194fdd4a..8ca9325da7 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -9,7 +9,7 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( refresh: function(doc, dt, dn) { this._super(); - if (!doc.is_return) { + if (!doc.is_return && doc.status!="Closed") { if(flt(doc.per_installed, 2) < 100 && doc.docstatus==1) cur_frm.add_custom_button(__('Installation Note'), this.make_installation_note); @@ -41,14 +41,15 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( } } - if (doc.docstatus==1) { + if (doc.docstatus==1 && doc.status!="Closed") { this.show_stock_ledger(); if (cint(frappe.defaults.get_default("auto_accounting_for_stock"))) { this.show_general_ledger(); } + cur_frm.add_custom_button(__("Close"), this.close_delivery_note) } - if(doc.__onload && !doc.__onload.billing_complete && doc.docstatus==1 && !doc.is_return) { + if(doc.__onload && !doc.__onload.billing_complete && doc.docstatus==1 && !doc.is_return && doc.status!="Closed") { // show Make Invoice button only if Delivery Note is not created from Sales Invoice var from_sales_invoice = false; from_sales_invoice = cur_frm.doc.items.some(function(item) { @@ -93,6 +94,17 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( items_on_form_rendered: function(doc, grid_row) { erpnext.setup_serial_no(); + }, + + close_delivery_note: function(doc){ + frappe.call({ + method:"erpnext.stock.doctype.delivery_note.delivery_note.close_delivery_note", + args: {docname: cur_frm.doc.name, status:"Closed"}, + callback: function(r){ + if(!r.exc) + cur_frm.reload_doc(); + } + }) } }); diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json index 5475f00a9b..16c1e6de8a 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.json +++ b/erpnext/stock/doctype/delivery_note/delivery_note.json @@ -87,7 +87,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Series", + "label": "Series", "no_copy": 1, "oldfieldname": "naming_series", "oldfieldtype": "Select", @@ -1205,7 +1205,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Apply Additional Discount On", + "label": "Apply Additional Discount On", "no_copy": 0, "options": "\nGrand Total\nNet Total", "permlevel": 0, @@ -1873,7 +1873,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Source", + "label": "Source", "no_copy": 0, "oldfieldname": "source", "oldfieldtype": "Select", @@ -2108,11 +2108,11 @@ "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 0, - "label": "Status", + "label": "Status", "no_copy": 1, "oldfieldname": "status", "oldfieldtype": "Select", - "options": "\nDraft\nSubmitted\nCancelled", + "options": "\nDraft\nSubmitted\nCancelled\nClosed", "permlevel": 0, "print_hide": 1, "print_width": "150px", @@ -2438,7 +2438,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-10-02 07:38:44.497411", + "modified": "2015-11-02 01:20:58.934509", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note", diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 6339752634..7e5f68a12e 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -10,6 +10,8 @@ from frappe import msgprint, _ import frappe.defaults from frappe.model.mapper import get_mapped_doc from erpnext.controllers.selling_controller import SellingController +from frappe.desk.notifications import clear_doctype_notifications + form_grid_templates = { "items": "templates/form_grid/item_grid.html" @@ -268,6 +270,12 @@ class DeliveryNote(SellingController): ps.cancel() frappe.msgprint(_("Packing Slip(s) cancelled")) + def update_status(self, status): + self.db_set('status', status) + self.set_status(update=True) + self.notify_update() + clear_doctype_notifications(self) + def get_list_context(context=None): from erpnext.controllers.website_list_for_contact import get_list_context list_context = get_list_context(context) @@ -386,3 +394,9 @@ def make_packing_slip(source_name, target_doc=None): def make_sales_return(source_name, target_doc=None): from erpnext.controllers.sales_and_purchase_return import make_return_doc return make_return_doc("Delivery Note", source_name, target_doc) + + +@frappe.whitelist() +def close_delivery_note(docname, status): + dn = frappe.get_doc("Delivery Note", docname) + dn.update_status(status) \ No newline at end of file diff --git a/erpnext/stock/doctype/delivery_note/delivery_note_list.js b/erpnext/stock/doctype/delivery_note/delivery_note_list.js index d79015e566..fbbf08f047 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note_list.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note_list.js @@ -1,9 +1,11 @@ frappe.listview_settings['Delivery Note'] = { add_fields: ["customer", "customer_name", "base_grand_total", "per_installed", - "transporter_name", "grand_total", "is_return"], + "transporter_name", "grand_total", "is_return", "status"], get_indicator: function(doc) { if(cint(doc.is_return)==1) { return [__("Return"), "darkgrey", "is_return,=,Yes"]; - } + } else if(doc.status==="Closed") { + return [__("Closed"), "green", "status,=,Closed"]; + } } }; diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index 07308e6c30..98acb6253d 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -396,6 +396,15 @@ class TestDeliveryNote(unittest.TestCase): self.assertEquals([gle.debit, gle.credit], expected_values.get(gle.account)) set_perpetual_inventory(0) + + def test_closed_delivery_note(self): + from erpnext.stock.doctype.delivery_note.delivery_note import close_delivery_note + + dn = create_delivery_note(do_not_submit=True) + dn.submit() + + close_delivery_note(dn.name, "Closed") + self.assertEquals(frappe.db.get_value("Delivery Note", dn.name, "Status"), "Closed") def create_delivery_note(**args): dn = frappe.new_doc("Delivery Note") diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js index 38b054cbfd..2427b51882 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js @@ -33,7 +33,7 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend if (cint(frappe.defaults.get_default("auto_accounting_for_stock"))) { this.show_general_ledger(); } - if(!this.frm.doc.is_return) { + if(!this.frm.doc.is_return && this.frm.doc.status!="Closed") { if(this.frm.doc.docstatus==0) { cur_frm.add_custom_button(__('From Purchase Order'), function() { @@ -51,11 +51,12 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend }); } - if(this.frm.doc.docstatus == 1) { + if(this.frm.doc.docstatus == 1 && this.frm.doc.status!="Closed") { cur_frm.add_custom_button(__('Return'), this.make_purchase_return); if(this.frm.doc.__onload && !this.frm.doc.__onload.billing_complete) { cur_frm.add_custom_button(__('Invoice'), this.make_purchase_invoice).addClass("btn-primary"); } + cur_frm.add_custom_button(__("Close"), this.close_purchase_receipt) } } @@ -121,6 +122,17 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend tc_name: function() { this.get_terms(); }, + + close_purchase_receipt: function() { + frappe.call({ + method:"erpnext.stock.doctype.purchase_receipt.purchase_receipt.close_purchase_receipt", + args: {"docname": cur_frm.doc.name, "status":"Closed"}, + callback: function(r){ + if(!r.exc) + cur_frm.reload_doc(); + } + }) + } }); diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index 8218f98820..adb27617eb 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -88,7 +88,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Series", + "label": "Series", "no_copy": 1, "oldfieldname": "naming_series", "oldfieldtype": "Select", @@ -1062,7 +1062,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Apply Additional Discount On", + "label": "Apply Additional Discount On", "no_copy": 0, "options": "\nGrand Total\nNet Total", "permlevel": 0, @@ -1498,7 +1498,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Raw Materials Supplied", + "label": "Raw Materials Supplied", "no_copy": 0, "oldfieldname": "is_subcontracted", "oldfieldtype": "Select", @@ -1643,11 +1643,11 @@ "ignore_user_permissions": 0, "in_filter": 1, "in_list_view": 0, - "label": "Status", + "label": "Status", "no_copy": 1, "oldfieldname": "status", "oldfieldtype": "Select", - "options": "\nDraft\nSubmitted\nCancelled", + "options": "\nDraft\nSubmitted\nCancelled\nClosed", "permlevel": 0, "print_hide": 1, "print_width": "150px", @@ -2076,7 +2076,7 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "modified": "2015-10-02 07:39:05.186518", + "modified": "2015-11-02 01:19:45.539793", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt", diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 1ca81b66d9..28a86f794f 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -11,6 +11,7 @@ import frappe.defaults from erpnext.controllers.buying_controller import BuyingController from erpnext.accounts.utils import get_account_currency +from frappe.desk.notifications import clear_doctype_notifications form_grid_templates = { "items": "templates/form_grid/item_grid.html" @@ -426,7 +427,12 @@ class PurchaseReceipt(BuyingController): "\n".join(warehouse_with_no_account)) return process_gl_map(gl_entries) - + + def update_status(self, status): + self.db_set('status', status) + self.set_status(update=True) + self.notify_update() + clear_doctype_notifications(self) @frappe.whitelist() def make_purchase_invoice(source_name, target_doc=None): @@ -487,3 +493,9 @@ def get_invoiced_qty_map(purchase_receipt): def make_purchase_return(source_name, target_doc=None): from erpnext.controllers.sales_and_purchase_return import make_return_doc return make_return_doc("Purchase Receipt", source_name, target_doc) + + +@frappe.whitelist() +def close_purchase_receipt(docname, status): + pr = frappe.get_doc("Purchase Receipt", docname) + pr.update_status(status) \ No newline at end of file diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt_list.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt_list.js index 838fbb03a1..63148995fa 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt_list.js +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt_list.js @@ -1,9 +1,11 @@ frappe.listview_settings['Purchase Receipt'] = { add_fields: ["supplier", "supplier_name", "base_grand_total", "is_subcontracted", - "transporter_name", "is_return"], + "transporter_name", "is_return", "status"], get_indicator: function(doc) { if(cint(doc.is_return)==1) { return [__("Return"), "darkgrey", "is_return,=,Yes"]; - } + } else if(doc.status==="Closed") { + return [__("Closed"), "green", "status,=,Closed"]; + } } }; diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 7ad6489295..3c121e5f4a 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -175,8 +175,16 @@ class TestPurchaseReceipt(unittest.TestCase): "purchase_document_no": pr.name, "delivery_document_no": return_pr.name }) + + def test_closed_purchase_receipt(self): + from erpnext.stock.doctype.purchase_receipt.purchase_receipt import close_purchase_receipt + + pr = make_purchase_receipt(do_not_submit=True) + pr.submit() + + close_purchase_receipt(pr.name, "Closed") + self.assertEquals(frappe.db.get_value("Purchase Receipt", pr.name, "status"), "Closed") - def get_gl_entries(voucher_type, voucher_no): return frappe.db.sql("""select account, debit, credit from `tabGL Entry` where voucher_type=%s and voucher_no=%s