# Блок-схема сервиса Contracts ## Полный пайплайн обработки допника ```mermaid flowchart TD A["📄 POST /api/contracts/{id}/supplements\n(file.docx)"] --> B["💾 documents.original_bytes\n(status=uploaded)"] B --> C["🔧 parser.parse()\nbytes → elements JSON"] C --> D["📝 textify.to_text()\nelements → линейный текст"] D --> E["📄 documents.parsed_text\n(status=parsed)"] E --> F["🤖 extractor.extract()\nтекст → LLM → строки JSON"] F --> G["📊 spec_rows\n(row_num, name, price, qty, sum, date)"] G --> H["🔄 differ.diff()\nсравнение с пред. допником"] H --> I["📋 spec_history\n(added/changed/deleted/unchanged)"] I --> J["✅ ответ API\n{rows, diff_summary}"] ``` ## Архитектура слоёв ```mermaid flowchart LR subgraph "Внешний мир" USER["👤 Пользователь"] end subgraph "Flask" APP["app.py\nсборка"] API["api.py\n/contracts"] UPL["upload.py\n/upload"] TEST["test_routes.py\n/test"] end subgraph "Бизнес-логика" PARSER["parser.py\nbytes→JSON"] TEXTIFY["textify.py\nJSON→текст"] LLM["llm_client.py\nHTTP/2→LLM"] EXTRACT["extractor.py\nтекст→строки"] DIFF["differ.py\nсравнение"] end subgraph "Данные" DB["db.py\nconnect/query"] SCH["schema.py\nDDL"] PG[("PostgreSQL\n5 таблиц")] end USER -->|"POST docx"| API USER -->|"GET /test"| TEST API --> PARSER PARSER --> TEXTIFY TEXTIFY --> EXTRACT EXTRACT --> LLM EXTRACT --> DIFF API --> DB DB --> PG APP --> SCH SCH --> DB ``` ## Цепочка данных ```mermaid flowchart LR A["docx\n(байты)"] -->|parser| B["elements\nJSON"] B -->|textify| C["текст\nстрока"] C -->|extractor + LLM| D["spec_rows\nJSON"] D -->|differ| E["changes\nJSON"] E -->|api| F["ответ\nпользователю"] ```