from django.db import models
from db.vsolvmodels import FETModels
from django.utils.timezone import now

class EmployeePaystructure(FETModels):
    employee_id = models.IntegerField(null=True)
    standard_ctc = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    gross_pay = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    is_tds = models.BooleanField(default=False)
    pf_type = models.SmallIntegerField(default=1)
    take_home = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    status = models.SmallIntegerField(default=1)
    is_esi = models.BooleanField(default=True)
    emp_grade = models.SmallIntegerField(null=True)#template_id
    from_date = models.DateField(null=True,blank=True)
    to_date = models.DateField(null=True,blank=True)

class EmployeePaystructure_details(FETModels):
    emp_pay = models.ForeignKey(EmployeePaystructure, on_delete=models.CASCADE, null=True)
    paycomponent = models.SmallIntegerField(null=True)
    paycomponent_type = models.SmallIntegerField(null=True)
    paycomponent_percentage = models.DecimalField(max_digits=16, decimal_places=4, default=0.00, null=True)
    amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    company_contribution = models.BooleanField(default=False)
    type = models.SmallIntegerField(null=True)
    from_date = models.DateField(null=True)
    to_date = models.DateField(null=True)
    status = models.SmallIntegerField(default=1)
    segment = models.IntegerField(null=True)
    segment_percentage = models.DecimalField(max_digits=16,decimal_places=4, default=0.00, null=True)


class EmployeePaystructure_deductions(FETModels):
    employee_id = models.IntegerField(null=True)
    paycomponent_id = models.SmallIntegerField(null=True)
    type = models.SmallIntegerField(null=True)
    amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    from_date = models.DateField(null=True)
    to_date = models.DateField(null=True)
    status = models.SmallIntegerField(default=1)
    is_customdeduct = models.BooleanField(default=False)


class Employeemonthly_payinfo(FETModels):
    employee_id = models.IntegerField(null=True)
    code = models.CharField(max_length=128, null=True)
    standard_ctc = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    gross_pay = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    take_home = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    payable_days = models.SmallIntegerField(null=True, default=0)
    paid_days = models.SmallIntegerField(null=True, default=0)
    pay_status = models.SmallIntegerField(null=True)
    pay_mode = models.SmallIntegerField(null=True)
    is_tds = models.BooleanField(default=False)
    pf_type = models.SmallIntegerField(default=1)
    status = models.SmallIntegerField(default=1)
    payroll_date = models.DateField(default=now)
    ref_id = models.IntegerField(null=True)
    is_deduct = models.BooleanField(default=0)
    paid_date = models.DateTimeField(null=True)
    transaction_num = models.CharField(max_length=128, null=True)
    remarks = models.CharField(max_length=128, null=True)

class Employeemonthlypay_details(FETModels):
    empmonthly_pay = models.ForeignKey(Employeemonthly_payinfo, on_delete=models.CASCADE, null=True)
    paycomponent = models.SmallIntegerField(null=True)
    paycomponent_type = models.SmallIntegerField(null=True)
    paycomponent_percentage = models.DecimalField(max_digits=16, decimal_places=4, default=0.00, null=True)
    company_contribution = models.BooleanField(default=False)
    amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    type = models.SmallIntegerField(null=True)
    from_date = models.DateField(null=True)
    to_date = models.DateField(null=True)
    status = models.SmallIntegerField(default=1)
    segment = models.IntegerField(null=True)
    segment_percentage = models.DecimalField(max_digits=16, decimal_places=4, default=0.00, null=True)


class Employeemonthlypay_deductions(FETModels):
    employee_id = models.IntegerField(null=True)
    paycomponent_id = models.SmallIntegerField(null=True)
    type = models.SmallIntegerField(null=True)
    from_date = models.DateField(null=True)
    to_date = models.DateField(null=True)
    deduct_date = models.DateField(default=now)
    amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    deduction_status = models.SmallIntegerField(default=-1)
    status = models.SmallIntegerField(default=1)
    is_advance = models.BooleanField(default=False)


