"""
Seed 25 шаблонов документов авиационной отрасли в стиле REFLY.
"""
import logging
from app.db.session import SessionLocal
from app.models.document_template import DocumentTemplate
logger = logging.getLogger(__name__)
_STYLE = """
"""
_HEADER = """
"""
_FOOTER = """
"""
def _wrap(title: str, subtitle: str | None, content: str) -> str:
sub = f'{subtitle}
' if subtitle else ""
return (
_STYLE
+ ''
+ _HEADER
+ f'
{title}
'
+ sub
+ '
№ [___________] от [дата]
'
+ content
+ _FOOTER
+ "
"
)
def _templates_data() -> list[dict]:
return [
{
"code": "APP-246",
"name": "Заявка на получение сертификата эксплуатанта (ФАП-246)",
"category": "application",
"standard": "RF",
"description": "Заявка на получение сертификата эксплуатанта ВК РФ",
"sort_order": 1,
"html_content": _wrap(
"Заявка на получение сертификата эксплуатанта",
"ФАП-246",
"""
Наименование организации: [___________]
ИНН: [___] ОГРН: [___]
Адрес: [___________]
Типы ВС: [___________]
Виды авиаработ: [___________]
Ответственное лицо: [___________]
""",
),
},
{
"code": "APP-145",
"name": "Заявка на одобрение организации ТОиР (ФАП-145)",
"category": "application",
"standard": "RF",
"description": "Заявка на одобрение организации по техническому обслуживанию",
"sort_order": 2,
"html_content": _wrap(
"Заявка на одобрение организации ТОиР",
"ФАП-145",
"""
Наименование: [___________]
Область одобрения: [___________]
Типы ВС: [___________]
Категории работ: [___________]
""",
),
},
{
"code": "APP-SLG",
"name": "Заявка на выдачу/продление СЛГ",
"category": "application",
"standard": "RF",
"description": "Заявка на выдачу или продление сертификата лётной годности",
"sort_order": 3,
"html_content": _wrap(
"Заявка на выдачу/продление сертификата лётной годности",
None,
"""
Рег. номер ВС: [___] Тип: [___]
Серийный №: [___] Собственник: [___________]
Дата последнего ТО: [дата]
""",
),
},
{
"code": "APP-MOD",
"name": "Заявка на одобрение модификации ВС",
"category": "application",
"standard": "RF",
"description": "Заявка на одобрение модификации воздушного судна",
"sort_order": 4,
"html_content": _wrap(
"Заявка на одобрение модификации ВС",
None,
"""
Описание модификации: [___________]
STC: [___] Основание: [___]
ВС (рег. №): [___]
""",
),
},
{
"code": "CERT-SLG",
"name": "Сертификат лётной годности (СЛГ) — бланк",
"category": "certificate",
"standard": "RF",
"description": "Бланк сертификата лётной годности",
"sort_order": 5,
"html_content": _wrap(
"Сертификат лётной годности",
None,
"""
Государство регистрации: [___] Рег. знак: [___]
Тип: [___] Серийный №: [___]
Категория: [___]
Дата выдачи: [дата] Срок действия: [дата]
Орган выдачи: [___________]
Печать
""",
),
},
{
"code": "CERT-CRS",
"name": "Свидетельство о допуске к эксплуатации (CRS)",
"category": "certificate",
"standard": "RF",
"description": "ФАП-145 / EASA Part-145.A.50 — Certificate of Release to Service",
"sort_order": 6,
"html_content": _wrap(
"Свидетельство о допуске к эксплуатации",
"ФАП-145 / EASA Part-145.A.50",
"""
Организация ТОиР: [___________]
ВС: [рег. №] Тип: [___]
Выполненные работы: [___________]
Наряд №: [___] Дата: [дата]
Подпись уполномоченного лица: _____________________
М.П.
""",
),
},
{
"code": "CERT-EASA1",
"name": "EASA Form 1 — Authorized Release Certificate",
"category": "certificate",
"standard": "EASA",
"description": "Форма 1 EASA — сертификат авторизованного выпуска",
"sort_order": 7,
"html_content": _wrap(
"EASA Form 1 — Authorized Release Certificate",
"EASA",
"""
| Part Number | Description | Quantity | Serial No | Status | Remarks |
| [___] | [___] | [___] | [___] | [___] | [___] |
Authorized Signature: [___________]
""",
),
},
{
"code": "CERT-8130",
"name": "FAA Form 8130-3 — Airworthiness Approval Tag",
"category": "certificate",
"standard": "FAA",
"description": "Форма 8130-3 FAA — ярлык одобрения лётной годности",
"sort_order": 8,
"html_content": _wrap(
"FAA Form 8130-3 — Airworthiness Approval Tag",
"FAA",
"""
Part No: [___] Serial No: [___]
Description: [___________]
Status: [___] Remarks: [___]
Approved by: [___________]
""",
),
},
{
"code": "ACT-INSP",
"name": "Акт инспекционной проверки ВС",
"category": "act",
"standard": "RF",
"description": "Акт инспекционной проверки воздушного судна",
"sort_order": 9,
"html_content": _wrap(
"Акт инспекционной проверки ВС",
None,
"""
Дата: [дата] Место: [___________]
Борт: [рег. №] Инспектор: [___________]
Результат: [годен / не годен]
Замечания: [___________]
Представитель организации
""",
),
},
{
"code": "ACT-AUDIT",
"name": "Акт аудита организации",
"category": "act",
"standard": "RF",
"description": "Акт проведения аудита организации",
"sort_order": 10,
"html_content": _wrap(
"Акт аудита организации",
None,
"""
Организация: [___________]
Дата: [дата] Аудитор: [___________]
Область проверки: [___________]
Несоответствия (level 1/2): [___________]
Корректирующие действия, срок: [___________]
Представитель организации
""",
),
},
{
"code": "ACT-DEFECT",
"name": "Акт дефектации",
"category": "act",
"standard": "RF",
"description": "Акт дефектации компонента/ВС",
"sort_order": 11,
"html_content": _wrap(
"Акт дефектации",
None,
"""
ВС: [рег. №] ATA chapter: [___]
Описание дефекта: [___________]
MEL категория: [___] Решение: [___________]
""",
),
},
{
"code": "ACT-ACCEPT",
"name": "Акт приёмки ВС после ТО",
"category": "act",
"standard": "RF",
"description": "Акт приёмки воздушного судна после технического обслуживания",
"sort_order": 12,
"html_content": _wrap(
"Акт приёмки ВС после ТО",
None,
"""
Наряд №: [___] ВС: [рег. №]
Выполненные работы: [___________]
Замечания: [___________]
CRS: [___]
""",
),
},
{
"code": "LTR-FAVT",
"name": "Сопроводительное письмо в ФАВТ (Росавиация)",
"category": "letter",
"standard": "RF",
"description": "Сопроводительное письмо в Федеральное агентство воздушного транспорта",
"sort_order": 13,
"html_content": _wrap(
"Сопроводительное письмо",
"в ФАВТ (Росавиация)",
"""
Исх. № [___] от [дата]
Кому: [___________]
От кого: [___________]
Тема: [___________]
Текст: [___________]
Приложения: [___________]
""",
),
},
{
"code": "LTR-MRO",
"name": "Письмо-заказ в организацию ТОиР",
"category": "letter",
"standard": "RF",
"description": "Письмо-заказ на выполнение работ организацией ТОиР",
"sort_order": 14,
"html_content": _wrap(
"Письмо-заказ в организацию ТОиР",
None,
"""
Наименование ТОиР: [___________]
Запрос на выполнение работ: [___________]
ВС: [рег. №] Сроки: [___________]
Контакт: [___________]
""",
),
},
{
"code": "LTR-SB",
"name": "Уведомление о выполнении сервисного бюллетеня (SB)",
"category": "letter",
"standard": "RF",
"description": "Уведомление о выполнении SB",
"sort_order": 15,
"html_content": _wrap(
"Уведомление о выполнении SB",
None,
"""
№ SB: [___] ВС: [рег. №]
Дата выполнения: [дата]
Ссылка на наряд: [___]
""",
),
},
{
"code": "LTR-AD",
"name": "Отчёт о выполнении директивы ЛГ (AD/ДЛГ)",
"category": "letter",
"standard": "RF",
"description": "Отчёт о выполнении воздушной директивы",
"sort_order": 16,
"html_content": _wrap(
"Отчёт о выполнении директивы ЛГ",
"AD / ДЛГ",
"""
№ AD: [___] ВС: [рег. №]
Метод выполнения: [___________]
Дата: [дата]
Подтверждение: [___________]
""",
),
},
{
"code": "FORM-TECHLOG",
"name": "Technical Log / Бортовой журнал",
"category": "form",
"standard": "ICAO",
"description": "Бортовой журнал (ICAO)",
"sort_order": 17,
"html_content": _wrap(
"Technical Log / Бортовой журнал",
"ICAO",
"""
| Flight No | Date | Departure | Arrival | Block Time | Defects | Actions | CRS |
| [___] | [___] | [___] | [___] | [___] | [___] | [___] | [___] |
""",
),
},
{
"code": "FORM-MEL",
"name": "MEL Deferral Form / Форма отложенного дефекта",
"category": "form",
"standard": "ICAO",
"description": "Форма отложенного дефекта по MEL",
"sort_order": 18,
"html_content": _wrap(
"MEL Deferral Form",
None,
"""
ВС: [___] ATA: [___]
Item: [___] Category (A/B/C/D): [___]
Deferred By: [___] Expiry Date: [дата]
Rectified By: [___]
""",
),
},
{
"code": "FORM-WEIGHT",
"name": "Weight & Balance Sheet / Весовая ведомость",
"category": "form",
"standard": "ICAO",
"description": "Весовая ведомость ВС",
"sort_order": 19,
"html_content": _wrap(
"Weight & Balance Sheet",
"Весовая ведомость",
"""
ВС: [___]
Empty Weight: [___] CG: [___]
Fuel: [___] Payload: [___]
Max TOW: [___] Actual TOW: [___]
""",
),
},
{
"code": "FORM-WO",
"name": "Work Order / Наряд-задание на ТО",
"category": "form",
"standard": "RF",
"description": "Наряд-задание на техническое обслуживание",
"sort_order": 20,
"html_content": _wrap(
"Work Order / Наряд-задание на ТО",
None,
"""
WO №: [___] ВС: [рег. №]
Тип работ: [___________]
Плановые ч/ч: [___] Исполнитель: [___________]
Инструмент, запчасти: [___________]
CRS: [___]
""",
),
},
{
"code": "RPT-ANNUAL",
"name": "Годовой отчёт о состоянии парка ВС",
"category": "report",
"standard": "RF",
"description": "Годовой отчёт по парку воздушных судов",
"sort_order": 21,
"html_content": _wrap(
"Годовой отчёт о состоянии парка ВС",
None,
"""
Парк ВС
[___________]
Наработка, ТО
[___________]
Инциденты, AD/SB, риски
[___________]
""",
),
},
{
"code": "RPT-SMS",
"name": "Отчёт по SMS (Safety Management System)",
"category": "report",
"standard": "ICAO",
"description": "Отчёт по системе управления безопасностью",
"sort_order": 22,
"html_content": _wrap(
"Отчёт по SMS",
"Safety Management System",
"""
Показатели безопасности (SPI)
[___________]
Происшествия, риски
[___________]
Корректирующие действия
[___________]
""",
),
},
{
"code": "RPT-RISK",
"name": "Отчёт об оценке риска",
"category": "report",
"standard": "RF",
"description": "Отчёт об оценке риска",
"sort_order": 23,
"html_content": _wrap(
"Отчёт об оценке риска",
None,
"""
Опасность: [___________]
Вероятность: [___] Серьёзность: [___]
Матрица риска: [___]
Меры: [___________]
Остаточный риск: [___]
""",
),
},
{
"code": "ORD-PILOT",
"name": "Приказ о допуске экипажа к полётам",
"category": "order",
"standard": "RF",
"description": "Приказ о допуске пилота/экипажа к полётам",
"sort_order": 24,
"html_content": _wrap(
"Приказ о допуске экипажа к полётам",
None,
"""
ФИО: [___________] Должность: [___]
Свидетельство №: [___]
Типы ВС: [___________]
Дата: [дата]
""",
),
},
{
"code": "ORD-INSPECT",
"name": "Распоряжение о проведении инспекции",
"category": "order",
"standard": "RF",
"description": "Распоряжение о проведении инспекционной проверки",
"sort_order": 25,
"html_content": _wrap(
"Распоряжение о проведении инспекции",
None,
"""
Основание: [___________]
Объект: [___________]
Дата: [дата] Инспектор: [___________]
Задачи: [___________]
""",
),
},
]
def seed_document_templates():
db = SessionLocal()
try:
for d in _templates_data():
if db.query(DocumentTemplate).filter(DocumentTemplate.code == d["code"]).first():
continue
db.add(
DocumentTemplate(
code=d["code"],
name=d["name"],
category=d["category"],
standard=d["standard"],
description=d.get("description"),
html_content=d["html_content"],
version=1,
is_active=True,
sort_order=d["sort_order"],
)
)
db.commit()
logger.info("Document templates seed complete: up to 25 templates")
except Exception as e:
db.rollback()
logger.exception("Document templates seed failed: %s", e)
raise
finally:
db.close()