(day, from_end=False, past_period=0)
return date(y, m, min(day, monthrange(y, m)[1]))
compute the next due date on a monthly schedule, where reports are
    due on 'day' day of the month. (if from_end is true, due date is 'day' days
    before the end of the month, where 0 is the last day of the month). 'next' due date
    is the first due date that occurs today or in the future. if past_period
    is non-zero, return the due date that occured N before the next due date
compute the next due date on a monthly schedule, where reports are
    due on 'day' day of the month. (if from_end is true, due date is 'day' days
    before the end of the month, where 0 is the last day of the month). 'next' due date
    is the first due date that occurs today or in the future. if past_period
    is non-zero, return the due date that occured N before the next due date
compute the next due date on a monthly schedule where reports are due on day day of the month . ( if from_end is true due date is day days before the end of the month where 0 is the last day of the month ) . next due date is the first due date that occurs today or in the future . if past_period is non - zero return the due date that occured N before the next due date
def due_date_monthly(day, from_end=False, past_period=0):
    """compute the next due date on a monthly schedule, where reports are
    due on 'day' day of the month. (if from_end is true, due date is 'day' days
    before the end of the month, where 0 is the last day of the month). 'next' due date
    is the first due date that occurs today or in the future. if past_period
    is non-zero, return the due date that occured N before the next due date
    """
    if from_end:
        assert False, 'not supported yet'

    month_diff = -past_period
    if date.today().day > day:
        month_diff += 1
    month_seq = date.today().year * 12 + (date.today().month - 1)
    month_seq += month_diff

    y = month_seq // 12
    m = month_seq % 12 + 1
    return date(y, m, min(day, monthrange(y, m)[1]))
def due_date_monthly ( day , from_end = False , past_period = 0 ) : if from_end : assert False , 'not supported yet' month_diff = - past_period if date . today ( ) . day > day : month_diff += 1 month_seq = date . today ( ) . year * 12 + ( date . today ( ) . month - 1 ) month_seq += month_diff y = month_seq // 12 m = month_seq % 12 + 1 return date ( y , m , min ( day , monthrange ( y , m ) [ 1 ] ) )