mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-29 18:04:46 +00:00
Merge branch 'version-12-hotfix' into fix-margin-calculation
This commit is contained in:
@@ -21,6 +21,14 @@ frappe.ui.form.on("Bank Reconciliation", {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
frm.set_query("bank_account", function() {
|
||||||
|
return {
|
||||||
|
"filters": {
|
||||||
|
"is_company_account": 1
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
frm.set_value("from_date", frappe.datetime.month_start());
|
frm.set_value("from_date", frappe.datetime.month_start());
|
||||||
frm.set_value("to_date", frappe.datetime.month_end());
|
frm.set_value("to_date", frappe.datetime.month_end());
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -531,7 +531,8 @@
|
|||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 1,
|
"hidden": 1,
|
||||||
"label": "Title",
|
"label": "Title",
|
||||||
"print_hide": 1
|
"print_hide": 1,
|
||||||
|
"read_only": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"depends_on": "party",
|
"depends_on": "party",
|
||||||
@@ -575,7 +576,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"modified": "2019-11-06 12:59:43.151721",
|
"modified": "2021-03-10 13:05:16.958866",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Payment Entry",
|
"name": "Payment Entry",
|
||||||
@@ -619,4 +620,4 @@
|
|||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"title_field": "title",
|
"title_field": "title",
|
||||||
"track_changes": 1
|
"track_changes": 1
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -441,6 +441,10 @@ class PaymentEntry(AccountsController):
|
|||||||
.format(total_negative_outstanding), InvalidPaymentEntry)
|
.format(total_negative_outstanding), InvalidPaymentEntry)
|
||||||
|
|
||||||
def set_title(self):
|
def set_title(self):
|
||||||
|
if frappe.flags.in_import and self.title:
|
||||||
|
# do not set title dynamically if title exists during data import.
|
||||||
|
return
|
||||||
|
|
||||||
if self.payment_type in ("Receive", "Pay"):
|
if self.payment_type in ("Receive", "Pay"):
|
||||||
self.title = self.party
|
self.title = self.party
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -224,8 +224,7 @@ def get_company_currency(filters=None):
|
|||||||
def calculate_values(accounts_by_name, gl_entries_by_account, companies, fiscal_year, filters):
|
def calculate_values(accounts_by_name, gl_entries_by_account, companies, fiscal_year, filters):
|
||||||
for entries in gl_entries_by_account.values():
|
for entries in gl_entries_by_account.values():
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
key = entry.account_number or entry.account_name
|
d = accounts_by_name.get(entry.account_name)
|
||||||
d = accounts_by_name.get(key)
|
|
||||||
if d:
|
if d:
|
||||||
for company in companies:
|
for company in companies:
|
||||||
# check if posting date is within the period
|
# check if posting date is within the period
|
||||||
@@ -240,7 +239,8 @@ def accumulate_values_into_parents(accounts, accounts_by_name, companies):
|
|||||||
"""accumulate children's values in parent accounts"""
|
"""accumulate children's values in parent accounts"""
|
||||||
for d in reversed(accounts):
|
for d in reversed(accounts):
|
||||||
if d.parent_account:
|
if d.parent_account:
|
||||||
account = d.parent_account.split('-')[0].strip()
|
account = d.parent_account_name
|
||||||
|
|
||||||
if not accounts_by_name.get(account):
|
if not accounts_by_name.get(account):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -251,16 +251,34 @@ def accumulate_values_into_parents(accounts, accounts_by_name, companies):
|
|||||||
accounts_by_name[account]["opening_balance"] = \
|
accounts_by_name[account]["opening_balance"] = \
|
||||||
accounts_by_name[account].get("opening_balance", 0.0) + d.get("opening_balance", 0.0)
|
accounts_by_name[account].get("opening_balance", 0.0) + d.get("opening_balance", 0.0)
|
||||||
|
|
||||||
|
|
||||||
def get_account_heads(root_type, companies, filters):
|
def get_account_heads(root_type, companies, filters):
|
||||||
accounts = get_accounts(root_type, filters)
|
accounts = get_accounts(root_type, filters)
|
||||||
|
|
||||||
if not accounts:
|
if not accounts:
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
|
accounts = update_parent_account_names(accounts)
|
||||||
|
|
||||||
accounts, accounts_by_name, parent_children_map = filter_accounts(accounts)
|
accounts, accounts_by_name, parent_children_map = filter_accounts(accounts)
|
||||||
|
|
||||||
return accounts, accounts_by_name
|
return accounts, accounts_by_name
|
||||||
|
|
||||||
|
def update_parent_account_names(accounts):
|
||||||
|
"""Update parent_account_name in accounts list.
|
||||||
|
|
||||||
|
parent_name is `name` of parent account which could have other prefix
|
||||||
|
of account_number and suffix of company abbr. This function adds key called
|
||||||
|
`parent_account_name` which does not have such prefix/suffix.
|
||||||
|
"""
|
||||||
|
name_to_account_map = { d.name : d.account_name for d in accounts }
|
||||||
|
|
||||||
|
for account in accounts:
|
||||||
|
if account.parent_account:
|
||||||
|
account["parent_account_name"] = name_to_account_map[account.parent_account]
|
||||||
|
|
||||||
|
return accounts
|
||||||
|
|
||||||
def get_companies(filters):
|
def get_companies(filters):
|
||||||
companies = {}
|
companies = {}
|
||||||
all_companies = get_subsidiary_companies(filters.get('company'))
|
all_companies = get_subsidiary_companies(filters.get('company'))
|
||||||
@@ -367,9 +385,9 @@ def set_gl_entries_by_account(from_date, to_date, root_lft, root_rgt, filters, g
|
|||||||
convert_to_presentation_currency(gl_entries, currency_info)
|
convert_to_presentation_currency(gl_entries, currency_info)
|
||||||
|
|
||||||
for entry in gl_entries:
|
for entry in gl_entries:
|
||||||
key = entry.account_number or entry.account_name
|
account_name = entry.account_name
|
||||||
validate_entries(key, entry, accounts_by_name, accounts)
|
validate_entries(account_name, entry, accounts_by_name, accounts)
|
||||||
gl_entries_by_account.setdefault(key, []).append(entry)
|
gl_entries_by_account.setdefault(account_name, []).append(entry)
|
||||||
|
|
||||||
return gl_entries_by_account
|
return gl_entries_by_account
|
||||||
|
|
||||||
@@ -438,8 +456,7 @@ def filter_accounts(accounts, depth=10):
|
|||||||
parent_children_map = {}
|
parent_children_map = {}
|
||||||
accounts_by_name = {}
|
accounts_by_name = {}
|
||||||
for d in accounts:
|
for d in accounts:
|
||||||
key = d.account_number or d.account_name
|
accounts_by_name[d.account_name] = d
|
||||||
accounts_by_name[key] = d
|
|
||||||
parent_children_map.setdefault(d.parent_account or None, []).append(d)
|
parent_children_map.setdefault(d.parent_account or None, []).append(d)
|
||||||
|
|
||||||
filtered_accounts = []
|
filtered_accounts = []
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ def call_mws_method(mws_method, *args, **kwargs):
|
|||||||
return response
|
return response
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
delay = math.pow(4, x) * 125
|
delay = math.pow(4, x) * 125
|
||||||
frappe.log_error(message=e, title=str(mws_method))
|
frappe.log_error(message=e, title="Method {} failed".format(mws_method.__name__))
|
||||||
time.sleep(delay)
|
time.sleep(delay)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|||||||
@@ -261,6 +261,9 @@ doc_events = {
|
|||||||
('Sales Invoice', 'Sales Order', 'Delivery Note', 'Purchase Invoice', 'Purchase Order', 'Purchase Receipt'): {
|
('Sales Invoice', 'Sales Order', 'Delivery Note', 'Purchase Invoice', 'Purchase Order', 'Purchase Receipt'): {
|
||||||
'validate': ['erpnext.regional.india.utils.set_place_of_supply']
|
'validate': ['erpnext.regional.india.utils.set_place_of_supply']
|
||||||
},
|
},
|
||||||
|
('Sales Invoice', 'Purchase Invoice'): {
|
||||||
|
'validate': ['erpnext.regional.india.utils.validate_document_name']
|
||||||
|
},
|
||||||
"Contact": {
|
"Contact": {
|
||||||
"on_trash": "erpnext.support.doctype.issue.issue.update_issue",
|
"on_trash": "erpnext.support.doctype.issue.issue.update_issue",
|
||||||
"after_insert": "erpnext.communication.doctype.call_log.call_log.set_caller_information",
|
"after_insert": "erpnext.communication.doctype.call_log.call_log.set_caller_information",
|
||||||
|
|||||||
@@ -350,13 +350,12 @@ class GSTR3BReport(Document):
|
|||||||
return inter_state_supply_details
|
return inter_state_supply_details
|
||||||
|
|
||||||
def get_inward_nil_exempt(self, state):
|
def get_inward_nil_exempt(self, state):
|
||||||
|
|
||||||
inward_nil_exempt = frappe.db.sql(""" select p.place_of_supply, sum(i.base_amount) as base_amount,
|
inward_nil_exempt = frappe.db.sql(""" select p.place_of_supply, sum(i.base_amount) as base_amount,
|
||||||
i.is_nil_exempt, i.is_non_gst from `tabPurchase Invoice` p , `tabPurchase Invoice Item` i
|
i.is_nil_exempt, i.is_non_gst from `tabPurchase Invoice` p , `tabPurchase Invoice Item` i
|
||||||
where p.docstatus = 1 and p.name = i.parent
|
where p.docstatus = 1 and p.name = i.parent
|
||||||
and i.is_nil_exempt = 1 or i.is_non_gst = 1 and
|
and (i.is_nil_exempt = 1 or i.is_non_gst = 1) and
|
||||||
month(p.posting_date) = %s and year(p.posting_date) = %s and p.company = %s and p.company_gstin = %s
|
month(p.posting_date) = %s and year(p.posting_date) = %s and p.company = %s and p.company_gstin = %s
|
||||||
group by p.place_of_supply """, (self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1)
|
group by p.place_of_supply, i.is_nil_exempt, i.is_non_gst""", (self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1)
|
||||||
|
|
||||||
inward_nil_exempt_details = {
|
inward_nil_exempt_details = {
|
||||||
"gst": {
|
"gst": {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe, re, json
|
import frappe, re, json
|
||||||
from frappe import _
|
from frappe import _
|
||||||
import erpnext
|
import erpnext
|
||||||
from frappe.utils import cstr, flt, date_diff, nowdate, round_based_on_smallest_currency_fraction, money_in_words
|
from frappe.utils import cstr, flt, date_diff, nowdate, round_based_on_smallest_currency_fraction, money_in_words, getdate
|
||||||
from erpnext.regional.india import states, state_numbers
|
from erpnext.regional.india import states, state_numbers
|
||||||
from erpnext.controllers.taxes_and_totals import get_itemised_tax, get_itemised_taxable_amount, calculate_outstanding_amount
|
from erpnext.controllers.taxes_and_totals import get_itemised_tax, get_itemised_taxable_amount, calculate_outstanding_amount
|
||||||
from erpnext.controllers.accounts_controller import get_taxes_and_charges
|
from erpnext.controllers.accounts_controller import get_taxes_and_charges
|
||||||
@@ -15,6 +15,13 @@ from erpnext.accounts.utils import get_account_currency
|
|||||||
from frappe.contacts.doctype.address.address import get_address_display
|
from frappe.contacts.doctype.address.address import get_address_display
|
||||||
from frappe.model.utils import get_fetch_values
|
from frappe.model.utils import get_fetch_values
|
||||||
|
|
||||||
|
|
||||||
|
GST_INVOICE_NUMBER_FORMAT = re.compile(r"^[a-zA-Z0-9\-/]+$") #alphanumeric and - /
|
||||||
|
GSTIN_FORMAT = re.compile("^[0-9]{2}[A-Z]{4}[0-9A-Z]{1}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}[1-9A-Z]{1}[0-9A-Z]{1}$")
|
||||||
|
GSTIN_UIN_FORMAT = re.compile("^[0-9]{4}[A-Z]{3}[0-9]{5}[0-9A-Z]{3}")
|
||||||
|
PAN_NUMBER_FORMAT = re.compile("[A-Z]{5}[0-9]{4}[A-Z]{1}")
|
||||||
|
|
||||||
|
|
||||||
def validate_gstin_for_india(doc, method):
|
def validate_gstin_for_india(doc, method):
|
||||||
if hasattr(doc, 'gst_state') and doc.gst_state:
|
if hasattr(doc, 'gst_state') and doc.gst_state:
|
||||||
doc.gst_state_number = state_numbers[doc.gst_state]
|
doc.gst_state_number = state_numbers[doc.gst_state]
|
||||||
@@ -38,12 +45,10 @@ def validate_gstin_for_india(doc, method):
|
|||||||
frappe.throw(_("Invalid GSTIN! A GSTIN must have 15 characters."))
|
frappe.throw(_("Invalid GSTIN! A GSTIN must have 15 characters."))
|
||||||
|
|
||||||
if gst_category and gst_category == 'UIN Holders':
|
if gst_category and gst_category == 'UIN Holders':
|
||||||
p = re.compile("^[0-9]{4}[A-Z]{3}[0-9]{5}[0-9A-Z]{3}")
|
if not GSTIN_UIN_FORMAT.match(doc.gstin):
|
||||||
if not p.match(doc.gstin):
|
|
||||||
frappe.throw(_("Invalid GSTIN! The input you've entered doesn't match the GSTIN format for UIN Holders or Non-Resident OIDAR Service Providers"))
|
frappe.throw(_("Invalid GSTIN! The input you've entered doesn't match the GSTIN format for UIN Holders or Non-Resident OIDAR Service Providers"))
|
||||||
else:
|
else:
|
||||||
p = re.compile("^[0-9]{2}[A-Z]{4}[0-9A-Z]{1}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}[1-9A-Z]{1}[0-9A-Z]{1}$")
|
if not GSTIN_FORMAT.match(doc.gstin):
|
||||||
if not p.match(doc.gstin):
|
|
||||||
frappe.throw(_("Invalid GSTIN! The input you've entered doesn't match the format of GSTIN."))
|
frappe.throw(_("Invalid GSTIN! The input you've entered doesn't match the format of GSTIN."))
|
||||||
|
|
||||||
validate_gstin_check_digit(doc.gstin)
|
validate_gstin_check_digit(doc.gstin)
|
||||||
@@ -162,6 +167,20 @@ def set_transporter_address(doc, method=None):
|
|||||||
doc.transporter_address = transporter_address
|
doc.transporter_address = transporter_address
|
||||||
doc.transporter_address_display = get_address_display(transporter_address)
|
doc.transporter_address_display = get_address_display(transporter_address)
|
||||||
|
|
||||||
|
def validate_document_name(doc, method=None):
|
||||||
|
"""Validate GST invoice number requirements."""
|
||||||
|
country = frappe.get_cached_value("Company", doc.company, "country")
|
||||||
|
|
||||||
|
# Date was chosen as start of next FY to avoid irritating current users.
|
||||||
|
if country != "India" or getdate(doc.posting_date) < getdate("2021-04-01"):
|
||||||
|
return
|
||||||
|
|
||||||
|
if len(doc.name) > 16:
|
||||||
|
frappe.throw(_("Maximum length of document number should be 16 characters as per GST rules. Please change the naming series."))
|
||||||
|
|
||||||
|
if not GST_INVOICE_NUMBER_FORMAT.match(doc.name):
|
||||||
|
frappe.throw(_("Document name should only contain alphanumeric values, dash(-) and slash(/) characters as per GST rules. Please change the naming series."))
|
||||||
|
|
||||||
# don't remove this function it is used in tests
|
# don't remove this function it is used in tests
|
||||||
def test_method():
|
def test_method():
|
||||||
'''test function'''
|
'''test function'''
|
||||||
@@ -715,25 +734,12 @@ def update_grand_total_for_rcm(doc, method):
|
|||||||
if country != 'India':
|
if country != 'India':
|
||||||
return
|
return
|
||||||
|
|
||||||
if not doc.total_taxes_and_charges:
|
gst_tax, base_gst_tax = get_gst_tax_amount(doc)
|
||||||
|
|
||||||
|
if not base_gst_tax:
|
||||||
return
|
return
|
||||||
|
|
||||||
if doc.reverse_charge == 'Y':
|
if doc.reverse_charge == 'Y':
|
||||||
gst_accounts = get_gst_accounts(doc.company)
|
|
||||||
gst_account_list = gst_accounts.get('cgst_account') + gst_accounts.get('sgst_account') \
|
|
||||||
+ gst_accounts.get('igst_account')
|
|
||||||
|
|
||||||
base_gst_tax = 0
|
|
||||||
gst_tax = 0
|
|
||||||
|
|
||||||
for tax in doc.get('taxes'):
|
|
||||||
if tax.category not in ("Total", "Valuation and Total"):
|
|
||||||
continue
|
|
||||||
|
|
||||||
if flt(tax.base_tax_amount_after_discount_amount) and tax.account_head in gst_account_list:
|
|
||||||
base_gst_tax += tax.base_tax_amount_after_discount_amount
|
|
||||||
gst_tax += tax.tax_amount_after_discount_amount
|
|
||||||
|
|
||||||
doc.taxes_and_charges_added -= gst_tax
|
doc.taxes_and_charges_added -= gst_tax
|
||||||
doc.total_taxes_and_charges -= gst_tax
|
doc.total_taxes_and_charges -= gst_tax
|
||||||
doc.base_taxes_and_charges_added -= base_gst_tax
|
doc.base_taxes_and_charges_added -= base_gst_tax
|
||||||
@@ -765,6 +771,11 @@ def make_regional_gl_entries(gl_entries, doc):
|
|||||||
if country != 'India':
|
if country != 'India':
|
||||||
return gl_entries
|
return gl_entries
|
||||||
|
|
||||||
|
gst_tax, base_gst_tax = get_gst_tax_amount(doc)
|
||||||
|
|
||||||
|
if not base_gst_tax:
|
||||||
|
return gl_entries
|
||||||
|
|
||||||
if doc.reverse_charge == 'Y':
|
if doc.reverse_charge == 'Y':
|
||||||
gst_accounts = get_gst_accounts(doc.company)
|
gst_accounts = get_gst_accounts(doc.company)
|
||||||
gst_account_list = gst_accounts.get('cgst_account') + gst_accounts.get('sgst_account') \
|
gst_account_list = gst_accounts.get('cgst_account') + gst_accounts.get('sgst_account') \
|
||||||
@@ -792,3 +803,21 @@ def make_regional_gl_entries(gl_entries, doc):
|
|||||||
)
|
)
|
||||||
|
|
||||||
return gl_entries
|
return gl_entries
|
||||||
|
|
||||||
|
def get_gst_tax_amount(doc):
|
||||||
|
gst_accounts = get_gst_accounts(doc.company)
|
||||||
|
gst_account_list = gst_accounts.get('cgst_account', []) + gst_accounts.get('sgst_account', []) \
|
||||||
|
+ gst_accounts.get('igst_account', [])
|
||||||
|
|
||||||
|
base_gst_tax = 0
|
||||||
|
gst_tax = 0
|
||||||
|
|
||||||
|
for tax in doc.get('taxes'):
|
||||||
|
if tax.category not in ("Total", "Valuation and Total"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if flt(tax.base_tax_amount_after_discount_amount) and tax.account_head in gst_account_list:
|
||||||
|
base_gst_tax += tax.base_tax_amount_after_discount_amount
|
||||||
|
gst_tax += tax.tax_amount_after_discount_amount
|
||||||
|
|
||||||
|
return gst_tax, base_gst_tax
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ frappe.ui.form.on('Global Defaults', {
|
|||||||
method: "frappe.client.get_list",
|
method: "frappe.client.get_list",
|
||||||
args: {
|
args: {
|
||||||
doctype: "UOM Conversion Factor",
|
doctype: "UOM Conversion Factor",
|
||||||
filters: { "category": "Length" },
|
filters: { "category": __("Length") },
|
||||||
fields: ["to_uom"],
|
fields: ["to_uom"],
|
||||||
limit_page_length: 500
|
limit_page_length: 500
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -156,7 +156,8 @@ erpnext.stock.move_item = function(item, source, target, actual_qty, rate, callb
|
|||||||
fieldtype: 'Float', description: __('Available {0}', [actual_qty]) },
|
fieldtype: 'Float', description: __('Available {0}', [actual_qty]) },
|
||||||
{fieldname: 'rate', label: __('Rate'), fieldtype: 'Currency', hidden: 1 },
|
{fieldname: 'rate', label: __('Rate'), fieldtype: 'Currency', hidden: 1 },
|
||||||
],
|
],
|
||||||
})
|
});
|
||||||
|
var submitted = false;
|
||||||
dialog.show();
|
dialog.show();
|
||||||
dialog.get_field('item_code').set_input(item);
|
dialog.get_field('item_code').set_input(item);
|
||||||
|
|
||||||
@@ -180,6 +181,7 @@ erpnext.stock.move_item = function(item, source, target, actual_qty, rate, callb
|
|||||||
}
|
}
|
||||||
|
|
||||||
dialog.set_primary_action(__('Submit'), function() {
|
dialog.set_primary_action(__('Submit'), function() {
|
||||||
|
if(submitted) return;
|
||||||
var values = dialog.get_values();
|
var values = dialog.get_values();
|
||||||
if(!values) {
|
if(!values) {
|
||||||
return;
|
return;
|
||||||
@@ -192,6 +194,7 @@ erpnext.stock.move_item = function(item, source, target, actual_qty, rate, callb
|
|||||||
frappe.msgprint(__('Source and target warehouse must be different'));
|
frappe.msgprint(__('Source and target warehouse must be different'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
submitted = true;
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method: 'erpnext.stock.doctype.stock_entry.stock_entry_utils.make_stock_entry',
|
method: 'erpnext.stock.doctype.stock_entry.stock_entry_utils.make_stock_entry',
|
||||||
args: values,
|
args: values,
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ frappe.ui.form.on("Item", {
|
|||||||
}
|
}
|
||||||
if (frm.doc.variant_of) {
|
if (frm.doc.variant_of) {
|
||||||
frm.set_intro(__('This Item is a Variant of {0} (Template).',
|
frm.set_intro(__('This Item is a Variant of {0} (Template).',
|
||||||
[`<a href="#Form/Item/${frm.doc.variant_of}">${frm.doc.variant_of}</a>`]), true);
|
[`<a href="/app/item/${frm.doc.variant_of}" onclick="location.reload()">${frm.doc.variant_of}</a>`]), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frappe.defaults.get_default("item_naming_by")!="Naming Series" || frm.doc.variant_of) {
|
if (frappe.defaults.get_default("item_naming_by")!="Naming Series" || frm.doc.variant_of) {
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ def get_item_warehouse_map(filters, sle):
|
|||||||
else:
|
else:
|
||||||
qty_diff = flt(d.actual_qty)
|
qty_diff = flt(d.actual_qty)
|
||||||
|
|
||||||
value_diff = flt(d.stock_value) - flt(qty_dict.bal_val)
|
value_diff = flt(d.stock_value_difference)
|
||||||
|
|
||||||
if d.posting_date < from_date:
|
if d.posting_date < from_date:
|
||||||
qty_dict.opening_qty += qty_diff
|
qty_dict.opening_qty += qty_diff
|
||||||
|
|||||||
Reference in New Issue
Block a user