class Employeeadvancedetails(FETModels):
    employee_id = models.IntegerField(null=True)
    type = models.SmallIntegerField(null=True)
    from_date = models.DateField(null=True)
    to_date = models.DateField(null=True)
    advance_status = models.SmallIntegerField(null=True)
    actual_amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    payable_amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    reason = models.TextField(null=True)
    emi_amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    status = models.SmallIntegerField(default=1)
    amount_reciveddate = models.DateTimeField(null=True)
    code = models.CharField(max_length=128, null=True)
    remarks = models.TextField(null=True)


class Employeeadvancepayment(FETModels):
    advance = models.ForeignKey(Employeeadvancedetails, on_delete=models.CASCADE, null=True)
    paid_date = models.DateTimeField(null=True)
    balance_amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    paid_amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    status = models.SmallIntegerField(default=1)

class Payrolltran(FETModels):
    ref_type = models.SmallIntegerField(null=True)
    ref_id = models.IntegerField(null=True)
    tran_status = models.SmallIntegerField(null=True)
    tran_from = models.IntegerField(null=True)
    tran_to = models.IntegerField(null=True)
    from_date = models.DateField(null=True)
    tran_date = models.DateField(null=True)
    remarks = models.CharField(max_length=25, null=True)
    status = models.SmallIntegerField(default=1)

class Payrollaudit(FETModels):
    ref_id = models.IntegerField()
    ref_type = models.CharField(max_length=28, null=True, blank=True)
    data = models.TextField(null=True, blank=True)
    employee_id = models.IntegerField()
    date = models.DateTimeField(null=True, blank=True)
    req_status = models.SmallIntegerField()
    action = models.CharField(max_length=28, null=True, blank=True)

class Payrollprocesschange(FETModels):
    employee_id = models.IntegerField(null=True)
    from_date = models.DateField(null=True)
    to_date = models.DateField(null=True)
    pay_change=models.SmallIntegerField(null=True)
    reason = models.TextField(null=True)
    status = models.SmallIntegerField(default=1)

class Employeeadditional_allowance(FETModels):
    employee_id = models.IntegerField(null=True)
    type = models.SmallIntegerField(null=True)
    active_date = models.DateField(null=True)
    end_date = models.DateField(null=True)
    custom_deduct = models.BooleanField(default=False)
    amount = models.DecimalField(max_digits=16, decimal_places=2, null=True, default=0.00)
    status = models.SmallIntegerField(default=1)


class Payapprovedqueue(FETModels):
    code = models.CharField(max_length=20, null=True)
    date = models.DateField(default=now)

# npayroll master
class PayrollComponent(FETModels):
    name = models.CharField(max_length=128, null=True)
    code = models.CharField(max_length=8, null=True)
    allowance_type = models.IntegerField(null=True)
    is_default = models.BooleanField(default=False)
    pf_include = models.BooleanField(default=False)
    is_deduction = models.BooleanField(default=False)
    cat_id = models.IntegerField(null=True)
    subcat_id = models.IntegerField(null=True)
    glno = models.IntegerField(null=True)
    percentage = models.DecimalField(max_digits=8, decimal_places=2, default=0.00)
    status = models.SmallIntegerField(default=1)
    grade = models.SmallIntegerField(null=True)
    from_date = models.DateField(null=True)
    to_date = models.DateField(null=True)

class PayrollDeduction(FETModels):
    payrollcomp = models.ForeignKey(PayrollComponent, on_delete=models.SET_NULL, null=True)
    type = models.SmallIntegerField(null=True)
    from_date = models.DateField(null=True)
    to_date = models.DateField(null=True)
    status = models.SmallIntegerField(default=1)

class CompanyContribution(FETModels):
    name = models.CharField(max_length=128, null=True)
    percentage = models.DecimalField(max_digits=8, decimal_places=2, default=0.00)
    amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    effective_from = models.DateField(null=True)
    effective_to = models.DateField(null=True)
    cat_id = models.IntegerField(null=True)
    subcat_id = models.IntegerField(null=True)
    glno = models.CharField(max_length=128,null=True)
    status = models.SmallIntegerField(default=1)
    sal_amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)

