naveenkumar.s naveenkumar.s - 1 year ago 42
MySQL Question

Guidance needed for leave Report logic and functions in python

I am working in python 2.7, tornado web service, peewee for database.

Scenario To get leave report for each month 26 to next month 25.

So I did this below sample scenario(but logically i am stuck it out)

I am getting from_date,to_date from UI(selecting report for 26-04-2016 to 25-05-2016)

Leavetable is a table name (it has Employee id, leave from date, leave to date, working_days)

working_days is nothing but count of each leave(29-04-2016 - 02-05-2016) = 2 (saturday and sunday excluded already)

For a single employee total leave in particular month
sample leaves are

  • 24-04-16 - 26-04-16,

  • 28-04-16 - 29-04-16 ,

  • 15-05-2016 to 29-05-2016

My code (Help me to change)

for report in
db_from_date = report.From_Date
if (from_date<=db_from_date and to_date>=db_from_date):
value= workingday
print value

It getting in value = 3 for the same leave above of

  • 24-04-16 - 26-04-16(it is have to take 1day but not working out by
    this code)

  • 28-04-16 - 29-04-16(it is taken (2 days)

  • 15-05-2016 to 29-05-2016( 26,27,28,29 have to exclude this 4 days)

Guide me what is the simplest solution to get this logic work out please do the needful.

As per solarflare guidance I added the below code.

But even logically its not fit.The above scenario leave of 15-05-2016 to 29-05-2016 This leave also counting when i am taking report of 15-04-2016 to 15-05-2016

for report in
for dt in rrule(DAILY, dtstart=report.From_Date,until=report.To_Date):
if (dt.weekday() < 5):
if (report.To_Date>=from_date and report.From_Date<=to_date):
value += 1
print value

Answer Source

I Altered the above code with basic if logic and the above scenario got satisfied The code I listed below may be some variable name may difficult to understand if any comment here:

                    if (db_from_date>= prev_month and db_to_date<=this_month):
                        counting = float(working_day)

                    elif(db_from_date >= prev_month and db_from_date <= this_month and db_to_date > this_month):
                        counting = float(working_day)
                        check_point =counting + 0.5
                        extra_days = workdays.networkdays(this_month_date,db_to_date,holidays)
                        if int(check_point)==check_point:
                            extra_days=extra_days - 0.5

                    elif(db_from_date < prev_month and db_to_date>=prev_month and db_to_date <= this_month):
                        counting = float(working_day)
                        extra_days = workdays.networkdays(db_from_date,prev_month_date,holidays)
                        count = counting - extra_days

                    elif(db_from_date < prev_month and db_to_date > this_month):
                        count = workdays.networkdays(prev_month,this_month,holidays)