Merge branch 'develop' into quality-inspection-parameter-group

This commit is contained in:
Marica
2021-02-22 11:34:34 +05:30
committed by GitHub
18 changed files with 354 additions and 602 deletions

View File

@@ -109,7 +109,7 @@ def get_region(company=None):
''' '''
if company or frappe.flags.company: if company or frappe.flags.company:
return frappe.get_cached_value('Company', return frappe.get_cached_value('Company',
company or frappe.flags.company, 'country') company or frappe.flags.company, 'country')
elif frappe.flags.country: elif frappe.flags.country:
return frappe.flags.country return frappe.flags.country
else: else:

View File

@@ -127,6 +127,10 @@ class RequestforQuotation(BuyingController):
'link_doctype': 'Supplier', 'link_doctype': 'Supplier',
'link_name': rfq_supplier.supplier 'link_name': rfq_supplier.supplier
}) })
contact.append('email_ids', {
'email_id': user.name,
'is_primary': 1
})
if not contact.email_id and not contact.user: if not contact.email_id and not contact.user:
contact.email_id = user.name contact.email_id = user.name

View File

@@ -15,6 +15,8 @@ from erpnext.accounts.doctype.journal_entry.journal_entry import get_exchange_ra
class calculate_taxes_and_totals(object): class calculate_taxes_and_totals(object):
def __init__(self, doc): def __init__(self, doc):
self.doc = doc self.doc = doc
frappe.flags.round_off_applicable_accounts = []
get_round_off_applicable_accounts(self.doc.company, frappe.flags.round_off_applicable_accounts)
self.calculate() self.calculate()
def calculate(self): def calculate(self):
@@ -332,10 +334,18 @@ class calculate_taxes_and_totals(object):
elif tax.charge_type == "On Item Quantity": elif tax.charge_type == "On Item Quantity":
current_tax_amount = tax_rate * item.qty current_tax_amount = tax_rate * item.qty
current_tax_amount = self.get_final_current_tax_amount(tax, current_tax_amount)
self.set_item_wise_tax(item, tax, tax_rate, current_tax_amount) self.set_item_wise_tax(item, tax, tax_rate, current_tax_amount)
return current_tax_amount return current_tax_amount
def get_final_current_tax_amount(self, tax, current_tax_amount):
# Some countries need individual tax components to be rounded
# Handeled via regional doctypess
if tax.account_head in frappe.flags.round_off_applicable_accounts:
current_tax_amount = round(current_tax_amount, 0)
return current_tax_amount
def set_item_wise_tax(self, item, tax, tax_rate, current_tax_amount): def set_item_wise_tax(self, item, tax, tax_rate, current_tax_amount):
# store tax breakup for each item # store tax breakup for each item
key = item.item_code or item.item_name key = item.item_code or item.item_name
@@ -693,6 +703,15 @@ def get_itemised_tax_breakup_html(doc):
) )
) )
@frappe.whitelist()
def get_round_off_applicable_accounts(company, account_list):
account_list = get_regional_round_off_accounts(company, account_list)
return account_list
@erpnext.allow_regional
def get_regional_round_off_accounts(company, account_list):
pass
@erpnext.allow_regional @erpnext.allow_regional
def update_itemised_tax_data(doc): def update_itemised_tax_data(doc):

View File

