Commit Graph

34 Commits

Author SHA1 Message Date
Hermes 4cf5c0ffab feat(autocall): локация без звонков помечена «Не звоним (город)»
Заказ из города, выключенного для звонков (Настройки → Коммуникации →
Автодозвон → 📍 Локации), больше не выглядит как «звонка не было»:

- autocall_status(og) отдаёт новый статус city_disabled (порядок: ручной
  запрет → локация выключена → исключение по номеру → журнал звонков);
- бейдж в реестре: 🚫 не звоним, виден и в завершённом заказе;
- фильтр «Статус автодозвона»: «Не звоним (город)»;
- карточка «Автодозвон»: пояснение «Не звоним — <город>», кнопка
  «Позвонить сейчас» заблокирована (планировщик такие заявки пропускает);
- сводка заказа и шаг «Звонок» в цепочке: «не звоним (локация выключена)»;
- в детальную выборку группы добавлены autocall_status/exclusion_reason;
- SW-кэш static-v129.

На SMS выключение локации не влияет — уведомления продолжают уходить.
2026-09-29 17:40:58 +02:00
Hermes 20e942235a feat(delivery): видно, чем согласовали заказ — пуш / SMS / звонок / логист
Владелец: «нужно видеть, согласование прошло через пуш/смс/звонок/вручную через
менеджера» и «в колонке с именем клиента пишется просто «Согласовано» — непонятно
как и кем». Плюс в карточке «завтра/послезавтра» читалось как дата заказа.

Источник правды — order_groups.delivery_date_source: manual (логист), autocall
(робот), и теперь push/sms/messenger/client от клиентской страницы. Раньше клиентское
подтверждение канал не писало вовсе — такие записи разбираются по confirmed_at
приглашения (канал «link» → «По ссылке»).

- миграция 20260929_confirmation_channel.sql: confirm_delivery_choice_by_token
  принимает p_src и сохраняет канал в delivery_date_source + action_logs.details;
- клиентская страница читает ?src= из ссылки и прокидывает в RPC (SMS-ссылка уже
  содержит src=sms);
- orderGroupViews: resolveConfirmChannel/confirmChannelMeta — единый источник подписей
  канала, плюс invitationConfirmedAt в репозитории (и в списке, и в карточке);
- реестр доставок/самовывозов: под статусом чип «как согласовано» (📞 звонок робота,
  ✉️ SMS-ссылка, 🔔 push, 🧑💼 логист, 🔗 по ссылке);
- карточка заказа: рядом с «Согласовано» тот же чип;
- AutocallStatusCard: «робот предлагал: завтра или послезавтра» вместо голого
  «завтра/послезавтра» (читалось как дата заказа);
- Аналитика: в «Пути заказа» блок «Как согласовали дату» — полосы по каналам
  (за 30 дней: логист 135, по ссылке 20, звонок робота 7, push 0).

Тесты: orderGroupViews +4, OrderPathFunnelBlock +1 (37 зелёных в этих файлах). SW v128.
2026-09-29 11:54:04 +02:00
Hermes 3b90b79f9f fix(registry): дата и время самовывоза в реестре групп
Владелец: «в таблице всех доставок и самовывоза, если согласована доставка, дата
и время указаны, а если самовывоз — нет; нужно и самовывоз выводить».

Причина: колонка «Дата» (LogisticsReadinessBoard) читала только delivery_date/
delivery_time, а у самовывоза дата и половина дня лежат в pickup_date/
pickup_time_slot — поэтому строка самовывоза показывала «—», хотя слот согласован.
Тот же пропуск был в фильтре по периоду и группировке по датам: getDeliveryDate()
смотрела только на delivery_date, и при выбранном периоде заказы самовывоза
пропадали из реестра (падали в дату заказа).

Введены общие хелперы в orderGroupViews: isPickupGroup, getGroupSlotDate,
getGroupSlotTime (камелкеис и snake_case). Реестр показывает дату и время слота
по типу заказа, сортировка — по этой же показанной дате, фильтр по периоду и
группировка — тоже по ней. Подпись колонки «Доставка» → «Дата» (в колонке теперь
и дата выдачи).

