chore: merge branch 'version-13-hotfix' into 'version-13-pre-release' (#27173)
* feat: add provision for process loss in manufac * feat: add is process loss autoset and validation * fix: add warehouse and unset is scrap for process loss items * refactor: shift auto entry of is process loss check, update validations * test: add bom tests for process loss val, add se test for qty calc * fix: add more validations, remove source wh req for pl item * fix: sider * refactor: polyfill ?? * fix: sider * refactor: validation error message formatting * test: check manufacture completion qty in se and wo * fix: wo tests, sider, account for pl in se validation * fix: reword error messages, fix test values * feat: add procss_loss_qty field in work order * feat: process loss report, fix set pl query condition * fix: correct value in test * fix: get filters to work - reorder and rename columns - add work order filter * fix: Shopping cart Exchange rate validation (#27050) * fix: Shopping cart Exchange rate validation - Use `get_exchange_rate` to check for price list exchange rate in cart settings - Move cart exchange rate validation for Price List from hooks to doc event - Call cart exchange rate validation on PL update only if PL is in cart and currency is changed * chore: Comment out obsolete test - Modifying this test means considering extreme edge cases, which seems pointless now * fix: Remove snippet that got in due to cherry-pick from `develop` - This snippet is not present in v13-hotfix. Via https://github.com/frappe/erpnext/pull/26520 Co-authored-by: Nabin Hait <nabinhait@gmail.com> * feat: initialize party link for customer & suppliers * feat: toggle to enable common party accounting * feat: auto create advance entry on invoice submission * test: creation of advance entry on invoice submission * fix: remove unwanted filter query * feat: validate multiple links * fix: party link permissions * perf: reduce number of queries to get party link * fix: cost center & naming series * fix: cost center in test_sales_invoice_against_supplier * fix: Don't create inward SLE against SI unless is internal customer enabled (#27086) * fix: Dont create inward SLE against SI unless is internal customer enabled - Check if is internal customer enabled apart from target warehouse - Test to check if inward SLE is made if target warehouse is accidentally set but customer is not internal * test: Use internal customer for delivery of bundle items to target warehouse - created `create_internal_customer` util - reused it in delivery note and sales invoice tests - use internal customer for target warehouse test in delivery note (cherry picked from commitf4dc9ee2aa) # Conflicts: # erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py * fix: prevent over riding scrap table values, name kwargs, set currency * fix(regional): minor fixes and test for South Africa VAT report (#26933) (#27162) * fix: allow to change incoming rate manually in case of stand-alone credit note (#27164) * fix: allow to change rate manually in case of stand-alone credit note (#27036) Co-authored-by: Marica <maricadsouza221197@gmail.com> (cherry picked from commitfe4540d74d) # Conflicts: # erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json * fix: resolve conflicts Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com> Co-authored-by: Ankush Menat <ankush@iwebnotes.com> * fix: Fee Validity fixes (#27161) * fix: Fee Validity fixes (#27156) * chore: update Fee Validity form labels * fix: first appointment should not be considered for Fee Validity * fix: Fee Validity test cases * fix: appointment test case (cherry picked from commit642b4c805c) * fix: overlapping appointments Co-authored-by: Rucha Mahabal <ruchamahabal2@gmail.com> * fix: Merge conflicts and place internal customer creation util in test_customer.py * fix: internal customer util returns 'str' not doc object * fix: negative qty validation on stock reco cancellation (#27170) (#27171) * test: negative stock validation on SR cancel * fix: negative stock setting ignored in stock reco In stock reconcilation cancellation negative stock setting is ignored as `db.get_value` is returning string `'0'` which is not casted to int/bool for further logic. This causes negative qty, which evantually gets caught by reposting but by design this should stop cancellation. * test: typo and minor refactor (cherry picked from commite7109c18db) Co-authored-by: Ankush Menat <ankush@iwebnotes.com> Co-authored-by: 18alantom <2.alan.tom@gmail.com> Co-authored-by: Marica <maricadsouza221197@gmail.com> Co-authored-by: Nabin Hait <nabinhait@gmail.com> Co-authored-by: Saqib Ansari <nextchamp.saqib@gmail.com> Co-authored-by: Frappe PR Bot <frappe.pr.bot@gmail.com> Co-authored-by: Ankush Menat <ankush@iwebnotes.com> Co-authored-by: Rucha Mahabal <ruchamahabal2@gmail.com>
This commit is contained in:
@@ -14,7 +14,7 @@ from erpnext.accounts.utils import get_fiscal_years, validate_fiscal_year, get_a
|
||||
from erpnext.utilities.transaction_base import TransactionBase
|
||||
from erpnext.buying.utils import update_last_purchase_rate
|
||||
from erpnext.controllers.sales_and_purchase_return import validate_return
|
||||
from erpnext.accounts.party import get_party_account_currency, validate_party_frozen_disabled
|
||||
from erpnext.accounts.party import get_party_account_currency, validate_party_frozen_disabled, get_party_account
|
||||
from erpnext.accounts.doctype.pricing_rule.utils import (apply_pricing_rule_on_transaction,
|
||||
apply_pricing_rule_for_free_items, get_applied_pricing_rules)
|
||||
from erpnext.exceptions import InvalidCurrency
|
||||
@@ -1368,6 +1368,67 @@ class AccountsController(TransactionBase):
|
||||
|
||||
return False
|
||||
|
||||
def process_common_party_accounting(self):
|
||||
is_invoice = self.doctype in ['Sales Invoice', 'Purchase Invoice']
|
||||
if not is_invoice:
|
||||
return
|
||||
|
||||
if frappe.db.get_single_value('Accounts Settings', 'enable_common_party_accounting'):
|
||||
party_link = self.get_common_party_link()
|
||||
if party_link and self.outstanding_amount:
|
||||
self.create_advance_and_reconcile(party_link)
|
||||
|
||||
def get_common_party_link(self):
|
||||
party_type, party = self.get_party()
|
||||
return frappe.db.get_value(
|
||||
doctype='Party Link',
|
||||
filters={'secondary_role': party_type, 'secondary_party': party},
|
||||
fieldname=['primary_role', 'primary_party'],
|
||||
as_dict=True
|
||||
)
|
||||
|
||||
def create_advance_and_reconcile(self, party_link):
|
||||
secondary_party_type, secondary_party = self.get_party()
|
||||
primary_party_type, primary_party = party_link.primary_role, party_link.primary_party
|
||||
|
||||
primary_account = get_party_account(primary_party_type, primary_party, self.company)
|
||||
secondary_account = get_party_account(secondary_party_type, secondary_party, self.company)
|
||||
|
||||
jv = frappe.new_doc('Journal Entry')
|
||||
jv.voucher_type = 'Journal Entry'
|
||||
jv.posting_date = self.posting_date
|
||||
jv.company = self.company
|
||||
jv.remark = 'Adjustment for {} {}'.format(self.doctype, self.name)
|
||||
|
||||
reconcilation_entry = frappe._dict()
|
||||
advance_entry = frappe._dict()
|
||||
|
||||
reconcilation_entry.account = secondary_account
|
||||
reconcilation_entry.party_type = secondary_party_type
|
||||
reconcilation_entry.party = secondary_party
|
||||
reconcilation_entry.reference_type = self.doctype
|
||||
reconcilation_entry.reference_name = self.name
|
||||
reconcilation_entry.cost_center = self.cost_center
|
||||
|
||||
advance_entry.account = primary_account
|
||||
advance_entry.party_type = primary_party_type
|
||||
advance_entry.party = primary_party
|
||||
advance_entry.cost_center = self.cost_center
|
||||
advance_entry.is_advance = 'Yes'
|
||||
|
||||
if self.doctype == 'Sales Invoice':
|
||||
reconcilation_entry.credit_in_account_currency = self.outstanding_amount
|
||||
advance_entry.debit_in_account_currency = self.outstanding_amount
|
||||
else:
|
||||
advance_entry.credit_in_account_currency = self.outstanding_amount
|
||||
reconcilation_entry.debit_in_account_currency = self.outstanding_amount
|
||||
|
||||
jv.append('accounts', reconcilation_entry)
|
||||
jv.append('accounts', advance_entry)
|
||||
|
||||
jv.save()
|
||||
jv.submit()
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_tax_rate(account_head):
|
||||
return frappe.db.get_value("Account", account_head, ["tax_rate", "account_name"], as_dict=True)
|
||||
|
||||
Reference in New Issue
Block a user