class EmployeePFStructure(FETModels):
    name = models.CharField(max_length=128, null=True)
    code = models.CharField(max_length=8, null=True)
    percentage = models.DecimalField(max_digits=8, decimal_places=2,default=0.00)
    amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)
    is_standard = models.BooleanField(default=False)
    status = models.SmallIntegerField(default=1)
    cat_id=models.IntegerField(null=True)
    subcat_id=models.IntegerField(null=True)
    glno=models.CharField(max_length=128,null=True)
    sal_amount = models.DecimalField(max_digits=16, decimal_places=2, default=0.00)

class ComponentType(FETModels):
    name = models.CharField(max_length=128, null=True)
    percentage = models.DecimalField(max_digits=8, decimal_places=2, default=0.00)
    category = models.SmallIntegerField(null=True)
    status = models.SmallIntegerField(default=1)

class PaycomponentFlagmaster(FETModels):
    map_id=models.IntegerField(null=True)
    ref_type = models.IntegerField(null=True)#master type Esi/pf/company/seg
    ref_id = models.IntegerField(null=True)#id
    status = models.SmallIntegerField(default=1)

class Segment(FETModels):
    name = models.CharField(max_length=128,null=True)
    component_type = models.ForeignKey(ComponentType,on_delete=models.SET_NULL,null=True)
    type = models.SmallIntegerField(null=True)
    percentage = models.DecimalField(max_digits=8, decimal_places=2,default=0.00)
    status = models.SmallIntegerField(default=1)
    glno = models.CharField(max_length=128, null=True)

class PaycomponentSegmentmapping(FETModels):
    paycomponent=models.ForeignKey(PayrollComponent, on_delete=models.SET_NULL, null=True)
    segment=models.ForeignKey(Segment, on_delete=models.SET_NULL, null=True)
    status = models.SmallIntegerField(default=1)

class PayrollTemplate(FETModels):
    name=models.CharField(max_length=120,null=True)
    grade=models.IntegerField(null=True)
    code = models.CharField(max_length=8, null=True)
    status = models.SmallIntegerField(default=1)
    valid_from = models.DateField(null=True)
    valid_to = models.DateField(null=True)
    glno = models.CharField(max_length=64, null=True)


class Payrollmastersmapping(FETModels):
    template=models.ForeignKey(PayrollTemplate,on_delete=models.SET_NULL,null=True)
    segment=models.SmallIntegerField(null=True)
    paycomponent=models.IntegerField(null=True)
    percentage = models.DecimalField(max_digits=8, decimal_places=2, default=0.00)
    amount = models.DecimalField(max_digits=8, decimal_places=2, default=0.00)
    status = models.SmallIntegerField(default=1)


class ReportColumns(FETModels):
    name = models.CharField(max_length=125, null=True)
    type = models.SmallIntegerField(null=True)
    link_columns = models.CharField(max_length=125,null=True)
    status = models.SmallIntegerField(default=1)


class ReportTemplate(FETModels):
    name = models.CharField(max_length=125,null=True)
    bank_id = models.IntegerField(null=True)
    status = models.SmallIntegerField(default=1)


class ReportTemplateDetails(FETModels):
    report_template = models.ForeignKey(ReportTemplate, on_delete=models.SET_NULL, null=True)
    reportcolumns = models.ForeignKey(ReportColumns, on_delete=models.SET_NULL, null=True)
    order = models.IntegerField(null=True)
    status = models.SmallIntegerField(default=1)

class PayrollTest(FETModels):
    employee_id = models.IntegerField()
    month= models.IntegerField()
    year= models.IntegerField()
    present_count = models.FloatField(null=True)
    leave_count = models.FloatField(null=True)
    premission_hr = models.FloatField(null=True)
    duration = models.FloatField(null=True)
    status = models.IntegerField(default=1)
    paid_days = models.FloatField(null=True)


class payrollschedular(FETModels):
    start = models.DateTimeField(null=True, blank=True)
    end= models.DateTimeField(null=True, blank=True)
    message = models.TextField(null=True)


class PayrollManualRunSchedular(FETModels):
    is_completed = models.BooleanField(default=False)
    date = models.DateTimeField(null=True, blank=True)
    is_manual = models.BooleanField(default=True)
