Compare commits
9 Commits
handle-mul
...
v12.2.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
47e786ef62 | ||
|
|
f10be395c1 | ||
|
|
14018b3dea | ||
|
|
91f2cfb999 | ||
|
|
c0a0331570 | ||
|
|
4ceba43e43 | ||
|
|
5d2ad7fc38 | ||
|
|
3347473aa1 | ||
|
|
7f951b5595 |
@@ -5,7 +5,7 @@ import frappe
|
|||||||
from erpnext.hooks import regional_overrides
|
from erpnext.hooks import regional_overrides
|
||||||
from frappe.utils import getdate
|
from frappe.utils import getdate
|
||||||
|
|
||||||
__version__ = '12.2.0'
|
__version__ = '12.2.2'
|
||||||
|
|
||||||
def get_default_company(user=None):
|
def get_default_company(user=None):
|
||||||
'''Get default company for user'''
|
'''Get default company for user'''
|
||||||
|
|||||||
@@ -330,23 +330,6 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({
|
|||||||
frm: cur_frm
|
frm: cur_frm
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
item_code: function(frm, cdt, cdn) {
|
|
||||||
var row = locals[cdt][cdn];
|
|
||||||
if(row.item_code) {
|
|
||||||
frappe.call({
|
|
||||||
method: "erpnext.assets.doctype.asset_category.asset_category.get_asset_category_account",
|
|
||||||
args: {
|
|
||||||
"item": row.item_code,
|
|
||||||
"fieldname": "fixed_asset_account",
|
|
||||||
"company": frm.doc.company
|
|
||||||
},
|
|
||||||
callback: function(r, rt) {
|
|
||||||
frappe.model.set_value(cdt, cdn, "expense_account", r.message);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
cur_frm.script_manager.make(erpnext.accounts.PurchaseInvoice);
|
cur_frm.script_manager.make(erpnext.accounts.PurchaseInvoice);
|
||||||
|
|||||||
@@ -830,7 +830,11 @@ class PurchaseInvoice(BuyingController):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def make_gle_for_rounding_adjustment(self, gl_entries):
|
def make_gle_for_rounding_adjustment(self, gl_entries):
|
||||||
if self.rounding_adjustment:
|
# if rounding adjustment in small and conversion rate is also small then
|
||||||
|
# base_rounding_adjustment may become zero due to small precision
|
||||||
|
# eg: rounding_adjustment = 0.01 and exchange rate = 0.05 and precision of base_rounding_adjustment is 2
|
||||||
|
# then base_rounding_adjustment becomes zero and error is thrown in GL Entry
|
||||||
|
if self.rounding_adjustment and self.base_rounding_adjustment:
|
||||||
round_off_account, round_off_cost_center = \
|
round_off_account, round_off_cost_center = \
|
||||||
get_round_off_account_and_cost_center(self.company)
|
get_round_off_account_and_cost_center(self.company)
|
||||||
|
|
||||||
|
|||||||
@@ -953,7 +953,7 @@ class SalesInvoice(SellingController):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def make_gle_for_rounding_adjustment(self, gl_entries):
|
def make_gle_for_rounding_adjustment(self, gl_entries):
|
||||||
if flt(self.rounding_adjustment, self.precision("rounding_adjustment")):
|
if flt(self.rounding_adjustment, self.precision("rounding_adjustment")) and self.base_rounding_adjustment:
|
||||||
round_off_account, round_off_cost_center = \
|
round_off_account, round_off_cost_center = \
|
||||||
get_round_off_account_and_cost_center(self.company)
|
get_round_off_account_and_cost_center(self.company)
|
||||||
|
|
||||||
@@ -1048,13 +1048,18 @@ class SalesInvoice(SellingController):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
for serial_no in item.serial_no.split("\n"):
|
for serial_no in item.serial_no.split("\n"):
|
||||||
sales_invoice, item_code = frappe.db.get_value("Serial No", serial_no,
|
serial_no_details = frappe.db.get_value("Serial No", serial_no,
|
||||||
["sales_invoice", "item_code"])
|
["sales_invoice", "item_code"], as_dict=1)
|
||||||
if sales_invoice and item_code == item.item_code and self.name != sales_invoice:
|
|
||||||
sales_invoice_company = frappe.db.get_value("Sales Invoice", sales_invoice, "company")
|
if not serial_no_details:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if serial_no_details.sales_invoice and serial_no_details.item_code == item.item_code \
|
||||||
|
and self.name != serial_no_details.sales_invoice:
|
||||||
|
sales_invoice_company = frappe.db.get_value("Sales Invoice", serial_no_details.sales_invoice, "company")
|
||||||
if sales_invoice_company == self.company:
|
if sales_invoice_company == self.company:
|
||||||
frappe.throw(_("Serial Number: {0} is already referenced in Sales Invoice: {1}"
|
frappe.throw(_("Serial Number: {0} is already referenced in Sales Invoice: {1}"
|
||||||
.format(serial_no, sales_invoice)))
|
.format(serial_no, serial_no_details.sales_invoice)))
|
||||||
|
|
||||||
def update_project(self):
|
def update_project(self):
|
||||||
if self.project:
|
if self.project:
|
||||||
|
|||||||
@@ -162,33 +162,34 @@ def validate_account_for_perpetual_inventory(gl_map):
|
|||||||
frappe.throw(_("Account: {0} can only be updated via Stock Transactions")
|
frappe.throw(_("Account: {0} can only be updated via Stock Transactions")
|
||||||
.format(account), StockAccountInvalidTransaction)
|
.format(account), StockAccountInvalidTransaction)
|
||||||
|
|
||||||
elif account_bal != stock_bal:
|
# This has been comment for a temporary, will add this code again on release of immutable ledger
|
||||||
precision = get_field_precision(frappe.get_meta("GL Entry").get_field("debit"),
|
# elif account_bal != stock_bal:
|
||||||
currency=frappe.get_cached_value('Company', gl_map[0].company, "default_currency"))
|
# precision = get_field_precision(frappe.get_meta("GL Entry").get_field("debit"),
|
||||||
|
# currency=frappe.get_cached_value('Company', gl_map[0].company, "default_currency"))
|
||||||
|
|
||||||
diff = flt(stock_bal - account_bal, precision)
|
# diff = flt(stock_bal - account_bal, precision)
|
||||||
error_reason = _("Stock Value ({0}) and Account Balance ({1}) are out of sync for account {2} and it's linked warehouses.").format(
|
# error_reason = _("Stock Value ({0}) and Account Balance ({1}) are out of sync for account {2} and it's linked warehouses.").format(
|
||||||
stock_bal, account_bal, frappe.bold(account))
|
# stock_bal, account_bal, frappe.bold(account))
|
||||||
error_resolution = _("Please create adjustment Journal Entry for amount {0} ").format(frappe.bold(diff))
|
# error_resolution = _("Please create adjustment Journal Entry for amount {0} ").format(frappe.bold(diff))
|
||||||
stock_adjustment_account = frappe.db.get_value("Company",gl_map[0].company,"stock_adjustment_account")
|
# stock_adjustment_account = frappe.db.get_value("Company",gl_map[0].company,"stock_adjustment_account")
|
||||||
|
|
||||||
db_or_cr_warehouse_account =('credit_in_account_currency' if diff < 0 else 'debit_in_account_currency')
|
# db_or_cr_warehouse_account =('credit_in_account_currency' if diff < 0 else 'debit_in_account_currency')
|
||||||
db_or_cr_stock_adjustment_account = ('debit_in_account_currency' if diff < 0 else 'credit_in_account_currency')
|
# db_or_cr_stock_adjustment_account = ('debit_in_account_currency' if diff < 0 else 'credit_in_account_currency')
|
||||||
|
|
||||||
journal_entry_args = {
|
# journal_entry_args = {
|
||||||
'accounts':[
|
# 'accounts':[
|
||||||
{'account': account, db_or_cr_warehouse_account : abs(diff)},
|
# {'account': account, db_or_cr_warehouse_account : abs(diff)},
|
||||||
{'account': stock_adjustment_account, db_or_cr_stock_adjustment_account : abs(diff) }]
|
# {'account': stock_adjustment_account, db_or_cr_stock_adjustment_account : abs(diff) }]
|
||||||
}
|
# }
|
||||||
|
|
||||||
frappe.msgprint(msg="""{0}<br></br>{1}<br></br>""".format(error_reason, error_resolution),
|
# frappe.msgprint(msg="""{0}<br></br>{1}<br></br>""".format(error_reason, error_resolution),
|
||||||
raise_exception=StockValueAndAccountBalanceOutOfSync,
|
# raise_exception=StockValueAndAccountBalanceOutOfSync,
|
||||||
title=_('Values Out Of Sync'),
|
# title=_('Values Out Of Sync'),
|
||||||
primary_action={
|
# primary_action={
|
||||||
'label': _('Make Journal Entry'),
|
# 'label': _('Make Journal Entry'),
|
||||||
'client_action': 'erpnext.route_to_adjustment_jv',
|
# 'client_action': 'erpnext.route_to_adjustment_jv',
|
||||||
'args': journal_entry_args
|
# 'args': journal_entry_args
|
||||||
})
|
# })
|
||||||
|
|
||||||
def validate_cwip_accounts(gl_map):
|
def validate_cwip_accounts(gl_map):
|
||||||
cwip_enabled = any([cint(ac.enable_cwip_accounting) for ac in frappe.db.get_all("Asset Category","enable_cwip_accounting")])
|
cwip_enabled = any([cint(ac.enable_cwip_accounting) for ac in frappe.db.get_all("Asset Category","enable_cwip_accounting")])
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ def get_asset_category_account(fieldname, item=None, asset=None, account=None, a
|
|||||||
account=None
|
account=None
|
||||||
|
|
||||||
if not account:
|
if not account:
|
||||||
asset_category, company = frappe.db.get_value("Asset", asset, ["asset_category", "company"])
|
asset_details = frappe.db.get_value("Asset", asset, ["asset_category", "company"])
|
||||||
|
asset_category, company = asset_details or [None, None]
|
||||||
|
|
||||||
account = frappe.db.get_value("Asset Category Account",
|
account = frappe.db.get_value("Asset Category Account",
|
||||||
filters={"parent": asset_category, "company_name": company}, fieldname=fieldname)
|
filters={"parent": asset_category, "company_name": company}, fieldname=fieldname)
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ def update_packing_list_item(doc, packing_item_code, qty, main_item_row, descrip
|
|||||||
bin = get_bin_qty(packing_item_code, pi.warehouse)
|
bin = get_bin_qty(packing_item_code, pi.warehouse)
|
||||||
pi.actual_qty = flt(bin.get("actual_qty"))
|
pi.actual_qty = flt(bin.get("actual_qty"))
|
||||||
pi.projected_qty = flt(bin.get("projected_qty"))
|
pi.projected_qty = flt(bin.get("projected_qty"))
|
||||||
if old_packed_items_map:
|
if old_packed_items_map and old_packed_items_map.get((packing_item_code, main_item_row.item_code)):
|
||||||
pi.batch_no = old_packed_items_map.get((packing_item_code, main_item_row.item_code))[0].batch_no
|
pi.batch_no = old_packed_items_map.get((packing_item_code, main_item_row.item_code))[0].batch_no
|
||||||
pi.serial_no = old_packed_items_map.get((packing_item_code, main_item_row.item_code))[0].serial_no
|
pi.serial_no = old_packed_items_map.get((packing_item_code, main_item_row.item_code))[0].serial_no
|
||||||
pi.warehouse = old_packed_items_map.get((packing_item_code, main_item_row.item_code))[0].warehouse
|
pi.warehouse = old_packed_items_map.get((packing_item_code, main_item_row.item_code))[0].warehouse
|
||||||
|
|||||||
@@ -251,6 +251,12 @@ def get_basic_details(args, item, overwrite_warehouse=True):
|
|||||||
args['material_request_type'] = frappe.db.get_value('Material Request',
|
args['material_request_type'] = frappe.db.get_value('Material Request',
|
||||||
args.get('name'), 'material_request_type', cache=True)
|
args.get('name'), 'material_request_type', cache=True)
|
||||||
|
|
||||||
|
expense_account = None
|
||||||
|
|
||||||
|
if args.get('doctype') == 'Purchase Invoice' and item.is_fixed_asset:
|
||||||
|
from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
|
||||||
|
expense_account = get_asset_category_account(fieldname = "fixed_asset_account", item = args.item_code, company= args.company)
|
||||||
|
|
||||||
#Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master
|
#Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master
|
||||||
if not args.uom:
|
if not args.uom:
|
||||||
if args.get('doctype') in sales_doctypes:
|
if args.get('doctype') in sales_doctypes:
|
||||||
@@ -268,7 +274,7 @@ def get_basic_details(args, item, overwrite_warehouse=True):
|
|||||||
"image": cstr(item.image).strip(),
|
"image": cstr(item.image).strip(),
|
||||||
"warehouse": warehouse,
|
"warehouse": warehouse,
|
||||||
"income_account": get_default_income_account(args, item_defaults, item_group_defaults, brand_defaults),
|
"income_account": get_default_income_account(args, item_defaults, item_group_defaults, brand_defaults),
|
||||||
"expense_account": get_default_expense_account(args, item_defaults, item_group_defaults, brand_defaults),
|
"expense_account": expense_account or get_default_expense_account(args, item_defaults, item_group_defaults, brand_defaults) ,
|
||||||
"cost_center": get_default_cost_center(args, item_defaults, item_group_defaults, brand_defaults),
|
"cost_center": get_default_cost_center(args, item_defaults, item_group_defaults, brand_defaults),
|
||||||
'has_serial_no': item.has_serial_no,
|
'has_serial_no': item.has_serial_no,
|
||||||
'has_batch_no': item.has_batch_no,
|
'has_batch_no': item.has_batch_no,
|
||||||
|
|||||||
Reference in New Issue
Block a user