Попутно поправлено устаревшее ожидание в тесте (getOrderGroupDisplayStatusLabel
для черновика ждало «draft», подпись локализована в «Черновик») — тест падал и до
этой правки.

SW: v121 -> v122.
2026-09-28 23:17:39 +02:00
Hermes c58f2b0629 fix(ui): закрытый баннер SMS больше не возвращается (отпечаток без суммы), баланс один на всех страницах; feat(autocall): статусы «не выбрал день» / «не выбрал время» / «и то и другое» (БД + бейдж + фильтр) 2026-09-17 12:32:53 +02:00
Hermes 4192e44998 feat(sms): понятные причины ошибок в карточке доставки — техстроки планировщика (code=106, not delivered, limit exceeded) переводятся в человеческие 2026-09-16 16:19:17 +02:00
Hermes 5c98a54895 feat(autocall): звонок клиенту, если SMS не ушло (отсчёт от последней попытки) + статусы «не выбрал день/время» вместо «не нажал цифру» 2026-09-16 16:14:34 +02:00
Hermes 7ab3debbb3 fix(logistics): понятные статусы автодозвона в реестре доставок — своя подпись у каждого исхода, «не звонили» только по ожидающим заказам, убраны формулировки удалённых сценариев; единый список подписей для фильтра и бейджа 2026-09-16 11:03:28 +02:00
Hermes dc262d2be7 feat(orders): причина неудачной отправки SMS — в карточке заказа и блоком над таблицей наборов (код 201 = кончились средства) 2026-09-14 15:40:15 +02:00
Hermes 04f78f7367 feat(filters): два отдельных фильтра «Статус SMS» и «Статус автодозвона» вместо «Прозвонить» 2026-09-09 14:49:31 +02:00
Hermes 64bcda8eed feat(autocall): статус автодозвона в карточке (как у SMS) + фильтр «Прозвонить» в таблице + выравнивание переключателя 2026-09-08 13:04:01 +02:00
root d5849f0ab2 feat(logistics): highlight and filter orders with SMS problems 2026-08-06 15:12:23 +00:00
root fbfcb71d61 fix: driver delivery UX — remove Загружено status, fix checkbox reset, fix confirmed label
1. Remove "Загружено" status from driver workflow — driver goes directly
   Назначен водитель → Доставлено (or Проблема)
2. Driver can undo "Доставлено" → "Вернуть в работу" (back to Назначен водитель)
3. Fix checkbox reset: shippedItems only resets when order ID changes,
   not on every order data refetch — driver can toggle items freely
4. Fix "confirmed" showing in SMS status card — add Russian label
5. onResetStatus resets to driver_assigned, not loaded
6. ShipmentPanel "Сбросить" works for all active statuses
2026-07-13 11:51:56 +00:00
root b78bdc48bb feat: drag-n-drop status sections + localStorage filters/collapsed + pickup date in logistics board
- Drag-n-drop reordering of status sections (desktop + touch)
- Section order saved in localStorage (logistics-section-order)
- Collapsed/expanded state saved in localStorage (logistics-collapsed)
- Filters (city, status, search) saved in localStorage (logistics-filters)
- Pickup date shown in delivery date column for self-pickup orders
- SMS campaign scripts (manual, second, paid_storage, timer manager)
- SmsCampaignStats + SmsStatusCard components
- DashboardPage: unified LogisticsReadinessBoard for all roles
- OrdersTable cleanup, StatusActionPanel updates
- SW v42
2026-07-01 16:16:22 +00:00
root b0370ed03e fix: handle status=first_sms_sent when notification_status=link_ready
n8n workflow writes status='first_sms_sent' but leaves notification_status='link_ready'.
Added first_sms_sent/second_sms_sent to ORDER_GROUP_STATUS_LABELS and tone logic.
2026-06-23 07:53:01 +00:00
root a55e5857f8 fix: add SMS notification statuses to filter options, increase Badge font size
- Add first_sms_sent, second_sms_sent, send_failed, link_ready, ready_to_launch
  to ORDER_GROUP_DISPLAY_STATUS_OPTIONS (were missing from filter dropdown)
- Badge: text-xs (12px) → text-sm (14px), font-semibold → font-medium,
  px-3 py-1 → px-2.5 py-0.5 (matches table text size, less padding)
