diff --git a/erpnext/__init__.py b/erpnext/__init__.py index edc4c9be990f..913b372556df 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe -__version__ = '8.3.1' +__version__ = '8.3.2' def get_default_company(user=None): '''Get default company for user''' diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 4c05b94af4af..260c05e3e428 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -12,6 +12,7 @@ "doctype": "DocType", "document_type": "", "editable_grid": 0, + "engine": "InnoDB", "fields": [ { "allow_bulk_edit": 0, @@ -1927,7 +1928,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Item-wise Tax Breakup", + "label": "Tax Breakup", "length": 0, "no_copy": 0, "permlevel": 0, @@ -4687,7 +4688,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-07-04 17:11:09.477003", + "modified": "2017-07-07 13:05:37.469682", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py index bc9d76646b97..bfe00ef94ac6 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py @@ -11,7 +11,8 @@ def get_data(): 'Sales Invoice': 'return_against' }, 'internal_links': { - 'Sales Order': ['items', 'sales_order'] + 'Sales Order': ['items', 'sales_order'], + 'Delivery Note': ['items', 'delivery_note'] }, 'transactions': [ { diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 22485e95f74d..6f1c2c973d0c 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -1116,7 +1116,7 @@ def test_item_wise_tax_breakup(self): }) si.insert() - tax_breakup_html = '''\n
\n\t\n\t\t\n\n\n\t\t\n\t
Item NameTaxable Amount_Test Account Service Tax - _TC
_Test Item\u20b9 5,000.00(10.0%) \u20b9 500.00
\n
''' + tax_breakup_html = '''\n
\n\t\n\t\t\n\t\t\n\t
Item NameTaxable Amount_Test Account Service Tax - _TC
_Test Item\u20b9 5,000.00(10.0%) \u20b9 500.00
\n
''' self.assertEqual(si.other_charges_calculation, tax_breakup_html) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 8c071203e86c..8eb83af6d571 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -531,8 +531,8 @@ def set_item_wise_tax_breakup(self): {rows} '''.format(**{ - "headings": "\n".join(headings), - "rows": "\n".join(rows) + "headings": "".join(headings), + "rows": "".join(rows) }) def get_item_tax(self, item_tax, tax_accounts, company_currency): @@ -605,7 +605,7 @@ def get_table_rows(distinct_items, item_tax, tax_accounts, company_currency): rows.append("{item_name}{taxable_amount}{taxes}".format(**{ "item_name": item.item_name, "taxable_amount": fmt_money(item.net_amount, item.precision("net_amount"), company_currency), - "taxes": "\n".join(taxes) + "taxes": "".join(taxes) })) return rows \ No newline at end of file diff --git a/erpnext/docs/assets/img/setup/email/email-alert-set-property.png b/erpnext/docs/assets/img/setup/email/email-alert-set-property.png new file mode 100644 index 000000000000..658b1494e683 Binary files /dev/null and b/erpnext/docs/assets/img/setup/email/email-alert-set-property.png differ diff --git a/erpnext/docs/user/manual/en/setting-up/email/email-alerts.md b/erpnext/docs/user/manual/en/setting-up/email/email-alerts.md index 9ec307370687..8d239ea9bb7f 100644 --- a/erpnext/docs/user/manual/en/setting-up/email/email-alerts.md +++ b/erpnext/docs/user/manual/en/setting-up/email/email-alerts.md @@ -42,6 +42,7 @@ Email alerts allow you to set conditions according to the field data in your doc The above example will send an Email Alert when a Task is saved with the status "Open" and the Expected End Date for the Task is the date on or before the date on which it was saved on. + ### Setting a Message You can use both Jinja Tags (`{% raw %}{{ doc.[field_name] }}{% endraw %}`) and HTML tags in the message textbox. @@ -64,6 +65,17 @@ You can use both Jinja Tags (`{% raw %}{{ doc.[field_name] }}{% endraw %}`) and --- +### Setting a Value after the Alert is Set + +Sometimes to make sure that the email alert is not sent multiple times, you can +define a custom property (via Customize Form) like "Email Alert Sent" and then +set this property after the alert is sent by setting the **Set Property After Alert** +field. + +Then you can use that as a condition in the **Condition** rules to ensure emails are not sent multiple times + +Setting Property in Email Alert + ### Example 1. Defining the Criteria diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 0cf0f7beff11..80d64e8ae558 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -413,4 +413,5 @@ execute:frappe.reload_doc('regional', 'doctype', 'gst_hsn_code') erpnext.patches.v8_1.removed_roles_from_gst_report_non_indian_account erpnext.patches.v8_1.gst_fixes #2017-07-06 erpnext.patches.v8_0.update_production_orders -erpnext.patches.v8_1.remove_sales_invoice_from_returned_serial_no \ No newline at end of file +erpnext.patches.v8_1.remove_sales_invoice_from_returned_serial_no +erpnext.patches.v8_1.allow_invoice_copy_to_edit_after_submit \ No newline at end of file diff --git a/erpnext/patches/v8_1/gst_fixes.py b/erpnext/patches/v8_1/gst_fixes.py index 1d3a380df05f..b47879c08d87 100644 --- a/erpnext/patches/v8_1/gst_fixes.py +++ b/erpnext/patches/v8_1/gst_fixes.py @@ -44,7 +44,7 @@ def add_custom_fields(): ], 'Sales Invoice': [ dict(fieldname='invoice_copy', label='Invoice Copy', - fieldtype='Select', insert_after='project', print_hide=1, + fieldtype='Select', insert_after='project', print_hide=1, allow_on_submit=1, options='ORIGINAL FOR RECIPIENT\nDUPLICATE FOR TRANSPORTER\nTRIPLICATE FOR SUPPLIER'), ], 'Sales Order Item': [hsn_sac_field], diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 075b2d0bdfe2..e917a75d6d7f 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -689,7 +689,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ return '' + (head || "") + ""; } } - ).join("\n"); + ).join(""); var distinct_item_names = []; var distinct_items = []; @@ -711,9 +711,9 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ return item_tax_record[head[0]] ? "(" + item_tax_record[head[0]][0] + ") " + item_tax_record[head[0]][1] + "" : ""; - }).join("\n") + }).join("") }); - }).join("\n"); + }).join(""); if(!rows) return ""; return '
\ diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index c4f9e8a8add8..fd91227cb673 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -63,37 +63,32 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ }); frappe.ui.form.on(this.frm.doctype, "additional_discount_percentage", function(frm) { - if (frm.via_discount_amount) { - return; - } - if(!frm.doc.apply_discount_on) { frappe.msgprint(__("Please set 'Apply Additional Discount On'")); - return + return; } frm.via_discount_percentage = true; if(frm.doc.additional_discount_percentage && frm.doc.discount_amount) { // Reset discount amount and net / grand total - frm.set_value("discount_amount", 0); + frm.doc.discount_amount = 0; + frm.cscript.calculate_taxes_and_totals(); } var total = flt(frm.doc[frappe.model.scrub(frm.doc.apply_discount_on)]); var discount_amount = flt(total*flt(frm.doc.additional_discount_percentage) / 100, precision("discount_amount")); - frm.set_value("discount_amount", discount_amount); - delete frm.via_discount_percentage; + frm.set_value("discount_amount", discount_amount) + .then(() => delete frm.via_discount_percentage); }); frappe.ui.form.on(this.frm.doctype, "discount_amount", function(frm) { frm.cscript.set_dynamic_labels(); if (!frm.via_discount_percentage) { - frm.via_discount_amount = true; - frm.set_value("additional_discount_percentage", 0); - delete frm.via_discount_amount; + frm.doc.additional_discount_percentage = 0; } frm.cscript.calculate_taxes_and_totals(); diff --git a/erpnext/regional/india/__init__.py b/erpnext/regional/india/__init__.py index 0b1b163015a5..9a6c376cca33 100644 --- a/erpnext/regional/india/__init__.py +++ b/erpnext/regional/india/__init__.py @@ -72,5 +72,5 @@ "Tripura": "16", "Uttar Pradesh": "35", "Uttarakhand": "36", - "West Bengal": "37" + "West Bengal": "19" } \ No newline at end of file diff --git a/erpnext/regional/india/gst_state_code_data.json b/erpnext/regional/india/gst_state_code_data.json index 89dc193af816..196f8d01b4a1 100644 --- a/erpnext/regional/india/gst_state_code_data.json +++ b/erpnext/regional/india/gst_state_code_data.json @@ -15,7 +15,7 @@ "state_name": "Uttarakhand" }, { - "state_number": "37", + "state_number": "19", "state_code": "WB", "state_name": "West Bengal" }, diff --git a/erpnext/regional/india/setup.py b/erpnext/regional/india/setup.py index f547b825e633..0aefc7b22e7a 100644 --- a/erpnext/regional/india/setup.py +++ b/erpnext/regional/india/setup.py @@ -102,7 +102,7 @@ def make_custom_fields(): fieldtype='Data', insert_after='company_address', options='company_address.gstin', print_hide=1), dict(fieldname='invoice_copy', label='Invoice Copy', - fieldtype='Select', insert_after='project', print_hide=1, + fieldtype='Select', insert_after='project', print_hide=1, allow_on_submit=1, options='ORIGINAL FOR RECIPIENT\nDUPLICATE FOR TRANSPORTER\nTRIPLICATE FOR SUPPLIER') ], 'Item': [ diff --git a/erpnext/regional/print_format/gst_tax_invoice/gst_tax_invoice.json b/erpnext/regional/print_format/gst_tax_invoice/gst_tax_invoice.json index b2deda9b78e5..38508475e1d2 100644 --- a/erpnext/regional/print_format/gst_tax_invoice/gst_tax_invoice.json +++ b/erpnext/regional/print_format/gst_tax_invoice/gst_tax_invoice.json @@ -7,10 +7,10 @@ "docstatus": 0, "doctype": "Print Format", "font": "Default", - "format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"Custom HTML\", \"options\": \"
\\n\\t

\\n\\t\\tSALES INVOICE
\\n\\t\\t{{ doc.name }}\\n\\t

\\n
\\n

\\n\\t{% if doc.invoice_copy -%}\\n\\t\\t{{ doc.invoice_copy }}\\n\\t{% endif -%}\\n

\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"company\", \"label\": \"Company\"}, {\"print_hide\": 0, \"fieldname\": \"company_address_display\", \"label\": \"Company Address\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"posting_date\", \"label\": \"Date\"}, {\"print_hide\": 0, \"fieldname\": \"due_date\", \"label\": \"Payment Due Date\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"options\": \"
\", \"fieldname\": \"_custom_html\", \"fieldtype\": \"HTML\", \"label\": \"Custom HTML\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Address\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"customer_name\", \"label\": \"Customer Name\"}, {\"print_hide\": 0, \"fieldname\": \"address_display\", \"label\": \"Address\"}, {\"print_hide\": 0, \"fieldname\": \"contact_display\", \"label\": \"Contact\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"shipping_address\", \"label\": \"Shipping Address\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"item_code\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"description\", \"print_width\": \"200px\"}, {\"print_hide\": 0, \"fieldname\": \"gst_hsn_code\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"qty\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"uom\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"rate\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"items\", \"label\": \"Items\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"total\", \"label\": \"Total\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"description\", \"print_width\": \"300px\"}], \"print_hide\": 0, \"fieldname\": \"taxes\", \"label\": \"Sales Taxes and Charges\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"grand_total\", \"label\": \"Grand Total\"}, {\"print_hide\": 0, \"fieldname\": \"rounded_total\", \"label\": \"Rounded Total\"}, {\"print_hide\": 0, \"fieldname\": \"in_words\", \"label\": \"In Words\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"other_charges_calculation\", \"align\": \"left\", \"label\": \"Item-wise Tax Breakup\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Terms\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"terms\", \"label\": \"Terms and Conditions Details\"}]", + "format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"Custom HTML\", \"options\": \"
\\n\\t

\\n\\t\\tTAX INVOICE
\\n\\t\\t{{ doc.name }}\\n\\t

\\n
\\n

\\n\\t{% if doc.invoice_copy -%}\\n\\t\\t{{ doc.invoice_copy }}\\n\\t{% endif -%}\\n

\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"company\", \"label\": \"Company\"}, {\"print_hide\": 0, \"fieldname\": \"company_address_display\", \"label\": \"Company Address\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"posting_date\", \"label\": \"Date\"}, {\"print_hide\": 0, \"fieldname\": \"due_date\", \"label\": \"Payment Due Date\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"options\": \"
\", \"fieldname\": \"_custom_html\", \"fieldtype\": \"HTML\", \"label\": \"Custom HTML\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Address\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"customer_name\", \"label\": \"Customer Name\"}, {\"print_hide\": 0, \"fieldname\": \"address_display\", \"label\": \"Address\"}, {\"print_hide\": 0, \"fieldname\": \"contact_display\", \"label\": \"Contact\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"shipping_address\", \"label\": \"Shipping Address\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"item_code\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"description\", \"print_width\": \"200px\"}, {\"print_hide\": 0, \"fieldname\": \"gst_hsn_code\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"qty\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"uom\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"rate\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"items\", \"label\": \"Items\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"total\", \"label\": \"Total\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"description\", \"print_width\": \"300px\"}], \"print_hide\": 0, \"fieldname\": \"taxes\", \"label\": \"Sales Taxes and Charges\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"grand_total\", \"label\": \"Grand Total\"}, {\"print_hide\": 0, \"fieldname\": \"rounded_total\", \"label\": \"Rounded Total\"}, {\"print_hide\": 0, \"fieldname\": \"in_words\", \"label\": \"In Words\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"other_charges_calculation\", \"align\": \"left\", \"label\": \"Tax Breakup\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Terms\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"terms\", \"label\": \"Terms and Conditions Details\"}]", "idx": 0, "line_breaks": 0, - "modified": "2017-07-06 17:47:38.279783", + "modified": "2017-07-07 13:06:20.042807", "modified_by": "Administrator", "module": "Regional", "name": "GST Tax Invoice", diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py index 3005ed6d182a..5134ee11bc6c 100644 --- a/erpnext/setup/setup_wizard/setup_wizard.py +++ b/erpnext/setup/setup_wizard/setup_wizard.py @@ -351,7 +351,7 @@ def create_items(args): for i in xrange(1,6): item = args.get("item_" + str(i)) if item: - item_group = args.get("item_group_" + str(i)) + item_group = _(args.get("item_group_" + str(i))) is_sales_item = args.get("is_sales_item_" + str(i)) is_purchase_item = args.get("is_purchase_item_" + str(i)) is_stock_item = item_group!=_("Services") @@ -373,7 +373,7 @@ def create_items(args): "is_purchase_item": is_purchase_item, "is_stock_item": is_stock_item and 1 or 0, "item_group": item_group, - "stock_uom": args.get("item_uom_" + str(i)), + "stock_uom": _(args.get("item_uom_" + str(i))), "default_warehouse": default_warehouse }).insert()