import "https://deno.land/x/xhr@0.1.0/mod.ts"; import { serve } from "https://deno.land/std@0.168.0/http/server.ts"; const corsHeaders = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type', }; // Project documentation data const projectDocumentation = { title: "REFLY - Система контроля лётной годности", subtitle: "Техническая документация проекта", version: "1.0.0", date: new Date().toLocaleDateString('ru-RU'), overview: { title: "Обзор проекта", content: `REFLY — это ERP-система для авиационного бизнеса Mura Menasa FZCO. Система обеспечивает комплексный контроль лётной годности воздушных судов и включает модули для управления закупками, финансами, персоналом, документооборотом, контролем качества, безопасностью и нормативной базой (EASA, ICAO, FAA, ARMAK).` }, techStack: { title: "Технологический стек", items: [ { name: "React 18", description: "UI библиотека" }, { name: "Vite", description: "Сборщик и dev-сервер" }, { name: "TypeScript", description: "Типизация" }, { name: "React Router v6", description: "Маршрутизация" }, { name: "Tailwind CSS", description: "Стилизация" }, { name: "shadcn/ui", description: "Компоненты UI" }, { name: "TanStack Query", description: "Управление состоянием" }, { name: "Lucide React", description: "Иконки" }, { name: "Recharts", description: "Графики" }, { name: "Lovable Cloud", description: "Бэкенд (БД, Auth, Storage)" } ] }, architecture: { title: "Архитектура приложения", layers: [ { name: "Presentation Layer", components: ["Pages", "Layout Components", "UI Components"] }, { name: "Business Logic Layer", components: ["Hooks", "Utils", "Services"] }, { name: "Data Layer", components: ["TanStack Query", "Supabase Client", "API"] } ] }, modules: [ { name: "Dashboard", path: "/", description: "Главная панель с метриками и быстрыми действиями" }, { name: "Закупки и ТМЦ", path: "/procurement", description: "Управление заявками и товарно-материальными ценностями" }, { name: "Финансы", path: "/finance", description: "Платежи, бюджетирование, импорт/экспорт данных" }, { name: "Персонал", path: "/hr", description: "HR-процессы, отпуска, зарплата" }, { name: "Документооборот", path: "/documents", description: "Генерация и управление документами" }, { name: "ОТК", path: "/quality", description: "Контроль качества, фиксация дефектов, AI-анализ" }, { name: "Безопасность", path: "/safety", description: "Грузоподъемная техника, пожарная безопасность" }, { name: "Регламенты", path: "/regulations", description: "База регламентов ARMAK, EASA, ICAO, FAA" }, { name: "AI Помощник", path: "/ai-assistant", description: "Анализ документов, извлечение данных" }, { name: "AI Inbox", path: "/inbox", description: "Входящие AI-обработанные данные" }, { name: "Настройки", path: "/settings", description: "Конфигурация системы" } ], fileStructure: { title: "Структура проекта", tree: ` src/ ├── App.tsx # Конфигурация роутера ├── main.tsx # Точка входа ├── index.css # Глобальные стили + CSS токены │ ├── components/ │ ├── layout/ │ │ ├── AppLayout.tsx # Основной layout │ │ ├── Sidebar.tsx # Боковая навигация │ │ └── Header.tsx # Верхний header │ │ │ ├── dashboard/ │ │ ├── MetricCard.tsx # Карточки метрик │ │ ├── ModuleCard.tsx # Карточки модулей │ │ ├── ActivityFeed.tsx # Лента активности │ │ ├── QuickActions.tsx # Быстрые действия │ │ └── SystemStatus.tsx # Статус системы │ │ │ └── ui/ # 40+ shadcn компонентов │ ├── pages/ # Страницы приложения ├── hooks/ # Кастомные хуки └── lib/ # Утилиты ` }, designSystem: { title: "Дизайн-система REFLY", principles: [ "Светлая тема с минималистичным дизайном", "Синие градиенты (REFLY Sphere)", "Шрифт Inter для текста", "Скругленные углы (border-radius: 12-16px)", "Мягкие тени и анимации" ], colors: [ { name: "Primary", value: "hsl(217, 91%, 60%)", description: "Основной синий" }, { name: "Secondary", value: "hsl(220, 14%, 96%)", description: "Фоновый серый" }, { name: "Accent", value: "hsl(217, 91%, 60%)", description: "Акцентный" }, { name: "Success", value: "hsl(142, 76%, 36%)", description: "Успех" }, { name: "Warning", value: "hsl(38, 92%, 50%)", description: "Предупреждение" }, { name: "Destructive", value: "hsl(0, 84%, 60%)", description: "Ошибка" } ] }, diagrams: { routing: ` ┌─────────────────────────────────────────────────────────────┐ │ App.tsx │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ BrowserRouter ││ │ │ ┌─────────────────────────────────────────────────────┐││ │ │ │ Routes │││ │ │ │ │││ │ │ │ / → Dashboard │││ │ │ │ /procurement → Procurement │││ │ │ │ /finance → Finance │││ │ │ │ /hr → HR │││ │ │ │ /documents → Documents │││ │ │ │ /quality → Quality │││ │ │ │ /safety → Safety │││ │ │ │ /regulations → Regulations │││ │ │ │ /ai-assistant → AIAssistant │││ │ │ │ /inbox → Inbox │││ │ │ │ /settings → Settings │││ │ │ │ * → NotFound │││ │ │ └─────────────────────────────────────────────────────┘││ │ └─────────────────────────────────────────────────────────┘│ └─────────────────────────────────────────────────────────────┘ `, components: ` ┌────────────────────────────────────────────────────────────────┐ │ AppLayout │ │ ┌──────────────┐ ┌──────────────────────────────────────────┐│ │ │ Sidebar │ │ Main Content ││ │ │ │ │ ┌────────────────────────────────────┐ ││ │ │ • Dashboard │ │ │ Header │ ││ │ │ • Закупки │ │ │ Title | Search | Theme | User │ ││ │ │ • Финансы │ │ └────────────────────────────────────┘ ││ │ │ • Персонал │ │ ┌────────────────────────────────────┐ ││ │ │ • Документы │ │ │ Page Content │ ││ │ │ • ОТК │ │ │ │ ││ │ │ • Безоп. │ │ │ (Dashboard, Procurement, etc.) │ ││ │ │ • Регламенты│ │ │ │ ││ │ │ • AI │ │ └────────────────────────────────────┘ ││ │ │ • Inbox │ │ ││ │ │ • Настройки │ │ ││ │ └──────────────┘ └──────────────────────────────────────────┘│ └────────────────────────────────────────────────────────────────┘ `, dataFlow: ` ┌─────────────────────────────────────────────────────────────────┐ │ Data Flow │ │ │ │ ┌──────────┐ ┌──────────────┐ ┌─────────────────┐ │ │ │ User │ ──── │ Components │ ──── │ TanStack Query │ │ │ │ Action │ │ (React) │ │ (Cache/Sync) │ │ │ └──────────┘ └──────────────┘ └─────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────┐ │ │ │ Supabase Client │ │ │ └─────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ Lovable Cloud │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │ │ │ │ │ Database │ │ Auth │ │ Storage │ │ Edge Fn │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ └─────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ` } }; // Generate HTML content for PDF function generateHTMLDocument(): string { const doc = projectDocumentation; return ` ${doc.title}

