| """ |
| Constants module for Supply Roster Optimization Tool |
| Replaces hard-coded magic numbers with meaningful named constants |
| """ |
| from src.preprocess import extract |
|
|
| class ShiftType: |
| """ |
| Shift type constants to replace magic numbers |
| 1 = Regular, 2 = Evening, 3 = Overtime |
| """ |
| REGULAR = 1 |
| EVENING = 2 |
| OVERTIME = 3 |
| |
| |
| ALL_SHIFTS = [REGULAR, EVENING, OVERTIME] |
| |
| |
| REGULAR_AND_OVERTIME = [REGULAR, OVERTIME] |
| |
| @classmethod |
| def get_name(cls, shift_id): |
| """Get human-readable name for shift ID""" |
| names = { |
| cls.REGULAR: "Regular", |
| cls.EVENING: "Evening", |
| cls.OVERTIME: "Overtime" |
| } |
| return names.get(shift_id, "Unknown") |
| |
| @classmethod |
| def get_all_names(cls): |
| """Get dictionary mapping shift IDs to names""" |
| return { |
| cls.REGULAR: "Regular", |
| cls.EVENING: "Evening", |
| cls.OVERTIME: "Overtime" |
| } |
|
|
| class LineType: |
| """ |
| Line type constants to replace magic numbers |
| 6 = Long Line, 7 = Mini Load |
| """ |
| LONG_LINE = 6 |
| MINI_LOAD = 7 |
| |
| |
| ALL_LINE_TYPES = [LONG_LINE, MINI_LOAD] |
| |
| @classmethod |
| def get_name(cls, line_id): |
| """Get human-readable name for line type ID""" |
| names = { |
| cls.LONG_LINE: "Long Line", |
| cls.MINI_LOAD: "Mini Load" |
| } |
| return names.get(line_id, "Unknown") |
| |
| @classmethod |
| def get_all_names(cls): |
| """Get dictionary mapping line type IDs to names""" |
| return { |
| cls.LONG_LINE: "Long Line", |
| cls.MINI_LOAD: "Mini Load" |
| } |
|
|
| class KitLevel: |
| """ |
| Kit hierarchy level constants |
| 0 = Prepack, 1 = Subkit, 2 = Master |
| """ |
| PREPACK = 0 |
| SUBKIT = 1 |
| MASTER = 2 |
| |
| |
| ALL_LEVELS = [PREPACK, SUBKIT, MASTER] |
| |
| @classmethod |
| def get_name(cls, level_id): |
| """Get human-readable name for kit level ID""" |
| names = { |
| cls.PREPACK: "prepack", |
| cls.SUBKIT: "subkit", |
| cls.MASTER: "master" |
| } |
| return names.get(level_id, "unknown") |
| |
| @classmethod |
| def get_all_names(cls): |
| """Get dictionary mapping level IDs to names""" |
| return { |
| cls.PREPACK: "prepack", |
| cls.SUBKIT: "subkit", |
| cls.MASTER: "master" |
| } |
| |
| |
| |
|
|
| class PaymentMode: |
| """ |
| Payment mode constants |
| """ |
| BULK = "bulk" |
| PARTIAL = "partial" |
| |
| @classmethod |
| def get_all_modes(cls): |
| """Get all available payment modes""" |
| return [cls.BULK, cls.PARTIAL] |
|
|
| |
| class DefaultConfig: |
| """Default configuration values using constants""" |
| |
| |
| PAYMENT_MODE_CONFIG = { |
| ShiftType.REGULAR: PaymentMode.BULK, |
| ShiftType.EVENING: PaymentMode.BULK, |
| ShiftType.OVERTIME: PaymentMode.PARTIAL |
| } |
| |
| |
| MAX_HOUR_PER_SHIFT_PER_PERSON = { |
| ShiftType.REGULAR: 7.5, |
| ShiftType.EVENING: 7.5, |
| ShiftType.OVERTIME: 5 |
| } |
| |
| |
| MAX_PARALLEL_WORKERS = { |
| LineType.LONG_LINE: 15, |
| LineType.MINI_LOAD: 15 |
| } |
| |
| |
| FIXED_MIN_UNICEF_PER_DAY = 2 |
| |
| |
| LINE_COUNT_LONG_LINE = 3 |
| LINE_COUNT_MINI_LOAD = 2 |
| |
| |
| MAX_PARALLEL_WORKERS_LONG_LINE = 7 |
| MAX_PARALLEL_WORKERS_MINI_LOAD = 5 |
| |
| |
| DEFAULT_COST_RATES = { |
| "UNICEF Fixed term": { |
| ShiftType.REGULAR: 43.27, |
| ShiftType.EVENING: 43.27, |
| ShiftType.OVERTIME: 64.91 |
| }, |
| "Humanizer": { |
| ShiftType.REGULAR: 27.94, |
| ShiftType.EVENING: 27.94, |
| ShiftType.OVERTIME: 41.91 |
| } |
| } |
| |
| EMPLOYEE_TYPE_LIST =extract.read_employee_data()["employment_type"].unique().tolist() |
| SHIFT_LIST = extract.get_shift_info()["id"].unique().tolist() |
| EVENING_SHIFT_MODE = "normal" |
| EVENING_SHIFT_DEMAND_THRESHOLD = 0.9 |
| |
| |
| SCHEDULE_TYPE = "weekly" |
| |
| |
| FIXED_STAFF_MODE = "priority" |
| |
| |
| UNICEF_RATE_SHIFT_1 = 12.5 |
| UNICEF_RATE_SHIFT_2 = 15.0 |
| UNICEF_RATE_SHIFT_3 = 18.75 |
| HUMANIZER_RATE_SHIFT_1 = 10.0 |
| HUMANIZER_RATE_SHIFT_2 = 12.0 |
| HUMANIZER_RATE_SHIFT_3 = 15.0 |
| LINE_LIST = extract.read_packaging_line_data()["id"].unique().tolist() |
| LINE_CNT_PER_TYPE = extract.read_packaging_line_data().set_index("id")["line_count"].to_dict() |
| |
| |
| @staticmethod |
| def get_max_employee_per_type_on_day(date_span): |
| """Get max employee per type configuration for given date span""" |
| return { |
| "UNICEF Fixed term": { |
| t: 8 for t in date_span |
| }, |
| "Humanizer": { |
| t: 10 for t in date_span |
| } |
| } |
| MAX_UNICEF_PER_DAY = 8 |
| MAX_HUMANIZER_PER_DAY = 10 |
| MAX_HOUR_PER_PERSON_PER_DAY = 14 |
| KIT_LEVELS, KIT_DEPENDENCIES, PRODUCTION_PRIORITY_ORDER = extract.get_production_order_data() |
|
|
|
|
|
|