# Рефакторинг Маркетинговой Стратегии - Changelog

## Дата: 11 апреля 2026

### 📋 Описание изменений

Полностью переработана логика генерации маркетинговой стратегии для решения проблем:
- Недостаточное количество постов (было 8, стало 16)
- Неравномерное распределение постов (пропуски 2-3 дня)
- Отсутствие связи между постами и неделями
- Непрофессиональное отображение на фронте

---

### ✅ Что изменено

#### 1. **Увеличено количество постов: 8 → 16**
- **Было:** 8 постов за 4 недели (2 поста/неделю)
- **Стало:** 16 постов за 4 недели (4 поста/неделю)
- **Распределение:** Пн 09:00, Ср 12:00, Пт 18:00, Сб 20:00

#### 2. **Добавлено поле `weekNumber`**
- **Model:** `MarketingStrategy.PostCalendarItem.weekNumber`
- **DTO:** `MarketingStrategyResponse.PostCalendarItem.weekNumber`
- **Цель:** Чёткая связь каждого поста с конкретной неделей стратегии

#### 3. **Нормализация расписания**
- Новый метод: `normalizePostSchedule()`
- Автоматически выравнивает посты по дням недели
- Гарантирует равномерный ритм публикаций
- Сохраняет валидные даты от AI (если в пределах ±2 дней)

#### 4. **Усиленный промпт для AI**
- Чёткие инструкции по распределению 16 постов
- Примеры правильного JSON с `weekNumber`
- Явные требования: 4 поста/неделю, Пн-Ср-Пт-Сб
- Увеличено количество видео: 2 → 4 (по 1 в неделю)

#### 5. **Улучшенная валидация**
- Логирование при < 12 постах от AI
- Авто-расчёт дат если AI вернул некорректные
- Нормализация `weekNumber` для всех постов

---

### 📁 Изменённые файлы

1. **`MarketingStrategy.java`** (Model)
   - Добавлено поле `weekNumber` в `PostCalendarItem`

2. **`MarketingStrategyResponse.java`** (DTO)
   - Добавлено поле `weekNumber` в `PostCalendarItem`
   - Добавлены геттеры/сеттеры + поля `videoUrl`, `videoFilename`

3. **`MarketingStrategyV3Service.java`** (Service)
   - Усилен `buildUserPrompt()` — детальные инструкции по распределению
   - Переписан `populateStrategyEntity()` — обработка `weekNumber`
   - Новый метод `normalizePostSchedule()` — выравнивание расписания
   - Новый метод `getDayOffset()` — расчёт дней недели
   - Обновлён `buildPostCountPlan()` — 16 постов вместо 12
   - Увеличен лимит видео: 2 → 4

4. **`getStrategyResult()`**
   - Добавлено поле `weekNumber` в ответ API

---

### 🎯 Результат

#### **До рефакторинга:**
```json
{
  "postCalendar": [
    { "publishDate": "2026-04-10T09:00:00", "theme": "Кейс: ..." },
    { "publishDate": "2026-04-12T18:00:00", "theme": "Процесс: ..." },
    { "publishDate": "2026-04-15T12:00:00", "theme": "Отзыв: ..." }
    // ... всего 8 постов, пропуски 2-3 дня
  ]
}
```

#### **После рефакторинга:**
```json
{
  "postCalendar": [
    { 
      "postIndex": 0, 
      "publishDate": "2026-04-13T09:00:00", 
      "weekNumber": 1,
      "platform": "Instagram",
      "contentType": "видео",
      "theme": "Кейс: Как мы увеличили продажи на 40%",
      "publishTime": "09:00"
    },
    { 
      "postIndex": 1, 
      "publishDate": "2026-04-15T12:00:00", 
      "weekNumber": 1,
      "platform": "Instagram",
      "contentType": "фото",
      "theme": "Процесс: За кадром нашей работы",
      "publishTime": "12:00"
    },
    // ... ещё 14 постов, ровно 4 в неделю
  ]
}
```

---

### 📊 Расписание постов (пример)

| Неделя | День | Время | Тип контента |
|--------|------|-------|--------------|
| 1 | Понедельник (день 1) | 09:00 | 🎥 Видео (Кейс) |
| 1 | Среда (день 3) | 12:00 | 📸 Фото (Процесс) |
| 1 | Пятница (день 5) | 18:00 | 📸 Фото (Отзыв) |
| 1 | Суббота (день 6) | 20:00 | 📸 Фото (Экспертный) |
| 2 | Понедельник (день 8) | 09:00 | 🎥 Видео (Кейс) |
| 2 | Среда (день 10) | 12:00 | 📸 Фото (Процесс) |
| ... | ... | ... | ... |

---

### 🚀 Преимущества

✅ **Профессиональный вид** — равномерное расписание, как у SMM-агентств  
✅ **Предсказуемость** — клиент знает когда будет каждый пост  
✅ **Связность** — каждый пост привязан к неделе и теме  
✅ **Гибкость** — AI может предлагать даты, но система нормализует  
✅ **Масштабируемость** — легко изменить на 3 или 5 постов/неделю  

---

### ⚠️ Важно для фронтенда

Теперь в ответе API появляется новое поле `weekNumber` у каждого поста:

```typescript
interface PostCalendarItem {
  postIndex: number;
  publishDate: string;
  weekNumber: number;        // ← НОВОЕ ПОЛЕ
  platform: string;
  contentType: string;
  theme: string;
  postText: string;
  hashtags: string[];
  publishTime: string;
  imageUrl?: string;
  videoUrl?: string;
  // ...
}
```

Рекомендуется использовать `weekNumber` для группировки постов на фронте!

---

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

После деплоя проверьте:
1. Генерацию новой стратегии — должно быть 16 постов
2. Распределение по неделям — по 4 поста в каждой
3. Даты публикаций — Пн-Ср-Пт-Сб
4. Поле `weekNumber` — должно присутствовать у всех постов
5. Видео-посты — ровно 4 (по 1 в неделю)

---

### 📝 Компиляция

```bash
cd c:\Users\777\IdeaProjects\telecomBackend
mvnw.cmd compile -DskipTests
```

✅ **BUILD SUCCESS** — все изменения компилируются без ошибок!

---

**Автор:** AI Assistant  
**Дата:** 11.04.2026  
**Версия:** 2.0
