📊 Статусы альбома (справочник)
Карточные статусы (Dashboard)
Это вычисляемые статусы для отображения на Рабочем столе.
| Статус |
Цвет |
Условие |
Клиенты |
Ретушь |
Печать |
active |
🟢 Зелёный |
PUBLISHED + не истёк |
✅ |
✅ |
❌ |
warning |
🟡 Жёлтый |
PUBLISHED + < 24ч до истечения |
✅ |
✅ |
❌ |
processing |
🔵 Синий |
PUBLISHED + истёк |
❌ |
✅ |
✅ |
archived |
⚪ Серый |
HIDDEN или EXPIRED |
❌ |
❌ |
❌ |
setup |
⚪ Серый |
DRAFT, SYNCING, ERROR, READY |
❌ |
❌ |
❌ |
База данных (AlbumStatus)
Это статусы в базе данных (enum).
| Статус |
Label |
Описание |
Доступен клиентам? |
DRAFT |
Черновик |
Создан, но не синхронизирован |
❌ |
SYNCING |
Синхронизация |
Загрузка фото с диска |
❌ |
ERROR |
Ошибка |
Ошибка при синхронизации |
❌ |
PROCESSING |
Обработка AI |
Распознавание лиц (если включено) |
❌ |
READY |
Готов к публикации |
Синхронизирован, можно публиковать |
❌ |
PUBLISHED |
Опубликован |
Доступен клиентам |
✅ |
HIDDEN |
Скрыт |
Скрыт вручную фотографом |
❌ |
EXPIRED |
Истёк |
Срок жизни истёк (cron) |
❌ |
Связь DB Status → Card Status
// Album::getCardStatus()
if (HIDDEN || EXPIRED) → 'archived'
if (!PUBLISHED) → 'setup'
if (expires_at && isPast) → 'processing'
if (expires_at && diffInHours < 24) → 'warning'
else → 'active'
Логика
┌─────────────┐
│ PUBLISHED │
└──────┬──────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
expires_at expires_at no expires_at
is future is past (infinite)
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ < 24h? │ │processing│ │ active │
└────┬────┘ └─────────┘ └─────────┘
│
┌─────┴─────┐
│ │
▼ ▼
warning active
Транзиции DB статусов
┌─────────┐
│ ERROR │◄──────────────────┐
└────┬────┘ │
│ "Повторить" │
▼ │
┌─────────┐ "Синхронизировать" ┌─────────┐ error │
│ DRAFT │───────────────────────►│ SYNCING │────────────────────┤
└─────────┘ └────┬────┘ │
│ │
┌─────────────┴─────────────┐ │
│ done │ │
▼ │ │
┌─────────┐ │ │
│ READY │◄──────────────────────┼───────────┘
└────┬────┘ │
│ "Опубликовать" │ "Синхронизировать"
│ (Галерея) │
▼ │
┌───────────┐ │
│ PUBLISHED │──────────────────────┤
└─────┬─────┘ │
│ │
┌────────────┴────────────┐ │
│ "Скрыть" │ expires │
│ │ (cron) │
▼ ▼ │
┌─────────┐ ┌─────────┐ │
│ HIDDEN │──────────────►│ EXPIRED │───────────┘
└────┬────┘ └────┬────┘
│ │
│ "Синхронизировать" │ "Синхронизировать"
│ │
└─────────────────────────┴──────────► SYNCING → READY
Методы AlbumStatus
| Метод |
Возвращает true для |
isAccessible() |
PUBLISHED |
canPublish() |
READY, HIDDEN, EXPIRED |
canUnpublish() |
PUBLISHED |
canDelete() |
DRAFT, ERROR, READY |
canSync() |
DRAFT, ERROR, HIDDEN, EXPIRED |
На что влияют статусы?
Клиентская галерея
isAccessible() = true → галерея доступна
isAccessible() = false → страница "Альбом недоступен"
Заказы
| Card Status |
Новые заказы |
Изменение заказа |
| active |
✅ |
✅ |
| warning |
✅ |
✅ |
| processing |
✅ |
❌ |
| archived |
❌ |
❌ |
Печать (в Dashboard)
| Card Status |
Печать |
| active |
🔒 Заблокирована |
| warning |
🔒 Заблокирована |
| processing |
✅ Доступна |
| archived |
🔒 Недоступна |
Ретушь (в Dashboard)
| Card Status |
Ретушь |
| active |
✅ Доступна |
| warning |
✅ Доступна |
| processing |
✅ Доступна |
| archived |
🔒 Недоступна |
Кнопки по статусам
| Статус |
Dashboard |
Галерея (владелец) |
| DRAFT |
🔄 Синхронизировать |
— |
| SYNCING |
⏳ Синхронизация... |
— |
| ERROR |
🔄 Повторить |
— |
| READY |
👁️ Предпросмотр и публикация |
📢 Опубликовать |
| PUBLISHED |
🔗 Поделиться, ⏸️ Скрыть |
— |
| HIDDEN |
🔄 Синхронизировать, 👁️ Предпросмотр |
📢 Опубликовать |
| EXPIRED |
🔄 Синхронизировать, 👁️ Предпросмотр |
📢 Опубликовать* |
*только если expires_at > now или указан новый срок
Console Commands
albums:expire
Переводит PUBLISHED → EXPIRED если expires_at < now.
php artisan albums:expire
Запускается каждый час через scheduler.