Added status field in sales invoice and purchase invoice
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py
index fddabcb..5773813 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py
@@ -195,6 +195,7 @@
if against_voucher_type in ["Sales Invoice", "Purchase Invoice"]:
ref_doc = frappe.get_doc(against_voucher_type, against_voucher)
ref_doc.db_set('outstanding_amount', bal)
+ ref_doc.set_status(update=True)
def validate_frozen_account(account, adv_adj=None):
frozen_account = frappe.db.get_value("Account", account, "freeze_account")
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
index 01e5784..1546857 100755
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
@@ -2776,6 +2776,35 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "default": "Draft",
+ "fieldname": "status",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Status",
+ "length": 0,
+ "no_copy": 0,
+ "options": "\nDraft\nSubmitted\nPaid\nUnpaid\nOverdue\nCancelled",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "posting_time",
"fieldtype": "Time",
"hidden": 0,
@@ -3264,7 +3293,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2016-11-03 15:54:34.750548",
+ "modified": "2016-11-08 11:49:00.752417",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice",
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 22de07f..5c2b62c 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -65,6 +65,7 @@
self.validate_fixed_asset()
self.validate_fixed_asset_account()
self.create_remarks()
+ self.set_status()
def validate_cash(self):
if not self.cash_bank_account and flt(self.paid_amount):
@@ -596,6 +597,7 @@
self.make_gl_entries_on_cancel()
self.update_project()
self.update_fixed_asset()
+ frappe.db.set(self, 'status', 'Cancelled')
def update_project(self):
project_list = []
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index ddbd648..b4747ce 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -3070,6 +3070,35 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "default": "Draft",
+ "fieldname": "status",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 1,
+ "in_list_view": 0,
+ "label": "Status",
+ "length": 0,
+ "no_copy": 1,
+ "options": "\nDraft\nSubmitted\nPaid\nUnpaid\nOverdue\nCancelled",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "source",
"fieldtype": "Link",
"hidden": 0,
@@ -4010,7 +4039,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2016-11-03 15:55:41.249414",
+ "modified": "2016-11-08 11:47:43.494612",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice",
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 521b0eb..4e0a6b4 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -86,6 +86,7 @@
self.update_packing_list()
self.set_billing_hours_and_amount()
self.update_timesheet_billing_for_project()
+ self.set_status()
def before_save(self):
set_account_for_mode_of_payment(self)
@@ -158,6 +159,7 @@
self.update_stock_ledger()
self.make_gl_entries_on_cancel()
+ frappe.db.set(self, 'status', 'Cancelled')
def update_status_updater_args(self):
if cint(self.update_stock):
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice_list.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice_list.js
index 55e8b21..5e21d7a 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice_list.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice_list.js
@@ -10,9 +10,9 @@
return [__("Return"), "darkgrey", "is_return,=,Yes"];
} else if(flt(doc.outstanding_amount)==0) {
return [__("Paid"), "green", "outstanding_amount,=,0"]
- } else if (flt(doc.outstanding_amount) > 0 && doc.due_date > frappe.datetime.get_today()) {
+ } else if (flt(doc.outstanding_amount) > 0 && doc.due_date >= frappe.datetime.get_today()) {
return [__("Unpaid"), "orange", "outstanding_amount,>,0|due_date,>,Today"]
- } else if (flt(doc.outstanding_amount) > 0 && doc.due_date <= frappe.datetime.get_today()) {
+ } else if (flt(doc.outstanding_amount) > 0 && doc.due_date < frappe.datetime.get_today()) {
return [__("Overdue"), "red", "outstanding_amount,>,0|due_date,<=,Today"]
}
},
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 3d2f16b..b436670 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -720,4 +720,13 @@
and docstatus = 1 and unallocated_amount > 0
""".format(party_account_field), (party_account, party_type, party, payment_type), as_dict=1)
- return list(payment_entries_against_order) + list(unallocated_payment_entries)
\ No newline at end of file
+ return list(payment_entries_against_order) + list(unallocated_payment_entries)
+
+def update_invoice_status():
+ # Daily update the status of the invoices
+
+ frappe.db.sql(""" update `tabSales Invoice` set status = 'Overdue'
+ where due_date < CURDATE() and docstatus = 1 and outstanding_amount > 0""")
+
+ frappe.db.sql(""" update `tabPurchase Invoice` set status = 'Overdue'
+ where due_date < CURDATE() and docstatus = 1 and outstanding_amount > 0""")
\ No newline at end of file
diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py
index 157c385..cb783b4 100644
--- a/erpnext/controllers/status_updater.py
+++ b/erpnext/controllers/status_updater.py
@@ -3,7 +3,7 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import flt, comma_or
+from frappe.utils import flt, comma_or, nowdate, getdate
from frappe import _
from frappe.model.document import Document
from erpnext.accounts.party_status import notify_status
@@ -41,6 +41,22 @@
["Cancelled", "eval:self.docstatus==2"],
["Closed", "eval:self.status=='Closed'"],
],
+ "Sales Invoice": [
+ ["Draft", None],
+ ["Submitted", "eval:self.docstatus==1"],
+ ["Paid", "eval:self.outstanding_amount==0 and self.docstatus==1"],
+ ["Unpaid", "eval:self.outstanding_amount > 0 and getdate(self.due_date) >= getdate(nowdate()) and self.docstatus==1"],
+ ["Overdue", "eval:self.outstanding_amount > 0 and getdate(self.due_date) < getdate(nowdate()) and self.docstatus==1"],
+ ["Cancelled", "eval:self.docstatus==2"],
+ ],
+ "Purchase Invoice": [
+ ["Draft", None],
+ ["Submitted", "eval:self.docstatus==1"],
+ ["Paid", "eval:self.outstanding_amount==0 and self.docstatus==1"],
+ ["Unpaid", "eval:self.outstanding_amount > 0 and getdate(self.due_date) >= getdate(nowdate()) and self.docstatus==1"],
+ ["Overdue", "eval:self.outstanding_amount > 0 and getdate(self.due_date) < getdate(nowdate()) and self.docstatus==1"],
+ ["Cancelled", "eval:self.docstatus==2"],
+ ],
"Purchase Order": [
["Draft", None],
["To Receive and Bill", "eval:self.per_received < 100 and self.per_billed < 100 and self.docstatus == 1"],
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index cef798b..90c7f51 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -189,6 +189,7 @@
"erpnext.stock.reorder_item.reorder_item",
"erpnext.setup.doctype.email_digest.email_digest.send",
"erpnext.support.doctype.issue.issue.auto_close_tickets",
+ "erpnext.controllers.accounts_controller.update_invoice_status",
"erpnext.accounts.doctype.fiscal_year.fiscal_year.auto_create_fiscal_year",
"erpnext.hr.doctype.employee.employee.send_birthday_reminders",
"erpnext.projects.doctype.task.task.set_tasks_as_overdue",
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index b53bbc6..57dbc59 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -346,3 +346,4 @@
erpnext.patches.v7_0.repost_gle_for_pi_with_update_stock #2016-11-01
erpnext.patches.v7_1.add_account_user_role_for_timesheet
erpnext.patches.v7_0.set_base_amount_in_invoice_payment_table
+erpnext.patches.v7_1.update_invoice_status
\ No newline at end of file
diff --git a/erpnext/patches/v7_1/update_invoice_status.py b/erpnext/patches/v7_1/update_invoice_status.py
new file mode 100644
index 0000000..5a2d013
--- /dev/null
+++ b/erpnext/patches/v7_1/update_invoice_status.py
@@ -0,0 +1,30 @@
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+ frappe.reload_doc('accounts', 'doctype', 'sales_invoice')
+ frappe.reload_doc('accounts', 'doctype', 'purchase_invoice')
+
+ frappe.db.sql("""
+ update
+ `tabPurchase Invoice`
+ set
+ status = (Case When outstanding_amount = 0 and docstatus = 1 then 'Paid'
+ when due_date < CURDATE() and outstanding_amount > 0 and docstatus =1 then 'Overdue'
+ when due_date >= CURDATE() and outstanding_amount > 0 and docstatus =1 then 'Unpaid'
+ when docstatus = 2 then 'Cancelled'
+ else 'Draft'
+ End)""")
+
+ frappe.db.sql("""
+ update
+ `tabSales Invoice`
+ set status = (Case When outstanding_amount = 0 and docstatus = 1 then 'Paid'
+ when due_date < CURDATE() and outstanding_amount > 0 and docstatus =1 then 'Overdue'
+ when due_date >= CURDATE() and outstanding_amount > 0 and docstatus =1 then 'Unpaid'
+ when docstatus = 2 then 'Cancelled'
+ else 'Draft'
+ End)""")
\ No newline at end of file