diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 846ca269b1..b4433fb07e 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -489,4 +489,5 @@ erpnext.patches.v10_0.update_reserved_qty_for_purchase_order erpnext.patches.v10_0.fichier_des_ecritures_comptables_for_france erpnext.patches.v10_0.update_assessment_plan erpnext.patches.v10_0.update_assessment_result -erpnext.patches.v10_0.workflow_leave_application #2018-01-24 \ No newline at end of file +erpnext.patches.v10_0.added_extra_gst_custom_field +erpnext.patches.v10_0.workflow_leave_application #2018-01-24 diff --git a/erpnext/patches/v10_0/added_extra_gst_custom_field.py b/erpnext/patches/v10_0/added_extra_gst_custom_field.py new file mode 100644 index 0000000000..a1512ed9b7 --- /dev/null +++ b/erpnext/patches/v10_0/added_extra_gst_custom_field.py @@ -0,0 +1,9 @@ +import frappe +from erpnext.regional.india.setup import make_custom_fields + +def execute(): + company = frappe.get_all('Company', filters = {'country': 'India'}) + if not company: + return + + make_custom_fields() \ No newline at end of file diff --git a/erpnext/regional/india/setup.py b/erpnext/regional/india/setup.py index 7143bd3457..e9d91abd48 100644 --- a/erpnext/regional/india/setup.py +++ b/erpnext/regional/india/setup.py @@ -103,7 +103,20 @@ def make_custom_fields(): depends_on='eval:in_list(["SEZ", "Export", "Deemed Export"], doc.invoice_type)', options='\nWith Payment of Tax\nWithout Payment of Tax'), dict(fieldname='ecommerce_gstin', label='E-commerce GSTIN', - fieldtype='Data', insert_after='export_type', print_hide=1) + fieldtype='Data', insert_after='export_type', print_hide=1), + dict(fieldname='reason_for_issuing_document', label='Reason For Issuing document', + fieldtype='Select', insert_after='ecommerce_gstin', print_hide=1, + depends_on='eval:doc.is_return==1', + options='\n01-Sales Return\n02-Post Sale Discount\n03-Deficiency in services\n04-Correction in Invoice\n05-Change in POS\n06-Finalization of Provisional assessment\n07-Others'), + dict(fieldname='port_code', label='Port Code', + fieldtype='Data', insert_after='reason_for_issuing_document', print_hide=1, + depends_on="eval:doc.invoice_type=='Export' "), + dict(fieldname='shipping_bill_number', label=' Shipping Bill Number', + fieldtype='Data', insert_after='port_code', print_hide=1, + depends_on="eval:doc.invoice_type=='Export' "), + dict(fieldname='shipping_bill_date', label='Shipping Bill Date', + fieldtype='Date', insert_after='shipping_bill_number', print_hide=1, + depends_on="eval:doc.invoice_type=='Export' "), ] purchase_invoice_gst_fields = [ diff --git a/erpnext/regional/report/gstr_1/gstr_1.js b/erpnext/regional/report/gstr_1/gstr_1.js index 943778661b..3a635277e4 100644 --- a/erpnext/regional/report/gstr_1/gstr_1.js +++ b/erpnext/regional/report/gstr_1/gstr_1.js @@ -31,7 +31,7 @@ frappe.query_reports["GSTR-1"] = { "label": __("Type of Business"), "fieldtype": "Select", "reqd": 1, - "options": ["B2B", "B2C Large", "B2C Small"], + "options": ["B2B", "B2C Large", "B2C Small","CDNR", "EXPORT"], "default": "B2B" } ] diff --git a/erpnext/regional/report/gstr_1/gstr_1.py b/erpnext/regional/report/gstr_1/gstr_1.py index 65b1b89523..b6df878690 100644 --- a/erpnext/regional/report/gstr_1/gstr_1.py +++ b/erpnext/regional/report/gstr_1/gstr_1.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals import frappe, json from frappe import _ +from datetime import date def execute(filters=None): return Gstr1Report(filters).run() @@ -12,7 +13,7 @@ class Gstr1Report(object): def __init__(self, filters=None): self.filters = frappe._dict(filters or {}) self.customer_type = "Company" if self.filters.get("type_of_business") == "B2B" else "Individual" - + def run(self): self.get_columns() self.get_data() @@ -35,13 +36,15 @@ class Gstr1Report(object): for rate, items in items_based_on_rate.items(): row = [] for fieldname in invoice_fields: - if fieldname == "invoice_value": + if self.filters.get("type_of_business") == "CDNR" and fieldname == "invoice_value": + row.append(abs(invoice_details.base_rounded_total) or abs(invoice_details.base_grand_total)) + elif fieldname == "invoice_value": row.append(invoice_details.base_rounded_total or invoice_details.base_grand_total) else: row.append(invoice_details.get(fieldname)) row += [rate, - sum([net_amount for item_code, net_amount in self.invoice_items.get(inv).items() + sum([abs(net_amount) for item_code, net_amount in self.invoice_items.get(inv).items() if item_code in items]), self.invoice_cess.get(inv) ] @@ -49,6 +52,10 @@ class Gstr1Report(object): if self.filters.get("type_of_business") == "B2C Small": row.append("E" if invoice_details.ecommerce_gstin else "OE") + if self.filters.get("type_of_business") == "CDNR": + row.append("Y" if invoice_details.posting_date <= date(2017, 7, 1) else "N") + row.append("C" if invoice_details.return_against else "R") + self.data.append(row) def get_invoice_data(self): @@ -66,7 +73,15 @@ class Gstr1Report(object): place_of_supply, ecommerce_gstin, reverse_charge, - invoice_type + invoice_type, + return_against, + is_return, + invoice_type, + export_type, + port_code, + shipping_bill_number, + shipping_bill_date, + reason_for_issuing_document from `tabSales Invoice` where docstatus = 1 %s order by posting_date desc @@ -85,18 +100,27 @@ class Gstr1Report(object): conditions += opts[1] customers = frappe.get_all("Customer", filters={"customer_type": self.customer_type}) - conditions += " and customer in ('{0}')".format("', '".join([frappe.db.escape(c.name) - for c in customers])) + + if self.filters.get("type_of_business") == "B2B": + conditions += " and invoice_type != 'Export' and is_return != 1 and customer in ('{0}')".\ + format("', '".join([frappe.db.escape(c.name) for c in customers])) if self.filters.get("type_of_business") == "B2C Large": conditions += """ and SUBSTR(place_of_supply, 1, 2) != SUBSTR(company_gstin, 1, 2) - and grand_total > 250000""" + and grand_total > 250000 and is_return != 1 and customer in ('{0}')""".\ + format("', '".join([frappe.db.escape(c.name) for c in customers])) + elif self.filters.get("type_of_business") == "B2C Small": conditions += """ and ( SUBSTR(place_of_supply, 1, 2) = SUBSTR(company_gstin, 1, 2) - or grand_total <= 250000 - )""" + or grand_total <= 250000 ) and is_return != 1 and customer in ('{0}')""".\ + format("', '".join([frappe.db.escape(c.name) for c in customers])) + elif self.filters.get("type_of_business") == "CDNR": + conditions += """ and is_return = 1 """ + + elif self.filters.get("type_of_business") == "EXPORT": + conditions += """ and is_return !=1 and invoice_type = 'Export' """ return conditions def get_invoice_items(self): @@ -118,7 +142,7 @@ class Gstr1Report(object): where parenttype = 'Sales Invoice' and docstatus = 1 and parent in (%s) - and tax_amount_after_discount_amount > 0 + order by account_head """ % (', '.join(['%s']*len(self.invoices.keys()))), tuple(self.invoices.keys())) @@ -152,7 +176,6 @@ class Gstr1Report(object): .setdefault(tax_rate, []) if item_code not in rate_based_dict: rate_based_dict.append(item_code) - except ValueError: continue if unidentified_gst_accounts: @@ -185,12 +208,6 @@ class Gstr1Report(object): "label": "Taxable Value", "fieldtype": "Currency", "width": 100 - }, - { - "fieldname": "cess_amount", - "label": "Cess Amount", - "fieldtype": "Currency", - "width": 100 } ] self.other_columns = [] @@ -200,33 +217,39 @@ class Gstr1Report(object): { "fieldname": "customer_gstin", "label": "GSTIN/UIN of Recipient", - "fieldtype": "Data" + "fieldtype": "Data", + "width": 150 }, { "fieldname": "customer_name", "label": "Receiver Name", - "fieldtype": "Data" + "fieldtype": "Data", + "width":100 }, { "fieldname": "invoice_number", "label": "Invoice Number", "fieldtype": "Link", - "options": "Sales Invoice" + "options": "Sales Invoice", + "width":100 }, { "fieldname": "posting_date", "label": "Invoice date", - "fieldtype": "Date" + "fieldtype": "Date", + "width":80 }, { "fieldname": "invoice_value", "label": "Invoice Value", - "fieldtype": "Currency" + "fieldtype": "Currency", + "width":100 }, { "fieldname": "place_of_supply", "label": "Place of Supply", - "fieldtype": "Data" + "fieldtype": "Data", + "width":100 }, { "fieldname": "reverse_charge", @@ -241,9 +264,19 @@ class Gstr1Report(object): { "fieldname": "ecommerce_gstin", "label": "E-Commerce GSTIN", - "fieldtype": "Data" + "fieldtype": "Data", + "width":120 } ] + self.other_columns = [ + { + "fieldname": "cess_amount", + "label": "Cess Amount", + "fieldtype": "Currency", + "width": 100 + } + ] + elif self.filters.get("type_of_business") == "B2C Large": self.invoice_columns = [ { @@ -278,6 +311,93 @@ class Gstr1Report(object): "width": 130 } ] + self.other_columns = [ + { + "fieldname": "cess_amount", + "label": "Cess Amount", + "fieldtype": "Currency", + "width": 100 + } + ] + elif self.filters.get("type_of_business") == "CDNR": + self.invoice_columns = [ + { + "fieldname": "customer_gstin", + "label": "GSTIN/UIN of Recipient", + "fieldtype": "Data", + "width": 150 + }, + { + "fieldname": "customer_name", + "label": "Receiver Name", + "fieldtype": "Data", + "width": 120 + }, + { + "fieldname": "return_against", + "label": "Invoice/Advance Receipt Number", + "fieldtype": "Link", + "options": "Sales Invoice", + "width": 120 + }, + { + "fieldname": "posting_date", + "label": "Invoice/Advance Receipt date", + "fieldtype": "Date", + "width": 120 + }, + { + "fieldname": "invoice_number", + "label": "Invoice/Advance Receipt Number", + "fieldtype": "Link", + "options": "Sales Invoice", + "width":120 + }, + { + "fieldname": "posting_date", + "label": "Invoice/Advance Receipt date", + "fieldtype": "Date", + "width": 120 + }, + { + "fieldname": "reason_for_issuing_document", + "label": "Reason For Issuing document", + "fieldtype": "Data", + "width": 140 + }, + { + "fieldname": "place_of_supply", + "label": "Place of Supply", + "fieldtype": "Data", + "width": 120 + }, + { + "fieldname": "invoice_value", + "label": "Invoice Value", + "fieldtype": "Currency", + "width": 120 + } + ] + self.other_columns = [ + { + "fieldname": "cess_amount", + "label": "Cess Amount", + "fieldtype": "Currency", + "width": 100 + }, + { + "fieldname": "pre_gst", + "label": "PRE GST", + "fieldtype": "Data", + "width": 80 + }, + { + "fieldname": "document_type", + "label": "Document Type", + "fieldtype": "Data", + "width": 80 + } + ] elif self.filters.get("type_of_business") == "B2C Small": self.invoice_columns = [ { @@ -294,6 +414,12 @@ class Gstr1Report(object): } ] self.other_columns = [ + { + "fieldname": "cess_amount", + "label": "Cess Amount", + "fieldtype": "Currency", + "width": 100 + }, { "fieldname": "type", "label": "Type", @@ -301,4 +427,50 @@ class Gstr1Report(object): "width": 50 } ] - self.columns = self.invoice_columns + self.tax_columns + self.other_columns \ No newline at end of file + elif self.filters.get("type_of_business") == "EXPORT": + self.invoice_columns = [ + { + "fieldname": "export_type", + "label": "Export Type", + "fieldtype": "Data", + "width":120 + }, + { + "fieldname": "invoice_number", + "label": "Invoice Number", + "fieldtype": "Link", + "options": "Sales Invoice", + "width":120 + }, + { + "fieldname": "posting_date", + "label": "Invoice date", + "fieldtype": "Date", + "width": 120 + }, + { + "fieldname": "invoice_value", + "label": "Invoice Value", + "fieldtype": "Currency", + "width": 120 + }, + { + "fieldname": "port_code", + "label": "Port Code", + "fieldtype": "Data", + "width": 120 + }, + { + "fieldname": "shipping_bill_number", + "label": "Shipping Bill Number", + "fieldtype": "Data", + "width": 120 + }, + { + "fieldname": "shipping_bill_date", + "label": "Shipping Bill Date", + "fieldtype": "Date", + "width": 120 + } + ] + self.columns = self.invoice_columns + self.tax_columns + self.other_columns