Skip to main content

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

Project description

pysla

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

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.1.0.tar.gz (13.4 kB view details)

Uploaded Source

Built Distribution

pyshiftsla-0.1.0-py3-none-any.whl (13.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pyshiftsla-0.1.0.tar.gz
  • Upload date:
  • Size: 13.4 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.1.0.tar.gz
Algorithm Hash digest
SHA256 d52d05249b2d46ef817aefae951647616c821c32472b1e110c149a4020762cfb
MD5 5e2b500e095a1c6a3e8287bf8eed7d66
BLAKE2b-256 0b02ea20483bb3de32690add3a198c5078483695c687d94d9a76bb3ed91405bf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pyshiftsla-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.9 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.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9941b0f48a25d90ae4105b882d8bd853944121f073b0dd9c16952159d3169ead
MD5 2ad904e509b9aef6a0d57aaee37d76d8
BLAKE2b-256 b7af9d37fd39aa0124cfefaf3547a7f28536bef946d276cfd23d841da2bcd11f

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