refactor: add budget start and end date field on the parent

This commit is contained in:
khushi8112
2025-11-05 01:21:54 +05:30
parent e40fe9919c
commit e4bae76580
4 changed files with 38 additions and 34 deletions

View File

@@ -17,7 +17,8 @@
"amended_from",
"from_fiscal_year",
"to_fiscal_year",
"distribution_type",
"budget_start_date",
"budget_end_date",
"allocation_frequency",
"budget_amount",
"section_break_nwug",
@@ -237,15 +238,6 @@
"read_only_depends_on": "eval: doc.revision_of",
"reqd": 1
},
{
"default": "Percent",
"fieldname": "distribution_type",
"fieldtype": "Select",
"label": "Distribution Type",
"options": "Amount\nPercent",
"read_only_depends_on": "eval: doc.revision_of",
"reqd": 1
},
{
"default": "Monthly",
"fieldname": "allocation_frequency",
@@ -298,13 +290,25 @@
"options": "Fiscal Year",
"read_only_depends_on": "eval: doc.revision_of",
"reqd": 1
},
{
"fieldname": "budget_start_date",
"fieldtype": "Date",
"hidden": 1,
"label": "Budget Start Date"
},
{
"fieldname": "budget_end_date",
"fieldtype": "Date",
"hidden": 1,
"label": "Budget End Date"
}
],
"grid_page_length": 50,
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2025-10-31 01:13:15.114440",
"modified": "2025-11-05 01:00:46.470251",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Budget",

View File

@@ -54,10 +54,11 @@ class Budget(Document):
budget_against: DF.Literal["", "Cost Center", "Project"]
budget_amount: DF.Currency
budget_distribution: DF.Table[BudgetDistribution]
budget_end_date: DF.Date | None
budget_start_date: DF.Date | None
company: DF.Link
cost_center: DF.Link | None
distribute_equally: DF.Check
distribution_type: DF.Literal["Amount", "Percent"]
from_fiscal_year: DF.Link
naming_series: DF.Literal["BUDGET-.YYYY.-"]
project: DF.Link | None
@@ -68,11 +69,23 @@ class Budget(Document):
def validate(self):
if not self.get(frappe.scrub(self.budget_against)):
frappe.throw(_("{0} is mandatory").format(self.budget_against))
self.set_fiscal_year_dates()
self.validate_duplicate()
self.validate_account()
self.set_null_value()
self.validate_applicable_for()
def set_fiscal_year_dates(self):
if self.from_fiscal_year:
self.budget_start_date = frappe.get_cached_value(
"Fiscal Year", self.from_fiscal_year, "year_start_date"
)
if self.to_fiscal_year:
self.budget_end_date = frappe.get_cached_value(
"Fiscal Year", self.to_fiscal_year, "year_end_date"
)
def validate_duplicate(self):
budget_against_field = frappe.scrub(self.budget_against)
budget_against = self.get(budget_against_field)
@@ -275,7 +288,7 @@ class Budget(Document):
)
)
if round(total_percent, 2) != 100:
if flt(abs(total_percent - 100), 2) > 0.10:
frappe.throw(
_("Total distribution percent must equal 100 (currently {0})").format(round(total_percent, 2))
)
@@ -361,6 +374,8 @@ def validate_expense_against_budget(args, expense_amount=0):
b.budget_amount,
b.from_fiscal_year,
b.to_fiscal_year,
b.budget_start_date,
b.budget_end_date,
IFNULL(b.applicable_on_material_request, 0) AS for_material_request,
IFNULL(b.applicable_on_purchase_order, 0) AS for_purchase_order,
IFNULL(b.applicable_on_booking_actual_expenses, 0) AS for_actual_expenses,
@@ -375,12 +390,7 @@ def validate_expense_against_budget(args, expense_amount=0):
WHERE
b.company = %s
AND b.docstatus = 1
AND (
%s BETWEEN
(SELECT year_start_date FROM `tabFiscal Year` WHERE name = b.from_fiscal_year)
AND
(SELECT year_end_date FROM `tabFiscal Year` WHERE name = b.to_fiscal_year)
)
AND %s BETWEEN b.budget_start_date AND b.budget_end_date
AND b.account = %s
{condition}
""",
@@ -627,14 +637,7 @@ def get_actual_expense(args):
budget_against_field = args.get("budget_against_field")
condition1 = " and gle.posting_date <= %(month_end_date)s" if args.get("month_end_date") else ""
from_start, _ = frappe.get_cached_value(
"Fiscal Year", args.from_fiscal_year, ["year_start_date", "year_end_date"]
)
_, to_end = frappe.get_cached_value(
"Fiscal Year", args.to_fiscal_year, ["year_start_date", "year_end_date"]
)
date_condition = f"and gle.posting_date between '{from_start}' and '{to_end}'"
date_condition = f"and gle.posting_date between '{args.budget_start_date}' and '{args.budget_end_date}'"
if args.is_tree:
lft_rgt = frappe.db.get_value(
@@ -687,7 +690,7 @@ def get_accumulated_monthly_budget(budget_name, posting_date):
.on(bd.parent == b.name)
.select(Sum(bd.amount).as_("accumulated_amount"))
.where(b.name == budget_name)
.where(bd.end_date >= posting_date)
.where(bd.start_date <= posting_date)
.run(as_dict=True)
)

View File

@@ -725,7 +725,6 @@ def make_budget(**args):
budget.budget_against = budget_against
budget.allocation_frequency = "Monthly"
budget.distribution_type = "Amount"
budget.distribute_equally = args.get("distribute_equally", 1)
if args.applicable_on_material_request:

View File

@@ -31,22 +31,20 @@
"fieldname": "amount",
"fieldtype": "Currency",
"in_list_view": 1,
"label": "Amount",
"read_only_depends_on": "eval:doc.end_date < frappe.datetime.get_today()"
"label": "Amount"
},
{
"fieldname": "percent",
"fieldtype": "Percent",
"in_list_view": 1,
"label": "Percent",
"read_only_depends_on": "eval:doc.end_date < frappe.datetime.get_today()"
"label": "Percent"
}
],
"grid_page_length": 50,
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2025-10-30 12:35:31.310931",
"modified": "2025-11-03 13:18:28.398198",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Budget Distribution",