🛫 ${doc.title}

${doc.subtitle}

Версия: ${doc.version}

Дата: ${doc.date}

📋 Содержание

  1. 1. Обзор проекта
  2. 2. Технологический стек
  3. 3. Архитектура приложения
  4. 4. Модули системы
  5. 5. Структура файлов
  6. 6. Дизайн-система
  7. 7. Диаграммы

1. ${doc.overview.title}

${doc.overview.content}

2. ${doc.techStack.title}

${doc.techStack.items.map(item => `
${item.name} — ${item.description}
`).join('')}

3. ${doc.architecture.title}

${doc.architecture.layers.map(layer => `
${layer.name}
${layer.components.map(c => `${c}`).join('')}
`).join('')}

4. Модули системы

${doc.modules.map(m => `
${m.path} ${m.name} ${m.description}
`).join('')}

5. ${doc.fileStructure.title}

${doc.fileStructure.tree}

6. ${doc.designSystem.title}

Принципы дизайна

Цветовая палитра

${doc.designSystem.colors.map(c => `
${c.name}
${c.value}
`).join('')}

7. Диаграммы

Маршрутизация (Routing)

${doc.diagrams.routing}

Компоненты (Layout)

${doc.diagrams.components}

Поток данных (Data Flow)

${doc.diagrams.dataFlow}
`; } serve(async (req) => { // Handle CORS preflight if (req.method === 'OPTIONS') { return new Response(null, { headers: corsHeaders }); } try { console.log('Generating PDF documentation...'); const htmlContent = generateHTMLDocument(); // Return HTML that can be printed to PDF in browser return new Response(htmlContent, { headers: { ...corsHeaders, 'Content-Type': 'text/html; charset=utf-8', }, }); } catch (error: unknown) { console.error('Error generating documentation:', error); const errorMessage = error instanceof Error ? error.message : 'Unknown error'; return new Response( JSON.stringify({ error: errorMessage }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, } ); } });