/
AxeOn
/
ProjectAi
Обзор
Документация
Войти
/
AxeOn
/
ProjectAi
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
models.py
204 строки
7 KB
Дмитрий
refactor(backend): pivot surcharge logic from automated rules engine to manual hourly calculation records
07 май 2026, 09:01
07 май 2026, 09:01
4eeb141
Код
Авторство
О чём код?
from __future__ import annotations from dataclasses import dataclass from typing import Optional @dataclass class Employee: id: int name: str email: Optional[str] = None tg_id: Optional[str] = None department: Optional[str] = None phone: Optional[str] = None managers: Optional[str] = None is_manager: int = 0 is_temp: int = 0 birth_date: Optional[str] = None category: Optional[str] = None is_reso: int = 0 working_group_id: Optional[int] = None base_salary: float = 0.0 is_fired: int = 0 fired_date: Optional[str] = None schedule_pattern: str = '5/2_mon_fri' svc_types: str = '[]' @classmethod def from_row(cls, row) -> Employee: keys = row.keys() if hasattr(row, 'keys') else [] return cls( id=row['id'], name=row['name'], email=row['email'], tg_id=row['tg_id'], department=row['department'], phone=row['phone'], managers=row['managers'], is_manager=row['is_manager'] or 0, is_temp=row['is_temp'] or 0, birth_date=row['birth_date'], category=row['category'], is_reso=row['is_reso'] or 0, working_group_id=row['working_group_id'], base_salary=row['base_salary'] or 0.0, is_fired=row['is_fired'] or 0, fired_date=row['fired_date'], schedule_pattern=row['schedule_pattern'] if 'schedule_pattern' in keys else '5/2_mon_fri', svc_types=row['svc_types'] if 'svc_types' in keys else '[]', ) @dataclass class ManagementTask: id: int title: str due_date: str priority: str = 'Medium' employee_id: Optional[int] = None status: str = 'New' parent_id: int = 0 comment: Optional[str] = None client_name: Optional[str] = None created_at: Optional[str] = None updated_at: Optional[str] = None poll_id: Optional[str] = None poll_sent_at: Optional[str] = None poll_answered_at: Optional[str] = None @classmethod def from_row(cls, row) -> ManagementTask: return cls( id=row['id'], title=row['title'], due_date=row['due_date'], priority=row['priority'] or 'Medium', employee_id=row['employee_id'], status=row['status'] or 'New', parent_id=row['parent_id'] or 0, comment=row['comment'], client_name=row['client_name'], created_at=row['created_at'], updated_at=row['updated_at'], poll_id=row['poll_id'], poll_sent_at=row['poll_sent_at'], poll_answered_at=row['poll_answered_at'], ) @dataclass class DeadlineCase: id: int case_number: str load_date: str create_date: Optional[str] = None inspection_date: Optional[str] = None risk: Optional[str] = None expert_inspection: Optional[str] = None expert_calculation: Optional[str] = None payment_info: Optional[str] = None region: Optional[str] = None department: Optional[str] = None deadline: Optional[int] = None comment: Optional[str] = None address: Optional[str] = None created_at: Optional[str] = None services_list: Optional[str] = None candidate_expert: Optional[str] = None @classmethod def from_row(cls, row) -> DeadlineCase: return cls( id=row['id'], case_number=row['case_number'], load_date=row['load_date'], create_date=row['create_date'], inspection_date=row['inspection_date'], risk=row['risk'], expert_inspection=row['expert_inspection'], expert_calculation=row['expert_calculation'], payment_info=row['payment_info'], region=row['region'], department=row['department'], deadline=row['deadline'], comment=row['comment'], address=row['address'], created_at=row['created_at'], services_list=row['services_list'], candidate_expert=row['candidate_expert'], ) @dataclass class VacationRange: start: str end: str v_type: Optional[str] = None @classmethod def from_row(cls, row) -> VacationRange: return cls( start=row['start'], end=row['end'], v_type=row['v_type'], ) @dataclass class ManualSurcharge: """Ручная доплата — запись о нестандартной доплате эксперту. Бизнес-логика: - Пользователь выбирает эксперта, вводит номер дела, выбирает услугу. - Система подтягивает базовую стоимость услуги (base_cost) и стоимость нормочаса (hourly_rate). - Пользователь вводит количество часов (hours). - Итоговая сумма: total_amount = (hours * hourly_rate) - base_cost - Тип операции: 'Доплата' или 'Взаимовычет' """ id: int expert_name: str department: Optional[str] = None case_number: Optional[str] = None service_name: Optional[str] = None base_cost: float = 0.0 hourly_rate: float = 0.0 hours: float = 0.0 total_amount: float = 0.0 operation_type: str = 'Доплата' # 'Доплата' or 'Взаимовычет' note: Optional[str] = None period_date: Optional[str] = None @classmethod def from_row(cls, row) -> 'ManualSurcharge': keys = row.keys() if hasattr(row, 'keys') else [] return cls( id=row['id'], expert_name=row['expert_name'], department=row['department'] if 'department' in keys else None, case_number=row['case_number'] if 'case_number' in keys else None, service_name=row['service_name'] if 'service_name' in keys else None, base_cost=row['base_cost'] if 'base_cost' in keys else 0.0, hourly_rate=row['hourly_rate'] if 'hourly_rate' in keys else 0.0, hours=row['hours'] if 'hours' in keys else 0.0, total_amount=row['total_amount'] if 'total_amount' in keys else 0.0, operation_type=row['operation_type'] if 'operation_type' in keys else 'Доплата', note=row['note'] if 'note' in keys else None, period_date=row['period_date'] if 'period_date' in keys else None, ) @dataclass class WorkingGroup: id: int name: str tg_id: Optional[str] = None department: Optional[str] = None @classmethod def from_row(cls, row) -> WorkingGroup: return cls( id=row['id'], name=row['name'], tg_id=row['tg_id'], department=row['department'], )