@classytic/payroll 2.0.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @classytic/payroll might be problematic. Click here for more details.
- package/README.md +2599 -253
- package/dist/calculators/index.d.ts +433 -0
- package/dist/calculators/index.js +283 -0
- package/dist/calculators/index.js.map +1 -0
- package/dist/core/index.d.ts +85 -251
- package/dist/core/index.js +286 -91
- package/dist/core/index.js.map +1 -1
- package/dist/employee-identity-DXhgOgXE.d.ts +473 -0
- package/dist/employee.factory-BlZqhiCk.d.ts +189 -0
- package/dist/idempotency-Cw2CWicb.d.ts +52 -0
- package/dist/index.d.ts +618 -683
- package/dist/index.js +8336 -3580
- package/dist/index.js.map +1 -1
- package/dist/jurisdiction/index.d.ts +660 -0
- package/dist/jurisdiction/index.js +533 -0
- package/dist/jurisdiction/index.js.map +1 -0
- package/dist/payroll.d.ts +261 -65
- package/dist/payroll.js +4164 -1075
- package/dist/payroll.js.map +1 -1
- package/dist/schemas/index.d.ts +1176 -783
- package/dist/schemas/index.js +368 -28
- package/dist/schemas/index.js.map +1 -1
- package/dist/services/index.d.ts +582 -3
- package/dist/services/index.js +572 -96
- package/dist/services/index.js.map +1 -1
- package/dist/shift-compliance/index.d.ts +1171 -0
- package/dist/shift-compliance/index.js +1479 -0
- package/dist/shift-compliance/index.js.map +1 -0
- package/dist/types-BN3K_Uhr.d.ts +1842 -0
- package/dist/utils/index.d.ts +22 -2
- package/dist/utils/index.js +470 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +24 -6
- package/dist/index-CTjHlCzz.d.ts +0 -721
- package/dist/plugin-D9mOr3_d.d.ts +0 -333
- package/dist/types-BSYyX2KJ.d.ts +0 -671
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/enums.ts","../../src/config.ts","../../src/schemas/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * @classytic/payroll - Enums\r\n *\r\n * Type-safe enum definitions with const assertions\r\n * Single source of truth for all enum values\r\n */\r\n\r\nimport type {\r\n EmploymentType,\r\n EmployeeStatus,\r\n Department,\r\n PaymentFrequency,\r\n PaymentMethod,\r\n AllowanceType,\r\n DeductionType,\r\n PayrollStatus,\r\n TerminationReason,\r\n HRMTransactionCategory,\r\n SalaryBand,\r\n OrgRole,\r\n} from './types.js';\r\n\r\n// ============================================================================\r\n// Employment Type\r\n// ============================================================================\r\n\r\nexport const EMPLOYMENT_TYPE = {\r\n FULL_TIME: 'full_time',\r\n PART_TIME: 'part_time',\r\n CONTRACT: 'contract',\r\n INTERN: 'intern',\r\n CONSULTANT: 'consultant',\r\n} as const satisfies Record<string, EmploymentType>;\r\n\r\nexport const EMPLOYMENT_TYPE_VALUES = Object.values(EMPLOYMENT_TYPE);\r\n\r\nexport function isValidEmploymentType(value: string): value is EmploymentType {\r\n return EMPLOYMENT_TYPE_VALUES.includes(value as EmploymentType);\r\n}\r\n\r\n// ============================================================================\r\n// Employee Status\r\n// ============================================================================\r\n\r\nexport const EMPLOYEE_STATUS = {\r\n ACTIVE: 'active',\r\n ON_LEAVE: 'on_leave',\r\n SUSPENDED: 'suspended',\r\n TERMINATED: 'terminated',\r\n} as const satisfies Record<string, EmployeeStatus>;\r\n\r\nexport const EMPLOYEE_STATUS_VALUES = Object.values(EMPLOYEE_STATUS);\r\n\r\nexport function isValidEmployeeStatus(value: string): value is EmployeeStatus {\r\n return EMPLOYEE_STATUS_VALUES.includes(value as EmployeeStatus);\r\n}\r\n\r\nexport function isActiveStatus(status: EmployeeStatus): boolean {\r\n return status === EMPLOYEE_STATUS.ACTIVE;\r\n}\r\n\r\nexport function isEmployedStatus(status: EmployeeStatus): boolean {\r\n return status !== EMPLOYEE_STATUS.TERMINATED;\r\n}\r\n\r\nexport function canReceiveSalaryStatus(status: EmployeeStatus): boolean {\r\n return status === EMPLOYEE_STATUS.ACTIVE || status === EMPLOYEE_STATUS.ON_LEAVE;\r\n}\r\n\r\n// ============================================================================\r\n// Department\r\n// ============================================================================\r\n\r\nexport const DEPARTMENT = {\r\n MANAGEMENT: 'management',\r\n TRAINING: 'training',\r\n SALES: 'sales',\r\n OPERATIONS: 'operations',\r\n SUPPORT: 'support',\r\n HR: 'hr',\r\n MAINTENANCE: 'maintenance',\r\n MARKETING: 'marketing',\r\n FINANCE: 'finance',\r\n IT: 'it',\r\n} as const satisfies Record<string, Department>;\r\n\r\nexport const DEPARTMENT_VALUES = Object.values(DEPARTMENT);\r\n\r\nexport function isValidDepartment(value: string): value is Department {\r\n return DEPARTMENT_VALUES.includes(value as Department);\r\n}\r\n\r\n// ============================================================================\r\n// Payment Frequency\r\n// ============================================================================\r\n\r\nexport const PAYMENT_FREQUENCY = {\r\n MONTHLY: 'monthly',\r\n BI_WEEKLY: 'bi_weekly',\r\n WEEKLY: 'weekly',\r\n HOURLY: 'hourly',\r\n DAILY: 'daily',\r\n} as const satisfies Record<string, PaymentFrequency>;\r\n\r\nexport const PAYMENT_FREQUENCY_VALUES = Object.values(PAYMENT_FREQUENCY);\r\n\r\nexport function isValidPaymentFrequency(value: string): value is PaymentFrequency {\r\n return PAYMENT_FREQUENCY_VALUES.includes(value as PaymentFrequency);\r\n}\r\n\r\n// ============================================================================\r\n// Payment Method\r\n// ============================================================================\r\n\r\nexport const PAYMENT_METHOD = {\r\n BANK: 'bank',\r\n CASH: 'cash',\r\n MOBILE: 'mobile',\r\n BKASH: 'bkash',\r\n NAGAD: 'nagad',\r\n ROCKET: 'rocket',\r\n CHECK: 'check',\r\n} as const satisfies Record<string, PaymentMethod>;\r\n\r\nexport const PAYMENT_METHOD_VALUES = Object.values(PAYMENT_METHOD);\r\n\r\nexport function isValidPaymentMethod(value: string): value is PaymentMethod {\r\n return PAYMENT_METHOD_VALUES.includes(value as PaymentMethod);\r\n}\r\n\r\n// ============================================================================\r\n// Allowance Type\r\n// ============================================================================\r\n\r\nexport const ALLOWANCE_TYPE = {\r\n HOUSING: 'housing',\r\n TRANSPORT: 'transport',\r\n MEAL: 'meal',\r\n MOBILE: 'mobile',\r\n MEDICAL: 'medical',\r\n EDUCATION: 'education',\r\n BONUS: 'bonus',\r\n OTHER: 'other',\r\n} as const satisfies Record<string, AllowanceType>;\r\n\r\nexport const ALLOWANCE_TYPE_VALUES = Object.values(ALLOWANCE_TYPE);\r\n\r\nexport function isValidAllowanceType(value: string): value is AllowanceType {\r\n return ALLOWANCE_TYPE_VALUES.includes(value as AllowanceType);\r\n}\r\n\r\n// ============================================================================\r\n// Deduction Type\r\n// ============================================================================\r\n\r\nexport const DEDUCTION_TYPE = {\r\n TAX: 'tax',\r\n LOAN: 'loan',\r\n ADVANCE: 'advance',\r\n PROVIDENT_FUND: 'provident_fund',\r\n INSURANCE: 'insurance',\r\n ABSENCE: 'absence',\r\n OTHER: 'other',\r\n} as const satisfies Record<string, DeductionType>;\r\n\r\nexport const DEDUCTION_TYPE_VALUES = Object.values(DEDUCTION_TYPE);\r\n\r\nexport function isValidDeductionType(value: string): value is DeductionType {\r\n return DEDUCTION_TYPE_VALUES.includes(value as DeductionType);\r\n}\r\n\r\n// ============================================================================\r\n// Payroll Status\r\n// ============================================================================\r\n\r\nexport const PAYROLL_STATUS = {\r\n PENDING: 'pending',\r\n PROCESSING: 'processing',\r\n PAID: 'paid',\r\n FAILED: 'failed',\r\n CANCELLED: 'cancelled',\r\n} as const satisfies Record<string, PayrollStatus>;\r\n\r\nexport const PAYROLL_STATUS_VALUES = Object.values(PAYROLL_STATUS);\r\n\r\nexport function isValidPayrollStatus(value: string): value is PayrollStatus {\r\n return PAYROLL_STATUS_VALUES.includes(value as PayrollStatus);\r\n}\r\n\r\nexport function isCompletedPayrollStatus(status: PayrollStatus): boolean {\r\n return status === PAYROLL_STATUS.PAID;\r\n}\r\n\r\nexport function isPendingPayrollStatus(status: PayrollStatus): boolean {\r\n return status === PAYROLL_STATUS.PENDING || status === PAYROLL_STATUS.PROCESSING;\r\n}\r\n\r\n// ============================================================================\r\n// Termination Reason\r\n// ============================================================================\r\n\r\nexport const TERMINATION_REASON = {\r\n RESIGNATION: 'resignation',\r\n RETIREMENT: 'retirement',\r\n TERMINATION: 'termination',\r\n CONTRACT_END: 'contract_end',\r\n MUTUAL_AGREEMENT: 'mutual_agreement',\r\n OTHER: 'other',\r\n} as const satisfies Record<string, TerminationReason>;\r\n\r\nexport const TERMINATION_REASON_VALUES = Object.values(TERMINATION_REASON);\r\n\r\nexport function isValidTerminationReason(value: string): value is TerminationReason {\r\n return TERMINATION_REASON_VALUES.includes(value as TerminationReason);\r\n}\r\n\r\n// ============================================================================\r\n// HRM Transaction Categories\r\n// ============================================================================\r\n\r\nexport const HRM_TRANSACTION_CATEGORIES = {\r\n SALARY: 'salary',\r\n BONUS: 'bonus',\r\n COMMISSION: 'commission',\r\n OVERTIME: 'overtime',\r\n SEVERANCE: 'severance',\r\n} as const satisfies Record<string, HRMTransactionCategory>;\r\n\r\nexport const HRM_CATEGORY_VALUES = Object.values(HRM_TRANSACTION_CATEGORIES);\r\n\r\nexport function isHRMManagedCategory(category: string): category is HRMTransactionCategory {\r\n return HRM_CATEGORY_VALUES.includes(category as HRMTransactionCategory);\r\n}\r\n\r\n// ============================================================================\r\n// Salary Band\r\n// ============================================================================\r\n\r\nexport const SALARY_BAND = {\r\n INTERN: 'intern',\r\n JUNIOR: 'junior',\r\n MID: 'mid',\r\n SENIOR: 'senior',\r\n LEAD: 'lead',\r\n EXECUTIVE: 'executive',\r\n CUSTOM: 'custom',\r\n} as const satisfies Record<string, SalaryBand>;\r\n\r\nexport const SALARY_BAND_VALUES = Object.values(SALARY_BAND);\r\n\r\nexport function isValidSalaryBand(value: string): value is SalaryBand {\r\n return SALARY_BAND_VALUES.includes(value as SalaryBand);\r\n}\r\n\r\n// ============================================================================\r\n// Organization Role\r\n// ============================================================================\r\n\r\nexport const ORG_ROLE = {\r\n OWNER: 'owner',\r\n MANAGER: 'manager',\r\n TRAINER: 'trainer',\r\n STAFF: 'staff',\r\n INTERN: 'intern',\r\n CONSULTANT: 'consultant',\r\n} as const satisfies Record<string, OrgRole>;\r\n\r\nexport const ORG_ROLE_VALUES = Object.values(ORG_ROLE);\r\n\r\nexport function isValidOrgRole(value: string): value is OrgRole {\r\n return ORG_ROLE_VALUES.includes(value as OrgRole);\r\n}\r\n\r\n// ============================================================================\r\n// Default Export\r\n// ============================================================================\r\n\r\nexport default {\r\n EMPLOYMENT_TYPE,\r\n EMPLOYMENT_TYPE_VALUES,\r\n EMPLOYEE_STATUS,\r\n EMPLOYEE_STATUS_VALUES,\r\n DEPARTMENT,\r\n DEPARTMENT_VALUES,\r\n PAYMENT_FREQUENCY,\r\n PAYMENT_FREQUENCY_VALUES,\r\n PAYMENT_METHOD,\r\n PAYMENT_METHOD_VALUES,\r\n ALLOWANCE_TYPE,\r\n ALLOWANCE_TYPE_VALUES,\r\n DEDUCTION_TYPE,\r\n DEDUCTION_TYPE_VALUES,\r\n PAYROLL_STATUS,\r\n PAYROLL_STATUS_VALUES,\r\n TERMINATION_REASON,\r\n TERMINATION_REASON_VALUES,\r\n HRM_TRANSACTION_CATEGORIES,\r\n HRM_CATEGORY_VALUES,\r\n SALARY_BAND,\r\n SALARY_BAND_VALUES,\r\n ORG_ROLE,\r\n ORG_ROLE_VALUES,\r\n};\r\n\r\n","/**\r\n * @classytic/payroll - Configuration\r\n *\r\n * Centralized configuration with type safety\r\n * Configurable defaults for different use cases\r\n */\r\n\r\nimport type {\r\n HRMConfig,\r\n TaxBracket,\r\n SalaryBandRange,\r\n RoleMappingConfig,\r\n OrgRole,\r\n SalaryBand,\r\n Department,\r\n EmploymentType,\r\n PaymentFrequency,\r\n DeepPartial,\r\n} from './types.js';\r\n\r\n// ============================================================================\r\n// Default Configuration\r\n// ============================================================================\r\n\r\nexport const HRM_CONFIG: HRMConfig = {\r\n dataRetention: {\r\n payrollRecordsTTL: 63072000, // 2 years in seconds\r\n exportWarningDays: 30,\r\n archiveBeforeDeletion: true,\r\n },\r\n\r\n payroll: {\r\n defaultCurrency: 'BDT',\r\n allowProRating: true,\r\n attendanceIntegration: true,\r\n autoDeductions: true,\r\n overtimeEnabled: false,\r\n overtimeMultiplier: 1.5,\r\n },\r\n\r\n salary: {\r\n minimumWage: 0,\r\n maximumAllowances: 10,\r\n maximumDeductions: 10,\r\n defaultFrequency: 'monthly',\r\n },\r\n\r\n employment: {\r\n defaultProbationMonths: 3,\r\n maxProbationMonths: 6,\r\n allowReHiring: true,\r\n trackEmploymentHistory: true,\r\n },\r\n\r\n validation: {\r\n requireBankDetails: false,\r\n requireEmployeeId: true,\r\n uniqueEmployeeIdPerOrg: true,\r\n allowMultiTenantEmployees: true,\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Salary Bands Configuration\r\n// ============================================================================\r\n\r\nexport const SALARY_BANDS: Record<Exclude<SalaryBand, 'custom'>, SalaryBandRange> = {\r\n intern: { min: 10000, max: 20000 },\r\n junior: { min: 20000, max: 40000 },\r\n mid: { min: 40000, max: 70000 },\r\n senior: { min: 70000, max: 120000 },\r\n lead: { min: 100000, max: 200000 },\r\n executive: { min: 150000, max: 500000 },\r\n};\r\n\r\n// ============================================================================\r\n// Tax Brackets Configuration\r\n// ============================================================================\r\n\r\nexport const TAX_BRACKETS: Record<string, TaxBracket[]> = {\r\n BDT: [\r\n { min: 0, max: 300000, rate: 0 },\r\n { min: 300000, max: 400000, rate: 0.05 },\r\n { min: 400000, max: 500000, rate: 0.10 },\r\n { min: 500000, max: 600000, rate: 0.15 },\r\n { min: 600000, max: 3000000, rate: 0.20 },\r\n { min: 3000000, max: Infinity, rate: 0.25 },\r\n ],\r\n USD: [\r\n { min: 0, max: 10000, rate: 0.10 },\r\n { min: 10000, max: 40000, rate: 0.12 },\r\n { min: 40000, max: 85000, rate: 0.22 },\r\n { min: 85000, max: 165000, rate: 0.24 },\r\n { min: 165000, max: 215000, rate: 0.32 },\r\n { min: 215000, max: 540000, rate: 0.35 },\r\n { min: 540000, max: Infinity, rate: 0.37 },\r\n ],\r\n};\r\n\r\n// ============================================================================\r\n// Organization Roles Configuration\r\n// ============================================================================\r\n\r\nexport interface OrgRoleDefinition {\r\n key: OrgRole;\r\n label: string;\r\n description: string;\r\n}\r\n\r\nexport const ORG_ROLES: Record<Uppercase<OrgRole>, OrgRoleDefinition> = {\r\n OWNER: {\r\n key: 'owner',\r\n label: 'Owner',\r\n description: 'Full organization access (set by Organization model)',\r\n },\r\n MANAGER: {\r\n key: 'manager',\r\n label: 'Manager',\r\n description: 'Management and administrative features',\r\n },\r\n TRAINER: {\r\n key: 'trainer',\r\n label: 'Trainer',\r\n description: 'Training and coaching features',\r\n },\r\n STAFF: {\r\n key: 'staff',\r\n label: 'Staff',\r\n description: 'General staff access to basic features',\r\n },\r\n INTERN: {\r\n key: 'intern',\r\n label: 'Intern',\r\n description: 'Limited access for interns',\r\n },\r\n CONSULTANT: {\r\n key: 'consultant',\r\n label: 'Consultant',\r\n description: 'Project-based consultant access',\r\n },\r\n};\r\n\r\nexport const ORG_ROLE_KEYS = Object.values(ORG_ROLES).map((role) => role.key);\r\n\r\n// ============================================================================\r\n// Role Mapping Configuration\r\n// ============================================================================\r\n\r\nexport const ROLE_MAPPING: RoleMappingConfig = {\r\n byDepartment: {\r\n management: 'manager',\r\n training: 'trainer',\r\n sales: 'staff',\r\n operations: 'staff',\r\n finance: 'staff',\r\n hr: 'staff',\r\n marketing: 'staff',\r\n it: 'staff',\r\n support: 'staff',\r\n maintenance: 'staff',\r\n },\r\n\r\n byEmploymentType: {\r\n full_time: 'staff',\r\n part_time: 'staff',\r\n contract: 'consultant',\r\n intern: 'intern',\r\n consultant: 'consultant',\r\n },\r\n\r\n default: 'staff',\r\n};\r\n\r\n// ============================================================================\r\n// Configuration Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Calculate tax based on annual income\r\n */\r\nexport function calculateTax(annualIncome: number, currency = 'BDT'): number {\r\n const brackets = TAX_BRACKETS[currency];\r\n if (!brackets) return 0;\r\n\r\n let tax = 0;\r\n for (const bracket of brackets) {\r\n if (annualIncome > bracket.min) {\r\n const taxableAmount = Math.min(annualIncome, bracket.max) - bracket.min;\r\n tax += taxableAmount * bracket.rate;\r\n }\r\n }\r\n return Math.round(tax);\r\n}\r\n\r\n/**\r\n * Get salary band for a given amount\r\n */\r\nexport function getSalaryBand(amount: number): SalaryBand {\r\n for (const [band, range] of Object.entries(SALARY_BANDS)) {\r\n if (amount >= range.min && amount <= range.max) {\r\n return band as SalaryBand;\r\n }\r\n }\r\n return 'custom';\r\n}\r\n\r\n/**\r\n * Determine the appropriate organization role for an employee\r\n */\r\nexport function determineOrgRole(employmentData: {\r\n department?: Department | string;\r\n type?: EmploymentType | string;\r\n position?: string;\r\n}): OrgRole {\r\n const { department, type: employmentType } = employmentData;\r\n\r\n // Priority 1: Department-based mapping\r\n if (department && department in ROLE_MAPPING.byDepartment) {\r\n return ROLE_MAPPING.byDepartment[department as keyof typeof ROLE_MAPPING.byDepartment];\r\n }\r\n\r\n // Priority 2: Employment type mapping\r\n if (employmentType && employmentType in ROLE_MAPPING.byEmploymentType) {\r\n return ROLE_MAPPING.byEmploymentType[employmentType as keyof typeof ROLE_MAPPING.byEmploymentType];\r\n }\r\n\r\n // Priority 3: Default role\r\n return ROLE_MAPPING.default;\r\n}\r\n\r\n/**\r\n * Get pay periods per year based on frequency\r\n */\r\nexport function getPayPeriodsPerYear(frequency: PaymentFrequency): number {\r\n const periodsMap: Record<PaymentFrequency, number> = {\r\n monthly: 12,\r\n bi_weekly: 26,\r\n weekly: 52,\r\n daily: 365,\r\n hourly: 2080, // Assuming 40 hours/week * 52 weeks\r\n };\r\n return periodsMap[frequency];\r\n}\r\n\r\n/**\r\n * Calculate monthly equivalent from any frequency\r\n */\r\nexport function toMonthlyAmount(amount: number, frequency: PaymentFrequency): number {\r\n const periodsPerYear = getPayPeriodsPerYear(frequency);\r\n return Math.round((amount * periodsPerYear) / 12);\r\n}\r\n\r\n/**\r\n * Calculate annual equivalent from any frequency\r\n */\r\nexport function toAnnualAmount(amount: number, frequency: PaymentFrequency): number {\r\n const periodsPerYear = getPayPeriodsPerYear(frequency);\r\n return Math.round(amount * periodsPerYear);\r\n}\r\n\r\n/**\r\n * Merge configuration with defaults\r\n */\r\nexport function mergeConfig(\r\n customConfig: Partial<HRMConfig> | DeepPartial<HRMConfig> | undefined\r\n): HRMConfig {\r\n if (!customConfig) return HRM_CONFIG;\r\n\r\n return {\r\n dataRetention: { ...HRM_CONFIG.dataRetention, ...customConfig.dataRetention },\r\n payroll: { ...HRM_CONFIG.payroll, ...customConfig.payroll },\r\n salary: { ...HRM_CONFIG.salary, ...customConfig.salary },\r\n employment: { ...HRM_CONFIG.employment, ...customConfig.employment },\r\n validation: { ...HRM_CONFIG.validation, ...customConfig.validation },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Default Export\r\n// ============================================================================\r\n\r\nexport default {\r\n HRM_CONFIG,\r\n SALARY_BANDS,\r\n TAX_BRACKETS,\r\n ORG_ROLES,\r\n ORG_ROLE_KEYS,\r\n ROLE_MAPPING,\r\n calculateTax,\r\n getSalaryBand,\r\n determineOrgRole,\r\n getPayPeriodsPerYear,\r\n toMonthlyAmount,\r\n toAnnualAmount,\r\n mergeConfig,\r\n};\r\n\r\n","/**\r\n * @classytic/payroll - Mongoose Schemas\r\n *\r\n * Reusable schema definitions for employee and payroll models\r\n * Can be spread into your own schemas\r\n */\r\n\r\nimport mongoose, { Schema, type SchemaDefinition } from 'mongoose';\r\nimport {\r\n EMPLOYMENT_TYPE_VALUES,\r\n EMPLOYEE_STATUS_VALUES,\r\n DEPARTMENT_VALUES,\r\n PAYMENT_FREQUENCY_VALUES,\r\n ALLOWANCE_TYPE_VALUES,\r\n DEDUCTION_TYPE_VALUES,\r\n TERMINATION_REASON_VALUES,\r\n PAYROLL_STATUS_VALUES,\r\n} from '../enums.js';\r\nimport { HRM_CONFIG } from '../config.js';\r\n\r\n// ============================================================================\r\n// Sub-Schemas\r\n// ============================================================================\r\n\r\n/**\r\n * Allowance schema definition\r\n */\r\nexport const allowanceSchema = new Schema(\r\n {\r\n type: {\r\n type: String,\r\n enum: ALLOWANCE_TYPE_VALUES,\r\n required: true,\r\n },\r\n name: { type: String },\r\n amount: { type: Number, required: true, min: 0 },\r\n isPercentage: { type: Boolean, default: false },\r\n value: { type: Number },\r\n taxable: { type: Boolean, default: true },\r\n recurring: { type: Boolean, default: true },\r\n effectiveFrom: { type: Date, default: () => new Date() },\r\n effectiveTo: { type: Date },\r\n },\r\n { _id: false }\r\n);\r\n\r\n/**\r\n * Deduction schema definition\r\n */\r\nexport const deductionSchema = new Schema(\r\n {\r\n type: {\r\n type: String,\r\n enum: DEDUCTION_TYPE_VALUES,\r\n required: true,\r\n },\r\n name: { type: String },\r\n amount: { type: Number, required: true, min: 0 },\r\n isPercentage: { type: Boolean, default: false },\r\n value: { type: Number },\r\n auto: { type: Boolean, default: false },\r\n recurring: { type: Boolean, default: true },\r\n effectiveFrom: { type: Date, default: () => new Date() },\r\n effectiveTo: { type: Date },\r\n description: { type: String },\r\n },\r\n { _id: false }\r\n);\r\n\r\n/**\r\n * Compensation schema definition\r\n */\r\nexport const compensationSchema = new Schema(\r\n {\r\n baseAmount: { type: Number, required: true, min: 0 },\r\n frequency: {\r\n type: String,\r\n enum: PAYMENT_FREQUENCY_VALUES,\r\n default: 'monthly',\r\n },\r\n currency: { type: String, default: 'BDT' },\r\n allowances: [allowanceSchema],\r\n deductions: [deductionSchema],\r\n grossSalary: { type: Number, default: 0 },\r\n netSalary: { type: Number, default: 0 },\r\n effectiveFrom: { type: Date, default: () => new Date() },\r\n lastModified: { type: Date, default: () => new Date() },\r\n },\r\n { _id: false }\r\n);\r\n\r\n/**\r\n * Work schedule schema definition\r\n */\r\nexport const workScheduleSchema = new Schema(\r\n {\r\n hoursPerWeek: { type: Number, min: 0, max: 168 },\r\n hoursPerDay: { type: Number, min: 0, max: 24 },\r\n workingDays: [{ type: Number, min: 0, max: 6 }],\r\n shiftStart: { type: String },\r\n shiftEnd: { type: String },\r\n },\r\n { _id: false }\r\n);\r\n\r\n/**\r\n * Bank details schema definition\r\n */\r\nexport const bankDetailsSchema = new Schema(\r\n {\r\n accountName: { type: String },\r\n accountNumber: { type: String },\r\n bankName: { type: String },\r\n branchName: { type: String },\r\n routingNumber: { type: String },\r\n },\r\n { _id: false }\r\n);\r\n\r\n/**\r\n * Employment history entry schema\r\n */\r\nexport const employmentHistorySchema = new Schema(\r\n {\r\n hireDate: { type: Date, required: true },\r\n terminationDate: { type: Date, required: true },\r\n reason: { type: String, enum: TERMINATION_REASON_VALUES },\r\n finalSalary: { type: Number },\r\n position: { type: String },\r\n department: { type: String },\r\n notes: { type: String },\r\n },\r\n { timestamps: true }\r\n);\r\n\r\n/**\r\n * Payroll stats schema (pre-calculated)\r\n */\r\nexport const payrollStatsSchema = new Schema(\r\n {\r\n totalPaid: { type: Number, default: 0, min: 0 },\r\n lastPaymentDate: { type: Date },\r\n nextPaymentDate: { type: Date },\r\n paymentsThisYear: { type: Number, default: 0, min: 0 },\r\n averageMonthly: { type: Number, default: 0, min: 0 },\r\n updatedAt: { type: Date, default: () => new Date() },\r\n },\r\n { _id: false }\r\n);\r\n\r\n// ============================================================================\r\n// Employment Fields (Spread into Employee Schema)\r\n// ============================================================================\r\n\r\n/**\r\n * Employment fields to spread into your Employee schema\r\n * \r\n * @example\r\n * const employeeSchema = new Schema({\r\n * ...employmentFields,\r\n * // Your custom fields\r\n * certifications: [{ name: String, issuedDate: Date }],\r\n * });\r\n */\r\nexport const employmentFields: SchemaDefinition = {\r\n userId: {\r\n type: Schema.Types.ObjectId,\r\n ref: 'User',\r\n required: true,\r\n },\r\n organizationId: {\r\n type: Schema.Types.ObjectId,\r\n ref: 'Organization',\r\n required: true,\r\n },\r\n employeeId: { type: String, required: true },\r\n employmentType: {\r\n type: String,\r\n enum: EMPLOYMENT_TYPE_VALUES,\r\n default: 'full_time',\r\n },\r\n status: {\r\n type: String,\r\n enum: EMPLOYEE_STATUS_VALUES,\r\n default: 'active',\r\n },\r\n department: { type: String, enum: DEPARTMENT_VALUES },\r\n position: { type: String, required: true },\r\n hireDate: { type: Date, required: true },\r\n terminationDate: { type: Date },\r\n probationEndDate: { type: Date },\r\n employmentHistory: [employmentHistorySchema],\r\n compensation: { type: compensationSchema, required: true },\r\n workSchedule: workScheduleSchema,\r\n bankDetails: bankDetailsSchema,\r\n payrollStats: { type: payrollStatsSchema, default: () => ({}) },\r\n};\r\n\r\n// ============================================================================\r\n// Payroll Record Sub-Schemas\r\n// ============================================================================\r\n\r\n/**\r\n * Payroll breakdown schema\r\n */\r\nexport const payrollBreakdownSchema = new Schema(\r\n {\r\n baseAmount: { type: Number, required: true, min: 0 },\r\n allowances: [\r\n {\r\n type: { type: String },\r\n amount: { type: Number, min: 0 },\r\n taxable: { type: Boolean, default: true },\r\n },\r\n ],\r\n deductions: [\r\n {\r\n type: { type: String },\r\n amount: { type: Number, min: 0 },\r\n description: { type: String },\r\n },\r\n ],\r\n grossSalary: { type: Number, required: true, min: 0 },\r\n netSalary: { type: Number, required: true, min: 0 },\r\n workingDays: { type: Number, min: 0 },\r\n actualDays: { type: Number, min: 0 },\r\n proRatedAmount: { type: Number, default: 0, min: 0 },\r\n attendanceDeduction: { type: Number, default: 0, min: 0 },\r\n overtimeAmount: { type: Number, default: 0, min: 0 },\r\n bonusAmount: { type: Number, default: 0, min: 0 },\r\n },\r\n { _id: false }\r\n);\r\n\r\n/**\r\n * Payroll period schema\r\n */\r\nexport const periodSchema = new Schema(\r\n {\r\n month: { type: Number, required: true, min: 1, max: 12 },\r\n year: { type: Number, required: true, min: 2020 },\r\n startDate: { type: Date, required: true },\r\n endDate: { type: Date, required: true },\r\n payDate: { type: Date, required: true },\r\n },\r\n { _id: false }\r\n);\r\n\r\n/**\r\n * Payroll record fields to spread into PayrollRecord schema\r\n */\r\nexport const payrollRecordFields: SchemaDefinition = {\r\n organizationId: {\r\n type: Schema.Types.ObjectId,\r\n ref: 'Organization',\r\n required: true,\r\n index: true,\r\n },\r\n employeeId: {\r\n type: Schema.Types.ObjectId,\r\n required: true,\r\n index: true,\r\n },\r\n userId: {\r\n type: Schema.Types.ObjectId,\r\n ref: 'User',\r\n index: true,\r\n },\r\n period: { type: periodSchema, required: true },\r\n breakdown: { type: payrollBreakdownSchema, required: true },\r\n transactionId: { type: Schema.Types.ObjectId, ref: 'Transaction' },\r\n status: {\r\n type: String,\r\n enum: PAYROLL_STATUS_VALUES,\r\n default: 'pending',\r\n index: true,\r\n },\r\n paidAt: { type: Date },\r\n paymentMethod: { type: String },\r\n processedBy: { type: Schema.Types.ObjectId, ref: 'User' },\r\n notes: { type: String },\r\n payslipUrl: { type: String },\r\n exported: { type: Boolean, default: false },\r\n exportedAt: { type: Date },\r\n};\r\n\r\n// ============================================================================\r\n// Index Definitions\r\n// ============================================================================\r\n\r\n/**\r\n * Recommended indexes for Employee schema\r\n */\r\nexport const employeeIndexes = [\r\n { fields: { organizationId: 1, employeeId: 1 }, options: { unique: true } },\r\n { fields: { userId: 1, organizationId: 1 }, options: { unique: true } },\r\n { fields: { organizationId: 1, status: 1 } },\r\n { fields: { organizationId: 1, department: 1 } },\r\n { fields: { organizationId: 1, 'compensation.netSalary': -1 } },\r\n];\r\n\r\n/**\r\n * Recommended indexes for PayrollRecord schema\r\n */\r\nexport const payrollRecordIndexes = [\r\n {\r\n fields: { organizationId: 1, employeeId: 1, 'period.month': 1, 'period.year': 1 },\r\n options: { unique: true },\r\n },\r\n { fields: { organizationId: 1, 'period.year': 1, 'period.month': 1 } },\r\n { fields: { employeeId: 1, 'period.year': -1, 'period.month': -1 } },\r\n { fields: { status: 1, createdAt: -1 } },\r\n { fields: { organizationId: 1, status: 1, 'period.payDate': 1 } },\r\n {\r\n fields: { createdAt: 1 },\r\n options: {\r\n expireAfterSeconds: HRM_CONFIG.dataRetention.payrollRecordsTTL,\r\n partialFilterExpression: { exported: true },\r\n },\r\n },\r\n];\r\n\r\n/**\r\n * Apply indexes to schema\r\n */\r\nexport function applyEmployeeIndexes(schema: Schema): void {\r\n for (const { fields, options } of employeeIndexes) {\r\n schema.index(fields as unknown as Record<string, 1 | -1>, options);\r\n }\r\n}\r\n\r\n/**\r\n * Apply payroll record indexes to schema\r\n */\r\nexport function applyPayrollRecordIndexes(schema: Schema): void {\r\n for (const { fields, options } of payrollRecordIndexes) {\r\n schema.index(fields as unknown as Record<string, 1 | -1>, options);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Complete Schema Creators\r\n// ============================================================================\r\n\r\n/**\r\n * Create a complete Employee schema with all HRM fields\r\n */\r\nexport function createEmployeeSchema(\r\n additionalFields: SchemaDefinition = {}\r\n): Schema {\r\n const schema = new Schema(\r\n {\r\n ...employmentFields,\r\n ...additionalFields,\r\n },\r\n { timestamps: true }\r\n );\r\n\r\n applyEmployeeIndexes(schema);\r\n return schema;\r\n}\r\n\r\n/**\r\n * Create a complete PayrollRecord schema\r\n */\r\nexport function createPayrollRecordSchema(\r\n additionalFields: SchemaDefinition = {}\r\n): Schema {\r\n const schema = new Schema(\r\n {\r\n ...payrollRecordFields,\r\n ...additionalFields,\r\n },\r\n { timestamps: true }\r\n );\r\n\r\n applyPayrollRecordIndexes(schema);\r\n\r\n // Virtual: totalAmount\r\n schema.virtual('totalAmount').get(function () {\r\n return this.breakdown?.netSalary || 0;\r\n });\r\n\r\n // Virtual: isPaid\r\n schema.virtual('isPaid').get(function () {\r\n return this.status === 'paid';\r\n });\r\n\r\n // Virtual: periodLabel\r\n schema.virtual('periodLabel').get(function () {\r\n const months = [\r\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\r\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\r\n ];\r\n return `${months[this.period.month - 1]} ${this.period.year}`;\r\n });\r\n\r\n // Method: markAsPaid\r\n schema.methods.markAsPaid = function (\r\n transactionId: mongoose.Types.ObjectId,\r\n paidAt = new Date()\r\n ) {\r\n this.status = 'paid';\r\n this.transactionId = transactionId;\r\n this.paidAt = paidAt;\r\n };\r\n\r\n // Method: markAsExported\r\n schema.methods.markAsExported = function () {\r\n this.exported = true;\r\n this.exportedAt = new Date();\r\n };\r\n\r\n // Method: canBeDeleted\r\n schema.methods.canBeDeleted = function (): boolean {\r\n return this.exported && this.status === 'paid';\r\n };\r\n\r\n return schema;\r\n}\r\n\r\n\r\n// ============================================================================\r\n// Default Export\r\n// ============================================================================\r\n\r\nexport default {\r\n // Sub-schemas\r\n allowanceSchema,\r\n deductionSchema,\r\n compensationSchema,\r\n workScheduleSchema,\r\n bankDetailsSchema,\r\n employmentHistorySchema,\r\n payrollStatsSchema,\r\n payrollBreakdownSchema,\r\n periodSchema,\r\n // Fields\r\n employmentFields,\r\n payrollRecordFields,\r\n // Indexes\r\n employeeIndexes,\r\n payrollRecordIndexes,\r\n applyEmployeeIndexes,\r\n applyPayrollRecordIndexes,\r\n // Schema creators\r\n createEmployeeSchema,\r\n createPayrollRecordSchema,\r\n};\r\n\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/enums.ts","../../src/config.ts","../../src/schemas/common.ts","../../src/schemas/leave.ts","../../src/schemas/tax-withholding.ts","../../src/schemas/index.ts"],"names":["Schema"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @classytic/payroll - Enums\n *\n * Type-safe enum definitions with const assertions\n * Single source of truth for all enum values\n */\n\nimport type {\n EmploymentType,\n EmployeeStatus,\n Department,\n PaymentFrequency,\n PaymentMethod,\n AllowanceType,\n DeductionType,\n PayrollStatus,\n TerminationReason,\n SalaryBand,\n} from './types.js';\n\n// ============================================================================\n// Employment Type\n// ============================================================================\n\nexport const EMPLOYMENT_TYPE = {\n FULL_TIME: 'full_time',\n PART_TIME: 'part_time',\n CONTRACT: 'contract',\n INTERN: 'intern',\n CONSULTANT: 'consultant',\n} as const satisfies Record<string, EmploymentType>;\n\nexport const EMPLOYMENT_TYPE_VALUES = Object.values(EMPLOYMENT_TYPE);\n\nexport function isValidEmploymentType(value: string): value is EmploymentType {\n return EMPLOYMENT_TYPE_VALUES.includes(value as EmploymentType);\n}\n\n// ============================================================================\n// Employee Status\n// ============================================================================\n\nexport const EMPLOYEE_STATUS = {\n ACTIVE: 'active',\n ON_LEAVE: 'on_leave',\n SUSPENDED: 'suspended',\n TERMINATED: 'terminated',\n} as const satisfies Record<string, EmployeeStatus>;\n\nexport const EMPLOYEE_STATUS_VALUES = Object.values(EMPLOYEE_STATUS);\n\nexport function isValidEmployeeStatus(value: string): value is EmployeeStatus {\n return EMPLOYEE_STATUS_VALUES.includes(value as EmployeeStatus);\n}\n\nexport function isActiveStatus(status: EmployeeStatus): boolean {\n return status === EMPLOYEE_STATUS.ACTIVE;\n}\n\nexport function isEmployedStatus(status: EmployeeStatus): boolean {\n return status !== EMPLOYEE_STATUS.TERMINATED;\n}\n\nexport function canReceiveSalaryStatus(status: EmployeeStatus): boolean {\n return status === EMPLOYEE_STATUS.ACTIVE || status === EMPLOYEE_STATUS.ON_LEAVE;\n}\n\n// ============================================================================\n// Department\n// ============================================================================\n\nexport const DEPARTMENT = {\n MANAGEMENT: 'management',\n TRAINING: 'training',\n SALES: 'sales',\n OPERATIONS: 'operations',\n SUPPORT: 'support',\n HR: 'hr',\n MAINTENANCE: 'maintenance',\n MARKETING: 'marketing',\n FINANCE: 'finance',\n IT: 'it',\n} as const satisfies Record<string, Department>;\n\nexport const DEPARTMENT_VALUES = Object.values(DEPARTMENT);\n\nexport function isValidDepartment(value: string): value is Department {\n return DEPARTMENT_VALUES.includes(value as Department);\n}\n\n// ============================================================================\n// Payment Frequency\n// ============================================================================\n\nexport const PAYMENT_FREQUENCY = {\n MONTHLY: 'monthly',\n BI_WEEKLY: 'bi_weekly',\n WEEKLY: 'weekly',\n HOURLY: 'hourly',\n DAILY: 'daily',\n} as const satisfies Record<string, PaymentFrequency>;\n\nexport const PAYMENT_FREQUENCY_VALUES = Object.values(PAYMENT_FREQUENCY);\n\nexport function isValidPaymentFrequency(value: string): value is PaymentFrequency {\n return PAYMENT_FREQUENCY_VALUES.includes(value as PaymentFrequency);\n}\n\n// ============================================================================\n// Payment Method\n// ============================================================================\n\nexport const PAYMENT_METHOD = {\n BANK: 'bank',\n CASH: 'cash',\n MOBILE: 'mobile',\n BKASH: 'bkash',\n NAGAD: 'nagad',\n ROCKET: 'rocket',\n CHECK: 'check',\n} as const satisfies Record<string, PaymentMethod>;\n\nexport const PAYMENT_METHOD_VALUES = Object.values(PAYMENT_METHOD);\n\nexport function isValidPaymentMethod(value: string): value is PaymentMethod {\n return PAYMENT_METHOD_VALUES.includes(value as PaymentMethod);\n}\n\n// ============================================================================\n// Allowance Type\n// ============================================================================\n\nexport const ALLOWANCE_TYPE = {\n HOUSING: 'housing',\n TRANSPORT: 'transport',\n MEAL: 'meal',\n MOBILE: 'mobile',\n MEDICAL: 'medical',\n EDUCATION: 'education',\n BONUS: 'bonus',\n OTHER: 'other',\n} as const satisfies Record<string, AllowanceType>;\n\nexport const ALLOWANCE_TYPE_VALUES = Object.values(ALLOWANCE_TYPE);\n\nexport function isValidAllowanceType(value: string): value is AllowanceType {\n return ALLOWANCE_TYPE_VALUES.includes(value as AllowanceType);\n}\n\n// ============================================================================\n// Deduction Type\n// ============================================================================\n\nexport const DEDUCTION_TYPE = {\n TAX: 'tax',\n LOAN: 'loan',\n ADVANCE: 'advance',\n PROVIDENT_FUND: 'provident_fund',\n INSURANCE: 'insurance',\n ABSENCE: 'absence',\n OTHER: 'other',\n} as const satisfies Record<string, DeductionType>;\n\nexport const DEDUCTION_TYPE_VALUES = Object.values(DEDUCTION_TYPE);\n\nexport function isValidDeductionType(value: string): value is DeductionType {\n return DEDUCTION_TYPE_VALUES.includes(value as DeductionType);\n}\n\n// ============================================================================\n// Payroll Status\n// ============================================================================\n\nexport const PAYROLL_STATUS = {\n PENDING: 'pending',\n PROCESSING: 'processing',\n PAID: 'paid',\n FAILED: 'failed',\n CANCELLED: 'cancelled',\n} as const satisfies Record<string, PayrollStatus>;\n\nexport const PAYROLL_STATUS_VALUES = Object.values(PAYROLL_STATUS);\n\nexport function isValidPayrollStatus(value: string): value is PayrollStatus {\n return PAYROLL_STATUS_VALUES.includes(value as PayrollStatus);\n}\n\nexport function isCompletedPayrollStatus(status: PayrollStatus): boolean {\n return status === PAYROLL_STATUS.PAID;\n}\n\nexport function isPendingPayrollStatus(status: PayrollStatus): boolean {\n return status === PAYROLL_STATUS.PENDING || status === PAYROLL_STATUS.PROCESSING;\n}\n\n// ============================================================================\n// Termination Reason\n// ============================================================================\n\nexport const TERMINATION_REASON = {\n RESIGNATION: 'resignation',\n RETIREMENT: 'retirement',\n TERMINATION: 'termination',\n CONTRACT_END: 'contract_end',\n MUTUAL_AGREEMENT: 'mutual_agreement',\n OTHER: 'other',\n} as const satisfies Record<string, TerminationReason>;\n\nexport const TERMINATION_REASON_VALUES = Object.values(TERMINATION_REASON);\n\nexport function isValidTerminationReason(value: string): value is TerminationReason {\n return TERMINATION_REASON_VALUES.includes(value as TerminationReason);\n}\n\n// ============================================================================\n// Salary Band\n// ============================================================================\n\nexport const SALARY_BAND = {\n INTERN: 'intern',\n JUNIOR: 'junior',\n MID: 'mid',\n SENIOR: 'senior',\n LEAD: 'lead',\n EXECUTIVE: 'executive',\n CUSTOM: 'custom',\n} as const satisfies Record<string, SalaryBand>;\n\nexport const SALARY_BAND_VALUES = Object.values(SALARY_BAND);\n\nexport function isValidSalaryBand(value: string): value is SalaryBand {\n return SALARY_BAND_VALUES.includes(value as SalaryBand);\n}\n\n// ============================================================================\n// Leave Type\n// ============================================================================\n\nimport type { LeaveType, LeaveRequestStatus } from './types.js';\n\nexport const LEAVE_TYPE = {\n ANNUAL: 'annual',\n SICK: 'sick',\n UNPAID: 'unpaid',\n MATERNITY: 'maternity',\n PATERNITY: 'paternity',\n BEREAVEMENT: 'bereavement',\n COMPENSATORY: 'compensatory',\n OTHER: 'other',\n} as const satisfies Record<string, LeaveType>;\n\nexport const LEAVE_TYPE_VALUES = Object.values(LEAVE_TYPE);\n\nexport function isValidLeaveType(value: string): value is LeaveType {\n return LEAVE_TYPE_VALUES.includes(value as LeaveType);\n}\n\nexport function isPaidLeaveType(type: LeaveType): boolean {\n return type !== LEAVE_TYPE.UNPAID;\n}\n\n// ============================================================================\n// Leave Request Status\n// ============================================================================\n\nexport const LEAVE_REQUEST_STATUS = {\n PENDING: 'pending',\n APPROVED: 'approved',\n REJECTED: 'rejected',\n CANCELLED: 'cancelled',\n} as const satisfies Record<string, LeaveRequestStatus>;\n\nexport const LEAVE_REQUEST_STATUS_VALUES = Object.values(LEAVE_REQUEST_STATUS);\n\nexport function isValidLeaveRequestStatus(value: string): value is LeaveRequestStatus {\n return LEAVE_REQUEST_STATUS_VALUES.includes(value as LeaveRequestStatus);\n}\n\nexport function isPendingLeaveStatus(status: LeaveRequestStatus): boolean {\n return status === LEAVE_REQUEST_STATUS.PENDING;\n}\n\nexport function isApprovedLeaveStatus(status: LeaveRequestStatus): boolean {\n return status === LEAVE_REQUEST_STATUS.APPROVED;\n}\n\n// ============================================================================\n// Tax Type\n// ============================================================================\n\nexport const TAX_TYPE = {\n INCOME_TAX: 'income_tax',\n SOCIAL_SECURITY: 'social_security',\n HEALTH_INSURANCE: 'health_insurance',\n PENSION: 'pension',\n EMPLOYMENT_INSURANCE: 'employment_insurance',\n LOCAL_TAX: 'local_tax',\n OTHER: 'other',\n} as const satisfies Record<string, import('./types.js').TaxType>;\n\nexport const TAX_TYPE_VALUES = Object.values(TAX_TYPE);\n\nexport function isValidTaxType(value: string): value is import('./types.js').TaxType {\n return TAX_TYPE_VALUES.includes(value as import('./types.js').TaxType);\n}\n\n// ============================================================================\n// Tax Status\n// ============================================================================\n\nexport const TAX_STATUS = {\n PENDING: 'pending',\n SUBMITTED: 'submitted',\n PAID: 'paid',\n} as const satisfies Record<string, import('./types.js').TaxStatus>;\n\nexport const TAX_STATUS_VALUES = Object.values(TAX_STATUS);\n\nexport function isValidTaxStatus(value: string): value is import('./types.js').TaxStatus {\n return TAX_STATUS_VALUES.includes(value as import('./types.js').TaxStatus);\n}\n\nexport function isPendingTaxStatus(status: import('./types.js').TaxStatus): boolean {\n return status === TAX_STATUS.PENDING;\n}\n\nexport function isPaidTaxStatus(status: import('./types.js').TaxStatus): boolean {\n return status === TAX_STATUS.PAID;\n}\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport default {\n EMPLOYMENT_TYPE,\n EMPLOYMENT_TYPE_VALUES,\n EMPLOYEE_STATUS,\n EMPLOYEE_STATUS_VALUES,\n DEPARTMENT,\n DEPARTMENT_VALUES,\n PAYMENT_FREQUENCY,\n PAYMENT_FREQUENCY_VALUES,\n PAYMENT_METHOD,\n PAYMENT_METHOD_VALUES,\n ALLOWANCE_TYPE,\n ALLOWANCE_TYPE_VALUES,\n DEDUCTION_TYPE,\n DEDUCTION_TYPE_VALUES,\n PAYROLL_STATUS,\n PAYROLL_STATUS_VALUES,\n TERMINATION_REASON,\n TERMINATION_REASON_VALUES,\n SALARY_BAND,\n SALARY_BAND_VALUES,\n LEAVE_TYPE,\n LEAVE_TYPE_VALUES,\n LEAVE_REQUEST_STATUS,\n LEAVE_REQUEST_STATUS_VALUES,\n TAX_TYPE,\n TAX_TYPE_VALUES,\n TAX_STATUS,\n TAX_STATUS_VALUES,\n};\n","/**\n * @classytic/payroll - Configuration\n *\n * Centralized configuration with type safety\n * Configurable defaults for different use cases\n */\n\nimport type {\n HRMConfig,\n TaxBracket,\n SalaryBandRange,\n RoleMappingConfig,\n OrgRole,\n SalaryBand,\n Department,\n EmploymentType,\n PaymentFrequency,\n DeepPartial,\n EmployeeIdentityMode,\n} from './types.js';\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\nexport const HRM_CONFIG: HRMConfig = {\n dataRetention: {\n payrollRecordsTTL: 63072000, // 2 years in seconds\n exportWarningDays: 30,\n archiveBeforeDeletion: true,\n },\n\n payroll: {\n defaultCurrency: 'BDT',\n allowProRating: true,\n attendanceIntegration: true,\n autoDeductions: true,\n overtimeEnabled: false,\n overtimeMultiplier: 1.5,\n },\n\n salary: {\n minimumWage: 0,\n maximumAllowances: 10,\n maximumDeductions: 10,\n defaultFrequency: 'monthly',\n },\n\n employment: {\n defaultProbationMonths: 3,\n maxProbationMonths: 6,\n allowReHiring: true,\n trackEmploymentHistory: true,\n },\n\n validation: {\n requireBankDetails: false,\n requireUserId: false, // Modern: Allow guest employees by default\n identityMode: 'employeeId', // Modern: Use human-readable IDs as primary\n identityFallbacks: ['email', 'userId'], // Smart fallback chain\n },\n};\n\n// ============================================================================\n// Salary Bands Configuration\n// ============================================================================\n\nexport const SALARY_BANDS: Record<Exclude<SalaryBand, 'custom'>, SalaryBandRange> = {\n intern: { min: 10000, max: 20000 },\n junior: { min: 20000, max: 40000 },\n mid: { min: 40000, max: 70000 },\n senior: { min: 70000, max: 120000 },\n lead: { min: 100000, max: 200000 },\n executive: { min: 150000, max: 500000 },\n};\n\n// ============================================================================\n// Tax Brackets Configuration\n// ============================================================================\n\nexport const TAX_BRACKETS: Record<string, TaxBracket[]> = {\n BDT: [\n { min: 0, max: 300000, rate: 0 },\n { min: 300000, max: 400000, rate: 0.05 },\n { min: 400000, max: 500000, rate: 0.10 },\n { min: 500000, max: 600000, rate: 0.15 },\n { min: 600000, max: 3000000, rate: 0.20 },\n { min: 3000000, max: Infinity, rate: 0.25 },\n ],\n USD: [\n { min: 0, max: 10000, rate: 0.10 },\n { min: 10000, max: 40000, rate: 0.12 },\n { min: 40000, max: 85000, rate: 0.22 },\n { min: 85000, max: 165000, rate: 0.24 },\n { min: 165000, max: 215000, rate: 0.32 },\n { min: 215000, max: 540000, rate: 0.35 },\n { min: 540000, max: Infinity, rate: 0.37 },\n ],\n};\n\n// ============================================================================\n// Organization Roles Configuration\n// ============================================================================\n\nexport interface OrgRoleDefinition {\n key: OrgRole;\n label: string;\n description: string;\n}\n\nexport const ORG_ROLES: Record<Uppercase<OrgRole>, OrgRoleDefinition> = {\n OWNER: {\n key: 'owner',\n label: 'Owner',\n description: 'Full organization access (set by Organization model)',\n },\n MANAGER: {\n key: 'manager',\n label: 'Manager',\n description: 'Management and administrative features',\n },\n TRAINER: {\n key: 'trainer',\n label: 'Trainer',\n description: 'Training and coaching features',\n },\n STAFF: {\n key: 'staff',\n label: 'Staff',\n description: 'General staff access to basic features',\n },\n INTERN: {\n key: 'intern',\n label: 'Intern',\n description: 'Limited access for interns',\n },\n CONSULTANT: {\n key: 'consultant',\n label: 'Consultant',\n description: 'Project-based consultant access',\n },\n};\n\nexport const ORG_ROLE_KEYS = Object.values(ORG_ROLES).map((role) => role.key);\n\n// ============================================================================\n// Role Mapping Configuration\n// ============================================================================\n\nexport const ROLE_MAPPING: RoleMappingConfig = {\n byDepartment: {\n management: 'manager',\n training: 'trainer',\n sales: 'staff',\n operations: 'staff',\n finance: 'staff',\n hr: 'staff',\n marketing: 'staff',\n it: 'staff',\n support: 'staff',\n maintenance: 'staff',\n },\n\n byEmploymentType: {\n full_time: 'staff',\n part_time: 'staff',\n contract: 'consultant',\n intern: 'intern',\n consultant: 'consultant',\n },\n\n default: 'staff',\n};\n\n// ============================================================================\n// Configuration Functions\n// ============================================================================\n\n/**\n * Calculate tax based on annual income\n */\nexport function calculateTax(annualIncome: number, currency = 'BDT'): number {\n const brackets = TAX_BRACKETS[currency];\n if (!brackets) return 0;\n\n let tax = 0;\n for (const bracket of brackets) {\n if (annualIncome > bracket.min) {\n const taxableAmount = Math.min(annualIncome, bracket.max) - bracket.min;\n tax += taxableAmount * bracket.rate;\n }\n }\n return Math.round(tax);\n}\n\n/**\n * Get salary band for a given amount\n */\nexport function getSalaryBand(amount: number): SalaryBand {\n for (const [band, range] of Object.entries(SALARY_BANDS)) {\n if (amount >= range.min && amount <= range.max) {\n return band as SalaryBand;\n }\n }\n return 'custom';\n}\n\n/**\n * Determine the appropriate organization role for an employee\n */\nexport function determineOrgRole(employmentData: {\n department?: Department | string;\n type?: EmploymentType | string;\n position?: string;\n}): OrgRole {\n const { department, type: employmentType } = employmentData;\n\n // Priority 1: Department-based mapping\n if (department && department in ROLE_MAPPING.byDepartment) {\n return ROLE_MAPPING.byDepartment[department as keyof typeof ROLE_MAPPING.byDepartment];\n }\n\n // Priority 2: Employment type mapping\n if (employmentType && employmentType in ROLE_MAPPING.byEmploymentType) {\n return ROLE_MAPPING.byEmploymentType[employmentType as keyof typeof ROLE_MAPPING.byEmploymentType];\n }\n\n // Priority 3: Default role\n return ROLE_MAPPING.default;\n}\n\n/**\n * Get pay periods per year based on frequency\n */\nexport function getPayPeriodsPerYear(frequency: PaymentFrequency): number {\n const periodsMap: Record<PaymentFrequency, number> = {\n monthly: 12,\n bi_weekly: 26,\n weekly: 52,\n daily: 365,\n hourly: 2080, // Assuming 40 hours/week * 52 weeks\n };\n return periodsMap[frequency];\n}\n\n/**\n * Calculate monthly equivalent from any frequency\n */\nexport function toMonthlyAmount(amount: number, frequency: PaymentFrequency): number {\n const periodsPerYear = getPayPeriodsPerYear(frequency);\n return Math.round((amount * periodsPerYear) / 12);\n}\n\n/**\n * Calculate annual equivalent from any frequency\n */\nexport function toAnnualAmount(amount: number, frequency: PaymentFrequency): number {\n const periodsPerYear = getPayPeriodsPerYear(frequency);\n return Math.round(amount * periodsPerYear);\n}\n\n/**\n * Merge configuration with defaults\n */\nexport function mergeConfig(\n customConfig: Partial<HRMConfig> | DeepPartial<HRMConfig> | undefined\n): HRMConfig {\n if (!customConfig) return HRM_CONFIG;\n\n return {\n dataRetention: { ...HRM_CONFIG.dataRetention, ...customConfig.dataRetention },\n payroll: { ...HRM_CONFIG.payroll, ...customConfig.payroll },\n salary: { ...HRM_CONFIG.salary, ...customConfig.salary },\n employment: { ...HRM_CONFIG.employment, ...customConfig.employment },\n validation: {\n ...HRM_CONFIG.validation,\n ...customConfig.validation,\n // Ensure fallbacks is always EmployeeIdentityMode[]\n identityFallbacks: (customConfig.validation?.identityFallbacks ?? HRM_CONFIG.validation.identityFallbacks) as EmployeeIdentityMode[]\n },\n };\n}\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport default {\n HRM_CONFIG,\n SALARY_BANDS,\n TAX_BRACKETS,\n ORG_ROLES,\n ORG_ROLE_KEYS,\n ROLE_MAPPING,\n calculateTax,\n getSalaryBand,\n determineOrgRole,\n getPayPeriodsPerYear,\n toMonthlyAmount,\n toAnnualAmount,\n mergeConfig,\n};\n\n","/**\n * @classytic/payroll - Common Schema Definitions\n *\n * Shared sub-schemas used across multiple schema modules\n * Extracted to prevent circular dependencies\n */\n\nimport { Schema } from 'mongoose';\n\n// ============================================================================\n// Period Schema\n// ============================================================================\n\n/**\n * Payroll period schema\n * Shared across PayrollRecord and TaxWithholding schemas\n */\nexport const periodSchema = new Schema(\n {\n month: { type: Number, required: true, min: 1, max: 12 },\n year: { type: Number, required: true, min: 2020 },\n startDate: { type: Date, required: true },\n endDate: { type: Date, required: true },\n payDate: { type: Date, required: true },\n },\n { _id: false }\n);\n","/**\n * @classytic/payroll - Leave Schemas\n *\n * Reusable schema definitions for leave management\n */\n\nimport { Schema, type SchemaDefinition } from 'mongoose';\nimport { LEAVE_TYPE_VALUES, LEAVE_REQUEST_STATUS_VALUES } from '../enums.js';\n\n// ============================================================================\n// Sub-Schemas\n// ============================================================================\n\n/**\n * Leave balance schema (embedded in Employee)\n */\nexport const leaveBalanceSchema = new Schema(\n {\n type: {\n type: String,\n enum: LEAVE_TYPE_VALUES,\n required: true,\n },\n allocated: { type: Number, default: 0, min: 0 },\n used: { type: Number, default: 0, min: 0 },\n pending: { type: Number, default: 0, min: 0 },\n carriedOver: { type: Number, default: 0, min: 0 },\n expiresAt: { type: Date },\n year: { type: Number, required: true },\n },\n { _id: false }\n);\n\n// ============================================================================\n// Leave Balance Fields (for Employee schema)\n// ============================================================================\n\n/**\n * Leave balance fields to add to Employee schema\n * Use with employmentFields spread\n *\n * @example\n * const employeeSchema = new Schema({\n * ...employmentFields,\n * ...leaveBalanceFields,\n * });\n */\nexport const leaveBalanceFields: SchemaDefinition = {\n leaveBalances: [leaveBalanceSchema],\n};\n\n// ============================================================================\n// Leave Request Fields\n// ============================================================================\n\n/**\n * Leave request fields for LeaveRequest schema\n * Note: organizationId is optional to support single-tenant mode\n */\nexport const leaveRequestFields: SchemaDefinition = {\n organizationId: {\n type: Schema.Types.ObjectId,\n ref: 'Organization',\n required: false, // Optional for single-tenant mode\n },\n employeeId: {\n type: Schema.Types.ObjectId,\n required: true,\n },\n userId: {\n type: Schema.Types.ObjectId,\n ref: 'User',\n required: true,\n },\n type: {\n type: String,\n enum: LEAVE_TYPE_VALUES,\n required: true,\n },\n startDate: { type: Date, required: true },\n endDate: { type: Date, required: true },\n days: { type: Number, required: true, min: 0.5 },\n halfDay: { type: Boolean, default: false },\n reason: { type: String },\n status: {\n type: String,\n enum: LEAVE_REQUEST_STATUS_VALUES,\n default: 'pending',\n },\n reviewedBy: { type: Schema.Types.ObjectId, ref: 'User' },\n reviewedAt: { type: Date },\n reviewNotes: { type: String },\n attachments: [{ type: String }],\n metadata: { type: Schema.Types.Mixed, default: {} },\n};\n\n// ============================================================================\n// Index Definitions\n// ============================================================================\n\n/**\n * Recommended indexes for LeaveRequest schema\n *\n * Note: In single-tenant mode where organizationId is optional/undefined,\n * indexes containing organizationId will still work but are less optimal.\n * The employeeId-based index (index 3) is most relevant for single-tenant.\n *\n * Multi-tenant apps should use all indexes for optimal query performance.\n */\nexport const leaveRequestIndexes = [\n { fields: { organizationId: 1, employeeId: 1, startDate: -1 } },\n { fields: { organizationId: 1, status: 1, createdAt: -1 } },\n { fields: { employeeId: 1, status: 1 } }, // Most relevant for single-tenant\n { fields: { organizationId: 1, type: 1, status: 1 } },\n];\n\n/**\n * TTL index for auto-cleanup (opt-in)\n */\nexport const leaveRequestTTLIndex = {\n fields: { createdAt: 1 },\n options: {\n expireAfterSeconds: 63072000, // 2 years default\n partialFilterExpression: {\n status: { $in: ['approved', 'rejected', 'cancelled'] },\n },\n },\n};\n\n/**\n * Apply indexes to LeaveRequest schema\n */\nexport function applyLeaveRequestIndexes(\n schema: Schema,\n options: { createIndexes?: boolean; enableTTL?: boolean; ttlSeconds?: number } = {}\n): void {\n if (!options.createIndexes) return;\n\n for (const { fields } of leaveRequestIndexes) {\n schema.index(fields as unknown as Record<string, 1 | -1>);\n }\n\n if (options.enableTTL) {\n schema.index(leaveRequestTTLIndex.fields as unknown as Record<string, 1>, {\n ...leaveRequestTTLIndex.options,\n expireAfterSeconds:\n options.ttlSeconds ?? leaveRequestTTLIndex.options.expireAfterSeconds,\n });\n }\n}\n\n// ============================================================================\n// Schema Creator\n// ============================================================================\n\n/**\n * Create a complete LeaveRequest schema\n *\n * @example\n * const LeaveRequest = model('LeaveRequest', createLeaveRequestSchema());\n *\n * // With indexes\n * const LeaveRequest = model('LeaveRequest', createLeaveRequestSchema({}, { createIndexes: true }));\n *\n * // Multi-tenant mode (require organizationId)\n * const LeaveRequest = model('LeaveRequest', createLeaveRequestSchema({}, {\n * requireOrganizationId: true,\n * }));\n *\n * // With TTL for auto-cleanup\n * const LeaveRequest = model('LeaveRequest', createLeaveRequestSchema({}, {\n * createIndexes: true,\n * enableTTL: true,\n * ttlSeconds: 31536000, // 1 year\n * }));\n */\nexport function createLeaveRequestSchema(\n additionalFields: SchemaDefinition = {},\n options: {\n createIndexes?: boolean;\n enableTTL?: boolean;\n ttlSeconds?: number;\n requireOrganizationId?: boolean;\n } = {}\n): Schema {\n const fields = { ...leaveRequestFields };\n\n // Override organizationId requirement for multi-tenant mode\n if (options.requireOrganizationId) {\n fields.organizationId = {\n ...(fields.organizationId as object),\n required: true,\n };\n }\n\n const schema = new Schema(\n {\n ...fields,\n ...additionalFields,\n },\n { timestamps: true }\n );\n\n applyLeaveRequestIndexes(schema, options);\n\n // Virtual: isPending\n schema.virtual('isPending').get(function () {\n return this.status === 'pending';\n });\n\n // Virtual: isApproved\n schema.virtual('isApproved').get(function () {\n return this.status === 'approved';\n });\n\n // Virtual: isRejected\n schema.virtual('isRejected').get(function () {\n return this.status === 'rejected';\n });\n\n // Virtual: isCancelled\n schema.virtual('isCancelled').get(function () {\n return this.status === 'cancelled';\n });\n\n // Virtual: durationInDays\n schema.virtual('durationInDays').get(function () {\n return this.days;\n });\n\n return schema;\n}\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport default {\n leaveBalanceSchema,\n leaveBalanceFields,\n leaveRequestFields,\n leaveRequestIndexes,\n leaveRequestTTLIndex,\n applyLeaveRequestIndexes,\n createLeaveRequestSchema,\n};\n","/**\n * @classytic/payroll - Tax Withholding Schema\n *\n * Mongoose schema definitions for tax withholding tracking\n */\n\nimport mongoose, { Schema, type SchemaDefinition } from 'mongoose';\nimport { TAX_TYPE_VALUES, TAX_STATUS_VALUES } from '../enums.js';\nimport { periodSchema } from './common.js';\n\n// ============================================================================\n// Field Definitions\n// ============================================================================\n\n/**\n * Tax withholding field definitions\n * Can be spread into custom schemas\n */\nexport const taxWithholdingFields: SchemaDefinition = {\n organizationId: {\n type: Schema.Types.ObjectId,\n required: true,\n ref: 'Organization',\n index: true,\n },\n employeeId: {\n type: Schema.Types.ObjectId,\n required: true,\n ref: 'Employee',\n index: true,\n },\n userId: {\n type: Schema.Types.ObjectId,\n required: false,\n ref: 'User',\n },\n payrollRecordId: {\n type: Schema.Types.ObjectId,\n required: true,\n ref: 'PayrollRecord',\n index: true,\n },\n transactionId: {\n type: Schema.Types.ObjectId,\n required: true,\n ref: 'Transaction',\n index: true,\n },\n\n period: {\n type: periodSchema,\n required: true,\n },\n\n amount: {\n type: Number,\n required: true,\n min: 0,\n },\n currency: {\n type: String,\n default: 'BDT',\n },\n\n taxType: {\n type: String,\n enum: TAX_TYPE_VALUES,\n required: true,\n },\n taxRate: {\n type: Number,\n required: true,\n min: 0,\n max: 1,\n },\n taxableAmount: {\n type: Number,\n required: true,\n min: 0,\n },\n\n status: {\n type: String,\n enum: TAX_STATUS_VALUES,\n default: 'pending',\n },\n\n submittedAt: Date,\n paidAt: Date,\n governmentTransactionId: {\n type: Schema.Types.ObjectId,\n ref: 'Transaction',\n },\n referenceNumber: String,\n\n notes: String,\n metadata: {\n type: Schema.Types.Mixed,\n default: {},\n },\n};\n\n// ============================================================================\n// Index Definitions\n// ============================================================================\n\n/**\n * Recommended indexes for tax withholding collection\n */\nexport const taxWithholdingIndexes = [\n {\n fields: { organizationId: 1, status: 1, 'period.year': 1, 'period.month': 1 },\n },\n {\n fields: { employeeId: 1, 'period.year': -1, 'period.month': -1 },\n },\n {\n fields: { payrollRecordId: 1 },\n },\n {\n fields: { transactionId: 1 },\n },\n {\n fields: { organizationId: 1, taxType: 1, status: 1 },\n },\n {\n fields: { governmentTransactionId: 1 },\n options: { sparse: true },\n },\n];\n\n// ============================================================================\n// Apply Indexes Function\n// ============================================================================\n\n/**\n * Apply all recommended indexes to a tax withholding schema\n */\nexport function applyTaxWithholdingIndexes(schema: Schema): void {\n for (const { fields, options } of taxWithholdingIndexes) {\n schema.index(fields as any, options);\n }\n}\n\n// ============================================================================\n// Schema Creator Function\n// ============================================================================\n\n/**\n * Create a complete tax withholding schema with indexes, virtuals, and methods\n * @param additionalFields - Additional fields to add to the schema\n * @returns Configured tax withholding schema\n */\nexport function createTaxWithholdingSchema(additionalFields: SchemaDefinition = {}): Schema {\n const schema = new Schema(\n {\n ...taxWithholdingFields,\n ...additionalFields,\n },\n { timestamps: true }\n );\n\n // Apply indexes\n applyTaxWithholdingIndexes(schema);\n\n // Virtuals\n schema.virtual('isPending').get(function () {\n return this.status === 'pending';\n });\n\n schema.virtual('isPaid').get(function () {\n return this.status === 'paid';\n });\n\n schema.virtual('isSubmitted').get(function () {\n return this.status === 'submitted';\n });\n\n // Instance Methods\n schema.methods.markAsSubmitted = function (submittedAt = new Date()) {\n this.status = 'submitted';\n this.submittedAt = submittedAt;\n };\n\n schema.methods.markAsPaid = function (\n transactionId?: mongoose.Types.ObjectId,\n referenceNumber?: string,\n paidAt = new Date()\n ) {\n this.status = 'paid';\n this.governmentTransactionId = transactionId;\n this.referenceNumber = referenceNumber;\n this.paidAt = paidAt;\n };\n\n return schema;\n}\n","/**\n * @classytic/payroll - Mongoose Schemas\n *\n * Reusable schema definitions for employee and payroll models\n * Can be spread into your own schemas\n */\n\nimport mongoose, { Schema, type SchemaDefinition } from 'mongoose';\nimport {\n EMPLOYMENT_TYPE_VALUES,\n EMPLOYEE_STATUS_VALUES,\n DEPARTMENT_VALUES,\n PAYMENT_FREQUENCY_VALUES,\n ALLOWANCE_TYPE_VALUES,\n DEDUCTION_TYPE_VALUES,\n TERMINATION_REASON_VALUES,\n PAYROLL_STATUS_VALUES,\n PAYMENT_METHOD_VALUES,\n} from '../enums.js';\nimport { HRM_CONFIG } from '../config.js';\nimport { periodSchema } from './common.js';\n\n// ============================================================================\n// Sub-Schemas\n// ============================================================================\n\n/**\n * Allowance schema definition\n */\nexport const allowanceSchema = new Schema(\n {\n type: {\n type: String,\n enum: ALLOWANCE_TYPE_VALUES,\n required: true,\n },\n name: { type: String },\n amount: { type: Number, required: true, min: 0 },\n isPercentage: { type: Boolean, default: false },\n value: { type: Number },\n taxable: { type: Boolean, default: true },\n recurring: { type: Boolean, default: true },\n effectiveFrom: { type: Date, default: () => new Date() },\n effectiveTo: { type: Date },\n },\n { _id: false }\n);\n\n/**\n * Deduction schema definition\n */\nexport const deductionSchema = new Schema(\n {\n type: {\n type: String,\n enum: DEDUCTION_TYPE_VALUES,\n required: true,\n },\n name: { type: String },\n amount: { type: Number, required: true, min: 0 },\n isPercentage: { type: Boolean, default: false },\n value: { type: Number },\n auto: { type: Boolean, default: false },\n recurring: { type: Boolean, default: true },\n effectiveFrom: { type: Date, default: () => new Date() },\n effectiveTo: { type: Date },\n description: { type: String },\n },\n { _id: false }\n);\n\n/**\n * Compensation schema definition\n */\nexport const compensationSchema = new Schema(\n {\n baseAmount: { type: Number, required: true, min: 0 },\n frequency: {\n type: String,\n enum: PAYMENT_FREQUENCY_VALUES,\n default: 'monthly',\n },\n currency: { type: String, default: 'BDT' },\n allowances: [allowanceSchema],\n deductions: [deductionSchema],\n grossSalary: { type: Number, default: 0 },\n netSalary: { type: Number, default: 0 },\n effectiveFrom: { type: Date, default: () => new Date() },\n lastModified: { type: Date, default: () => new Date() },\n },\n { _id: false }\n);\n\n/**\n * Work schedule schema definition\n */\nexport const workScheduleSchema = new Schema(\n {\n hoursPerWeek: { type: Number, min: 0, max: 168 },\n hoursPerDay: { type: Number, min: 0, max: 24 },\n workingDays: [{ type: Number, min: 0, max: 6 }],\n shiftStart: { type: String },\n shiftEnd: { type: String },\n },\n { _id: false }\n);\n\n/**\n * Bank details schema definition\n */\nexport const bankDetailsSchema = new Schema(\n {\n accountName: { type: String },\n accountNumber: { type: String },\n bankName: { type: String },\n branchName: { type: String },\n routingNumber: { type: String },\n },\n { _id: false }\n);\n\n/**\n * Employment history entry schema\n */\nexport const employmentHistorySchema = new Schema(\n {\n hireDate: { type: Date, required: true },\n terminationDate: { type: Date, required: true },\n reason: { type: String, enum: TERMINATION_REASON_VALUES },\n finalSalary: { type: Number },\n position: { type: String },\n department: { type: String },\n notes: { type: String },\n },\n { timestamps: true }\n);\n\n/**\n * Payroll stats schema (pre-calculated)\n */\nexport const payrollStatsSchema = new Schema(\n {\n totalPaid: { type: Number, default: 0, min: 0 },\n lastPaymentDate: { type: Date },\n nextPaymentDate: { type: Date },\n paymentsThisYear: { type: Number, default: 0, min: 0 },\n averageMonthly: { type: Number, default: 0, min: 0 },\n updatedAt: { type: Date, default: () => new Date() },\n },\n { _id: false }\n);\n\n// ============================================================================\n// Employment Fields (Spread into Employee Schema)\n// ============================================================================\n\n/**\n * Employment fields to spread into your Employee schema\n * \n * @example\n * const employeeSchema = new Schema({\n * ...employmentFields,\n * // Your custom fields\n * certifications: [{ name: String, issuedDate: Date }],\n * });\n */\nexport const employmentFields: SchemaDefinition = {\n userId: {\n type: Schema.Types.ObjectId,\n ref: 'User',\n required: false, // Allow guest employees (no user account)\n },\n email: {\n type: String,\n trim: true,\n lowercase: true,\n required: false, // For guest employees without user account\n },\n organizationId: {\n type: Schema.Types.ObjectId,\n ref: 'Organization',\n required: true,\n },\n employeeId: { type: String, required: true },\n employmentType: {\n type: String,\n enum: EMPLOYMENT_TYPE_VALUES,\n default: 'full_time',\n },\n status: {\n type: String,\n enum: EMPLOYEE_STATUS_VALUES,\n default: 'active',\n },\n department: { type: String, enum: DEPARTMENT_VALUES },\n position: { type: String, required: true },\n hireDate: { type: Date, required: true },\n terminationDate: { type: Date },\n probationEndDate: { type: Date },\n employmentHistory: [employmentHistorySchema],\n compensation: { type: compensationSchema, required: true },\n workSchedule: workScheduleSchema,\n bankDetails: bankDetailsSchema,\n payrollStats: { type: payrollStatsSchema, default: () => ({}) },\n};\n\n// ============================================================================\n// Payroll Record Sub-Schemas\n// ============================================================================\n\n/**\n * Payroll breakdown schema\n */\nexport const payrollBreakdownSchema = new Schema(\n {\n baseAmount: { type: Number, required: true, min: 0 },\n allowances: [\n {\n type: { type: String, required: true },\n amount: { type: Number, required: true, min: 0 },\n taxable: { type: Boolean, default: true },\n },\n ],\n deductions: [\n {\n type: { type: String, required: true },\n amount: { type: Number, required: true, min: 0 },\n description: { type: String },\n },\n ],\n grossSalary: { type: Number, required: true, min: 0 },\n netSalary: { type: Number, required: true, min: 0 },\n taxableAmount: { type: Number, default: 0, min: 0 },\n taxAmount: { type: Number, default: 0, min: 0 },\n workingDays: { type: Number, min: 0 },\n actualDays: { type: Number, min: 0 },\n proRatedAmount: { type: Number, default: 0, min: 0 },\n attendanceDeduction: { type: Number, default: 0, min: 0 },\n overtimeAmount: { type: Number, default: 0, min: 0 },\n bonusAmount: { type: Number, default: 0, min: 0 },\n },\n { _id: false }\n);\n\n/**\n * Payroll period schema (imported from common to avoid circular dependencies)\n * Re-exported for external use\n */\nexport { periodSchema };\n\n/**\n * Payroll record fields to spread into PayrollRecord schema\n */\nexport const payrollRecordFields: SchemaDefinition = {\n organizationId: {\n type: Schema.Types.ObjectId,\n ref: 'Organization',\n required: true,\n },\n employeeId: {\n type: Schema.Types.ObjectId,\n required: true,\n },\n userId: {\n type: Schema.Types.ObjectId,\n ref: 'User',\n required: false, // Optional for guest employees\n },\n period: { type: periodSchema, required: true },\n breakdown: { type: payrollBreakdownSchema, required: true },\n transactionId: { type: Schema.Types.ObjectId, ref: 'Transaction' },\n status: {\n type: String,\n enum: PAYROLL_STATUS_VALUES,\n default: 'pending',\n },\n processedAt: { type: Date },\n paidAt: { type: Date },\n paymentMethod: {\n type: String,\n enum: PAYMENT_METHOD_VALUES,\n },\n processedBy: { type: Schema.Types.ObjectId, ref: 'User' },\n notes: { type: String },\n payslipUrl: { type: String },\n metadata: {\n type: Schema.Types.Mixed,\n default: {},\n },\n exported: { type: Boolean, default: false },\n exportedAt: { type: Date },\n corrections: [\n {\n previousAmount: Number,\n newAmount: Number,\n reason: String,\n correctedBy: { type: Schema.Types.ObjectId, ref: 'User' },\n correctedAt: { type: Date, default: Date.now },\n },\n ],\n};\n\n// ============================================================================\n// Index Definitions\n// ============================================================================\n\n/**\n * Recommended indexes for Employee schema\n */\nexport const employeeIndexes = [\n { fields: { organizationId: 1, employeeId: 1 }, options: { unique: true } },\n // Partial unique index: Only includes docs with userId field (excludes guest employees)\n // Uses partialFilterExpression instead of sparse for compound indexes\n {\n fields: { userId: 1, organizationId: 1 },\n options: {\n unique: true,\n partialFilterExpression: { userId: { $exists: true } }\n }\n },\n // Partial unique index: Only includes non-terminated docs with email\n // This allows email reuse when employees are terminated and rehired\n {\n fields: { email: 1, organizationId: 1 },\n options: {\n unique: true,\n partialFilterExpression: {\n email: { $exists: true },\n status: { $in: ['active', 'on_leave', 'suspended'] }\n }\n }\n },\n { fields: { organizationId: 1, status: 1 } },\n { fields: { organizationId: 1, department: 1 } },\n { fields: { organizationId: 1, 'compensation.netSalary': -1 } },\n];\n\n/**\n * Recommended indexes for PayrollRecord schema\n */\nexport const payrollRecordIndexes = [\n {\n fields: { organizationId: 1, employeeId: 1, 'period.month': 1, 'period.year': 1 },\n options: { unique: true },\n },\n { fields: { organizationId: 1, 'period.year': 1, 'period.month': 1 } },\n { fields: { employeeId: 1, 'period.year': -1, 'period.month': -1 } },\n { fields: { status: 1, createdAt: -1 } },\n { fields: { organizationId: 1, status: 1, 'period.payDate': 1 } },\n {\n fields: { createdAt: 1 },\n options: {\n expireAfterSeconds: HRM_CONFIG.dataRetention.payrollRecordsTTL,\n // TTL applies to ALL records (user handles backups/exports at app level)\n },\n },\n];\n\n/**\n * Apply indexes to schema\n */\nexport function applyEmployeeIndexes(schema: Schema): void {\n for (const { fields, options } of employeeIndexes) {\n schema.index(fields as unknown as Record<string, 1 | -1>, options);\n }\n}\n\n/**\n * Apply payroll record indexes to schema\n */\nexport function applyPayrollRecordIndexes(schema: Schema): void {\n for (const { fields, options } of payrollRecordIndexes) {\n schema.index(fields as unknown as Record<string, 1 | -1>, options);\n }\n}\n\n// ============================================================================\n// Complete Schema Creators\n// ============================================================================\n\n/**\n * Create a complete Employee schema with all HRM fields\n */\nexport function createEmployeeSchema(\n additionalFields: SchemaDefinition = {}\n): Schema {\n const schema = new Schema(\n {\n ...employmentFields,\n ...additionalFields,\n },\n { timestamps: true }\n );\n\n // Note: Pre-save hooks are not needed for partial indexes since:\n // - Guest employees use insertOne() which bypasses Mongoose hooks\n // - User-linked employees use Model.create() which properly sets userId\n // - Partial indexes with partialFilterExpression handle inclusion/exclusion\n\n applyEmployeeIndexes(schema);\n return schema;\n}\n\n/**\n * Create a complete PayrollRecord schema\n */\nexport function createPayrollRecordSchema(\n additionalFields: SchemaDefinition = {}\n): Schema {\n const schema = new Schema(\n {\n ...payrollRecordFields,\n ...additionalFields,\n },\n { timestamps: true }\n );\n\n applyPayrollRecordIndexes(schema);\n\n // Virtual: totalAmount\n schema.virtual('totalAmount').get(function () {\n return this.breakdown?.netSalary || 0;\n });\n\n // Virtual: isPaid\n schema.virtual('isPaid').get(function () {\n return this.status === 'paid';\n });\n\n // Virtual: periodLabel\n schema.virtual('periodLabel').get(function () {\n const months = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n ];\n return `${months[this.period.month - 1]} ${this.period.year}`;\n });\n\n // Method: markAsPaid\n schema.methods.markAsPaid = function (\n transactionId: mongoose.Types.ObjectId,\n paidAt = new Date()\n ) {\n this.status = 'paid';\n this.transactionId = transactionId;\n this.paidAt = paidAt;\n };\n\n // Method: markAsExported\n schema.methods.markAsExported = function () {\n this.exported = true;\n this.exportedAt = new Date();\n };\n\n // Method: canBeDeleted\n schema.methods.canBeDeleted = function (): boolean {\n return this.exported && this.status === 'paid';\n };\n\n return schema;\n}\n\n\n// ============================================================================\n// Leave Schemas\n// ============================================================================\n\nexport {\n leaveBalanceSchema,\n leaveBalanceFields,\n leaveRequestFields,\n leaveRequestIndexes,\n leaveRequestTTLIndex,\n applyLeaveRequestIndexes,\n createLeaveRequestSchema,\n} from './leave.js';\n\n// ============================================================================\n// Tax Withholding Schemas\n// ============================================================================\n\nexport {\n taxWithholdingFields,\n taxWithholdingIndexes,\n applyTaxWithholdingIndexes,\n createTaxWithholdingSchema,\n} from './tax-withholding.js';\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport default {\n // Sub-schemas\n allowanceSchema,\n deductionSchema,\n compensationSchema,\n workScheduleSchema,\n bankDetailsSchema,\n employmentHistorySchema,\n payrollStatsSchema,\n payrollBreakdownSchema,\n periodSchema,\n // Fields\n employmentFields,\n payrollRecordFields,\n // Indexes\n employeeIndexes,\n payrollRecordIndexes,\n applyEmployeeIndexes,\n applyPayrollRecordIndexes,\n // Schema creators\n createEmployeeSchema,\n createPayrollRecordSchema,\n};\n\n"]}
|