Commit Graph

97 Commits

Author SHA1 Message Date
Hermes c58f2b0629 fix(ui): закрытый баннер SMS больше не возвращается (отпечаток без суммы), баланс один на всех страницах; feat(autocall): статусы «не выбрал день» / «не выбрал время» / «и то и другое» (БД + бейдж + фильтр) 2026-09-17 12:32:53 +02:00
Hermes 775a72ea29 fix(autocall): «ручное управление» — это НЕ согласованный заказ; кнопку автодозвона по нему больше не блокирует (ошибка из прошлой правки) 2026-09-17 12:04:00 +02:00
Hermes 512aab9ff2 fix(sms): заказы больше не висят в «1-е приглашение отправлено» — в ручную работу переводим от последнего контакта и только по включённым каналам (SMS/автодозвон); заказ, где дата уже выбрана, роботу не звоним 2026-09-16 17:15:43 +02:00
Hermes e35b3d885f fix(autocall): заявку «позвонить сейчас» не закрываем — при закрытом окне звонка блокируем кнопку автодозвона с объяснением (по правилу владельца) 2026-09-16 16:47:49 +02:00
Hermes dacd43165c fix(autocall): заявка «позвонить сейчас» с закрытым окном звонка больше не висит вечно в очереди — планировщик закрывает её, карточка честно говорит «звонить больше не о чем» + кнопка «всё равно позвонить» 2026-09-16 16:39:28 +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 8e9a0f6dab fix(autocall): ручной звонок из карточки звонит клиенту (тестовый режим только для массового обзвона) + видимый процесс звонка в карточке 2026-09-15 15:26:20 +02:00
Hermes 3706f64ca7 feat(orders): блок про SMS смотрит на баланс счёта — гасится после пополнения, закрывается крестиком, предупреждает о низком балансе (эдж-функция sms-balance) 2026-09-14 15:58:30 +02:00
Hermes dc262d2be7 feat(orders): причина неудачной отправки SMS — в карточке заказа и блоком над таблицей наборов (код 201 = кончились средства) 2026-09-14 15:40:15 +02:00
Hermes 11167516a3 feat(schedule): рабочие часы склада и доставки в админке — открытие/закрытие, границы половин, отсечка «сегодня»; робот и ссылка клиента читают часы 2026-09-14 13:15:49 +02:00
Hermes 794c3ce5e3 fix(autocall,client): рабочие дни из графика админки — самовывоз пн-пт у робота и ссылки, доставка в ссылке читает график; тексты панели «Рабочие дни» 2026-09-11 15:53:03 +02:00
Hermes 270ab39abc fix(autocall): самовывоз только по рабочим дням графика + робот называет реальные дни; страница клиента читает график 2026-09-11 15:40:29 +02:00
Hermes 73b9512f15 fix(orders): список не пустеет при возврате — кэш отдаёт обёртку {data,error}, состояние не стирается 2026-09-10 15:04:47 +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
Hermes 5dbeae84f4 feat(autocall): исключения автодозвона — таблица, UI в настройках, проверка в планировщике, бейдж в реестре/карточке 2026-09-08 11:16:16 +02:00
Hermes 6435679161 feat(autocall): раздел «Коммуникации» с вкладками SMS/Автодозвон/Аналитика, бейджи, карточка заказа, edge fn autocall-result, миграция БД 2026-09-01 21:34:39 +02:00
Hermes 6ca8bd545e fix(call): show & persist 'called' status
- mapOrderGroupRowToDeliveryGroup dropped called/called_at/called_comment
  fields (they were selected but never mapped) so the panel always read
  'not called' and freshly saved calls appeared to vanish.
- CalledPanel: one-tap 'Звонили' marks called with now; app-styled
  date/time dropdowns (CallDateTime) default to current moment for fast
  entry; comment edit form pre-filled.
- OrderDetailPanel: forward real onRefreshOrder (was a silent no-op) so
  the card refreshes from DB after a save.
2026-08-21 14:09:54 +02:00
Hermes a3cd0838f0 perf: hide-completed server filter + in-memory list cache for fast return-to-list 2026-08-19 11:58:20 +02:00
Hermes 8131e26c77 perf: load single order group by id in detail view instead of all 430 groups
- add fetchOrderGroupById (single .eq(id).single() query)
- useOrderGroups gains groupId mode: fetches one group, not full 2.6MB list
- GroupDetailPage passes groupId — fixes 30-40s card open on slow connections
2026-08-19 11:02:23 +02:00
root d5849f0ab2 feat(logistics): highlight and filter orders with SMS problems 2026-08-06 15:12:23 +00:00
root c321353e8f feat(orders): show SMS delivery confirmation and 2nd-SMS skip reason 2026-08-06 13:55:42 +00:00
root fefb8065be perf(dashboard): lazy load order details only when needed; skip fetch on non-order tabs 2026-08-06 13:40:20 +00:00
root 60d6033085 feat(logistics): improve order workflow and aging 2026-08-06 06:52:32 +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 0821bcc747 merge: dev → main — driver table layout, filters, status reset, SMS campaigns, font zones
Merges dev branch into main:
- Driver delivery list: table layout (№, Client, Phone, City, Half-day)
- Driver filters: search, half-day filter, problem sorting
- DriverShipmentPanel: reset status with confirmation
- SmsCampaignPanel: campaigns refactor
- LogisticsReadinessBoard: unified table view
- Font zone classes (fs-zone-card) on all driver components
- SMS campaign scripts updates
2026-07-13 11:24:56 +00:00
root ced5958eac feat: driver filters + status fixes + logistics problem indicator
DriverDeliveryPlanner:
- Text search (name, address, phone, order numbers)
- Half-day filter (morning/afternoon/unknown)
- 'Reset all filters' button
- tel: link on phone in delivery cards
- Order numbers badges in cards
- Partial delivery warning badge
- Problems-first sorting

