[Report] GSTR - 1 CDNR Report (#12554)
* [wip] cdnr
* [WIP] cdnr with optional data
* [wip] Export GSTR-1
* [minor] Minor changes in export
* [new] Custom field added for GST
* [fix] Minor changes in GSTR1 Report
* [minor] Minor changes in gstr1
* [fix] Codacy Fixed
* Update setup.py
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 846ca26..b4433fb 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -489,4 +489,5 @@
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 0000000..a1512ed
--- /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 7143bd3..e9d91ab 100644
--- a/erpnext/regional/india/setup.py
+++ b/erpnext/regional/india/setup.py
@@ -103,7 +103,20 @@
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 9437786..3a63527 100644
--- a/erpnext/regional/report/gstr_1/gstr_1.js
+++ b/erpnext/regional/report/gstr_1/gstr_1.js
@@ -31,7 +31,7 @@
"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 65b1b89..b6df878 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
.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 @@
"label": "Taxable Value",
"fieldtype": "Currency",
"width": 100
- },
- {
- "fieldname": "cess_amount",
- "label": "Cess Amount",
- "fieldtype": "Currency",
- "width": 100
}
]
self.other_columns = []
@@ -200,33 +217,39 @@
{
"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 @@
{
"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 @@
"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 = [
{
@@ -295,10 +415,62 @@
]
self.other_columns = [
{
+ "fieldname": "cess_amount",
+ "label": "Cess Amount",
+ "fieldtype": "Currency",
+ "width": 100
+ },
+ {
"fieldname": "type",
"label": "Type",
"fieldtype": "Data",
"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