From c443c9f05d4bfb8feb336b143ec7a7d654bdc2c9 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 13 Sep 2017 15:13:53 +0530 Subject: [PATCH 1/6] Update actual dates in Production Order from Timesheet --- .../doctype/production_order/production_order.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py index 5fedc72889..5bd476eacd 100644 --- a/erpnext/manufacturing/doctype/production_order/production_order.py +++ b/erpnext/manufacturing/doctype/production_order/production_order.py @@ -367,15 +367,11 @@ class ProductionOrder(Document): frappe.throw(_("Completed Qty can not be greater than 'Qty to Manufacture'")) def set_actual_dates(self): + self.actual_start_date = None + self.actual_end_date = None if self.get("operations"): - actual_date = frappe.db.sql("""select min(actual_start_time) as start_date, - max(actual_end_time) as end_date from `tabProduction Order Operation` - where parent = %s and docstatus=1""", self.name, as_dict=1)[0] - self.actual_start_date = actual_date.start_date - self.actual_end_date = actual_date.end_date - else: - self.actual_start_date = None - self.actual_end_date = None + self.actual_start_date = min([d.actual_start_time for d in self.get("operations")]) + self.actual_end_date = max([d.actual_end_time for d in self.get("operations")]) def delete_timesheet(self): for timesheet in frappe.get_all("Timesheet", ["name"], {"production_order": self.name}): From 9a0db392dee799cdb0e3691677703e3548fdd50d Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 14 Sep 2017 10:51:21 +0530 Subject: [PATCH 2/6] [Fix] Only typed keywords displying in the field on selection of customer (#10778) --- erpnext/accounts/page/pos/pos.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js index f8399bf518..0416b193d7 100644 --- a/erpnext/accounts/page/pos/pos.js +++ b/erpnext/accounts/page/pos/pos.js @@ -260,9 +260,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ this.calculate_outstanding_amount(); } - if (this.frm.doc.customer) { - this.party_field.$input.val(this.frm.doc.customer); - } + this.set_customer_value_in_party_field(); if (!this.frm.doc.write_off_account) { this.frm.doc.write_off_account = doc.write_off_account @@ -273,6 +271,12 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ } }, + set_customer_value_in_party_field: function() { + if (this.frm.doc.customer) { + this.party_field.$input.val(this.frm.doc.customer); + } + }, + get_invoice_doc: function (si_docs) { var me = this; this.si_docs = this.get_doc_from_localstorage(); @@ -686,6 +690,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ set_focus: function () { if (this.default_customer || this.frm.doc.customer) { + this.set_customer_value_in_party_field(); this.serach_item.$input.focus(); } else { this.party_field.$input.focus(); From a6d78ef842616cab5f1ec9d51c9ea33ab91775e6 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 14 Sep 2017 15:01:04 +0530 Subject: [PATCH 3/6] Added Supplier Bill Date in Itemised Purchase Register (#10783) --- .../gst_itemised_purchase_register.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/erpnext/regional/report/gst_itemised_purchase_register/gst_itemised_purchase_register.py b/erpnext/regional/report/gst_itemised_purchase_register/gst_itemised_purchase_register.py index 1a54cc3ff2..b0dfdcbfea 100644 --- a/erpnext/regional/report/gst_itemised_purchase_register/gst_itemised_purchase_register.py +++ b/erpnext/regional/report/gst_itemised_purchase_register/gst_itemised_purchase_register.py @@ -14,7 +14,8 @@ def execute(filters=None): dict(fieldtype='Data', label='Export Type', width=120), dict(fieldtype='Data', label='E-Commerce GSTIN', width=130), dict(fieldtype='Data', label='HSN Code', width=120), - dict(fieldtype='Data', label='Supplier Invoice No', width=120) + dict(fieldtype='Data', label='Supplier Invoice No', width=120), + dict(fieldtype='Date', label='Supplier Invoice Date', width=100) ], additional_query_columns=[ 'supplier_gstin', 'company_gstin', @@ -23,5 +24,6 @@ def execute(filters=None): 'export_type', 'ecommerce_gstin', 'gst_hsn_code', - 'bill_no' + 'bill_no', + 'bill_date' ]) From bf8e331135c04608cff640416232f8e10cb09090 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 14 Sep 2017 15:03:45 +0530 Subject: [PATCH 4/6] [fix] unset default customer group (#10689) * [fix] unset default customer group * added __init__.py file for patch v8.9 directory --- erpnext/patches.txt | 3 ++- erpnext/patches/v8_9/__init__.py | 1 + erpnext/patches/v8_9/set_default_customer_group.py | 6 ++++++ .../selling/doctype/selling_settings/selling_settings.py | 7 +++++++ erpnext/setup/setup_wizard/setup_wizard.py | 1 + erpnext/startup/boot.py | 5 ++--- 6 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 erpnext/patches/v8_9/__init__.py create mode 100644 erpnext/patches/v8_9/set_default_customer_group.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 7ec2753801..31ecd294e5 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -434,4 +434,5 @@ erpnext.patches.v8_6.set_write_permission_for_quotation_for_sales_manager erpnext.patches.v8_5.remove_project_type_property_setter erpnext.patches.v8_7.add_more_gst_fields erpnext.patches.v8_7.fix_purchase_receipt_status -erpnext.patches.v8_6.rename_bom_update_tool \ No newline at end of file +erpnext.patches.v8_6.rename_bom_update_tool +erpnext.patches.v8_9.set_default_customer_group diff --git a/erpnext/patches/v8_9/__init__.py b/erpnext/patches/v8_9/__init__.py new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/erpnext/patches/v8_9/__init__.py @@ -0,0 +1 @@ + diff --git a/erpnext/patches/v8_9/set_default_customer_group.py b/erpnext/patches/v8_9/set_default_customer_group.py new file mode 100644 index 0000000000..b121998b2b --- /dev/null +++ b/erpnext/patches/v8_9/set_default_customer_group.py @@ -0,0 +1,6 @@ +import frappe + +def execute(): + selling_settings = frappe.get_single('Selling Settings') + selling_settings.set_default_customer_group_and_territory() + selling_settings.save() diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.py b/erpnext/selling/doctype/selling_settings/selling_settings.py index ee7d203d00..d297883876 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.py +++ b/erpnext/selling/doctype/selling_settings/selling_settings.py @@ -8,6 +8,7 @@ import frappe import frappe.defaults from frappe.utils import cint from frappe.custom.doctype.property_setter.property_setter import make_property_setter +from frappe.utils.nestedset import get_root_of from frappe.model.document import Document @@ -31,3 +32,9 @@ class SellingSettings(Document): for doctype in ("Sales Order", "Sales Invoice", "Delivery Note"): make_property_setter(doctype, "tax_id", "hidden", self.hide_tax_id, "Check") make_property_setter(doctype, "tax_id", "print_hide", self.hide_tax_id, "Check") + + def set_default_customer_group_and_territory(self): + if not self.customer_group: + self.customer_group = get_root_of('Customer Group') + if not self.territory: + self.territory = get_root_of('Territory') diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py index 4dec3d75f7..c40ad55f8b 100644 --- a/erpnext/setup/setup_wizard/setup_wizard.py +++ b/erpnext/setup/setup_wizard/setup_wizard.py @@ -176,6 +176,7 @@ def set_defaults(args): selling_settings.so_required = "No" selling_settings.dn_required = "No" selling_settings.allow_multiple_items = 1 + selling_settings.set_default_customer_group_and_territory() selling_settings.save() buying_settings = frappe.get_doc("Buying Settings") diff --git a/erpnext/startup/boot.py b/erpnext/startup/boot.py index 6b503b3eec..3164306109 100644 --- a/erpnext/startup/boot.py +++ b/erpnext/startup/boot.py @@ -4,7 +4,6 @@ from __future__ import unicode_literals import frappe -from frappe.utils.nestedset import get_root_of def boot_session(bootinfo): """boot session - send website info if guest""" @@ -17,9 +16,9 @@ def boot_session(bootinfo): load_country_and_currency(bootinfo) bootinfo.sysdefaults.territory = frappe.db.get_single_value('Selling Settings', - 'territory') or get_root_of('Territory') + 'territory') bootinfo.sysdefaults.customer_group = frappe.db.get_single_value('Selling Settings', - 'customer_group') or get_root_of('Customer Group') + 'customer_group') bootinfo.notification_settings = frappe.get_doc("Notification Control", "Notification Control") From 45dce89caea56691b3b050b1474fe3d51ad6e464 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 14 Sep 2017 15:17:38 +0530 Subject: [PATCH 5/6] Print Settings for printing taxes with zero amount (#10782) * Print Settings for printing taxes with zero amount * added __init__.py file to patch module v8_9 --- .../gst_pos_invoice/gst_pos_invoice.json | 4 ++-- .../print_format/point_of_sale/point_of_sale.json | 4 ++-- erpnext/controllers/buying_controller.py | 2 ++ erpnext/controllers/selling_controller.py | 2 ++ erpnext/patches.txt | 3 ++- .../patches/v8_9/set_print_zero_amount_taxes.py | 7 +++++++ erpnext/setup/install.py | 14 ++++++++++++-- .../templates/print_formats/includes/taxes.html | 4 ++-- 8 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 erpnext/patches/v8_9/set_print_zero_amount_taxes.py diff --git a/erpnext/accounts/print_format/gst_pos_invoice/gst_pos_invoice.json b/erpnext/accounts/print_format/gst_pos_invoice/gst_pos_invoice.json index 051a1238d9..5debb5c978 100644 --- a/erpnext/accounts/print_format/gst_pos_invoice/gst_pos_invoice.json +++ b/erpnext/accounts/print_format/gst_pos_invoice/gst_pos_invoice.json @@ -1,5 +1,5 @@ { - "align_labels_left": 0, + "align_labels_right": 0, "creation": "2017-08-08 12:33:04.773099", "custom_format": 1, "disabled": 0, @@ -10,7 +10,7 @@ "html": "\n\n

\n\t{{ doc.company }}
\n\t{% if doc.company_address_display %}\n\t\t{% set company_address = doc.company_address_display.replace(\"\\n\", \" \").replace(\"
\", \" \") %}\n\t\t{% if \"GSTIN\" not in company_address %}\n\t\t\t{{ company_address }}\n\t\t\t{{ _(\"GSTIN\") }}:{{ doc.company_gstin }}\n\t\t{% else %}\n\t\t\t{{ company_address.replace(\"GSTIN\", \"
GSTIN\") }}\n\t\t{% endif %}\n\t{% endif %}\n\t
\n\t{{ doc.select_print_heading or _(\"Invoice\") }}
\n

\n

\n\t{{ _(\"Receipt No\") }}: {{ doc.name }}
\n\t{{ _(\"Date\") }}: {{ doc.get_formatted(\"posting_date\") }}
\n\t{% if doc.grand_total > 50000 %}\n\t\t{% set customer_address = doc.address_display.replace(\"\\n\", \" \").replace(\"
\", \" \") %}\n\t\t{{ _(\"Customer\") }}:
\n\t\t{{ doc.customer_name }}
\n\t\t{{ customer_address }}\n\t{% endif %}\n

\n\n
\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\t\t{%- for item in doc.items -%}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{%- endfor -%}\n\t\n
{{ _(\"Item\") }}{{ _(\"Qty\") }}{{ _(\"Amount\") }}
\n\t\t\t\t{{ item.item_code }}\n\t\t\t\t{%- if item.item_name != item.item_code -%}\n\t\t\t\t\t
{{ item.item_name }}\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- if item.gst_hsn_code -%}\n\t\t\t\t\t
{{ _(\"HSN/SAC\") }}: {{ item.gst_hsn_code }}\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- if item.serial_no -%}\n\t\t\t\t\t
{{ _(\"Serial No\") }}: {{ item.serial_no }}\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ item.qty }}
@ {{ item.rate }}
{{ item.get_formatted(\"amount\") }}
\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{%- for row in doc.taxes -%}\n\t\t{%- if not row.included_in_print_rate -%}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{%- endif -%}\n\t\t{%- endfor -%}\n\t\t{%- if doc.discount_amount -%}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{%- endif -%}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n
\n\t\t\t\t{{ _(\"Net Total\") }}\n\t\t\t\n\t\t\t\t{{ doc.get_formatted(\"net_total\") }}\n\t\t\t
\n\t\t\t\t{{ row.description }}\n\t\t\t\n\t\t\t\t{{ row.get_formatted(\"tax_amount\", doc) }}\n\t\t\t
\n\t\t\t\t{{ _(\"Discount\") }}\n\t\t\t\n\t\t\t\t{{ doc.get_formatted(\"discount_amount\") }}\n\t\t\t
\n\t\t\t\t{{ _(\"Grand Total\") }}\n\t\t\t\n\t\t\t\t{{ doc.get_formatted(\"grand_total\") }}\n\t\t\t
\n

Tax Breakup:

\n
\n\t{{ doc.other_charges_calculation }}\n
\n

{{ doc.terms or \"\" }}

\n

{{ _(\"Thank you, please visit again.\") }}

", "idx": 0, "line_breaks": 0, - "modified": "2017-08-29 15:54:19.467642", + "modified": "2017-09-14 15:54:19.467642", "modified_by": "Administrator", "module": "Accounts", "name": "GST POS Invoice", diff --git a/erpnext/accounts/print_format/point_of_sale/point_of_sale.json b/erpnext/accounts/print_format/point_of_sale/point_of_sale.json index 28c853cc48..49696d253f 100644 --- a/erpnext/accounts/print_format/point_of_sale/point_of_sale.json +++ b/erpnext/accounts/print_format/point_of_sale/point_of_sale.json @@ -1,5 +1,5 @@ { - "align_labels_left": 0, + "align_labels_right": 0, "creation": "2016-05-05 17:16:18.564460", "custom_format": 1, "disabled": 0, @@ -10,7 +10,7 @@ "html": "\n\n

\n\t{{ company }}
\n\t{{ __(\"POS No : \") }} {{ offline_pos_name }}
\n

\n

\n\t{{ __(\"Customer\") }}: {{ customer }}
\n

\n\n

\n\t{{ __(\"Date\") }}: {{ dateutil.global_date_format(posting_date) }}
\n

\n\n
\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\t\t{% for item in items %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endfor %}\n\t\n
{{ __(\"Item\") }}{{ __(\"Qty\") }}{{ __(\"Amount\") }}
\n\t\t\t\t{{ item.item_name }}\n\t\t\t{{ format_number(item.qty, null,precision(\"difference\")) }}
@ {{ format_currency(item.rate, currency) }}
{{ format_currency(item.amount, currency) }}
\n\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% for row in taxes %}\n\t\t{% if not row.included_in_print_rate %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endif %}\n\t\t{% endfor %}\n\t\t{% if discount_amount %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endif %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n
\n\t\t\t\t{{ __(\"Net Total\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(total, currency) }}\n\t\t\t
\n\t\t\t\t{{ row.description }}\n\t\t\t\n\t\t\t\t{{ format_currency(row.tax_amount, currency) }}\n\t\t\t
\n\t\t\t\t{{ __(\"Discount\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(discount_amount, currency) }}\n\t\t\t
\n\t\t\t\t{{ __(\"Grand Total\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(grand_total, currency) }}\n\t\t\t
\n\t\t\t\t{{ __(\"Paid Amount\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(paid_amount, currency) }}\n\t\t\t
\n\n\n
\n

{{ terms }}

\n

{{ __(\"Thank you, please visit again.\") }}

", "idx": 0, "line_breaks": 0, - "modified": "2017-05-19 14:36:04.740728", + "modified": "2017-09-14 14:36:04.740728", "modified_by": "Administrator", "module": "Accounts", "name": "Point of Sale", diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 5a0b967bd1..9cc061677e 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -16,6 +16,8 @@ from erpnext.controllers.stock_controller import StockController class BuyingController(StockController): def __setup__(self): if hasattr(self, "taxes"): + self.flags.print_taxes_with_zero_amount = cint(frappe.db.get_single_value("Print Settings", + "print_taxes_with_zero_amount")) self.print_templates = { "taxes": "templates/print_formats/includes/taxes.html" } diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 10b3607df9..d8b4202704 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -14,6 +14,8 @@ from erpnext.controllers.stock_controller import StockController class SellingController(StockController): def __setup__(self): if hasattr(self, "taxes"): + self.flags.print_taxes_with_zero_amount = cint(frappe.db.get_single_value("Print Settings", + "print_taxes_with_zero_amount")) self.print_templates = { "taxes": "templates/print_formats/includes/taxes.html" } diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 31ecd294e5..5bfd34e869 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -435,4 +435,5 @@ erpnext.patches.v8_5.remove_project_type_property_setter erpnext.patches.v8_7.add_more_gst_fields erpnext.patches.v8_7.fix_purchase_receipt_status erpnext.patches.v8_6.rename_bom_update_tool -erpnext.patches.v8_9.set_default_customer_group +erpnext.patches.v8_9.set_print_zero_amount_taxes +erpnext.patches.v8_9.set_default_customer_group \ No newline at end of file diff --git a/erpnext/patches/v8_9/set_print_zero_amount_taxes.py b/erpnext/patches/v8_9/set_print_zero_amount_taxes.py new file mode 100644 index 0000000000..33d3cedc48 --- /dev/null +++ b/erpnext/patches/v8_9/set_print_zero_amount_taxes.py @@ -0,0 +1,7 @@ +from __future__ import unicode_literals +import frappe + +from erpnext.setup.install import create_print_zero_amount_taxes_custom_field + +def execute(): + create_print_zero_amount_taxes_custom_field() \ No newline at end of file diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index 9bf15cee64..81f909aa84 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -5,6 +5,8 @@ from __future__ import print_function, unicode_literals import frappe from frappe import _ +from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to +from frappe.custom.doctype.custom_field.custom_field import create_custom_field default_mail_footer = """
Sent via ERPNext
""" @@ -13,7 +15,7 @@ def after_install(): frappe.get_doc({'doctype': "Role", "role_name": "Analytics"}).insert() set_single_defaults() create_compact_item_print_custom_field() - from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to + create_print_zero_amount_taxes_custom_field() add_all_roles_to("Administrator") frappe.db.commit() @@ -44,11 +46,19 @@ def set_single_defaults(): frappe.db.set_default("date_format", "dd-mm-yyyy") def create_compact_item_print_custom_field(): - from frappe.custom.doctype.custom_field.custom_field import create_custom_field create_custom_field('Print Settings', { 'label': _('Compact Item Print'), 'fieldname': 'compact_item_print', 'fieldtype': 'Check', 'default': 1, 'insert_after': 'with_letterhead' + }) + +def create_print_zero_amount_taxes_custom_field(): + create_custom_field('Print Settings', { + 'label': _('Print taxes with zero amount'), + 'fieldname': 'print_taxes_with_zero_amount', + 'fieldtype': 'Check', + 'default': 0, + 'insert_after': 'allow_print_for_cancelled' }) \ No newline at end of file diff --git a/erpnext/templates/print_formats/includes/taxes.html b/erpnext/templates/print_formats/includes/taxes.html index b7827635af..41f216e7b4 100644 --- a/erpnext/templates/print_formats/includes/taxes.html +++ b/erpnext/templates/print_formats/includes/taxes.html @@ -1,7 +1,7 @@ {%- macro render_discount_amount(doc) -%} {%- if doc.discount_amount -%}
-
+
- {{ doc.get_formatted("discount_amount", doc) }} @@ -17,7 +17,7 @@ {{ render_discount_amount(doc) }} {%- endif -%} {%- for charge in data -%} - {%- if charge.tax_amount and not charge.included_in_print_rate -%} + {%- if (charge.tax_amount or doc.flags.print_taxes_with_zero_amount) and not charge.included_in_print_rate -%}
From 8ea3bb0d9069cf3ccf97a6b9dfe6756aa9ee8e20 Mon Sep 17 00:00:00 2001 From: mbauskar Date: Thu, 14 Sep 2017 15:58:44 +0600 Subject: [PATCH 6/6] bumped to version 8.11.3 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 1c9b0b4530..65ccec47fd 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from erpnext.hooks import regional_overrides -__version__ = '8.11.2' +__version__ = '8.11.3' def get_default_company(user=None): '''Get default company for user'''