@@ -399,6 +399,7 @@ regional_overrides = {
'erpnext.controllers.taxes_and_totals.get_itemised_tax_breakup_header': 'erpnext.regional.india.utils.get_itemised_tax_breakup_header', 'erpnext.controllers.taxes_and_totals.get_itemised_tax_breakup_header': 'erpnext.regional.india.utils.get_itemised_tax_breakup_header',
'erpnext.controllers.taxes_and_totals.get_itemised_tax_breakup_data': 'erpnext.regional.india.utils.get_itemised_tax_breakup_data', 'erpnext.controllers.taxes_and_totals.get_itemised_tax_breakup_data': 'erpnext.regional.india.utils.get_itemised_tax_breakup_data',
'erpnext.accounts.party.get_regional_address_details': 'erpnext.regional.india.utils.get_regional_address_details', 'erpnext.accounts.party.get_regional_address_details': 'erpnext.regional.india.utils.get_regional_address_details',
'erpnext.controllers.taxes_and_totals.get_regional_round_off_accounts': 'erpnext.regional.india.utils.get_regional_round_off_accounts',
'erpnext.hr.utils.calculate_annual_eligible_hra_exemption': 'erpnext.regional.india.utils.calculate_annual_eligible_hra_exemption', 'erpnext.hr.utils.calculate_annual_eligible_hra_exemption': 'erpnext.regional.india.utils.calculate_annual_eligible_hra_exemption',
'erpnext.hr.utils.calculate_hra_exemption_for_period': 'erpnext.regional.india.utils.calculate_hra_exemption_for_period', 'erpnext.hr.utils.calculate_hra_exemption_for_period': 'erpnext.regional.india.utils.calculate_hra_exemption_for_period',
'erpnext.accounts.doctype.purchase_invoice.purchase_invoice.make_regional_gl_entries': 'erpnext.regional.india.utils.make_regional_gl_entries', 'erpnext.accounts.doctype.purchase_invoice.purchase_invoice.make_regional_gl_entries': 'erpnext.regional.india.utils.make_regional_gl_entries',

View File

@@ -4,11 +4,11 @@
<thead> <thead>
<tr> <tr>
<th style="width: 16%">{{ __("Leave Type") }}</th> <th style="width: 16%">{{ __("Leave Type") }}</th>
<th style="width: 16%" class="text-right">{{ __("Total Allocated Leaves") }}</th> <th style="width: 16%" class="text-right">{{ __("Total Allocated Leave") }}</th>
<th style="width: 16%" class="text-right">{{ __("Expired Leaves") }}</th> <th style="width: 16%" class="text-right">{{ __("Expired Leave") }}</th>
<th style="width: 16%" class="text-right">{{ __("Used Leaves") }}</th> <th style="width: 16%" class="text-right">{{ __("Used Leave") }}</th>
<th style="width: 16%" class="text-right">{{ __("Pending Leaves") }}</th> <th style="width: 16%" class="text-right">{{ __("Pending Leave") }}</th>
<th style="width: 16%" class="text-right">{{ __("Available Leaves") }}</th> <th style="width: 16%" class="text-right">{{ __("Available Leave") }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -25,5 +25,5 @@
</tbody> </tbody>
</table> </table>
{% else %} {% else %}
<p style="margin-top: 30px;"> No Leaves have been allocated. </p> <p style="margin-top: 30px;"> No Leave has been allocated. </p>
{% endif %} {% endif %}

View File

@@ -40,17 +40,17 @@ def get_columns():
'fieldname': 'opening_balance', 'fieldname': 'opening_balance',
'width': 130, 'width': 130,
}, { }, {
'label': _('Leaves Allocated'), 'label': _('Leave Allocated'),
'fieldtype': 'float', 'fieldtype': 'float',
'fieldname': 'leaves_allocated', 'fieldname': 'leaves_allocated',
'width': 130, 'width': 130,
}, { }, {
'label': _('Leaves Taken'), 'label': _('Leave Taken'),
'fieldtype': 'float', 'fieldtype': 'float',
'fieldname': 'leaves_taken', 'fieldname': 'leaves_taken',
'width': 130, 'width': 130,
}, { }, {
'label': _('Leaves Expired'), 'label': _('Leave Expired'),
'fieldtype': 'float', 'fieldtype': 'float',
'fieldname': 'leaves_expired', 'fieldname': 'leaves_expired',
'width': 130, 'width': 130,

View File

@@ -246,7 +246,5 @@ def get_per_day_interest(principal_amount, rate_of_interest, posting_date=None):
if not posting_date: if not posting_date:
posting_date = getdate() posting_date = getdate()
precision = cint(frappe.db.get_default("currency_precision")) or 2 return flt((principal_amount * rate_of_interest) / (days_in_year(get_datetime(posting_date).year) * 100))
return flt((principal_amount * rate_of_interest) / (days_in_year(get_datetime(posting_date).year) * 100), precision)

View File

@@ -76,7 +76,7 @@ def get_company_wise_loan_security_details(filters, loan_security_details):
if qty: if qty:
security_wise_map[key[1]]['applicant_count'] += 1 security_wise_map[key[1]]['applicant_count'] += 1
total_portfolio_value += flt(qty * loan_security_details.get(key[1])['latest_price']) total_portfolio_value += flt(qty * loan_security_details.get(key[1], {}).get('latest_price', 0))
return security_wise_map, total_portfolio_value return security_wise_map, total_portfolio_value

View File

@@ -267,6 +267,17 @@ class JobCard(Document):
fields = ["sum(total_time_in_mins) as time_in_mins", "sum(total_completed_qty) as completed_qty"], fields = ["sum(total_time_in_mins) as time_in_mins", "sum(total_completed_qty) as completed_qty"],
filters = {"docstatus": 1, "work_order": self.work_order, "operation_id": self.operation_id}) filters = {"docstatus": 1, "work_order": self.work_order, "operation_id": self.operation_id})
def set_transferred_qty_in_job_card(self, ste_doc):
for row in ste_doc.items:
if not row.job_card_item: continue
qty = frappe.db.sql(""" SELECT SUM(qty) from `tabStock Entry Detail` sed, `tabStock Entry` se
WHERE sed.job_card_item = %s and se.docstatus = 1 and sed.parent = se.name and
se.purpose = 'Material Transfer for Manufacture'
""", (row.job_card_item))[0][0]
frappe.db.set_value('Job Card Item', row.job_card_item, 'transferred_qty', flt(qty))
def set_transferred_qty(self, update_status=False): def set_transferred_qty(self, update_status=False):
if not self.items: if not self.items:
self.transferred_qty = self.for_quantity if self.docstatus == 1 else 0 self.transferred_qty = self.for_quantity if self.docstatus == 1 else 0
@@ -279,7 +290,8 @@ class JobCard(Document):
self.transferred_qty = frappe.db.get_value('Stock Entry', { self.transferred_qty = frappe.db.get_value('Stock Entry', {
'job_card': self.name, 'job_card': self.name,
'work_order': self.work_order, 'work_order': self.work_order,
'docstatus': 1 'docstatus': 1,
'purpose': 'Material Transfer for Manufacture'
}, 'sum(fg_completed_qty)') or 0 }, 'sum(fg_completed_qty)') or 0
self.db_set("transferred_qty", self.transferred_qty) self.db_set("transferred_qty", self.transferred_qty)
@@ -420,6 +432,7 @@ def make_stock_entry(source_name, target_doc=None):
target.purpose = "Material Transfer for Manufacture" target.purpose = "Material Transfer for Manufacture"
target.from_bom = 1 target.from_bom = 1
target.fg_completed_qty = source.get('for_quantity', 0) - source.get('transferred_qty', 0) target.fg_completed_qty = source.get('for_quantity', 0) - source.get('transferred_qty', 0)
target.set_transfer_qty()
target.calculate_rate_and_amount() target.calculate_rate_and_amount()
target.set_missing_values() target.set_missing_values()
target.set_stock_entry_type() target.set_stock_entry_type()
@@ -437,9 +450,10 @@ def make_stock_entry(source_name, target_doc=None):
"field_map": { "field_map": {
"source_warehouse": "s_warehouse", "source_warehouse": "s_warehouse",
"required_qty": "qty", "required_qty": "qty",
"uom": "stock_uom" "name": "job_card_item"
}, },
"postprocess": update_item, "postprocess": update_item,
"condition": lambda doc: doc.required_qty > 0
} }
}, target_doc, set_missing_values) }, target_doc, set_missing_values)

