# Generated by Django 5.2.6 on 2026-06-29 10:52

import django.core.validators
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('base', '0002_initial'),
        ('employee', '0001_initial'),
        ('payroll', '0001_initial'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='CooperativeSociety',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('name', models.CharField(max_length=200, unique=True, verbose_name='Cooperative Name')),
                ('code', models.CharField(max_length=20, unique=True, verbose_name='Code')),
                ('contribution_type', models.CharField(choices=[('fixed', 'Fixed Amount'), ('percentage', 'Percentage of Basic')], default='fixed', max_length=15, verbose_name='Contribution Type')),
                ('amount', models.DecimalField(decimal_places=2, default=0, help_text="Used when contribution type is 'Fixed Amount'.", max_digits=15, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Fixed Amount')),
                ('rate', models.DecimalField(decimal_places=2, default=0, help_text="Used when contribution type is 'Percentage of Basic'.", max_digits=5, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100)], verbose_name='Rate (%)')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
            ],
            options={
                'verbose_name': 'Cooperative Society',
                'verbose_name_plural': 'Cooperative Societies',
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='HealthScheme',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('name', models.CharField(max_length=200, unique=True, verbose_name='Scheme Name')),
                ('code', models.CharField(max_length=20, unique=True, verbose_name='Code')),
                ('scheme_type', models.CharField(choices=[('nhis', 'NHIS (National Health Insurance)'), ('hmo', 'HMO (Health Maintenance Organisation)'), ('nhf', 'NHF (National Housing Fund)'), ('life_assurance', 'Life Assurance')], max_length=20, verbose_name='Scheme Type')),
                ('employee_contribution_type', models.CharField(choices=[('fixed', 'Fixed Amount'), ('percentage', 'Percentage of Basic')], default='percentage', max_length=15, verbose_name='Employee Contribution Type')),
                ('employee_amount', models.DecimalField(decimal_places=2, default=0, max_digits=15, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Employee Fixed Amount')),
                ('employee_rate', models.DecimalField(decimal_places=2, default=1.75, help_text='Default: NHIS 1.75%, NHF 2.5%', max_digits=5, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100)], verbose_name='Employee Rate (%)')),
                ('employer_contribution_type', models.CharField(choices=[('fixed', 'Fixed Amount'), ('percentage', 'Percentage of Basic')], default='percentage', max_length=15, verbose_name='Employer Contribution Type')),
                ('employer_amount', models.DecimalField(decimal_places=2, default=0, max_digits=15, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Employer Fixed Amount')),
                ('employer_rate', models.DecimalField(decimal_places=2, default=10.0, help_text='Default: NHIS 10%', max_digits=5, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100)], verbose_name='Employer Rate (%)')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
            ],
            options={
                'verbose_name': 'Health / Insurance Scheme',
                'verbose_name_plural': 'Health / Insurance Schemes',
                'ordering': ['scheme_type', 'name'],
            },
        ),
        migrations.CreateModel(
            name='IncomeComponent',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('name', models.CharField(max_length=200, unique=True, verbose_name='Component Name')),
                ('code', models.CharField(help_text='Short code, e.g. BASIC, HOUSING, TRANSPORT', max_length=20, unique=True, verbose_name='Code')),
                ('component_type', models.CharField(choices=[('basic', 'Basic Salary'), ('allowance', 'Allowance'), ('bonus', 'Bonus / Other')], default='allowance', max_length=20, verbose_name='Component Type')),
                ('is_taxable', models.BooleanField(default=True, verbose_name='Is Taxable?')),
                ('order', models.PositiveSmallIntegerField(default=0, help_text='Lower numbers appear first on payslip.', verbose_name='Display Order')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
            ],
            options={
                'verbose_name': 'Income Component',
                'verbose_name_plural': 'Income Components',
                'ordering': ['order', 'name'],
            },
        ),
        migrations.CreateModel(
            name='PayrollRun',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('reference', models.CharField(editable=False, max_length=30, unique=True, verbose_name='Reference')),
                ('period_start', models.DateField(verbose_name='Period Start')),
                ('period_end', models.DateField(verbose_name='Period End')),
                ('scope', models.CharField(choices=[('company', 'Company-Wide'), ('department', 'Department')], default='company', max_length=20, verbose_name='Scope')),
                ('status', models.CharField(choices=[('draft', 'Draft'), ('submitted', 'Submitted (Awaiting Chief Accountant)'), ('ca_approved', 'Chief Accountant Approved (Awaiting CEO)'), ('ceo_approved', 'CEO Approved (Ready for Payment)'), ('paid', 'Payment Executed'), ('returned', 'Returned for Correction')], default='draft', max_length=20, verbose_name='Status')),
                ('description', models.CharField(blank=True, help_text="E.g. 'May 2026 Payroll — Full Staff'", max_length=300, verbose_name='Description / Label')),
                ('total_gross', models.DecimalField(decimal_places=2, default=0, max_digits=18, verbose_name='Total Gross')),
                ('total_deductions', models.DecimalField(decimal_places=2, default=0, max_digits=18, verbose_name='Total Deductions')),
                ('total_net', models.DecimalField(decimal_places=2, default=0, max_digits=18, verbose_name='Total Net Pay')),
                ('submitted_at', models.DateTimeField(blank=True, null=True, verbose_name='Submitted At')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('department', models.ForeignKey(blank=True, help_text="Required when scope is 'Department'.", null=True, on_delete=django.db.models.deletion.PROTECT, to='base.department', verbose_name='Department')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
            ],
            options={
                'verbose_name': 'Payroll Run',
                'verbose_name_plural': 'Payroll Runs',
                'ordering': ['-period_start', '-id'],
            },
        ),
        migrations.CreateModel(
            name='PayrollRunLog',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('action', models.CharField(choices=[('submit', 'Submitted'), ('ca_approve', 'Chief Accountant Approved'), ('ceo_approve', 'CEO Approved'), ('return', 'Returned for Correction'), ('execute', 'Payment Executed')], max_length=20, verbose_name='Action')),
                ('comment', models.TextField(blank=True, verbose_name='Comment')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Timestamp')),
                ('actor', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='payroll_run_logs', to=settings.AUTH_USER_MODEL, verbose_name='Actor')),
                ('run', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='approval_logs', to='payroll.payrollrun', verbose_name='Payroll Run')),
            ],
            options={
                'verbose_name': 'Payroll Run Log',
                'verbose_name_plural': 'Payroll Run Logs',
                'ordering': ['created_at'],
            },
        ),
        migrations.CreateModel(
            name='PensionFundAdministrator',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('name', models.CharField(max_length=200, unique=True, verbose_name='PFA Name')),
                ('code', models.CharField(help_text='Short identifier, e.g. ARM-PFA, AIICO-PFA', max_length=20, unique=True, verbose_name='PFA Code')),
                ('employee_rate', models.DecimalField(decimal_places=2, default=8.0, max_digits=5, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100)], verbose_name='Employee Contribution Rate (%)')),
                ('employer_rate', models.DecimalField(decimal_places=2, default=10.0, max_digits=5, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100)], verbose_name='Employer Contribution Rate (%)')),
                ('contact_email', models.EmailField(blank=True, max_length=254, verbose_name='Contact Email')),
                ('address', models.TextField(blank=True, verbose_name='Address')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
            ],
            options={
                'verbose_name': 'Pension Fund Administrator',
                'verbose_name_plural': 'Pension Fund Administrators',
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='SalaryStructure',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('name', models.CharField(max_length=200, unique=True, verbose_name='Structure Name')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
            ],
            options={
                'verbose_name': 'Salary Structure',
                'verbose_name_plural': 'Salary Structures',
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='GradeLevel',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('level', models.PositiveSmallIntegerField(verbose_name='Grade Level')),
                ('name', models.CharField(blank=True, help_text="Optional label, e.g. 'Senior Officer'. Auto-filled as GL-{level} if blank.", max_length=100, verbose_name='Grade Name')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
                ('structure', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='grade_levels', to='payroll.salarystructure', verbose_name='Salary Structure')),
            ],
            options={
                'verbose_name': 'Grade Level',
                'verbose_name_plural': 'Grade Levels',
                'ordering': ['structure', 'level'],
                'unique_together': {('structure', 'level')},
            },
        ),
        migrations.CreateModel(
            name='StepLevel',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('step', models.PositiveSmallIntegerField(verbose_name='Step')),
                ('description', models.CharField(blank=True, max_length=200, verbose_name='Description')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('grade', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='steps', to='payroll.gradelevel', verbose_name='Grade Level')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
            ],
            options={
                'verbose_name': 'Step Level',
                'verbose_name_plural': 'Step Levels',
                'ordering': ['grade', 'step'],
                'unique_together': {('grade', 'step')},
            },
        ),
        migrations.CreateModel(
            name='GradeProgressionProposal',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('progression_type', models.CharField(choices=[('auto', 'Automatic (Anniversary)'), ('manual', 'Manual')], default='auto', max_length=10, verbose_name='Progression Type')),
                ('status', models.CharField(choices=[('pending', 'Pending HR Approval'), ('approved', 'Approved'), ('rejected', 'Rejected')], default='pending', max_length=10, verbose_name='Status')),
                ('proposed_date', models.DateField(auto_now_add=True, verbose_name='Proposed Date')),
                ('decision_date', models.DateField(blank=True, null=True, verbose_name='Decision Date')),
                ('notes', models.TextField(blank=True, verbose_name='Notes')),
                ('approved_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='payroll_progressions_approved', to=settings.AUTH_USER_MODEL, verbose_name='Approved / Rejected By')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('employee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='progression_proposals', to='employee.employee', verbose_name='Employee')),
                ('from_grade', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='proposals_from', to='payroll.gradelevel', verbose_name='From Grade')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
                ('to_grade', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='proposals_to', to='payroll.gradelevel', verbose_name='To Grade')),
                ('from_step', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='proposals_from_step', to='payroll.steplevel', verbose_name='From Step')),
                ('to_step', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='proposals_to_step', to='payroll.steplevel', verbose_name='To Step')),
            ],
            options={
                'verbose_name': 'Grade Progression Proposal',
                'verbose_name_plural': 'Grade Progression Proposals',
                'ordering': ['-proposed_date'],
            },
        ),
        migrations.CreateModel(
            name='Union',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('name', models.CharField(max_length=200, unique=True, verbose_name='Union Name')),
                ('code', models.CharField(max_length=20, unique=True, verbose_name='Code')),
                ('contribution_type', models.CharField(choices=[('fixed', 'Fixed Amount'), ('percentage', 'Percentage of Basic')], default='fixed', max_length=15, verbose_name='Contribution Type')),
                ('amount', models.DecimalField(decimal_places=2, default=0, max_digits=15, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Fixed Amount')),
                ('rate', models.DecimalField(decimal_places=2, default=0, max_digits=5, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100)], verbose_name='Rate (%)')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
            ],
            options={
                'verbose_name': 'Union / Association',
                'verbose_name_plural': 'Unions / Associations',
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='EmployeePayrollProfile',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('engagement_type', models.CharField(choices=[('full_time', 'Full-Time'), ('part_time', 'Part-Time'), ('contract', 'Contract'), ('casual', 'Casual'), ('consultant', 'Consultant')], default='full_time', max_length=20, verbose_name='Engagement Type')),
                ('pension_number', models.CharField(blank=True, max_length=50, verbose_name='Pension (RSA) Number')),
                ('nhf_number', models.CharField(blank=True, max_length=50, verbose_name='NHF Number')),
                ('nhis_number', models.CharField(blank=True, max_length=50, verbose_name='NHIS Number')),
                ('step_upgrade_interval_months', models.PositiveSmallIntegerField(default=12, help_text='Months between automatic step upgrades. Default: 12.', verbose_name='Step Upgrade Interval (months)')),
                ('last_step_upgrade_date', models.DateField(blank=True, help_text='Defaults to onboarding date on first use.', null=True, verbose_name='Last Step Upgrade Date')),
                ('next_step_upgrade_date', models.DateField(blank=True, null=True, verbose_name='Next Step Upgrade Date')),
                ('cooperatives', models.ManyToManyField(blank=True, to='payroll.cooperativesociety', verbose_name='Cooperative Societies')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('employee', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='payroll_profile', to='employee.employee', verbose_name='Employee')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
                ('grade', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='payroll.gradelevel', verbose_name='Grade Level')),
                ('health_scheme', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='payroll.healthscheme', verbose_name='Health Scheme (NHIS/HMO)')),
                ('pension_administrator', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='payroll.pensionfundadministrator', verbose_name='Pension Fund Administrator')),
                ('structure', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='payroll.salarystructure', verbose_name='Salary Structure')),
                ('step', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='payroll.steplevel', verbose_name='Step Level')),
                ('unions', models.ManyToManyField(blank=True, to='payroll.union', verbose_name='Unions / Associations')),
            ],
            options={
                'verbose_name': 'Employee Payroll Profile',
                'verbose_name_plural': 'Employee Payroll Profiles',
            },
        ),
        migrations.CreateModel(
            name='PayrollRunLine',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('grade_snapshot', models.CharField(max_length=200, verbose_name='Grade (at run time)')),
                ('step_snapshot', models.CharField(max_length=50, verbose_name='Step (at run time)')),
                ('income_breakdown', models.JSONField(default=dict, verbose_name='Income Breakdown')),
                ('pension_employee', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Pension (Employee)')),
                ('pension_employer', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Pension (Employer)')),
                ('nhf_deduction', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='NHF Deduction')),
                ('nhis_employee', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='NHIS/HMO (Employee)')),
                ('nhis_employer', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='NHIS/HMO (Employer)')),
                ('cooperative_deduction', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Cooperative Deductions')),
                ('union_deduction', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Union Dues')),
                ('gross_pay', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Gross Pay')),
                ('tax_relief', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Consolidated Relief Allowance')),
                ('chargeable_income', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Chargeable Income')),
                ('paye_tax', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='PAYE Tax')),
                ('total_deductions', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Total Deductions')),
                ('net_pay', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Net Pay')),
                ('deduction_detail', models.JSONField(default=dict, verbose_name='Deduction Detail')),
                ('employee', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='payroll_run_lines', to='employee.employee', verbose_name='Employee')),
                ('run', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lines', to='payroll.payrollrun', verbose_name='Payroll Run')),
            ],
            options={
                'verbose_name': 'Payroll Run Line',
                'verbose_name_plural': 'Payroll Run Lines',
                'ordering': ['run', 'employee'],
                'unique_together': {('run', 'employee')},
            },
        ),
        migrations.CreateModel(
            name='GradeStepComponent',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Created At')),
                ('is_active', models.BooleanField(default=True, verbose_name='Is Active')),
                ('amount', models.DecimalField(decimal_places=2, default=0, max_digits=15, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Amount')),
                ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Created By')),
                ('grade', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='grade_step_components', to='payroll.gradelevel', verbose_name='Grade Level')),
                ('modified_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified By')),
                ('component', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='grade_step_values', to='payroll.incomecomponent', verbose_name='Income Component')),
                ('step', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='components', to='payroll.steplevel', verbose_name='Step Level')),
            ],
            options={
                'verbose_name': 'Grade-Step Component Value',
                'verbose_name_plural': 'Grade-Step Component Values',
                'ordering': ['grade', 'step', 'component__order'],
                'unique_together': {('grade', 'step', 'component')},
            },
        ),
    ]