2026-06-23 07:38:54 +00:00
root bbe578eb3a fix: parseGroupDate now handles DD.MM.YYYY (4-digit year) format
customer_date in DB is stored as 23.06.2026 (DD.MM.YYYY) but parseGroupDate
only matched DD.MM.YY (2-digit year). This caused date filter to reject all
groups when filtering by date range, since parseGroupDate returned null
for 4-digit year dates.
2026-06-23 07:22:09 +00:00
root 54386e9710 feat: Тип column replaces Проблема, red highlight for problem rows, delivery type filter, clean status options
- OrdersTable: replaced 'Проблема' column with 'Тип' (Самовывоз/Доставка)
- Problem rows highlighted red (bg rgba danger 10%)
- Mobile cards also show Тип label
- OrderFilters: added deliveryType dropdown (Доставка/Самовывоз)
- filterOrderGroups: filter by deliveryType
- useOrderGroups: deliveryType in default filters state
- Cleaned ORDER_GROUP_DISPLAY_STATUS_OPTIONS: removed 'Повторное SMS' and 'SMS отправлены' (not used)
2026-06-18 15:00:58 +00:00
root d28e00782b fix: never show raw English status keys to user — fall back to 'Неизвестно (key)' 2026-06-16 13:29:38 +00:00
root b888eba09b feat: колонка has_delivery_problem + delivery_problem_note
- saveShipmentData автоматически заполняет has_delivery_problem (boolean) и delivery_problem_note (текст с перечислением неотгруженных позиций и причин)
- OrdersTable: колонка 'Проблема' показывает ⚠ Проблема + детали из delivery_problem_note
- orderGroupViews: warning-тон для групп с hasDeliveryProblem
- n8n/1C: просто читать has_delivery_problem (0/1) и delivery_problem_note
2026-06-15 17:32:14 +00:00
root 3847625005 feat: колонка Отгрузка в таблице + подсветка проблем
- Новая колонка 'Отгрузка' в таблице групп доставки (десктоп и мобайл)
- Показывает ✓ N/N для полностью отгруженных, ⚠ X/N для частичной отгрузки
- В мобильных карточках: блок с перечислением проблемных товаров и причин
- Подсветка warning-тоном для групп с неотгруженными позициями
- Восстановление состояния чекбоксов из driverShipmentData
2026-06-15 15:27:50 +00:00
root d313a3b6b9 fix: driver badge shows only assigned deliveries, add agreed+paid_storage to visible statuses
- DashboardPage: driver badge now counts only groups visible to driver AND assigned to current user
- DRIVER_VISIBLE_DELIVERY_STATUSES: added 'agreed' and 'paid_storage' so driver sees all relevant statuses
- DriverDeliveryPlanner: added agreed/paid_storage to status sort order
- Previously badge showed allOrderGroups.length (5) but list was empty because filter was too strict
2026-06-12 19:22:36 +00:00
root 3e5be5edf1 fix: remove on_route and pickup from manual status buttons and filters 2026-06-12 18:25:52 +00:00
root 6617abc27f feat: add picked_up (Вывезено) status — terminal status for self-pickup orders 2026-06-12 18:17:44 +00:00
root 4dde64ff5a refactor: Phase 1 stabilization — hooks ordering, deduplicate utils, extract shared constants
- P0-1: Move all hooks (useState, useCallback, useMemo) before early return to fix Rules of Hooks violation
- P0-3: Replace 7 inline isPickupOrder checks with single computed variable
- P1: Extract getErrorMessage, normalizeNom to shared utils/deliveryUtils.js
- P1: Replace duplicate STATUS_LABELS with DELIVERY_GROUP_STATUS_LABELS import
- P1: Add requires_address to DELIVERY_GROUP_STATUS_LABELS
- Remove duplicate getErrorMessage from useOrderGroups.js and OrderDetailPanel.jsx
- Remove duplicate normalizeNom from OrderDetailPanel.jsx and orderGroupRepository.js
2026-06-12 14:50:56 +00:00
root e05613ac1d feat: add pickup (самовывоз) delivery type
- New status pickup in delivery workflow
- DB: delivery_type, pickup_date, pickup_time_slot columns
- Client page: tabs Доставка/Самовывоз with PickupSlotsPicker
- PickupSlotsPicker: today/tomorrow/day-after with half-day slots
- Storage notice: free 2 workdays, then 300₽/day
- OrderDetailPanel: delivery type tabs, pickup date/time, status button
- Edge function: delivery_type/pickup fields in confirm-delivery-choice
- RPC: confirm_delivery_choice_by_token updated for pickup
- orderGroupRepository: full pickup field mapping
2026-06-10 12:02:46 +00:00
root 6f29948f8a fix: remove Группы tab from logistician, remove Справка, Телефон→Город, Заказы→Водитель, add city filter 2026-05-28 10:29:13 +00:00
root 805ceca152 fix: 8 bugfixes — current undefined, auth email, sequential statuses, problem dialog, action log details, KPI layout, date sort, driver lock 2026-05-28 10:03:19 +00:00
root 40b28be0ee fix: automation funnel — correct data logic, remove emojis, rename to Воронка согласования 2026-05-25 12:31:58 +00:00
Codex 43c5f75055 feat: delivery page improvements and driver shipment workflow
- OrderCompositionPanel: flatten nested source_orders into product list, collapsed by default
- DeliverySlotsPicker: single-line heading 'Доставка завтра · 22.05.2026' instead of two-line
- OrderDetailPanel: add logistics status change panel, reorder sections (delivery date → driver → status → paid storage)
- OrderDetailPanel: require delivery date before assigning driver
- GroupDetailPage: dedicated route /dashboard/group/:groupId instead of modal
- DashboardPage: navigate to group detail page instead of opening modal
- DriverDeliveryPlanner: remove 'agreed' status, add city filter pills, group by status within dates
- DriverDeliveryPlanner: show delivery address instead of order numbers/ready count/SMS
- DriverShipmentPanel: new component with per-item checkboxes, ship-all, comments for unshipped items
- OrderDetailPanel: driver sees shipment panel + status buttons; 'delivered' requires all items shipped or commented
- Driver status: start from 'Назначено вам' (driver_assigned), not 'agreed'
- Remove duplicate header from GroupDetailPage
2026-05-22 12:53:43 +03:00
Codex 6244749545 feat: unify manual_required status and driver label
- orderGroupViews: unify notification manual_required + pending delivery_status into single "Требуется ручное управление" status
- LogisticsReadinessBoard: use status:manual_required in funnel instead of delivery:manual_confirmation_required
- DriverDeliveryPlanner: show "Назначено вам" for driver_assigned instead of "Назначен водитель"
- Add sync-manual-status.sql trigger patch for backend
2026-05-20 16:25:06 +03:00
Codex c8fbe95bd1 feat(paid-storage): inline confirmation + cancel action + status display
- Replaced window.confirm with inline confirmation panel in app style
- Shows confirmation block with 'Yes, transfer' / 'Cancel' buttons
- After transfer: shows 'Transferred to paid storage' with date and yellow indicator
- Added cancel button to revert from paid_storage back to pending_confirmation
2026-05-20 16:25:06 +03:00
Codex b9c6bb2810 fix: RLS recursion, driver UI, auth errors, status counts
- Fix infinite RLS recursion in users policies via current_role_name()
- Add is_admin() helper and simplify users select policies
- Fix order_groups insert for service_role (n8n integration)
- Fix status option counts in dropdown (LogisticsReadinessBoard)
- Add driver delivery status buttons (loaded, on_route, delivered, problem, cancelled)
- Replace driver date range filters with single date picker + date pills
- Hide SMS/internal data from driver view in OrderDetailPanel
- Fix Edge Function error messages in OTP flow (read error.context body)
- Add update_delivery_status RPC for driver workflow
- Remove customer column from order_groups fetch (DB schema mismatch)
- UI: swap filter/search positions, limit modal width, status label cleanup
2026-05-20 16:25:05 +03:00
Codex b79de7afba feat(delivery): auto-create invitation links
Add a Supabase trigger that creates delivery invitations and writes delivery_link on order_groups changes. n8n can now consume link_ready rows without calling the edge function first.
2026-05-13 18:59:30 +03:00
Codex 684424dd25 feat(order-groups): wire driver delivery flow 2026-05-13 18:59:30 +03:00