Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
lib-py-b2b / calendar.py
Size: Mime:
from datetime import datetime, timedelta
import logging
from lib_b2b.holidays import Holidays
import calendar

logger = logging.getLogger(__name__)


class OperatingCalendar:
    three_year_range = [datetime.now().year - 1, datetime.now().year, datetime.now().year + 1]
    standard_holidays = Holidays.get('BarnhardtHolidayCalendar', years=three_year_range)

    def __init__(self, work_days: [int], holidays: Holidays):
        self.holidays = holidays
        self.work_days = work_days

    def next_available_day(self, after: datetime):
        _date = after
        while _date in self.holidays or _date.weekday() not in self.work_days:
            _date = _date + timedelta(days=1)
        return _date

    def describe(self):
        _str = "Operating Calendar:\n"
        _str += f"\toperate on: {', '.join(list(map(lambda d: list(calendar.day_abbr)[d], self.work_days)))}\n"
        _str += f"\tholidays: {self.holidays.describe()}\n"
        return _str


class CustomerOperatingCalendars:
    three_year_range = [datetime.now().year - 1, datetime.now().year, datetime.now().year + 1]
    standard_holidays = Holidays.get('BarnhardtHolidayCalendar', years=three_year_range)

    @classmethod
    def get(cls, customer: str):
        if customer == '4021001305':
            return CustomerOperatingCalendars(
                customer_service=OperatingCalendar(work_days=list(range(0, 5)),
                                                   holidays=cls.standard_holidays),
                fulfillment=OperatingCalendar(work_days=list(range(0, 5)),
                                              holidays=cls.standard_holidays)
            )
        elif customer == '402100200186':
            return CustomerOperatingCalendars(
                customer_service=OperatingCalendar(work_days=list(range(0, 5)),
                                                   holidays=cls.standard_holidays),
                fulfillment=OperatingCalendar(work_days=list(range(0, 5)),
                                              holidays=cls.standard_holidays)
            )
        elif customer == '402100100554':
            return CustomerOperatingCalendars(
                customer_service=OperatingCalendar(work_days=list(range(0, 5)),
                                                   holidays=cls.standard_holidays),
                fulfillment=OperatingCalendar(work_days=list(range(1, 5)),
                                              holidays=cls.standard_holidays)
            )
        elif customer == '402100200002':
            return CustomerOperatingCalendars(
                customer_service=OperatingCalendar(work_days=list(range(0, 5)),
                                                   holidays=cls.standard_holidays),
                fulfillment=OperatingCalendar(work_days=list(range(1, 5)),
                                              holidays=cls.standard_holidays)
            )
        elif customer == '705700100991':
            return CustomerOperatingCalendars(
                customer_service=OperatingCalendar(work_days=list(range(0, 5)),
                                                   holidays=cls.standard_holidays),
                fulfillment=OperatingCalendar(work_days=list(range(0, 5)),
                                              holidays=cls.standard_holidays)
            )
        else:
            raise ValueError(f"Operating calendars not found for {customer}")

    def __init__(self, customer_service: OperatingCalendar, fulfillment: OperatingCalendar):
        self.fulfillment = fulfillment
        self.customer_service = customer_service