Automated Action 1b9ddb4750 Implement comprehensive HR Management Backend System
- FastAPI application with JWT authentication and role-based access control
- Complete employee management with CRUD operations
- Department management with manager assignments
- Leave management system with approval workflow
- Payroll processing with overtime and deductions calculation
- Attendance tracking with clock in/out functionality
- SQLite database with proper migrations using Alembic
- Role-based permissions (Admin, HR Manager, Manager, Employee)
- Comprehensive API documentation and health checks
- CORS enabled for cross-origin requests

Environment Variables Required:
- SECRET_KEY: JWT secret key for token signing

Features implemented:
- User registration and authentication
- Employee profile management
- Department hierarchy management
- Leave request creation and approval
- Payroll record processing
- Daily attendance tracking
- Hours calculation for attendance
- Proper error handling and validation
2025-06-23 10:06:23 +00:00

35 lines
1.5 KiB
Python

from sqlalchemy import Column, Integer, DateTime, ForeignKey, Date, Numeric, Enum
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from app.db.base import Base
import enum
class PayrollStatus(enum.Enum):
DRAFT = "draft"
PROCESSED = "processed"
PAID = "paid"
class PayrollRecord(Base):
__tablename__ = "payroll_records"
id = Column(Integer, primary_key=True, index=True)
employee_id = Column(Integer, ForeignKey("employees.id"), nullable=False)
pay_period_start = Column(Date, nullable=False)
pay_period_end = Column(Date, nullable=False)
base_salary = Column(Numeric(10, 2), nullable=False)
overtime_hours = Column(Numeric(5, 2), default=0)
overtime_rate = Column(Numeric(5, 2), default=0)
bonus = Column(Numeric(10, 2), default=0)
deductions = Column(Numeric(10, 2), default=0)
gross_pay = Column(Numeric(10, 2), nullable=False)
tax_deductions = Column(Numeric(10, 2), default=0)
net_pay = Column(Numeric(10, 2), nullable=False)
status = Column(Enum(PayrollStatus), default=PayrollStatus.DRAFT)
processed_by = Column(Integer, ForeignKey("users.id"))
processed_at = Column(DateTime(timezone=True))
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
employee = relationship("Employee", back_populates="payroll_records")
processor = relationship("User", foreign_keys=[processed_by])