diff --git a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py index 86083114403..befc9189016 100644 --- a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py +++ b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py @@ -4,7 +4,7 @@ import frappe from dateutil.relativedelta import relativedelta -from frappe import _ +from frappe import _, cint from frappe.model.document import Document from frappe.utils import add_days, add_years, cstr, getdate @@ -89,6 +89,7 @@ class FiscalYear(Document): ) +<<<<<<< HEAD @frappe.whitelist() <<<<<<< HEAD def check_duplicate_fiscal_year(doc): @@ -110,14 +111,27 @@ def check_duplicate_fiscal_year(doc): @frappe.whitelist() ======= >>>>>>> 74ac28fc70 (refactor: `Fiscal Year` DocType cleanup) +======= +>>>>>>> 4c76786ce4 (fix(`fiscal_year`): `Fiscal Year` auto-generation and notification) def auto_create_fiscal_year(): - for d in frappe.db.sql( - """select name from `tabFiscal Year` where year_end_date = date_add(current_date, interval 3 day)""" - ): + fy = frappe.qb.DocType("Fiscal Year") + + # Skipped auto-creating Short Year, as it has very rare use case. + # Reference: https://www.irs.gov/businesses/small-businesses-self-employed/tax-years (US) + follow_up_date = add_days(getdate(), days=3) + fiscal_year = ( + frappe.qb.from_(fy) + .select(fy.name) + .where((fy.year_end_date == follow_up_date) & (fy.is_short_year == 0)) + .run() + ) + + for d in fiscal_year: try: current_fy = frappe.get_doc("Fiscal Year", d[0]) - new_fy = frappe.copy_doc(current_fy, ignore_no_copy=False) + new_fy = frappe.new_doc("Fiscal Year") + new_fy.disabled = cint(current_fy.disabled) new_fy.year_start_date = add_days(current_fy.year_end_date, 1) new_fy.year_end_date = add_years(current_fy.year_end_date, 1) @@ -125,6 +139,10 @@ def auto_create_fiscal_year(): start_year = cstr(new_fy.year_start_date.year) end_year = cstr(new_fy.year_end_date.year) new_fy.year = start_year if start_year == end_year else (start_year + "-" + end_year) + + for row in current_fy.companies: + new_fy.append("companies", {"company": row.company}) + new_fy.auto_created = 1 new_fy.insert(ignore_permissions=True) diff --git a/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html b/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html new file mode 100644 index 00000000000..542070ab6f2 --- /dev/null +++ b/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html @@ -0,0 +1,43 @@ +
{{ _("A new fiscal year has been automatically created.") }}
+ +{{ _("Fiscal Year Details") }}
+ +| {{ _("Year Name") }} | +{{ doc.name }} | +
| {{ _("Start Date") }} | +{{ frappe.format_value(doc.year_start_date) }} | +
| {{ _("End Date") }} | +{{ frappe.format_value(doc.year_end_date) }} | +
| + {% if doc.companies|length < 2 %} + {{ _("Company") }} + {% else %} + {{ _("Companies") }} + {% endif %} + | +{{ doc.companies[0].company }} | +
| {{ doc.companies[idx].company }} | +
{{ _("The fiscal year has been automatically created in a Disabled state to maintain consistency with the previous fiscal year's status.") }}
+{% endif %} + +{{ _("Please review the {0} configuration and complete any required financial setup activities.").format(frappe.utils.get_link_to_form("Fiscal Year", doc.name, frappe.bold("Fiscal Year"))) }}
\ No newline at end of file diff --git a/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json b/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json index 4c7faf4f65b..abcbb790a12 100644 --- a/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json +++ b/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json @@ -1,7 +1,8 @@ { "attach_print": 0, "channel": "Email", - "condition": "doc.auto_created", + "condition": "doc.auto_created == 1", + "condition_type": "Python", "creation": "2018-04-25 14:19:05.440361", "days_in_advance": 0, "docstatus": 0, @@ -11,8 +12,15 @@ "event": "New", "idx": 0, "is_standard": 1, +<<<<<<< HEAD "message": "{{ _(\"New fiscal year created :- \") }} {{ doc.name }}
", "modified": "2018-04-25 14:30:38.588534", +======= + "message": "{{ _(\"A new fiscal year has been automatically created.\") }}
\n\n{{ _(\"Fiscal Year Details\") }}
\n\n| {{ _(\"Year Name\") }} | \n{{ doc.name }} | \n
| {{ _(\"Start Date\") }} | \n{{ frappe.format_value(doc.year_start_date) }} | \n
| {{ _(\"End Date\") }} | \n{{ frappe.format_value(doc.year_end_date) }} | \n
| \n {% if doc.companies|length < 2 %}\n {{ _(\"Company\") }}\n {% else %}\n {{ _(\"Companies\") }}\n {% endif %}\n | \n{{ doc.companies[0].company }} | \n
| {{ doc.companies[idx].company }} | \n
{{ _(\"The fiscal year has been automatically created in a Disabled state to maintain consistency with the previous fiscal year's status.\") }}
\n{% endif %}\n\n{{ _(\"Please review the {0} configuration and complete any required financial setup activities.\").format(frappe.utils.get_link_to_form(\"Fiscal Year\", doc.name, frappe.bold(\"Fiscal Year\"))) }}
", + "message_type": "HTML", + "minutes_offset": 0, + "modified": "2026-02-21 12:14:54.736795", +>>>>>>> 4c76786ce4 (fix(`fiscal_year`): `Fiscal Year` auto-generation and notification) "modified_by": "Administrator", "module": "Accounts", "name": "Notification for new fiscal year", @@ -25,5 +33,12 @@ "email_by_role": "Accounts Manager" } ], +<<<<<<< HEAD "subject": "Notification for new fiscal year {{ doc.name }}" -} \ No newline at end of file +} +======= + "send_system_notification": 0, + "send_to_all_assignees": 0, + "subject": "{{ _(\"New Fiscal Year {0} - Review Required\").format(doc.name) }}" +} +>>>>>>> 4c76786ce4 (fix(`fiscal_year`): `Fiscal Year` auto-generation and notification)