saveShipmentData fix:
- Partial shipment with problems → status 'problem' (not 'delivered')
- Full shipment → 'delivered' (unchanged)

DriverShipmentPanel:
- Reset button: confirmation dialog when status is final
- Calls onResetStatus to revert delivery status to 'loaded'

OrderDetailPanel (driver status section):
- 'Return to work' button for delivered/problem/picked_up statuses
- Passes onResetStatus + isSavingStatusChange to DriverShipmentPanel

LogisticsReadinessBoard:
- Warning badge for has_delivery_problem groups in table rows
- Shows delivery_problem_note as tooltip
2026-07-10 14:50:15 +00:00
root 1d288279c0 fix: extractCity word boundary + filter persistence in sessionStorage 2026-07-03 14:07:13 +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 45dbbd4cb3 feat: show client page open analytics in OrderDetailPanel
- Add delivery_invitation nested select (opened_at, access_count, last_accessed_at)
- Map to invitationOpenedAt, invitationAccessCount, invitationLastAccessedAt
- Show in 'Ссылка на согласование' panel: 'Клиент открывал страницу X раз, последний раз DD.MM'
- Or 'Клиент ещё не открывал страницу согласования'
- Data only updated by client-facing RPC, not by admin actions
2026-06-23 05:15:58 +00:00
root 693da3236e feat: payment + manager info in detail card, delivery type badge in mobile header
- orderGroupRepository: added manager_name, manager_email, manager_tel, payed_ship, is_payed_ship to SELECT
- OrderDetailPanel: manager name + tel, payment status with amount (✓ Оплачено + ₽), hidden for drivers
- OrdersTable mobile: delivery type badge moved to header row next to status badge
  - 🏪 Самовывоз (accent color) / 🚚 Доставка — immediately visible at top of card
2026-06-18 16:34:22 +00:00
root 7054390dcb feat: add delivery link panel in OrderDetail for non-driver roles
- Map delivery_link DB field to deliveryLink in order group object
- New panel in OrderDetailPanel: 'Ссылка на согласование'
- Two buttons: open approval page (link) + copy link to clipboard
- Visible for all roles except driver
- Shows when order.deliveryLink is present
2026-06-18 15:15:43 +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 37ea7d3a19 fix: убрать генерацию pickup_code — приходит из 1С, показывать только при самовывозе 2026-06-16 07:36:47 +00:00
root 9408b98f06 fix: pickup_code — 6-значное число вместо букв 2026-06-16 06:57:57 +00:00
root 5867272873 feat: pickup_code для самовывоза + упрощение статуса отгрузки
- pickup_code: автогенерация 6-значного кода при выборе самовывоза
- Колонка pickup_code в order_groups + SELECT
- Отображение кода выдачи в карточках (логист, клиент)
- Упрощение: любая отгрузка → delivered (проблемы в has_delivery_problem)
- RPC: добавлены deliveryType, pickupCode, pickupDate, pickupTimeSlot
2026-06-16 06:53:12 +00:00
root 6184f5aeed fix: авто-статус delivered при полной отгрузке (включая с комментарием)
Раньше: все позиции отгружены → delivered, иначе → problem
Теперь: все отгружены ИЛИ все неотгруженные с комментарием → delivered
Только если есть неотгруженные без комментария → problem
2026-06-16 06:33:55 +00:00
root c288251cec feat: автосменя статуса при сохранении отгрузки
- Все позиции отгружены → delivery_status = 'delivered'
- Частичная отгрузка (есть неотгруженные) → delivery_status = 'problem'
- Без сохранения отгрузки — статус не меняется
2026-06-15 18:40:42 +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 41272bdbbf fix: аудит доставки — критические и средние баги
Edge function confirm-delivery-choice:
- currentGroup использовался до объявления — перемещён вверх
- pickup не очищал assigned_driver_id — добавлена очистка
- выборка currentGroup теперь включает delivery_address, customer_address

Edge function update-order-group-delivery-choice:
- добавлена поддержка deliveryType=pickup (ранее всегда ставил 'agreed')
- pickup очищает assigned_driver_id, устанавливает pickup_date/time_slot
- дата доставки не обязательна для pickup

Фронтенд:
- assignDriverToOrderGroup: null → 'agreed' (NOT NULL constraint)
- isDeliveryAgreed включает статус 'pickup'
- orderGroupViews: warning-тон для групп с проблемами отгрузки
- OrdersTable: колонка Отгрузка с визуализацией проблем
2026-06-15 15:38:42 +00:00
root 3847625005 feat: колонка Отгрузка в таблице + подсветка проблем
- Новая колонка 'Отгрузка' в таблице групп доставки (десктоп и мобайл)
- Показывает ✓ N/N для полностью отгруженных, ⚠ X/N для частичной отгрузки
- В мобильных карточках: блок с перечислением проблемных товаров и причин
- Подсветка warning-тоном для групп с неотгруженными позициями
- Восстановление состояния чекбоксов из driverShipmentData
2026-06-15 15:27:50 +00:00
root ae1e0a2e0e fix: 3 бага доставки — самовывоз/водитель/отгрузка
Bug 1: deliveryType='delivery' перезаписывался на 'pickup' маппером из-за адреса/источника. Теперь если БД явно содержит delivery_type='delivery', маппер это уважает.

Bug 2: водитель не мог сохранить частичную отгрузку — добавлена кнопка 'Сохранить отгрузку' в DriverShipmentPanel + saveShipmentData() в репозитории.

Bug 3: при смене типа на самовывоз assigned_driver_id не очищался — добавлено assigned_driver_id: null в updatePayload.
2026-06-15 15:10:30 +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