# NIN Excel Parsers API

API для парсинга Excel отчетов нефтеперерабатывающих заводов (НПЗ) с использованием FastAPI и MinIO для хранения данных.

## 🚀 Быстрый запуск

### **Вариант 1: Только MinIO в Docker + FastAPI локально**
```bash
# Запуск MinIO в Docker
docker-compose up -d minio

# Запуск FastAPI локально
python run_dev.py

# В отдельном терминале запуск Streamlit
python run_streamlit.py
```

### **Вариант 2: MinIO + FastAPI в Docker + Streamlit локально**
```bash
# Запуск MinIO и FastAPI в Docker
docker-compose up -d

# В отдельном терминале запуск Streamlit
python run_streamlit.py
```

### **Вариант 3: Только MinIO в Docker**
```bash
# Запуск только MinIO
docker-compose up -d minio
```

## 📋 Описание сервисов

- **MinIO** (порт 9000-9001): S3-совместимое хранилище для данных
- **FastAPI** (порт 8000): API сервер для парсинга Excel файлов
- **Streamlit** (порт 8501): Веб-интерфейс для демонстрации API

## 🔧 Диагностика

Для проверки состояния всех сервисов:
```bash
python check_services.py
```

## 🛑 Остановка

### Остановка Docker сервисов:
```bash
# Все сервисы
docker-compose down

# Только MinIO
docker-compose stop minio
```

### Остановка Streamlit:
```bash
# Нажмите Ctrl+C в терминале с Streamlit
```

## 📁 Структура проекта

```
python_parser/
├── app/                    # FastAPI приложение
│   ├── main.py           # Основной файл приложения
│   └── schemas/          # Pydantic схемы
├── core/                  # Бизнес-логика
│   ├── models.py         # Модели данных
│   ├── ports.py          # Интерфейсы (порты)
│   └── services.py       # Сервисы
├── adapters/              # Адаптеры для внешних систем
│   ├── storage.py        # MinIO адаптер
│   └── parsers/          # Парсеры Excel файлов
├── data/                  # Тестовые данные
├── docker-compose.yml     # Docker Compose конфигурация
├── Dockerfile            # Docker образ для FastAPI
├── run_dev.py            # Запуск FastAPI локально
├── run_streamlit.py      # Запуск Streamlit
└── check_services.py     # Диагностика сервисов
```

## 🔍 Доступные эндпоинты

- **GET /** - Информация об API
- **GET /docs** - Swagger документация
- **POST /svodka_pm/upload-zip** - Загрузка сводок ПМ
- **POST /svodka_ca/upload-zip** - Загрузка сводок ЦА
- **POST /monitoring_fuel/upload-zip** - Загрузка мониторинга топлива
- **GET /svodka_pm/data** - Получение данных сводок ПМ
- **GET /svodka_ca/data** - Получение данных сводок ЦА
- **GET /monitoring_fuel/data** - Получение данных мониторинга топлива

## 📊 Поддерживаемые типы отчетов

1. **svodka_pm** - Сводки по переработке нефти (ПМ)
2. **svodka_ca** - Сводки по переработке нефти (ЦА)
3. **monitoring_fuel** - Мониторинг топлива

## 🐳 Docker команды

### Сборка и запуск:
```bash
# Все сервисы
docker-compose up -d --build

# Только MinIO
docker-compose up -d minio

# Только FastAPI (требует MinIO)
docker-compose up -d fastapi
```

### Просмотр логов:
```bash
# Все сервисы
docker-compose logs

# Конкретный сервис
docker-compose logs fastapi
docker-compose logs minio
```

### Остановка:
```bash
docker-compose down
```

## 🔧 Устранение неполадок

### Проблема: "Streamlit не может подключиться к FastAPI"

**Симптомы:**
- Streamlit открывается, но показывает "API недоступен по адресу http://localhost:8000"
- FastAPI не отвечает на порту 8000

**Решения:**

1. **Проверьте порты:**
   ```bash
   # Windows
   netstat -an | findstr :8000
   
   # Linux/Mac
   netstat -an | grep :8000
   ```

2. **Перезапустите FastAPI:**
   ```bash
   # Остановите текущий процесс (Ctrl+C)
   python run_dev.py
   ```

3. **Проверьте логи Docker:**
   ```bash
   docker-compose logs fastapi
   ```

### Проблема: "MinIO недоступен"

**Решения:**
1. Запустите Docker Desktop
2. Проверьте статус контейнера: `docker ps`
3. Перезапустите MinIO: `docker-compose restart minio`

### Проблема: "Порт уже занят"

**Решения:**
1. Найдите процесс: `netstat -ano | findstr :8000`
2. Остановите процесс: `taskkill /PID <номер_процесса>`
3. Или используйте другой порт в конфигурации

## 🚀 Разработка

### Добавление нового парсера:

1. Создайте файл в `adapters/parsers/`
2. Реализуйте интерфейс `ParserPort`
3. Добавьте в `core/services.py`
4. Создайте схемы в `app/schemas/`
5. Добавьте эндпоинты в `app/main.py`

### Тестирование:

```bash
# Запуск тестов
pytest

# Запуск с покрытием
pytest --cov=.
```

## 📝 Лицензия

Проект разработан для внутреннего использования НИН. 