Skip to main content

Highly customizable SLA and work-shifts Generator, for any time-keeping and days-off policies

Project description

Python package

pyshiftsla

Highly customizable SLA calculator and Work shift Generator, for any time-keeping and days-off policies

Install

pip install pyshiftsla

Quickstart - A case in Vietnam's Law:

  • Let's calculate SLA and generate work shifts for an American female employee, Working in Vietnam, about to take maternity leave.
  • Law references: (1); (2)

1. She will have:

  • 4-month of maternity leave.
  • Holidays leave:
    • All Vietnamese holidays.
    • 1 day from home country's New Year's days (2024-01-01) (same as Solar New Year in Vietnam) (+0 holiday leave)
    • 1 day from home country's Independence Days (2024-07-04) (+1 holiday leave)
  • Overtime shift in the Solar New Year: from 13:30 to 14:30
  • Plus random 3 days off

2. Configuration for ShiftsBuilder

from pysla.shifts_builder import ShiftsBuilder, Shift, DateRange
from datetime import time, date

US_WOMAN_LIVING_IN_VIETNAM_MATERNITY_LEAVE_4MONTHS_2024 = ShiftsBuilder(
    workdays_weekly=[0,1,2,3,4], # weekday indexes: Monday to Friday
    daily_shifts=DailyShift([
        # Usual Morning shift: 8:30 to 11:45
        # Created using a string, easier to read but slower
        Shift.fromstr("08301145"),
        # Usual Afternoon shift: 13:30 to 18:00
        # Parsed the timestamps straight to parameters, faster
        Shift(start=time(13,30), end=time(18))
    ]),
    days_off_ranges=[ # you can parse `date` or `DateRange`
        date(2024, 1, 1), # SOLAR_NEW_YEAR
        date(2024, 7, 4), # US_INDEPENDENCE_DAY
        DateRange.fromstr("20240430-20240501"), #VIETNAM_VICTORY_DAY
        DateRange.fromstr("20240902-20240903"), #VIETNAM_INDEPENDENCE_DAY
        #VIETNAMESE_LUNAR_NEW_YEAR, Lunar DateRange will automatically turn into Solar DateRange
        DateRange.fromstr("20240101-20240105", calendar_type="lunar") 
        #VIETNAM_LUNAR_HUNG_KINGS_FESTIVAL
        DateRange.fromstr("20240310", calendar_type="lunar")

        # 4 months of maternity leave
        DateRange.fromstr("20240801-20241201"),

        date(2024, 2, 9),  # custom days off
        date(2024, 6, 3),  # custom days off
        date(2024, 12, 10),  # custom days off
    ],
    special_shifts=ShiftRange(
        {
            # Urgent overtime in the Solar New Year
            # 13:30 to 14:30
            date(2024, 1, 1): DailyShift([Shift.fromstr("13301430")]),
        }
    ),
)

3. Generate ShiftRange for year 2024

  • ShiftRange works like a dictionary, and can check the generated Shift at a specific date.
generated_shiftrange = ( # ShiftRange for 2024
    US_WOMAN_LIVING_IN_VIETNAM_MATERNITY_LEAVE_4MONTHS_2024
    .build_shifts_from_daterange(
        from_date=date(2024, 1, 1),
        to_date=date(2024, 12, 30))
    )
# Get Shifts in New Year 2024-01-01
generated_shiftrange[date(2024,1,1)] 
# [Shift(start=datetime.time(13, 30), end=datetime.time(14, 30))]

# Get Shifts in a random working day
generated_shiftrange[date(2024,2,8)]
# [
#   Shift(start=datetime.time(8, 30), end=datetime.time(11, 45)), 
#   Shift(start=datetime.time(13, 30), end=datetime.time(18, 0)) 
# ]

# Get Shifts in a day off (holiday leave) 2024-07-04
# KeyError: datetime.date(2024, 2, 9)
generated_shiftrange[date(2024,7,4)]
generated_shiftrange.get(date(2024,7,4)) # None

4. Calculate SLA (service-level agreement)

  • The result will be in Milliseconds:
sla_millis = (
    US_WOMAN_lIVING_IN_VIETNAM_MATERNITY_LEAVE_4MONTHS_2024
    .calculate_sla(
        start_deal=datetime(2024, 1, 1, 14),
        end_deal=datetime(2024, 1, 2, 9, 30),
        use_generated_shifts=True, # for faster execution, 
        # reuse the cached results from `build_shifts_from_daterange`,
        # if "False", set re-generated `ShiftsRange` from `start_deal` to `end_deal`
    )
)
sla_hours = sla_millis/(1000*60*60) # 1.5 hours

Global ShiftsBuilder config for your company/team

from pysla.shifts_builder import ShiftsBuilder, Shift
from datetime import time

COMPANY_SHIFTS_BUILDER = ShiftsBuilder(
    daily_shifts=DailyShift([
        Shift.fromstr("08301145"), # morning shift, created using a string, easier to read but slower
        Shift(start=time(13,30), end=time(18)) # afternoon shift, parsed the timestamps straight to parameters, faster
    ]),
    workdays_weekly=[0,1,2,3,4] # Monday to Friday
)
  • Copy config to a specific employee.
employee_takes_4_days_off = (
    COMPANY_SHIFTS_BUILDER
    .add_days_off_range(
        [
            DateRange.fromstr("20241204-20241205"), # 2days off
            DateRange.fromstr("20241000-20241001") # 2days off
        ],
        inplace=False # if `False` will return a copied `ShiftsBuilder`,
        # if `True`, will change `COMPANY_SHIFTS_BUILDER` and return `None`
    ))

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyshiftsla-0.2.0.tar.gz (13.7 kB view details)

Uploaded Source

Built Distribution

pyshiftsla-0.2.0-py3-none-any.whl (14.0 kB view details)

Uploaded Python 3

File details

Details for the file pyshiftsla-0.2.0.tar.gz.

File metadata

  • Download URL: pyshiftsla-0.2.0.tar.gz
  • Upload date:
  • Size: 13.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.10.12 Linux/6.6.6-76060606-generic

File hashes

Hashes for pyshiftsla-0.2.0.tar.gz
Algorithm Hash digest
SHA256 4adf4ee0fcc3b5454d910ce7e09a94c91c5719ffec67799bdd39a040fc8e21aa
MD5 1a662a30bfee3bad326b13c7ac33c0e0
BLAKE2b-256 7f4c01dae83efaf55839da755bbfa8fafe5ddb01c57f0860f4e31856f3d1f63d

See more details on using hashes here.

File details

Details for the file pyshiftsla-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: pyshiftsla-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 14.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.10.12 Linux/6.6.6-76060606-generic

File hashes

Hashes for pyshiftsla-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bd4d85fe0c1e9f3ed211f2c2ea6ec443befc7cfa7ad64bf5fe674cd11e16e950
MD5 7d530fa170260083c15a978e82a2a815
BLAKE2b-256 759ba1f54ed6e007e783460d81e9cb7c24770aea5a4485e63029ec9220667fa9

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page