def pay_employees(self, today_date):
     date_format = "%Y-%m-%d"
     for emp in self.employeesList:
         payMet = emp.payDate.split("-")
         w = datetime.strptime(today_date, date_format) - datetime.strptime(
             emp.last_pay_date, date_format)
         worked_days = int(w.days)
         value = 0
         if payMet[0] == "weekly":
             hours = emp.workHours
             if worked_days >= (7 * int(payMet[1])) and payMet[2] == str(
                     datetime.strptime(today_date,
                                       date_format).strftime("%A")).lower():
                 if isinstance(emp, Hourly):
                     bonus_hours = hours - (worked_days * 8)
                     aux = hours + 0.5 * bonus_hours
                     value = aux * float(emp.hour_value)
                 if isinstance(emp, Comissioned):
                     if payMet[1] == 1:
                         div = 4
                     else:
                         div = 2
                     value = float(emp.wage) / div + emp.comission
                 elif isinstance(emp, Salaried):
                     if payMet[1] == 1:
                         div = 4
                     else:
                         div = 2
                     value = emp.wage / div
             if value > 0:
                 self.payday_employee_method(emp_id=emp.id,
                                             value=value,
                                             today_date=today_date)
         elif payMet[0] == "monthly":
             if isinstance(emp, Hourly):
                 bonus_hours = hours - (worked_days * 8)
                 value = emp.hour_value * (hours + 0.5 * bonus_hours)
             if isinstance(emp, Comissioned):
                 value = float(emp.wage) + emp.comission
             if isinstance(emp, Salaried):
                 value = emp.wage
             if str(
                     datetime.strptime(
                         today_date,
                         date_format).strftime("%d")).lower() == payMet[1]:
                 self.payday_employee_method(emp.id, value, today_date)
             elif payMet[1] == "$":
                 offset = BMonthEnd()
                 payDay = datetime.strptime(today_date, date_format)
                 d = offset.rollforward(payDay)
                 if payDay.strftime("%d") == d.strftime("%d"):
                     self.payday_employee_method(emp.id, value, today_date)
             elif str(
                     datetime.strptime(
                         today_date,
                         date_format).strftime("%d")).lower() == payMet[1]:
                 self.payday_employee_method(emp.id, value, today_date)
     print(self.payment_register)
     print("\n")
示例#2
0
def create_csv_cuotas_cobradas_file(
        sql_select_csv_fn,
        output_csv_fn,
        columns_name_to_filter,
        db_engine,
        active_wallet_result,
        cartera_activa_table_name="cartera_activa"):
    msg = f"Reading {sql_select_csv_fn} ..."
    try:
        logger.info(msg)
        sql_file_csv = open(
            os.path.join(settings.MYSQL_SQL_DIR, sql_select_csv_fn))

        logger.info(f"{msg} Done!")
        d = date.today()
        offset = BMonthEnd()
        date2 = str(offset.rollforward(d) - BDay(2))[:-9]
        date1 = str(offset.rollback(d) - BDay(1))[:-9]

        data = sql_file_csv.read().replace('$1', date1).replace('$2', date2)

        msg = f"Executing pandas.read_sql for {sql_select_csv_fn} ..."
        logger.info(msg)
        result = pandas.read_sql(sql=text(
            data.format(cartera_activa_table_name)),
                                 con=db_engine)
        logger.info(f"{msg} Done!")

        pattern = re.compile('[^a-zA-Z0-9\-._: \.\(\)\/]')
        msg = f"Removing characters '{pattern}' by '_' for {sql_select_csv_fn} data ..."
        logger.info(msg)
        for columns_name in columns_name_to_filter:
            result[columns_name] = result[columns_name].str.replace(
                pattern, '_')
        logger.info(f"{msg} Done!")
        fn = f'{output_csv_fn}_{datetime.datetime.now().strftime("%m-%d-%y-%H%M%S")}.zip'
        msg = f"Writing csv file {fn}... "
        logger.info(msg)
        result_csv = result.to_csv(header=False,
                                   decimal=',',
                                   index=False,
                                   encoding='utf-8-sig')
        zipbuff = io.BytesIO()
        with zipfile.ZipFile(zipbuff, "a", zipfile.ZIP_DEFLATED,
                             False) as zip_file:
            zip_file.writestr(f"results_{output_csv_fn}.csv",
                              result_csv.encode('utf-8-sig'))
        result = None
        result_csv = None
        gc.collect()
        active_wallet_result.save(fn, ContentFile(zipbuff.getvalue()))
        logger.info(f"{msg} Done!")
    except Exception as error:
        msg = f"{msg} Fail!: {error}"
        raise Exception(msg)
def simulate_lifetime_earnings(grossSalaryPA,
                               N,
                               principal,
                               employment_start,
                               method="monte carlo",
                               increases=None):
    '''
    Simulates payment of student debt across career based 
    on monthly tax payments according to estimated salary 
    and simultaneous compounding interest of loan
    '''

    salary = []  # store salary trajectory for plotting
    payments_towards = 0  # cumulative total of payments made towards loan across career
    salary.append(grossSalaryPA)

    ## Simulation start and end points
    today = pd.Timestamp(employment_start)
    start = today
    edate = today + timedelta(days=N * 365)  # N years of payments
    delta = timedelta(days=1)
    offset = BMonthEnd()  # date each month that tax is paid

    cumulativeTotal = principal
    cumulativeList = []  # store the value of the loan at each timestep
    cumulativeList.append(cumulativeTotal)

    ## Simulate through N years of payments
    ## interest compounds each day
    ## payment made on last working day of the month
    while today <= edate:
        if method == "monte carlo" and increases is not None:
            if ((today - start).days / 365) % 5 == 0 and (today -
                                                          start).days > 0:
                grossSalaryPA *= increases[(today - start).days / 365 / 5]

        elif method == "monte carlo" and increases is None:
            print("Please supply monte carlo simulated salary increases")

        if method == "median":
            if (today - start).days % 365 == 0 and (
                    today - start).days / 365 in male_HE.index:
                grossSalaryPA = male_HE.loc[(today - start).days /
                                            365]['Earning']

        cumulativeTotal *= (
            1 + (0.055 / 365)
        )  # apply interest on previous payments before new payment

        if today == offset.rollforward(
                today) and today.month == offset.rollforward(
                    today).month:  # if today in sim is last working day
            cumulativeTotal -= calc_student_finance_PM(
                grossSalaryPA
            )  # payment made to student finance based on gross salary
            payments_towards += calc_student_finance_PM(
                grossSalaryPA)  # this payment is added to cumulative sum
            cumulativeList.append(cumulativeTotal)
            salary.append(grossSalaryPA)

        today += delta

    return cumulativeList, salary, payments_towards
示例#4
0
def IsLastWorkingDayOfMonth(givendate):
    offset = BMonthEnd()
    #givendate += datetime.timedelta(days=3)
    lastday = offset.rollforward(givendate)
    if givendate == lastday.date(): return True
    else: return False
示例#5
0
def FindLastWorkingDayOfMonth(givendate):
    offset = BMonthEnd()
    givendate += datetime.timedelta(days=3)
    lastday = offset.rollforward(givendate)
    return lastday