44
55import frappe
66from dateutil .relativedelta import relativedelta
7- from frappe import _
7+ from frappe import _ , cint
88from frappe .model .document import Document
99from frappe .utils import add_days , add_years , cstr , getdate
1010
@@ -33,24 +33,6 @@ def validate(self):
3333 self .validate_dates ()
3434 self .validate_overlap ()
3535
36- if not self .is_new ():
37- year_start_end_dates = frappe .db .sql (
38- """select year_start_date, year_end_date
39- from `tabFiscal Year` where name=%s""" ,
40- (self .name ),
41- )
42-
43- if year_start_end_dates :
44- if (
45- getdate (self .year_start_date ) != year_start_end_dates [0 ][0 ]
46- or getdate (self .year_end_date ) != year_start_end_dates [0 ][1 ]
47- ):
48- frappe .throw (
49- _ (
50- "Cannot change Fiscal Year Start Date and Fiscal Year End Date once the Fiscal Year is saved."
51- )
52- )
53-
5436 def validate_dates (self ):
5537 self .validate_from_to_dates ("year_start_date" , "year_end_date" )
5638 if self .is_short_year :
@@ -66,28 +48,20 @@ def validate_dates(self):
6648 frappe .exceptions .InvalidDates ,
6749 )
6850
69- def on_update (self ):
70- check_duplicate_fiscal_year (self )
71- frappe .cache ().delete_value ("fiscal_years" )
51+ def validate_overlap (self ):
52+ fy = frappe .qb .DocType ("Fiscal Year" )
7253
73- def on_trash (self ):
74- frappe .cache ().delete_value ("fiscal_years" )
54+ name = self .name or self .year
7555
76- def validate_overlap (self ):
77- existing_fiscal_years = frappe .db .sql (
78- """select name from `tabFiscal Year`
79- where (
80- (%(year_start_date)s between year_start_date and year_end_date)
81- or (%(year_end_date)s between year_start_date and year_end_date)
82- or (year_start_date between %(year_start_date)s and %(year_end_date)s)
83- or (year_end_date between %(year_start_date)s and %(year_end_date)s)
84- ) and name!=%(name)s""" ,
85- {
86- "year_start_date" : self .year_start_date ,
87- "year_end_date" : self .year_end_date ,
88- "name" : self .name or "No Name" ,
89- },
90- as_dict = True ,
56+ existing_fiscal_years = (
57+ frappe .qb .from_ (fy )
58+ .select (fy .name )
59+ .where (
60+ (fy .year_start_date <= self .year_end_date )
61+ & (fy .year_end_date >= self .year_start_date )
62+ & (fy .name != name )
63+ )
64+ .run (as_dict = True )
9165 )
9266
9367 if existing_fiscal_years :
@@ -110,44 +84,41 @@ def validate_overlap(self):
11084 frappe .throw (
11185 _ (
11286 "Year start date or end date is overlapping with {0}. To avoid please set company"
113- ).format (existing .name ),
87+ ).format (frappe . get_desk_link ( "Fiscal Year" , existing .name , open_in_new_tab = True ) ),
11488 frappe .NameError ,
11589 )
11690
11791
118- @frappe .whitelist ()
119- def check_duplicate_fiscal_year (doc ):
120- year_start_end_dates = frappe .db .sql (
121- """select name, year_start_date, year_end_date from `tabFiscal Year` where name!=%s""" ,
122- (doc .name ),
92+ def auto_create_fiscal_year ():
93+ fy = frappe .qb .DocType ("Fiscal Year" )
94+
95+ # Skipped auto-creating Short Year, as it has very rare use case.
96+ # Reference: https://www.irs.gov/businesses/small-businesses-self-employed/tax-years (US)
97+ follow_up_date = add_days (getdate (), days = 3 )
98+ fiscal_year = (
99+ frappe .qb .from_ (fy )
100+ .select (fy .name )
101+ .where ((fy .year_end_date == follow_up_date ) & (fy .is_short_year == 0 ))
102+ .run ()
123103 )
124- for fiscal_year , ysd , yed in year_start_end_dates :
125- if (getdate (doc .year_start_date ) == ysd and getdate (doc .year_end_date ) == yed ) and (
126- not frappe .flags .in_test
127- ):
128- frappe .throw (
129- _ (
130- "Fiscal Year Start Date and Fiscal Year End Date are already set in Fiscal Year {0}"
131- ).format (fiscal_year )
132- )
133104
134-
135- @frappe .whitelist ()
136- def auto_create_fiscal_year ():
137- for d in frappe .db .sql (
138- """select name from `tabFiscal Year` where year_end_date = date_add(current_date, interval 3 day)"""
139- ):
105+ for d in fiscal_year :
140106 try :
141107 current_fy = frappe .get_doc ("Fiscal Year" , d [0 ])
142108
143- new_fy = frappe .copy_doc (current_fy , ignore_no_copy = False )
109+ new_fy = frappe .new_doc ("Fiscal Year" )
110+ new_fy .disabled = cint (current_fy .disabled )
144111
145112 new_fy .year_start_date = add_days (current_fy .year_end_date , 1 )
146113 new_fy .year_end_date = add_years (current_fy .year_end_date , 1 )
147114
148115 start_year = cstr (new_fy .year_start_date .year )
149116 end_year = cstr (new_fy .year_end_date .year )
150117 new_fy .year = start_year if start_year == end_year else (start_year + "-" + end_year )
118+
119+ for row in current_fy .companies :
120+ new_fy .append ("companies" , {"company" : row .company })
121+
151122 new_fy .auto_created = 1
152123
153124 new_fy .insert (ignore_permissions = True )
0 commit comments