View File

@@ -1,363 +1,120 @@
{ {
"allow_copy": 0, "actions": [],
"allow_guest_to_view": 0, "creation": "2018-07-09 17:20:44.737289",
"allow_import": 0, "doctype": "DocType",
"allow_rename": 0, "editable_grid": 1,
"beta": 0, "engine": "InnoDB",
"creation": "2018-07-09 17:20:44.737289", "field_order": [
"custom": 0, "item_code",
"docstatus": 0, "source_warehouse",
"doctype": "DocType", "uom",
"document_type": "", "item_group",
"editable_grid": 1, "column_break_3",
"engine": "InnoDB", "stock_uom",
"item_name",
"description",
"qty_section",
"required_qty",
"column_break_9",
"transferred_qty",
"allow_alternative_item"
],
"fields": [ "fields": [
{ {
"allow_bulk_edit": 0, "fieldname": "item_code",
"allow_in_quick_entry": 0, "fieldtype": "Link",
"allow_on_submit": 0, "in_list_view": 1,
"bold": 0, "label": "Item Code",
"collapsible": 0, "options": "Item",
"columns": 0, "read_only": 1
"fieldname": "item_code", },
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Item Code",
"length": 0,
"no_copy": 0,
"options": "Item",
"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, "fieldname": "source_warehouse",
"allow_in_quick_entry": 0, "fieldtype": "Link",
"allow_on_submit": 0, "ignore_user_permissions": 1,
"bold": 0, "in_list_view": 1,
"collapsible": 0, "label": "Source Warehouse",
"columns": 0, "options": "Warehouse"
"fieldname": "source_warehouse", },
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 1,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Source Warehouse",
"length": 0,
"no_copy": 0,
"options": "Warehouse",
"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, "fieldname": "uom",
"allow_in_quick_entry": 0, "fieldtype": "Link",
"allow_on_submit": 0, "label": "UOM",
"bold": 0, "options": "UOM"
"collapsible": 0, },
"columns": 0,
"fieldname": "uom",
"fieldtype": "Link",
"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": "UOM",
"length": 0,
"no_copy": 0,
"options": "UOM",
"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, "fieldname": "column_break_3",
"allow_in_quick_entry": 0, "fieldtype": "Column Break"
"allow_on_submit": 0, },
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_3",
"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, "fieldname": "item_name",
"allow_in_quick_entry": 0, "fieldtype": "Data",
"allow_on_submit": 0, "label": "Item Name",
"bold": 0, "read_only": 1
"collapsible": 0, },
"columns": 0,
"fieldname": "item_name",
"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": "Item Name",
"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, "fieldname": "description",
"allow_in_quick_entry": 0, "fieldtype": "Text",
"allow_on_submit": 0, "label": "Description",
"bold": 0, "read_only": 1
"collapsible": 0, },
"columns": 0,
"fieldname": "description",
"fieldtype": "Text",
"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": "Description",
"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, "fieldname": "qty_section",
"allow_in_quick_entry": 0, "fieldtype": "Section Break",
"allow_on_submit": 0, "label": "Qty"
"bold": 0, },
"collapsible": 0,
"columns": 0,
"fieldname": "qty_section",
"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": "Qty",
"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, "fieldname": "required_qty",
"allow_in_quick_entry": 0, "fieldtype": "Float",
"allow_on_submit": 0, "in_list_view": 1,
"bold": 0, "label": "Required Qty",
"collapsible": 0, "read_only": 1
"columns": 0, },
"fieldname": "required_qty",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Required Qty",
"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, "fieldname": "column_break_9",
"allow_in_quick_entry": 0, "fieldtype": "Column Break"
"allow_on_submit": 0, },
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_9",
"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, "default": "0",
"allow_in_quick_entry": 0, "fieldname": "allow_alternative_item",
"allow_on_submit": 0, "fieldtype": "Check",
"bold": 0, "label": "Allow Alternative Item"
"collapsible": 0, },
"columns": 0, {
"fieldname": "allow_alternative_item", "fetch_from": "item_code.item_group",
"fieldtype": "Check", "fieldname": "item_group",
"hidden": 0, "fieldtype": "Link",
"ignore_user_permissions": 0, "label": "Item Group",
"ignore_xss_filter": 0, "options": "Item Group",
"in_filter": 0, "read_only": 1
"in_global_search": 0, },
"in_list_view": 0, {
"in_standard_filter": 0, "fetch_from": "item_code.stock_uom",
"label": "Allow Alternative Item", "fieldname": "stock_uom",
"length": 0, "fieldtype": "Link",
"no_copy": 0, "label": "Stock UOM",
"permlevel": 0, "options": "UOM"
"precision": "", },
"print_hide": 0, {
"print_hide_if_no_value": 0, "fieldname": "transferred_qty",
"read_only": 0, "fieldtype": "Float",
"remember_last_selected_value": 0, "label": "Transferred Qty",
"report_hide": 0, "no_copy": 1,
"reqd": 0, "print_hide": 1,
"search_index": 0, "read_only": 1
"set_only_once": 0,
"translatable": 0,
"unique": 0
} }
], ],
"has_web_view": 0, "index_web_pages_for_search": 1,
"hide_heading": 0, "istable": 1,
"hide_toolbar": 0, "links": [],
"idx": 0, "modified": "2021-02-11 13:50:13.804108",
"image_view": 0, "modified_by": "Administrator",
"in_create": 0, "module": "Manufacturing",
"is_submittable": 0, "name": "Job Card Item",
"issingle": 0, "owner": "Administrator",
"istable": 1, "permissions": [],
"max_attachments": 0, "quick_entry": 1,
"modified": "2018-08-28 15:23:48.099459", "sort_field": "modified",
"modified_by": "Administrator", "sort_order": "DESC",
"module": "Manufacturing", "track_changes": 1
"name": "Job Card Item",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0,
"track_views": 0
} }

