Merge pull request #36657 from frappe/version-13-hotfix
chore: release v13
This commit is contained in:
@@ -1580,6 +1580,52 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
|
|||||||
|
|
||||||
self.assertTrue(return_pi.docstatus == 1)
|
self.assertTrue(return_pi.docstatus == 1)
|
||||||
|
|
||||||
|
def test_payment_allocation_for_payment_terms(self):
|
||||||
|
from erpnext.buying.doctype.purchase_order.test_purchase_order import (
|
||||||
|
create_pr_against_po,
|
||||||
|
create_purchase_order,
|
||||||
|
)
|
||||||
|
from erpnext.selling.doctype.sales_order.test_sales_order import (
|
||||||
|
automatically_fetch_payment_terms,
|
||||||
|
)
|
||||||
|
from erpnext.stock.doctype.purchase_receipt.purchase_receipt import (
|
||||||
|
make_purchase_invoice as make_pi_from_pr,
|
||||||
|
)
|
||||||
|
|
||||||
|
automatically_fetch_payment_terms()
|
||||||
|
frappe.db.set_value(
|
||||||
|
"Payment Terms Template",
|
||||||
|
"_Test Payment Term Template",
|
||||||
|
"allocate_payment_based_on_payment_terms",
|
||||||
|
0,
|
||||||
|
)
|
||||||
|
|
||||||
|
po = create_purchase_order(do_not_save=1)
|
||||||
|
po.payment_terms_template = "_Test Payment Term Template"
|
||||||
|
po.save()
|
||||||
|
po.submit()
|
||||||
|
|
||||||
|
pr = create_pr_against_po(po.name, received_qty=4)
|
||||||
|
pi = make_pi_from_pr(pr.name)
|
||||||
|
self.assertEqual(pi.payment_schedule[0].payment_amount, 1000)
|
||||||
|
|
||||||
|
frappe.db.set_value(
|
||||||
|
"Payment Terms Template",
|
||||||
|
"_Test Payment Term Template",
|
||||||
|
"allocate_payment_based_on_payment_terms",
|
||||||
|
1,
|
||||||
|
)
|
||||||
|
pi = make_pi_from_pr(pr.name)
|
||||||
|
self.assertEqual(pi.payment_schedule[0].payment_amount, 2500)
|
||||||
|
|
||||||
|
automatically_fetch_payment_terms(enable=0)
|
||||||
|
frappe.db.set_value(
|
||||||
|
"Payment Terms Template",
|
||||||
|
"_Test Payment Term Template",
|
||||||
|
"allocate_payment_based_on_payment_terms",
|
||||||
|
0,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
|
def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
|
||||||
gl_entries = frappe.db.sql(
|
gl_entries = frappe.db.sql(
|
||||||
|
|||||||
@@ -1580,15 +1580,13 @@ class SalesInvoice(SellingController):
|
|||||||
frappe.db.set_value("Customer", self.customer, "loyalty_program_tier", lp_details.tier_name)
|
frappe.db.set_value("Customer", self.customer, "loyalty_program_tier", lp_details.tier_name)
|
||||||
|
|
||||||
def get_returned_amount(self):
|
def get_returned_amount(self):
|
||||||
from frappe.query_builder.functions import Coalesce, Sum
|
from frappe.query_builder.functions import Sum
|
||||||
|
|
||||||
doc = frappe.qb.DocType(self.doctype)
|
doc = frappe.qb.DocType(self.doctype)
|
||||||
returned_amount = (
|
returned_amount = (
|
||||||
frappe.qb.from_(doc)
|
frappe.qb.from_(doc)
|
||||||
.select(Sum(doc.grand_total))
|
.select(Sum(doc.grand_total))
|
||||||
.where(
|
.where((doc.docstatus == 1) & (doc.is_return == 1) & (doc.return_against == self.name))
|
||||||
(doc.docstatus == 1) & (doc.is_return == 1) & (Coalesce(doc.return_against, "") == self.name)
|
|
||||||
)
|
|
||||||
).run()
|
).run()
|
||||||
|
|
||||||
return abs(returned_amount[0][0]) if returned_amount[0][0] else 0
|
return abs(returned_amount[0][0]) if returned_amount[0][0] else 0
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ frappe.ui.form.on('Asset Category', {
|
|||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
return {
|
return {
|
||||||
"filters": {
|
"filters": {
|
||||||
|
"account_type": "Depreciation",
|
||||||
"root_type": ["in", ["Expense", "Income"]],
|
"root_type": ["in", ["Expense", "Income"]],
|
||||||
"is_group": 0,
|
"is_group": 0,
|
||||||
"company": d.company_name
|
"company": d.company_name
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class AssetCategory(Document):
|
|||||||
account_type_map = {
|
account_type_map = {
|
||||||
"fixed_asset_account": {"account_type": ["Fixed Asset"]},
|
"fixed_asset_account": {"account_type": ["Fixed Asset"]},
|
||||||
"accumulated_depreciation_account": {"account_type": ["Accumulated Depreciation"]},
|
"accumulated_depreciation_account": {"account_type": ["Accumulated Depreciation"]},
|
||||||
"depreciation_expense_account": {"root_type": ["Expense", "Income"]},
|
"depreciation_expense_account": {"account_type": ["Depreciation"]},
|
||||||
"capital_work_in_progress_account": {"account_type": ["Capital Work in Progress"]},
|
"capital_work_in_progress_account": {"account_type": ["Capital Work in Progress"]},
|
||||||
}
|
}
|
||||||
for d in self.accounts:
|
for d in self.accounts:
|
||||||
|
|||||||
@@ -7,13 +7,14 @@ from itertools import chain
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.query_builder.functions import IfNull, Sum
|
from frappe.query_builder.functions import IfNull, Sum
|
||||||
from frappe.utils import cstr, flt, formatdate, getdate
|
from frappe.utils import add_months, cstr, flt, formatdate, getdate, nowdate, today
|
||||||
|
|
||||||
from erpnext.accounts.report.financial_statements import (
|
from erpnext.accounts.report.financial_statements import (
|
||||||
get_fiscal_year_data,
|
get_fiscal_year_data,
|
||||||
get_period_list,
|
get_period_list,
|
||||||
validate_fiscal_year,
|
validate_fiscal_year,
|
||||||
)
|
)
|
||||||
|
from erpnext.accounts.utils import get_fiscal_year
|
||||||
from erpnext.assets.doctype.asset.asset import get_asset_value_after_depreciation
|
from erpnext.assets.doctype.asset.asset import get_asset_value_after_depreciation
|
||||||
|
|
||||||
|
|
||||||
@@ -37,15 +38,26 @@ def get_conditions(filters):
|
|||||||
|
|
||||||
if filters.get("company"):
|
if filters.get("company"):
|
||||||
conditions["company"] = filters.company
|
conditions["company"] = filters.company
|
||||||
|
|
||||||
if filters.filter_based_on == "Date Range":
|
if filters.filter_based_on == "Date Range":
|
||||||
|
if not filters.from_date and not filters.to_date:
|
||||||
|
filters.from_date = add_months(nowdate(), -12)
|
||||||
|
filters.to_date = nowdate()
|
||||||
|
|
||||||
conditions[date_field] = ["between", [filters.from_date, filters.to_date]]
|
conditions[date_field] = ["between", [filters.from_date, filters.to_date]]
|
||||||
if filters.filter_based_on == "Fiscal Year":
|
elif filters.filter_based_on == "Fiscal Year":
|
||||||
|
if not filters.from_fiscal_year and not filters.to_fiscal_year:
|
||||||
|
default_fiscal_year = get_fiscal_year(today())[0]
|
||||||
|
filters.from_fiscal_year = default_fiscal_year
|
||||||
|
filters.to_fiscal_year = default_fiscal_year
|
||||||
|
|
||||||
fiscal_year = get_fiscal_year_data(filters.from_fiscal_year, filters.to_fiscal_year)
|
fiscal_year = get_fiscal_year_data(filters.from_fiscal_year, filters.to_fiscal_year)
|
||||||
validate_fiscal_year(fiscal_year, filters.from_fiscal_year, filters.to_fiscal_year)
|
validate_fiscal_year(fiscal_year, filters.from_fiscal_year, filters.to_fiscal_year)
|
||||||
filters.year_start_date = getdate(fiscal_year.year_start_date)
|
filters.year_start_date = getdate(fiscal_year.year_start_date)
|
||||||
filters.year_end_date = getdate(fiscal_year.year_end_date)
|
filters.year_end_date = getdate(fiscal_year.year_end_date)
|
||||||
|
|
||||||
conditions[date_field] = ["between", [filters.year_start_date, filters.year_end_date]]
|
conditions[date_field] = ["between", [filters.year_start_date, filters.year_end_date]]
|
||||||
|
|
||||||
if filters.get("only_existing_assets"):
|
if filters.get("only_existing_assets"):
|
||||||
conditions["is_existing_asset"] = filters.get("only_existing_assets")
|
conditions["is_existing_asset"] = filters.get("only_existing_assets")
|
||||||
if filters.get("asset_category"):
|
if filters.get("asset_category"):
|
||||||
|
|||||||
@@ -1635,8 +1635,13 @@ class AccountsController(TransactionBase):
|
|||||||
)
|
)
|
||||||
self.append("payment_schedule", data)
|
self.append("payment_schedule", data)
|
||||||
|
|
||||||
|
allocate_payment_based_on_payment_terms = frappe.db.get_value(
|
||||||
|
"Payment Terms Template", self.payment_terms_template, "allocate_payment_based_on_payment_terms"
|
||||||
|
)
|
||||||
|
|
||||||
if not (
|
if not (
|
||||||
automatically_fetch_payment_terms
|
automatically_fetch_payment_terms
|
||||||
|
and allocate_payment_based_on_payment_terms
|
||||||
and self.linked_order_has_payment_terms(po_or_so, fieldname, doctype)
|
and self.linked_order_has_payment_terms(po_or_so, fieldname, doctype)
|
||||||
):
|
):
|
||||||
for d in self.get("payment_schedule"):
|
for d in self.get("payment_schedule"):
|
||||||
|
|||||||
@@ -250,6 +250,9 @@ class LoanRepayment(AccountsController):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def check_future_accruals(self):
|
def check_future_accruals(self):
|
||||||
|
if self.is_term_loan:
|
||||||
|
return
|
||||||
|
|
||||||
future_accrual_date = frappe.db.get_value(
|
future_accrual_date = frappe.db.get_value(
|
||||||
"Loan Interest Accrual",
|
"Loan Interest Accrual",
|
||||||
{"posting_date": (">", self.posting_date), "docstatus": 1, "loan": self.against_loan},
|
{"posting_date": (">", self.posting_date), "docstatus": 1, "loan": self.against_loan},
|
||||||
|
|||||||
Reference in New Issue
Block a user