fix: Accounting for internal transfer invoices within same company (#24021)

* fix: Accounting for internal transfer invoices within same company

* fix: warehouse fetching

* fix: Linting issues

* fix: GL entry fixes and validation for intercompany account

* fix: Account naming changes and other fixes

* fix: Add test for internal transfer

* fix: Test Case

* fix: Add description for fields

* fix: Commonfied code

* fix: Map warehouse and serial no
This commit is contained in:
Deepesh Garg
2020-12-11 21:30:39 +05:30
committed by GitHub
parent f8d6726990
commit f17ea2ccab
18 changed files with 415 additions and 116 deletions

View File

@@ -107,6 +107,8 @@ class AccountsController(TransactionBase):
else:
self.validate_deferred_start_and_end_date()
self.set_inter_company_account()
validate_regional(self)
if self.doctype != 'Material Request':
apply_pricing_rule_on_transaction(self)
@@ -932,6 +934,38 @@ class AccountsController(TransactionBase):
else:
return frappe.db.get_single_value("Global Defaults", "disable_rounded_total")
def set_inter_company_account(self):
"""
Set intercompany account for inter warehouse transactions
This account will be used in case billing company and internal customer's
representation company is same
"""
if self.is_internal_transfer() and not self.unrealized_profit_loss_account:
unrealized_profit_loss_account = frappe.db.get_value('Company', self.company, 'unrealized_profit_loss_account')
if not unrealized_profit_loss_account:
msg = _("Please select Unrealized Profit / Loss account or add default Unrealized Profit / Loss account account for company {0}").format(
frappe.bold(self.company))
frappe.throw(msg)
self.unrealized_profit_loss_account = unrealized_profit_loss_account
def is_internal_transfer(self):
"""
It will an internal transfer if its an internal customer and representation
company is same as billing company
"""
if self.doctype == 'Sales Invoice':
internal_party_field = 'is_internal_customer'
else:
internal_party_field = 'is_internal_supplier'
if self.get(internal_party_field) and (self.represents_company == self.company):
return True
return False
@frappe.whitelist()
def get_tax_rate(account_head):
return frappe.db.get_value("Account", account_head, ["tax_rate", "account_name"], as_dict=True)