View File

@@ -2,7 +2,9 @@
// License: GNU General Public License v3. See license.txt // License: GNU General Public License v3. See license.txt
erpnext.taxes_and_totals = erpnext.payments.extend({ erpnext.taxes_and_totals = erpnext.payments.extend({
setup: function() {}, setup: function() {
this.fetch_round_off_accounts();
},
apply_pricing_rule_on_item: function(item) { apply_pricing_rule_on_item: function(item) {
let effective_item_rate = item.price_list_rate; let effective_item_rate = item.price_list_rate;
@@ -152,6 +154,22 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
}); });
}, },
fetch_round_off_accounts: function() {
let me = this;
frappe.flags.round_off_applicable_accounts = [];
return frappe.call({
"method": "erpnext.controllers.taxes_and_totals.get_round_off_applicable_accounts",
"args": {
"company": me.frm.doc.company,
"account_list": frappe.flags.round_off_applicable_accounts
},
callback: function(r) {
frappe.flags.round_off_applicable_accounts.push(...r.message);
}
});
},
determine_exclusive_rate: function() { determine_exclusive_rate: function() {
var me = this; var me = this;
@@ -372,11 +390,21 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
} else if (tax.charge_type == "On Item Quantity") { } else if (tax.charge_type == "On Item Quantity") {
current_tax_amount = tax_rate * item.qty; current_tax_amount = tax_rate * item.qty;
} }
current_tax_amount = this.get_final_tax_amount(tax, current_tax_amount);
this.set_item_wise_tax(item, tax, tax_rate, current_tax_amount); this.set_item_wise_tax(item, tax, tax_rate, current_tax_amount);
return current_tax_amount; return current_tax_amount;
}, },
get_final_tax_amount: function(tax, current_tax_amount) {
if (frappe.flags.round_off_applicable_accounts.includes(tax.account_head)) {
current_tax_amount = Math.round(current_tax_amount);
}
return current_tax_amount;
},
set_item_wise_tax: function(item, tax, tax_rate, current_tax_amount) { set_item_wise_tax: function(item, tax, tax_rate, current_tax_amount) {
// store tax breakup for each item // store tax breakup for each item
let tax_detail = tax.item_wise_tax_detail; let tax_detail = tax.item_wise_tax_detail;

View File

@@ -1,222 +1,86 @@
{ {
"allow_copy": 0, "actions": [],
"allow_guest_to_view": 0, "creation": "2017-06-27 15:09:01.318003",
"allow_import": 0, "doctype": "DocType",
"allow_rename": 0, "editable_grid": 1,
"beta": 0, "engine": "InnoDB",
"creation": "2017-06-27 15:09:01.318003", "field_order": [
"custom": 0, "gst_summary",
"docstatus": 0, "column_break_2",
"doctype": "DocType", "round_off_gst_values",
"document_type": "", "gstin_email_sent_on",
"editable_grid": 1, "section_break_4",
"engine": "InnoDB", "gst_accounts",
"b2c_limit"
],
"fields": [ "fields": [
{ {
"allow_bulk_edit": 0, "fieldname": "gst_summary",
"allow_on_submit": 0, "fieldtype": "HTML",
"bold": 0, "label": "GST Summary",
"collapsible": 0, "show_days": 1,
"columns": 0, "show_seconds": 1
"fieldname": "gst_summary", },
"fieldtype": "HTML",
"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": "GST Summary",
"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,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fieldname": "column_break_2",
"allow_on_submit": 0, "fieldtype": "Column Break",
"bold": 0, "show_days": 1,
"collapsible": 0, "show_seconds": 1
"columns": 0, },
"fieldname": "column_break_2",
"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,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fieldname": "gstin_email_sent_on",
"allow_on_submit": 0, "fieldtype": "Date",
"bold": 0, "label": "GSTIN Email Sent On",
"collapsible": 0, "read_only": 1,
"columns": 0, "show_days": 1,
"fieldname": "gstin_email_sent_on", "show_seconds": 1
"fieldtype": "Date", },
"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": "GSTIN Email Sent On",
"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,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fieldname": "section_break_4",
"allow_on_submit": 0, "fieldtype": "Section Break",
"bold": 0, "show_days": 1,
"collapsible": 0, "show_seconds": 1
"columns": 0, },
"fieldname": "section_break_4",
"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,
"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,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "fieldname": "gst_accounts",
"allow_on_submit": 0, "fieldtype": "Table",
"bold": 0, "label": "GST Accounts",
"collapsible": 0, "options": "GST Account",
"columns": 0, "show_days": 1,
"fieldname": "gst_accounts", "show_seconds": 1
"fieldtype": "Table", },
"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": "GST Accounts",
"length": 0,
"no_copy": 0,
"options": "GST 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,
"unique": 0
},
{ {
"allow_bulk_edit": 0, "default": "250000",
"allow_on_submit": 0, "description": "Set Invoice Value for B2C. B2CL and B2CS calculated based on this invoice value.",
"bold": 0, "fieldname": "b2c_limit",
"collapsible": 0, "fieldtype": "Data",
"columns": 0, "in_list_view": 1,
"default": "250000", "label": "B2C Limit",
"description": "Set Invoice Value for B2C. B2CL and B2CS calculated based on this invoice value.", "reqd": 1,
"fieldname": "b2c_limit", "show_days": 1,
"fieldtype": "Data", "show_seconds": 1
"hidden": 0, },
"ignore_user_permissions": 0, {
"ignore_xss_filter": 0, "default": "0",
"in_filter": 0, "description": "Enabling this option will round off individual GST components in all the Invoices",
"in_global_search": 0, "fieldname": "round_off_gst_values",
"in_list_view": 1, "fieldtype": "Check",
"in_standard_filter": 0, "label": "Round Off GST Values",
"label": "B2C Limit", "show_days": 1,
"length": 0, "show_seconds": 1
"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": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
} }
], ],
"has_web_view": 0, "index_web_pages_for_search": 1,
"hide_heading": 0, "issingle": 1,
"hide_toolbar": 0, "links": [],
"idx": 0, "modified": "2021-01-28 17:19:47.969260",
"image_view": 0, "modified_by": "Administrator",
"in_create": 0, "module": "Regional",
"is_submittable": 0, "name": "GST Settings",
"issingle": 1, "owner": "Administrator",
"istable": 0, "permissions": [],
"max_attachments": 0, "quick_entry": 1,
"modified": "2018-02-14 08:14:15.375181", "sort_field": "modified",
"modified_by": "Administrator", "sort_order": "DESC",
"module": "Regional", "track_changes": 1
"name": "GST Settings", }
"name_case": "",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

