Merge pull request #14041 from manassolanki/deferred-account
Deferred account
This commit is contained in:
commit
c0b15cf41a
@ -532,6 +532,37 @@
|
|||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "voucher_detail_no",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Voucher Detail No",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"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,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@ -772,6 +803,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
|
"modified": "2018-05-15 02:12:50.035755",
|
||||||
"modified": "2018-04-23 02:15:22.297509",
|
"modified": "2018-04-23 02:15:22.297509",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe, erpnext
|
import frappe, erpnext
|
||||||
import frappe.defaults
|
import frappe.defaults
|
||||||
from frappe.utils import cint, flt
|
from frappe.utils import cint, flt, add_months, today, date_diff, getdate, add_days
|
||||||
from frappe import _, msgprint, throw
|
from frappe import _, msgprint, throw
|
||||||
from erpnext.accounts.party import get_party_account, get_due_date
|
from erpnext.accounts.party import get_party_account, get_due_date
|
||||||
from erpnext.controllers.stock_controller import update_gl_entries_after
|
from erpnext.controllers.stock_controller import update_gl_entries_after
|
||||||
@ -699,7 +699,7 @@ class SalesInvoice(SellingController):
|
|||||||
account_currency = get_account_currency(item.income_account)
|
account_currency = get_account_currency(item.income_account)
|
||||||
gl_entries.append(
|
gl_entries.append(
|
||||||
self.get_gl_dict({
|
self.get_gl_dict({
|
||||||
"account": item.income_account,
|
"account": item.income_account if not item.enable_deferred_revenue else item.deferred_revenue_account,
|
||||||
"against": self.customer,
|
"against": self.customer,
|
||||||
"credit": item.base_net_amount,
|
"credit": item.base_net_amount,
|
||||||
"credit_in_account_currency": item.base_net_amount \
|
"credit_in_account_currency": item.base_net_amount \
|
||||||
@ -916,6 +916,86 @@ class SalesInvoice(SellingController):
|
|||||||
for entry in self.payments:
|
for entry in self.payments:
|
||||||
if entry.amount < 0:
|
if entry.amount < 0:
|
||||||
frappe.throw(_("Row #{0} (Payment Table): Amount must be positive").format(entry.idx))
|
frappe.throw(_("Row #{0} (Payment Table): Amount must be positive").format(entry.idx))
|
||||||
|
|
||||||
|
def book_income_for_deferred_revenue(self):
|
||||||
|
# book the income on the last day, but it will be trigger on the 1st of month at 12:00 AM
|
||||||
|
# start_date: 1st of the last month or the start date
|
||||||
|
# end_date: end_date or today-1
|
||||||
|
|
||||||
|
gl_entries = []
|
||||||
|
for item in self.get('items'):
|
||||||
|
last_gl_entry = False
|
||||||
|
|
||||||
|
booking_start_date = getdate(add_months(today(), -1))
|
||||||
|
booking_start_date = booking_start_date if booking_start_date>item.service_start_date else item.service_start_date
|
||||||
|
|
||||||
|
booking_end_date = getdate(add_days(today(), -1))
|
||||||
|
if booking_end_date>=item.service_end_date:
|
||||||
|
last_gl_entry = True
|
||||||
|
booking_end_date = item.service_end_date
|
||||||
|
|
||||||
|
total_days = date_diff(item.service_end_date, item.service_start_date)
|
||||||
|
total_booking_days = date_diff(booking_end_date, booking_start_date) + 1
|
||||||
|
|
||||||
|
account_currency = get_account_currency(item.income_account)
|
||||||
|
if not last_gl_entry:
|
||||||
|
base_amount = flt(item.base_net_amount*total_booking_days/flt(total_days), item.precision("base_net_amount"))
|
||||||
|
if account_currency==self.company_currency:
|
||||||
|
amount = base_amount
|
||||||
|
else:
|
||||||
|
amount = flt(item.net_amount*total_booking_days/flt(total_days), item.precision("net_amount"))
|
||||||
|
else:
|
||||||
|
gl_entries_details = frappe.db.sql('''
|
||||||
|
select sum(debit) as total_debit, sum(debit_in_account_currency) as total_debit_in_account_currency, voucher_detail_no
|
||||||
|
from `tabGL Entry` where company=%s and account=%s and voucher_type=%s and voucher_no=%s and voucher_detail_no=%s
|
||||||
|
group by voucher_detail_no
|
||||||
|
''', (self.company, item.deferred_revenue_account, "Sales Invoice", self.name, item.name), as_dict=True)[0]
|
||||||
|
base_amount = flt(item.base_net_amount - gl_entries_details.total_debit, item.precision("base_net_amount"))
|
||||||
|
if account_currency==self.company_currency:
|
||||||
|
amount = base_amount
|
||||||
|
else:
|
||||||
|
amount = flt(item.net_amount - gl_entries_details.total_debit_in_account_currency, item.precision("net_amount"))
|
||||||
|
|
||||||
|
# GL Entry for crediting the amount in the income
|
||||||
|
gl_entries.append(
|
||||||
|
self.get_gl_dict({
|
||||||
|
"account": item.income_account,
|
||||||
|
"against": self.customer,
|
||||||
|
"credit": base_amount,
|
||||||
|
"credit_in_account_currency": amount,
|
||||||
|
"cost_center": item.cost_center,
|
||||||
|
'posting_date': booking_end_date
|
||||||
|
}, account_currency)
|
||||||
|
)
|
||||||
|
# GL Entry to debit the amount from the deferred account
|
||||||
|
gl_entries.append(
|
||||||
|
self.get_gl_dict({
|
||||||
|
"account": item.deferred_revenue_account,
|
||||||
|
"against": self.customer,
|
||||||
|
"debit": base_amount,
|
||||||
|
"debit_in_account_currency": amount,
|
||||||
|
"cost_center": item.cost_center,
|
||||||
|
"voucher_detail_no": item.name,
|
||||||
|
'posting_date': booking_end_date
|
||||||
|
}, account_currency)
|
||||||
|
)
|
||||||
|
|
||||||
|
if gl_entries:
|
||||||
|
from erpnext.accounts.general_ledger import make_gl_entries
|
||||||
|
make_gl_entries(gl_entries, cancel=(self.docstatus == 2), merge_entries=True)
|
||||||
|
|
||||||
|
|
||||||
|
def booked_deferred_revenue():
|
||||||
|
# check for the sales invoice for which GL entries has to be done
|
||||||
|
invoices = frappe.db.sql_list('''
|
||||||
|
select parent from `tabSales Invoice Item` where service_start_date<=%s and service_end_date>=%s
|
||||||
|
''', (today(), add_months(today(), -1)))
|
||||||
|
|
||||||
|
# ToDo also find the list on the basic of the GL entry, and make another list
|
||||||
|
for invoice in invoices:
|
||||||
|
doc = frappe.get_doc("Sales Invoice", invoice)
|
||||||
|
doc.book_income_for_deferred_revenue()
|
||||||
|
|
||||||
|
|
||||||
def validate_inter_company_party(doctype, party, company, inter_company_invoice_reference):
|
def validate_inter_company_party(doctype, party, company, inter_company_invoice_reference):
|
||||||
if doctype == "Sales Invoice":
|
if doctype == "Sales Invoice":
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -236,6 +236,9 @@ scheduler_events = {
|
|||||||
"erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_latest_price_in_all_boms",
|
"erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_latest_price_in_all_boms",
|
||||||
"erpnext.assets.doctype.asset.asset.update_maintenance_status",
|
"erpnext.assets.doctype.asset.asset.update_maintenance_status",
|
||||||
"erpnext.assets.doctype.asset.asset.make_post_gl_entry"
|
"erpnext.assets.doctype.asset.asset.make_post_gl_entry"
|
||||||
|
],
|
||||||
|
"monthly": [
|
||||||
|
"erpnext.accounts.doctype.sales_invoice.sales_invoice.booked_deferred_revenue"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,4 +280,4 @@ regional_overrides = {
|
|||||||
'Saudi Arabia': {
|
'Saudi Arabia': {
|
||||||
'erpnext.controllers.taxes_and_totals.update_itemised_tax_data': 'erpnext.regional.united_arab_emirates.utils.update_itemised_tax_data'
|
'erpnext.controllers.taxes_and_totals.update_itemised_tax_data': 'erpnext.regional.united_arab_emirates.utils.update_itemised_tax_data'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1217,6 +1217,39 @@
|
|||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"depends_on": "eval:!doc.__islocal",
|
||||||
|
"fieldname": "default_deferred_revenue_account",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 1,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Default Deferred Revenue Account",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 1,
|
||||||
|
"options": "Account",
|
||||||
|
"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,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@ -2496,7 +2529,7 @@
|
|||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"menu_index": 0,
|
"menu_index": 0,
|
||||||
"modified": "2018-05-07 15:35:06.736602",
|
"modified": "2018-05-14 06:02:22.105952",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Setup",
|
"module": "Setup",
|
||||||
"name": "Company",
|
"name": "Company",
|
||||||
|
|||||||
@ -2517,6 +2517,163 @@
|
|||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 1,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "deferred_revenue",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Deferred Revenue",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"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,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "enable_deferred_revenue",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Enable Deferred Revenue",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"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,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"depends_on": "enable_deferred_revenue",
|
||||||
|
"fieldname": "deferred_revenue_account",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 1,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Deferred Revenue Account",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Account",
|
||||||
|
"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,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "column_break_85",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"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,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"depends_on": "enable_deferred_revenue",
|
||||||
|
"fieldname": "no_of_months",
|
||||||
|
"fieldtype": "Int",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "No of Months",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"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,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@ -3749,7 +3906,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 1,
|
"max_attachments": 1,
|
||||||
"modified": "2018-05-07 14:54:24.479267",
|
"modified": "2018-05-14 14:54:24.479267",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Item",
|
"name": "Item",
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _, throw
|
from frappe import _, throw
|
||||||
from frappe.utils import flt, cint, add_days, cstr
|
from frappe.utils import flt, cint, add_days, cstr, add_months
|
||||||
import json
|
import json
|
||||||
from erpnext.accounts.doctype.pricing_rule.pricing_rule import get_pricing_rule_for_item, set_transaction_type
|
from erpnext.accounts.doctype.pricing_rule.pricing_rule import get_pricing_rule_for_item, set_transaction_type
|
||||||
from erpnext.setup.utils import get_exchange_rate
|
from erpnext.setup.utils import get_exchange_rate
|
||||||
@ -254,6 +254,15 @@ def get_basic_details(args, item):
|
|||||||
"last_purchase_rate": item.last_purchase_rate if args.get("doctype") in ["Purchase Order"] else 0
|
"last_purchase_rate": item.last_purchase_rate if args.get("doctype") in ["Purchase Order"] else 0
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if item.enable_deferred_revenue:
|
||||||
|
service_end_date = add_months(args.transaction_date, item.no_of_months)
|
||||||
|
out.update({
|
||||||
|
"enable_deferred_revenue": item.enable_deferred_revenue,
|
||||||
|
"deferred_revenue_account": get_default_deferred_revenue_account(args, item),
|
||||||
|
"service_start_date": args.transaction_date,
|
||||||
|
"service_end_date": service_end_date
|
||||||
|
})
|
||||||
|
|
||||||
# calculate conversion factor
|
# calculate conversion factor
|
||||||
if item.stock_uom == args.uom:
|
if item.stock_uom == args.uom:
|
||||||
out.conversion_factor = 1.0
|
out.conversion_factor = 1.0
|
||||||
@ -294,6 +303,14 @@ def get_default_expense_account(args, item):
|
|||||||
or args.expense_account
|
or args.expense_account
|
||||||
or frappe.db.get_value("Item Group", item.item_group, "default_expense_account"))
|
or frappe.db.get_value("Item Group", item.item_group, "default_expense_account"))
|
||||||
|
|
||||||
|
def get_default_deferred_revenue_account(args, item):
|
||||||
|
if item.enable_deferred_revenue:
|
||||||
|
return (item.deferred_revenue_account
|
||||||
|
or args.deferred_revenue_account
|
||||||
|
or frappe.db.get_value("Company", args.company, "default_deferred_revenue_account"))
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
def get_default_cost_center(args, item):
|
def get_default_cost_center(args, item):
|
||||||
return (frappe.db.get_value("Project", args.get("project"), "cost_center")
|
return (frappe.db.get_value("Project", args.get("project"), "cost_center")
|
||||||
or (item.selling_cost_center if args.get("customer") else item.buying_cost_center)
|
or (item.selling_cost_center if args.get("customer") else item.buying_cost_center)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user