Загрузка данных


from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

db = SQLAlchemy()

class Employee(db.Model):
    __tablename__ = 'employees'
    id = db.Column(db.Integer, primary_key=True)
    tab_no = db.Column(db.String(20), unique=True)
    last_name = db.Column(db.String(50))
    first_name = db.Column(db.String(50))
    middle_name = db.Column(db.String(50))
    department = db.Column(db.String(100))
    position = db.Column(db.String(100))
    position_code = db.Column(db.String(20))

    @property
    def full_name(self):
        return f"{self.last_name} {self.first_name} {self.middle_name or ''}".strip()

class ServiceNote(db.Model):
    __tablename__ = 'service_notes'
    id = db.Column(db.Integer, primary_key=True)
    doc_number = db.Column(db.String(50))
    doc_date = db.Column(db.Date)
    payment_code = db.Column(db.String(10))
    base_reason = db.Column(db.Text)
    created_by = db.Column(db.String(50))
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

class SupplementDetail(db.Model):
    __tablename__ = 'supplement_details'
    id = db.Column(db.Integer, primary_key=True)
    service_note_id = db.Column(db.Integer, db.ForeignKey('service_notes.id', ondelete='CASCADE'))
    employee_id = db.Column(db.Integer, db.ForeignKey('employees.id'))
    start_date = db.Column(db.Date)
    end_date = db.Column(db.Date)
    amount = db.Column(db.Numeric(10, 2))
    is_percent = db.Column(db.Boolean, default=False)
    work_content = db.Column(db.Text)
    work_type = db.Column(db.String(100))
    status = db.Column(db.String(20), default='draft')
    
    employee = db.relationship('Employee')
    service_note = db.relationship('ServiceNote', backref='supplement_details')

class CombinationDetail(db.Model):
    __tablename__ = 'combination_details'
    id = db.Column(db.Integer, primary_key=True)
    service_note_id = db.Column(db.Integer, db.ForeignKey('service_notes.id', ondelete='CASCADE'))
    employee_id = db.Column(db.Integer, db.ForeignKey('employees.id'))
    combined_position = db.Column(db.String(250))
    position_identifier = db.Column(db.String(20))
    department = db.Column(db.String(250))
    start_date = db.Column(db.Date)
    end_date = db.Column(db.Date)
    extra_pay = db.Column(db.Numeric(10, 2))
    payment_code = db.Column(db.String(10))
    reason = db.Column(db.Text)
    duties = db.Column(db.Text)
    
    employee = db.relationship('Employee')
    service_note = db.relationship('ServiceNote', backref='combination_details')

class SubstitutionDetail(db.Model):
    __tablename__ = 'substitution_details'
    id = db.Column(db.Integer, primary_key=True)
    service_note_id = db.Column(db.Integer, db.ForeignKey('service_notes.id', ondelete='CASCADE'))
    substitute_employee_id = db.Column(db.Integer, db.ForeignKey('employees.id'))
    absent_employee_id = db.Column(db.Integer, db.ForeignKey('employees.id'))
    start_date = db.Column(db.Date)
    end_date = db.Column(db.Date)
    extra_pay_percent = db.Column(db.Numeric(5, 2))
    payment_code = db.Column(db.String(10))
    duties = db.Column(db.Text)
    absence_reason = db.Column(db.String(200))
    
    substitute = db.relationship('Employee', foreign_keys=[substitute_employee_id])
    absent = db.relationship('Employee', foreign_keys=[absent_employee_id])
    service_note = db.relationship('ServiceNote', backref='substitution_details')

class AllowanceDetail(db.Model):
    __tablename__ = 'allowance_details'
    id = db.Column(db.Integer, primary_key=True)
    service_note_id = db.Column(db.Integer, db.ForeignKey('service_notes.id', ondelete='CASCADE'))
    employee_id = db.Column(db.Integer, db.ForeignKey('employees.id'))
    allowance_name = db.Column(db.String(250))
    payment_code = db.Column(db.String(10))
    unit = db.Column(db.String(10))
    amount = db.Column(db.Numeric(10, 2))
    status = db.Column(db.String(20))
    start_date = db.Column(db.Date)
    end_date = db.Column(db.Date)
    
    employee = db.relationship('Employee')
    service_note = db.relationship('ServiceNote', backref='allowance_details')