View File

@@ -14,8 +14,20 @@ import json
test_dependencies = ["Territory", "Customer Group", "Supplier Group", "Item"] test_dependencies = ["Territory", "Customer Group", "Supplier Group", "Item"]
class TestGSTR3BReport(unittest.TestCase): class TestGSTR3BReport(unittest.TestCase):
def test_gstr_3b_report(self): def setUp(self):
frappe.set_user("Administrator")
frappe.db.sql("delete from `tabSales Invoice` where company='_Test Company GST'")
frappe.db.sql("delete from `tabPurchase Invoice` where company='_Test Company GST'")
frappe.db.sql("delete from `tabGSTR 3B Report` where company='_Test Company GST'")
make_company()
make_item("Milk", properties = {"is_nil_exempt": 1, "standard_rate": 0.000000})
set_account_heads()
make_customers()
make_suppliers()
def test_gstr_3b_report(self):
month_number_mapping = { month_number_mapping = {
1: "January", 1: "January",
2: "February", 2: "February",
@@ -31,17 +43,6 @@ class TestGSTR3BReport(unittest.TestCase):
12: "December" 12: "December"
} }
frappe.set_user("Administrator")
frappe.db.sql("delete from `tabSales Invoice` where company='_Test Company GST'")
frappe.db.sql("delete from `tabPurchase Invoice` where company='_Test Company GST'")
frappe.db.sql("delete from `tabGSTR 3B Report` where company='_Test Company GST'")
make_company()
make_item("Milk", properties = {"is_nil_exempt": 1, "standard_rate": 0.000000})
set_account_heads()
make_customers()
make_suppliers()
make_sales_invoice() make_sales_invoice()
create_purchase_invoices() create_purchase_invoices()
@@ -67,6 +68,42 @@ class TestGSTR3BReport(unittest.TestCase):
self.assertEqual(output["itc_elg"]["itc_avl"][4]["samt"], 22.50) self.assertEqual(output["itc_elg"]["itc_avl"][4]["samt"], 22.50)
self.assertEqual(output["itc_elg"]["itc_avl"][4]["camt"], 22.50) self.assertEqual(output["itc_elg"]["itc_avl"][4]["camt"], 22.50)
def test_gst_rounding(self):
gst_settings = frappe.get_doc('GST Settings')
gst_settings.round_off_gst_values = 1
gst_settings.save()
current_country = frappe.flags.country
frappe.flags.country = 'India'
si = create_sales_invoice(company="_Test Company GST",
customer = '_Test GST Customer',
currency = 'INR',
warehouse = 'Finished Goods - _GST',
debit_to = 'Debtors - _GST',
income_account = 'Sales - _GST',
expense_account = 'Cost of Goods Sold - _GST',
cost_center = 'Main - _GST',
rate=216,
do_not_save=1
)
si.append("taxes", {
"charge_type": "On Net Total",
"account_head": "IGST - _GST",
"cost_center": "Main - _GST",
"description": "IGST @ 18.0",
"rate": 18
})
si.save()
# Check for 39 instead of 38.88
self.assertEqual(si.taxes[0].base_tax_amount_after_discount_amount, 39)
frappe.flags.country = current_country
gst_settings.round_off_gst_values = 1
gst_settings.save()
def make_sales_invoice(): def make_sales_invoice():
si = create_sales_invoice(company="_Test Company GST", si = create_sales_invoice(company="_Test Company GST",
customer = '_Test GST Customer', customer = '_Test GST Customer',
@@ -145,7 +182,6 @@ def make_sales_invoice():
si3.submit() si3.submit()
def create_purchase_invoices(): def create_purchase_invoices():
pi = make_purchase_invoice( pi = make_purchase_invoice(
company="_Test Company GST", company="_Test Company GST",
supplier = '_Test Registered Supplier', supplier = '_Test Registered Supplier',
@@ -193,7 +229,6 @@ def create_purchase_invoices():
pi1.submit() pi1.submit()
def make_suppliers(): def make_suppliers():
if not frappe.db.exists("Supplier", "_Test Registered Supplier"): if not frappe.db.exists("Supplier", "_Test Registered Supplier"):
frappe.get_doc({ frappe.get_doc({
"supplier_group": "_Test Supplier Group", "supplier_group": "_Test Supplier Group",
@@ -257,7 +292,6 @@ def make_suppliers():
address.save() address.save()
def make_customers(): def make_customers():
if not frappe.db.exists("Customer", "_Test GST Customer"): if not frappe.db.exists("Customer", "_Test GST Customer"):
frappe.get_doc({ frappe.get_doc({
"customer_group": "_Test Customer Group", "customer_group": "_Test Customer Group",
@@ -354,9 +388,9 @@ def make_customers():
address.save() address.save()
def make_company(): def make_company():
if frappe.db.exists("Company", "_Test Company GST"): if frappe.db.exists("Company", "_Test Company GST"):
return return
company = frappe.new_doc("Company") company = frappe.new_doc("Company")
company.company_name = "_Test Company GST" company.company_name = "_Test Company GST"
company.abbr = "_GST" company.abbr = "_GST"
@@ -388,7 +422,6 @@ def make_company():
address.save() address.save()
def set_account_heads(): def set_account_heads():
gst_settings = frappe.get_doc("GST Settings") gst_settings = frappe.get_doc("GST Settings")
gst_account = frappe.get_all( gst_account = frappe.get_all(

View File

@@ -772,3 +772,24 @@ def make_regional_gl_entries(gl_entries, doc):
) )
return gl_entries return gl_entries
@frappe.whitelist()
def get_regional_round_off_accounts(company, account_list):
country = frappe.get_cached_value('Company', company, 'country')
if country != 'India':
return
if isinstance(account_list, string_types):
account_list = json.loads(account_list)
if not frappe.db.get_single_value('GST Settings', 'round_off_gst_values'):
return
gst_accounts = get_gst_accounts(company)
gst_account_list = gst_accounts.get('cgst_account') + gst_accounts.get('sgst_account') \
+ gst_accounts.get('igst_account')
account_list.extend(gst_account_list)
return account_list

View File

@@ -236,6 +236,7 @@ class Gstr1Report(object):
self.cgst_sgst_invoices = [] self.cgst_sgst_invoices = []
unidentified_gst_accounts = [] unidentified_gst_accounts = []
unidentified_gst_accounts_invoice = []
for parent, account, item_wise_tax_detail, tax_amount in self.tax_details: for parent, account, item_wise_tax_detail, tax_amount in self.tax_details:
if account in self.gst_accounts.cess_account: if account in self.gst_accounts.cess_account:
self.invoice_cess.setdefault(parent, tax_amount) self.invoice_cess.setdefault(parent, tax_amount)
@@ -251,6 +252,7 @@ class Gstr1Report(object):
if not (cgst_or_sgst or account in self.gst_accounts.igst_account): if not (cgst_or_sgst or account in self.gst_accounts.igst_account):
if "gst" in account.lower() and account not in unidentified_gst_accounts: if "gst" in account.lower() and account not in unidentified_gst_accounts:
unidentified_gst_accounts.append(account) unidentified_gst_accounts.append(account)
unidentified_gst_accounts_invoice.append(parent)
continue continue
for item_code, tax_amounts in item_wise_tax_detail.items(): for item_code, tax_amounts in item_wise_tax_detail.items():
@@ -273,7 +275,7 @@ class Gstr1Report(object):
# Build itemised tax for export invoices where tax table is blank # Build itemised tax for export invoices where tax table is blank
for invoice, items in iteritems(self.invoice_items): for invoice, items in iteritems(self.invoice_items):
if invoice not in self.items_based_on_tax_rate \ if invoice not in self.items_based_on_tax_rate and invoice not in unidentified_gst_accounts_invoice \
and frappe.db.get_value(self.doctype, invoice, "export_type") == "Without Payment of Tax": and frappe.db.get_value(self.doctype, invoice, "export_type") == "Without Payment of Tax":
self.items_based_on_tax_rate.setdefault(invoice, {}).setdefault(0, items.keys()) self.items_based_on_tax_rate.setdefault(invoice, {}).setdefault(0, items.keys())

View File

@@ -28,7 +28,7 @@ def delete_company_transactions(company_name):
"Party Account", "Employee", "Sales Taxes and Charges Template", "Party Account", "Employee", "Sales Taxes and Charges Template",
"Purchase Taxes and Charges Template", "POS Profile", "BOM", "Purchase Taxes and Charges Template", "POS Profile", "BOM",
"Company", "Bank Account", "Item Tax Template", "Mode Of Payment", "Company", "Bank Account", "Item Tax Template", "Mode Of Payment",
"Item Default", "Customer", "Supplier"): "Item Default", "Customer", "Supplier", "GST Account"):
delete_for_doctype(doctype, company_name) delete_for_doctype(doctype, company_name)
# reset company values # reset company values

View File

@@ -163,7 +163,7 @@ class StockEntry(StockController):
if self.purpose not in valid_purposes: if self.purpose not in valid_purposes:
frappe.throw(_("Purpose must be one of {0}").format(comma_or(valid_purposes))) frappe.throw(_("Purpose must be one of {0}").format(comma_or(valid_purposes)))
if self.job_card and self.purpose != 'Material Transfer for Manufacture': if self.job_card and self.purpose not in ['Material Transfer for Manufacture', 'Repack']:
frappe.throw(_("For job card {0}, you can only make the 'Material Transfer for Manufacture' type stock entry") frappe.throw(_("For job card {0}, you can only make the 'Material Transfer for Manufacture' type stock entry")
.format(self.job_card)) .format(self.job_card))
@@ -823,6 +823,7 @@ class StockEntry(StockController):
if self.job_card: if self.job_card:
job_doc = frappe.get_doc('Job Card', self.job_card) job_doc = frappe.get_doc('Job Card', self.job_card)
job_doc.set_transferred_qty(update_status=True) job_doc.set_transferred_qty(update_status=True)
job_doc.set_transferred_qty_in_job_card(self)
if self.work_order: if self.work_order:
pro_doc = frappe.get_doc("Work Order", self.work_order) pro_doc = frappe.get_doc("Work Order", self.work_order)

View File

@@ -69,7 +69,8 @@
"putaway_rule", "putaway_rule",
"column_break_51", "column_break_51",
"reference_purchase_receipt", "reference_purchase_receipt",
"quality_inspection" "quality_inspection",
"job_card_item"
], ],
"fields": [ "fields": [
{ {
@@ -532,13 +533,22 @@
"fieldname": "is_finished_item", "fieldname": "is_finished_item",
"fieldtype": "Check", "fieldtype": "Check",
"label": "Is Finished Item" "label": "Is Finished Item"
},
{
"fieldname": "job_card_item",
"fieldtype": "Data",
"hidden": 1,
"label": "Job Card Item",
"no_copy": 1,
"print_hide": 1,
"read_only": 1
} }
], ],
"idx": 1, "idx": 1,
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
"modified": "2020-12-30 15:00:44.489442", "modified": "2021-02-11 13:47:50.158754",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Stock Entry Detail", "name": "Stock Entry Detail",