Files
autocrm/app/Support/Hints.php
T
Vasyka dbac930523 fix(hints): position "?" next to page title, fix Admin pages missing
Switched render hook from PAGE_HEADER_ACTIONS_BEFORE to
PAGE_HEADER_HEADING_AFTER:
- Previous hook lived inside the action buttons container which is
  skipped on pages without header actions (most Admin pages: Settings,
  Integrations, API Tokens, Backup, Activity log).
- Previous hook also pushed the icon to the right side on pages that
  did have actions (Clienți, Mașini, Calendar list), which looked
  disconnected from the title.

New hook renders "?" immediately after the page heading text on every
page, always visible. Also fixed one URL prefix mismatch:
app/pipeline → app/pipeline-board (actual Filament page slug).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-09-01 10:39:37 +00:00

818 lines
71 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Support;
/**
* Centralized registry of in-app hints and the FAQ they generate.
*
* Each hint has:
* key — stable identifier used for dismiss + Blade component reference
* area — grouping bucket ("service", "crm", "depozit", "finante")
* title — short title (all 3 languages)
* body — 1-3 sentence explanation (all 3 languages)
* links — optional related pages (label + url in current locale)
* next — optional "what to do next" label (current locale)
*
* The FAQ page renders every entry grouped by area with a search box.
* The <x-hint> Blade component renders a single entry as a "?" popover.
*
* Add hints incrementally — this file is the single source of truth.
*/
class Hints
{
public const AREAS = [
'service' => ['label' => ['ro' => 'Fișe lucru', 'ru' => 'Заказ-наряды', 'en' => 'Work orders'], 'icon' => '🔧'],
'crm' => ['label' => ['ro' => 'CRM & Clienți', 'ru' => 'CRM и клиенты', 'en' => 'CRM & Customers'], 'icon' => '👥'],
'depozit' => ['label' => ['ro' => 'Depozit & Piese', 'ru' => 'Склад и запчасти', 'en' => 'Warehouse & Parts'], 'icon' => '📦'],
'finante' => ['label' => ['ro' => 'Finanțe', 'ru' => 'Финансы', 'en' => 'Finance'], 'icon' => '💰'],
];
/** @return array<string, array{area:string,title:array,body:array,links?:array,next?:array}> */
public static function all(): array
{
return [
// ─── Service / Work orders ────────────────────────────────
'wo.list.overview' => [
'area' => 'service',
'title' => [
'ro' => 'Lista fișelor de lucru',
'ru' => 'Список заказ-нарядов',
'en' => 'Work orders list',
],
'body' => [
'ro' => 'Aici vezi toate fișele active. Click pe un rând deschide dashboard-ul fișei (Mitchell1-style). Butonul „+ Fișă nouă" creează una nouă și te duce direct pe dashboard. Filtrele de sus permit selectare pe status, plată, maistru.',
'ru' => 'Здесь все активные заказы. Клик по строке открывает дашборд заказа. Кнопка «+ Новый заказ» создаёт и сразу открывает дашборд. Фильтры вверху — статус, оплата, мастер.',
'en' => 'All active work orders. Row click opens the Mitchell1-style dashboard. "+ New" creates and lands on the dashboard. Top filters: status, payment, master.',
],
'links' => [
['label_ro' => 'Deschide un dashboard', 'label_ru' => 'Открыть дашборд', 'label_en' => 'Open a dashboard', 'url' => '/app/work-orders'],
],
'next' => [
'ro' => 'Click pe orice rând sau „+ Fișă nouă"',
'ru' => 'Клик по строке или «+ Новый заказ»',
'en' => 'Click any row or "+ New"',
],
],
'wo.dashboard.overview' => [
'area' => 'service',
'title' => [
'ro' => 'Dashboard fișă (hub central)',
'ru' => 'Дашборд заказа (центр управления)',
'en' => 'Work order dashboard (hub)',
],
'body' => [
'ro' => 'Toate acțiunile legate de această fișă într-un singur ecran: stânga = client & mașină & istoric reparații, mijloc = lucrări/piese/diagnostic/foto/documente/note (taburi), dreapta = finanțe & timeline & chat client. Jos: navigare între fișe, comandă repetată, închide fișă.',
'ru' => 'Все действия по заказу в одном экране: слева — клиент, авто, история; в центре — работы/запчасти/диагностика/фото/документы/заметки (табы); справа — финансы, лента, чат с клиентом. Внизу: навигация, повтор заказа, закрытие.',
'en' => 'Everything for this WO on one screen: left = client + vehicle + repair history; middle = tabs (works/parts/diag/photos/docs/notes); right = finance + timeline + chat. Bottom bar: prev/next, repeat, close WO.',
],
'next' => [
'ro' => 'Explorează taburile din mijloc: Lucrări, Piese, Foto etc.',
'ru' => 'Проверьте табы в центре: Работы, Запчасти, Фото и т.д.',
'en' => 'Try the middle tabs: Works, Parts, Photos, etc.',
],
],
'wo.dashboard.pdf' => [
'area' => 'service',
'title' => [
'ro' => 'Vizualizare & descărcare PDF',
'ru' => 'Просмотр и скачивание PDF',
'en' => 'PDF preview & download',
],
'body' => [
'ro' => 'Butonul „Vizualizare PDF" deschide factura într-un modal cu preview embedded. Din modal poți printa (via viewer-ul browserului) sau descărca (link „Descarcă"). Nu forțează descărcare implicit.',
'ru' => 'Кнопка «Просмотр PDF» открывает счёт в модалке с превью. Оттуда можно печатать (через просмотрщик браузера) или скачать. По умолчанию не скачивается.',
'en' => 'The "View PDF" button opens the invoice in a modal preview. You can print (via the browser PDF viewer) or download from there. It doesn\'t force download by default.',
],
],
'wo.dashboard.tracking' => [
'area' => 'service',
'title' => [
'ro' => 'Link tracking pentru client',
'ru' => 'Ссылка отслеживания для клиента',
'en' => 'Client tracking link',
],
'body' => [
'ro' => 'Fiecare fișă are un token public unic. Butonul „Link tracking" deschide pagina publică pe care o poți trimite clientului prin SMS/WhatsApp/Telegram — vede statusul lucrării, ETA-ul și fotografiile.',
'ru' => 'У каждого заказа есть публичный токен. Кнопка «Ссылка отслеживания» открывает публичную страницу, которую можно отправить клиенту — он видит статус, ETA, фотографии.',
'en' => 'Each WO has a unique public token. "Tracking link" opens the customer-facing page you can send via SMS/WhatsApp/Telegram — status, ETA, photos.',
],
],
'wo.dashboard.topbar_actions' => [
'area' => 'service',
'title' => [
'ro' => 'Butoane rapide (top)',
'ru' => 'Быстрые кнопки (верх)',
'en' => 'Top-bar quick actions',
],
'body' => [
'ro' => '„Listă" — înapoi la toate fișele. „+ Nou" — creează una nouă (după save aterizezi tot pe dashboard). „Editare completă" — deschide formularul detaliat cu toate câmpurile. „Link tracking" — pagina publică pentru client.',
'ru' => '«Список» — все заказы. «+ Новый» — создать (после сохранения снова дашборд). «Полное редактирование» — детальная форма. «Ссылка отслеживания» — публичная страница для клиента.',
'en' => '"Listă" — back to all WOs. "+ Nou" — create a new one. "Editare completă" — full detail form. "Link tracking" — customer-facing public page.',
],
],
'wo.dashboard.meta' => [
'area' => 'service',
'title' => [
'ro' => 'Meta-antet (Data / ETA / Responsabil / Urgență)',
'ru' => 'Мета-шапка (даты / ETA / мастер / срочность)',
'en' => 'Meta header (dates / ETA / master / urgency)',
],
'body' => [
'ro' => 'Rezumat rapid al fișei. „Data creării" = când s-a introdus în sistem; „Deschis" = când s-a început efectiv lucrul; „ETA" = când promitem clientului. „Responsabil" = maistrul principal. „Urgență" influențează sortarea în calendar.',
'ru' => 'Быстрый обзор заказа. «Дата создания» — когда завели, «Открыт» — когда начали работать, «ETA» — обещанное клиенту время, «Ответственный» — главный мастер, «Срочность» влияет на сортировку.',
'en' => 'Quick snapshot: "Data creării" = when created; "Deschis" = actual work start; "ETA" = promised to client; "Responsabil" = primary master; "Urgență" affects calendar sort.',
],
],
'wo.dashboard.tabs' => [
'area' => 'service',
'title' => [
'ro' => 'Taburi (Lucrări/Piese/Diag/Foto/Doc/Note)',
'ru' => 'Табы (Работы/Запчасти/Диаг./Фото/Док./Заметки)',
'en' => 'Tabs (Works/Parts/Diag/Photos/Docs/Notes)',
],
'body' => [
'ro' => '„Lucrări" = manoperele efectuate. „Piese" = piesele consumate. „Diagnostic" = plângere client + concluzia mecanicului. „Foto" = poze de la lucrare. „Documente" = factura PDF + acte semnate. „Note" = observații interne, nu se văd de client.',
'ru' => '«Работы» — выполненные работы. «Запчасти» — использованные. «Диагностика» — жалоба клиента + заключение мастера. «Фото» — фотки. «Документы» — счёт + подписанные акты. «Заметки» — внутренние, клиент не видит.',
'en' => '"Works" = labor. "Parts" = consumed. "Diagnostic" = client complaint + master\'s conclusion. "Photos" = shoot from the job. "Docs" = invoice + signed papers. "Notes" = internal, not visible to client.',
],
],
'wo.dashboard.history' => [
'area' => 'service',
'title' => [
'ro' => 'Istoric reparații (mașină)',
'ru' => 'История ремонтов (авто)',
'en' => 'Repair history (vehicle)',
],
'body' => [
'ro' => 'Ultimele 5 fișe pentru această mașină. Click deschide dashboard-ul acelei fișe. Util să vezi ce s-a mai făcut înainte — evită sugestia dublă de lucrări.',
'ru' => 'Последние 5 заказов по этому авто. Клик — открыть тот заказ. Полезно проверить, что уже делали, чтобы не предлагать повторно.',
'en' => 'Last 5 WOs for this vehicle. Click opens that WO\'s dashboard. Handy to see prior work and avoid recommending duplicates.',
],
],
'wo.dashboard.finance' => [
'area' => 'service',
'title' => [
'ro' => 'Panou Finanțe (dreapta)',
'ru' => 'Панель финансов (справа)',
'en' => 'Finance panel (right)',
],
'body' => [
'ro' => 'Cost manopere + Cost piese = Subtotal. Discount = Total. Plătit = suma încasată deja (din plăți). Sold = ce mai rămâne de plătit. Totul se recalculează automat când adaugi ceva.',
'ru' => 'Стоимость работ + Стоимость запчастей = Промежуточный. − Скидка = Итого. «Оплачено» — уже внесено. «Остаток» — сколько ещё должен. Всё пересчитывается автоматом.',
'en' => 'Labor + Parts = Subtotal. Discount = Total. "Paid" = collected so far. "Balance" = still owed. Recomputes automatically.',
],
],
'wo.dashboard.timeline' => [
'area' => 'service',
'title' => [
'ro' => 'Timeline evenimente',
'ru' => 'Лента событий',
'en' => 'Event timeline',
],
'body' => [
'ro' => 'Cronologie automată: creare, deschidere, aprobare client, plăți primite, închidere, notificări trimise. Se agregă din câmpurile fișei + jurnalul de activitate. Util pentru audit.',
'ru' => 'Автохронология: создание, открытие, подтверждение клиента, оплаты, закрытие, отправки уведомлений. Собирается из полей + журнала. Полезно для аудита.',
'en' => 'Auto chronology: created, opened, approved, payments, closed, notifications sent. Aggregated from WO fields + activity log. Great for audit.',
],
],
'wo.dashboard.bottom' => [
'area' => 'service',
'title' => [
'ro' => 'Bara de jos (Prev/Next/Repetă/Închide)',
'ru' => 'Нижняя панель (Пред./След./Повтор/Закрыть)',
'en' => 'Bottom bar (Prev/Next/Repeat/Close)',
],
'body' => [
'ro' => 'Navighează rapid între fișe cu ← Precedent / Următor →. „Comandă repetată" creează o fișă nouă pre-populată cu același client + mașină. „Închide fișă" o marchează ca finalizată (status → done).',
'ru' => 'Быстрое переключение ← Пред. / След. →. «Повторный заказ» создаёт новый с теми же клиентом+авто. «Закрыть заказ» помечает как выполненный.',
'en' => 'Quick nav ← Prev / Next →. "Repeat order" creates a new WO pre-filled with same client + vehicle. "Close WO" marks it done.',
],
],
'wo.create.overview' => [
'area' => 'service',
'title' => [
'ro' => 'Fișă nouă — pași minimali',
'ru' => 'Новый заказ — минимальные шаги',
'en' => 'New WO — minimum steps',
],
'body' => [
'ro' => 'Obligatoriu: Client, Mașină, Data deschiderii. Numărul se generează automat (WO-{tenant}-{an}-{seq}). Poți adăuga direct un client nou / mașină nouă din meniul dropdown al câmpului. După save aterizezi pe dashboard.',
'ru' => 'Обязательно: клиент, авто, дата открытия. Номер — авто. Клиента/авто можно добавить прямо из выпадашки. После сохранения — дашборд.',
'en' => 'Required: Client, Vehicle, Opened at. Number is auto-generated. You can add a client/vehicle inline from the dropdown. After save you land on the dashboard.',
],
],
'crm.clients.overview' => [
'area' => 'crm',
'title' => [
'ro' => 'Clienți — baza de date',
'ru' => 'Клиенты — база',
'en' => 'Clients database',
],
'body' => [
'ro' => 'Fiecare client are: nume, telefon, email, adresă, sursă (de unde ne-a găsit), notițe. Poți lega un cont Telegram — atunci mesajele merg automat pe Telegram. „Datorii" arată totalul restant din toate fișele deschise.',
'ru' => 'У клиента: имя, телефон, email, адрес, источник, заметки. Можно привязать Telegram — тогда сообщения уходят в него. «Долг» — сумма непогашенных заказов.',
'en' => 'Each client: name, phone, email, address, source, notes. You can link a Telegram account so messages route there. "Debt" totals unpaid WOs.',
],
],
'crm.vehicles.overview' => [
'area' => 'crm',
'title' => [
'ro' => 'Automobile — istoricul mașinilor',
'ru' => 'Автомобили — история',
'en' => 'Vehicles — history',
],
'body' => [
'ro' => 'Fiecare mașină aparține unui client și are: marca, model, an, VIN, plăcuță, motor, kilometraj. „Decode VIN" (buton pe tabelul mașinilor) folosește AI pentru a completa datele tehnice din VIN. Poți încărca poze pe mașină — prima apare pe dashboard fișă.',
'ru' => 'У авто: марка, модель, год, VIN, номер, двигатель, пробег. «Decode VIN» — AI-заполнение по VIN. Фото на авто — первое показывается на дашборде заказа.',
'en' => 'Each vehicle belongs to a client: make, model, year, VIN, plate, engine, mileage. "Decode VIN" (table action) uses AI to fill technical fields. Vehicle photos — first one shows on the WO dashboard.',
],
],
'finante.dashboard.stats' => [
'area' => 'finante',
'title' => [
'ro' => 'Widget-uri dashboard (numere)',
'ru' => 'Виджеты дашборда (числа)',
'en' => 'Dashboard widgets (numbers)',
],
'body' => [
'ro' => 'Fiecare card e clicabil și duce la pagina relevantă cu filtrele setate. Ex: „Fișe în lucru" → lista filtrată pe status=in_work. „Datorii clienți" → fișe cu pay_status=unpaid. Cardurile se recalculează automat la fiecare vizită.',
'ru' => 'Каждая карточка кликабельна и ведёт на страницу с настроенным фильтром. «Заказы в работе» → список по статусу in_work. «Долги» → неоплаченные. Пересчёт при каждом заходе.',
'en' => 'Each stat card is clickable and jumps to the relevant page with filters applied. E.g. "Fișe în lucru" → list filtered by status=in_work. Recomputed on every visit.',
],
],
'service.mechanic_board.overview' => [
'area' => 'service', 'title' => ['ro' => 'Atelierul meu', 'ru' => 'Мой цех', 'en' => 'My workshop'],
'body' => [
'ro' => 'Vedere mobile-first pentru mecanic: doar fișele lui active (grupate pe status), butoane mari, actualizare status/kilometraj/foto direct din listă, fără să treci prin edit. Ideal pe tabletă în hala service.',
'ru' => 'Мобильный интерфейс для механика: только его активные заказы (по статусу), крупные кнопки, обновление статуса/пробега/фото прямо из списка. Удобно на планшете в цехе.',
'en' => 'Mobile-first view for a mechanic: only their active WOs (grouped by status), big buttons, update status/mileage/photos inline without opening edit. Made for tablets on the shop floor.',
],
],
'service.kpi.overview' => [
'area' => 'service', 'title' => ['ro' => 'KPI mecanici', 'ru' => 'KPI механиков', 'en' => 'Mechanic KPIs'],
'body' => [
'ro' => 'Pentru fiecare mecanic, pentru perioada aleasă: nr. fișe închise, ore norm-facturate vs. ore reale, venit generat, marja internă. Culorile roșu/verde arată abaterea de la ținta lunară.',
'ru' => 'По каждому механику за период: закрытые заказы, нормо-часы vs. фактические, выручка, внутренняя маржа. Красный/зелёный — отклонение от плана.',
'en' => 'Per mechanic for the chosen period: closed WOs, billed vs. actual hours, revenue generated, internal margin. Red/green shows deviation from monthly target.',
],
],
'service.labors.overview' => [
'area' => 'service', 'title' => ['ro' => 'Norme-ore (catalog manopere)', 'ru' => 'Нормо-часы (каталог работ)', 'en' => 'Labor norms (catalog)'],
'body' => [
'ro' => 'Catalog cu toate manoperele standard: denumire (RO/RU/EN), timp normat, preț recomandat, categoria. Aici se definesc șabloanele. La adăugarea unei manopere într-o fișă, sistemul completează automat timpul și prețul.',
'ru' => 'Каталог стандартных работ: название (RO/RU/EN), норматив времени, рекомендованная цена, категория. При добавлении в заказ время и цена подставляются автоматом.',
'en' => 'Standard labor catalog: name (RO/RU/EN), normed time, suggested price, category. Adding a labor to a WO auto-fills time + price.',
],
],
'service.masters.overview' => [
'area' => 'service', 'title' => ['ro' => 'Tehnicieni (maiștri)', 'ru' => 'Мастера', 'en' => 'Technicians'],
'body' => [
'ro' => 'Aici gestionezi lista de maiștri: nume, culoare (pentru calendar), tarif orar, marja internă, specializare. Sunt utilizatori cu rol „master" — pot vedea doar fișele proprii în „Atelierul meu".',
'ru' => 'Список мастеров: имя, цвет (для календаря), почасовая ставка, маржа, специализация. Это пользователи с ролью «master» — видят только свои заказы в «Мой цех».',
'en' => 'Manage master mechanics: name, calendar color, hourly rate, internal margin, specialty. These are users with role "master" — they only see their own WOs in "My workshop".',
],
],
'service.templates.overview' => [
'area' => 'service', 'title' => ['ro' => 'Șabloane servicii', 'ru' => 'Шаблоны услуг', 'en' => 'Service templates'],
'body' => [
'ro' => 'Pachete predefinite (ex: „Schimb ulei + filtru", „Diagnoză computerizată"). Din edit fișă → „Aplică șablon" adaugi toate manoperele + piesele deodată. Reduce dublă introducere pentru servicii recurente.',
'ru' => 'Готовые пакеты («Замена масла + фильтр», «Компьютерная диагностика»). В заказе — «Применить шаблон» добавляет все работы + запчасти сразу. Уменьшает ручной ввод.',
'en' => 'Predefined bundles ("Oil + filter change", "OBD diagnostic"). From WO edit → "Apply template" adds all labor + parts at once. Cuts repetitive data entry.',
],
],
'service.injector.overview' => [
'area' => 'service', 'title' => ['ro' => 'Protocoale forsunki', 'ru' => 'Протоколы форсунок', 'en' => 'Injector protocols'],
'body' => [
'ro' => 'Formular specializat pentru diagnostic injectoare (debit/pulverizare/retur pentru fiecare injector). Numărul se generează auto: {PREFIX}-{AN}-{SEQ}. Export PDF cu semnătură pentru client.',
'ru' => 'Специализированная форма для диагностики форсунок (расход/распыл/возврат по каждой). Номер: {PREFIX}-{ГОД}-{SEQ}. PDF с подписью для клиента.',
'en' => 'Specialized form for injector diagnostics (flow/spray/return per injector). Number auto-generated: {PREFIX}-{YEAR}-{SEQ}. Signed PDF for the customer.',
],
],
'service.bodyshop.overview' => [
'area' => 'service', 'title' => ['ro' => 'Tinichigerie / Detailing', 'ru' => 'Кузовной / Детейлинг', 'en' => 'Bodyshop / Detailing'],
'body' => [
'ro' => 'Lucrări separate de service mecanic: reparații caroserie, vopsit, polish, detailing. Deviz + foto înainte/după + status separat. Se leagă opțional de o fișă principală.',
'ru' => 'Отдельно от механики: кузов, покраска, полировка, детейлинг. Смета + фото до/после + свой статус. Опционально привязка к главному заказу.',
'en' => 'Separate from mechanical service: body repairs, paint, polish, detailing. Quote + before/after photos + own status. Optionally links to a parent WO.',
],
],
'service.tires.overview' => [
'area' => 'service', 'title' => ['ro' => 'Seturi anvelope', 'ru' => 'Комплекты шин', 'en' => 'Tire sets'],
'body' => [
'ro' => 'Depozitare sezonieră: set anvelope (4 buc) legat de mașină, dimensiuni, DOT, adâncime protector, locație în depozit. Notificare automată la schimb sezonier pentru clienți.',
'ru' => 'Сезонное хранение: комплект (4 шт.) на авто, размеры, DOT, глубина протектора, место на складе. Автонапоминания клиентам о сезонной замене.',
'en' => 'Seasonal storage: 4-tire set per vehicle, sizes, DOT code, tread depth, warehouse slot. Auto reminders to clients when the seasonal swap is due.',
],
],
'service.subcontract.overview' => [
'area' => 'service', 'title' => ['ro' => 'Lucrări terți (subcontract)', 'ru' => 'Работы у подрядчика', 'en' => 'Subcontract jobs'],
'body' => [
'ro' => 'Când o lucrare pleacă la un partener extern (ex: rectificare bloc). Se leagă de o fișă activă, se înregistrează costul plătit terțului + prețul cerut clientului. Diferența = marja pe subcontract.',
'ru' => 'Работа уходит к внешнему партнёру (напр. шлифовка блока). Привязка к заказу, стоимость подрядчика + цена клиенту. Разница = маржа.',
'en' => 'When work goes out to an external partner (e.g. head resurfacing). Ties to an active WO — logs cost paid to subcontractor + price charged to client. Delta = subcontract margin.',
],
],
'service.subcontractors.overview' => [
'area' => 'service', 'title' => ['ro' => 'Subcontractori (parteneri)', 'ru' => 'Подрядчики', 'en' => 'Subcontractors'],
'body' => [
'ro' => 'Lista partenerilor externi: nume, telefon, specializare (rectificări, geometrie roți, tapițerie). Se atașează la Lucrări terți pentru istoric complet + statistici pe partener.',
'ru' => 'Список внешних партнёров: имя, телефон, специализация. Подставляются в «Работы у подрядчика» для истории + статистики.',
'en' => 'External partner list: name, phone, specialty (machining, wheel alignment, upholstery). Referenced from Subcontract jobs for history + per-partner stats.',
],
],
// CRM extras
'crm.calls.overview' => [
'area' => 'crm', 'title' => ['ro' => 'Apeluri client', 'ru' => 'Звонки клиентам', 'en' => 'Customer calls'],
'body' => [
'ro' => 'Jurnal manual + integrare SIP (dacă e configurată): apel intrat/ieșit, durată, notițe, legarea de un client sau lead. Util pentru follow-up și evaluarea echipei.',
'ru' => 'Ручной журнал + интеграция SIP (если настроена): входящие/исходящие, длительность, заметки, привязка к клиенту/лиду. Для follow-up и оценки команды.',
'en' => 'Manual log + SIP integration (if configured): inbound/outbound, duration, notes, tied to a client or lead. Useful for follow-up and team review.',
],
],
// Depozit extras
'depozit.purchases.overview' => [
'area' => 'depozit', 'title' => ['ro' => 'Achiziții de la furnizor', 'ru' => 'Закупки у поставщика', 'en' => 'Supplier purchases'],
'body' => [
'ro' => 'Documentul de intrare (aviz + factură) al pieselor: furnizor, dată, poziții (piesă + cant + preț cost). La salvare, stocul crește automat și prețul de cost al piesei se actualizează.',
'ru' => 'Приходный документ (накладная + счёт): поставщик, дата, позиции (запчасть + кол + цена). При сохранении остаток растёт, себестоимость обновляется.',
'en' => 'Goods receipt document (waybill + invoice): supplier, date, lines (part + qty + cost). Saving increases stock and updates part cost.',
],
],
'depozit.suppliers.overview' => [
'area' => 'depozit', 'title' => ['ro' => 'Furnizori', 'ru' => 'Поставщики', 'en' => 'Suppliers'],
'body' => [
'ro' => 'Fișa furnizorului: nume, cod fiscal, contact, condiții plată. Fiecare Achiziție se leagă aici. Maparea coloanelor de la Import Excel se salvează per furnizor pentru viitor.',
'ru' => 'Карточка поставщика: имя, реквизиты, контакт, условия оплаты. Каждая закупка привязывается сюда. Соответствие колонок Excel-импорта запоминается по поставщику.',
'en' => 'Supplier card: name, tax ID, contact, payment terms. Every purchase links here. Excel import column mapping is remembered per supplier for next time.',
],
],
'depozit.warehouses.overview' => [
'area' => 'depozit', 'title' => ['ro' => 'Depozite (locații)', 'ru' => 'Склады (локации)', 'en' => 'Warehouses (locations)'],
'body' => [
'ro' => 'Dacă ai mai multe locații de stocare (ex: „Central", „Punct de lucru 2", „Vitrina"), le definești aici. Fiecare piesă are stoc separat pe depozit. Achizițiile pot merge într-un depozit specific.',
'ru' => 'Если несколько мест хранения (напр. «Центральный», «Точка 2», «Витрина») — задай их здесь. Остатки ведутся раздельно. Закупки могут идти в конкретный склад.',
'en' => 'If you have multiple storage locations (e.g. "Central", "Site 2", "Showroom"), define them here. Each part has per-warehouse stock. Purchases can target a specific warehouse.',
],
],
'depozit.pricing.overview' => [
'area' => 'depozit', 'title' => ['ro' => 'Coeficienți de preț', 'ru' => 'Ценовые коэффициенты', 'en' => 'Pricing coefficients'],
'body' => [
'ro' => 'Reguli automate: preț manoperă × coeficient pe clasa mașinii (economy/premium/luxury) × coeficient urgență (normal/urgent). Definite o dată — se aplică automat pe toate fișele noi.',
'ru' => 'Автоправила: цена работ × коэфф. класса авто × коэфф. срочности. Настроил один раз — применяется на всех новых заказах.',
'en' => 'Auto rules: labor price × vehicle-class coeff × urgency coeff. Set once — applies to all new WOs automatically.',
],
],
'depozit.markup.overview' => [
'area' => 'depozit', 'title' => ['ro' => 'Reguli procentaj (markup)', 'ru' => 'Правила наценки', 'en' => 'Markup rules'],
'body' => [
'ro' => 'Cât adaugi la costul piesei pentru preț client, în funcție de: categoria piesei, prețul cost (praguri), furnizor. Ex: „Piese sub 100 MDL → +40%, peste → +25%". Se aplică automat la achiziții.',
'ru' => 'Наценка от закупки к цене клиента по: категории, ценовому диапазону, поставщику. Пример: «до 100 MDL → +40%, свыше → +25%». Применяется автоматом на закупках.',
'en' => 'Cost-to-client markup by: part category, cost thresholds, supplier. E.g. "Under 100 MDL → +40%, above → +25%". Applied automatically on purchases.',
],
],
'depozit.units.overview' => [
'area' => 'depozit', 'title' => ['ro' => 'Unități de măsură', 'ru' => 'Единицы измерения', 'en' => 'Units of measure'],
'body' => [
'ro' => 'Buc / L / kg / m / set etc., cu denumire în 3 limbi. Se folosesc pe piese și pe achiziții pentru claritate în facturi și avize.',
'ru' => 'Шт. / Л / кг / м / компл. — с названием на 3-х языках. Используются в запчастях и закупках для ясности в документах.',
'en' => 'Pcs / L / kg / m / set — with names in 3 languages. Used on parts and purchases for clarity on invoices.',
],
],
'depozit.vin_search.overview' => [
'area' => 'depozit', 'title' => ['ro' => 'VIN-căutare (piese OEM)', 'ru' => 'VIN-поиск (OEM)', 'en' => 'VIN part search'],
'body' => [
'ro' => 'Introdu VIN-ul mașinii → AI-ul decodează marca/modelul/anul și sugerează codurile OEM ale pieselor necesare pentru operația căutată (ex: „plăcuțe frână față"). Copiază codul, verifică la furnizori.',
'ru' => 'Введи VIN → AI декодирует марку/модель/год и подскажет OEM-коды нужных запчастей (напр. «передние тормозные колодки»). Копируй код и проверяй у поставщиков.',
'en' => 'Enter a VIN → AI decodes make/model/year and suggests OEM codes for the requested operation (e.g. "front brake pads"). Copy the code and check with suppliers.',
],
],
// Finanțe extras
'finante.adjustments.overview' => [
'area' => 'finante', 'title' => ['ro' => 'Bonusuri & avansuri', 'ru' => 'Бонусы и авансы', 'en' => 'Bonuses & advances'],
'body' => [
'ro' => 'Ajustări manuale la salariul unui angajat: bonus (adaugă) sau avans (scade la salariu). Cu dată, sumă, motiv. Se aplică automat la următorul „Închide perioadă" din Salarii.',
'ru' => 'Ручные корректировки: бонус (плюс) или аванс (минус). Дата, сумма, причина. Применяются на ближайшем «Закрыть период» в Зарплатах.',
'en' => 'Manual salary adjustments: bonus (adds) or advance (deducts). Date, amount, reason. Auto-applied on the next Salaries "Close period".',
],
],
'finante.employees.overview' => [
'area' => 'finante', 'title' => ['ro' => 'Angajați (profile financiare)', 'ru' => 'Сотрудники (финансовые профили)', 'en' => 'Employees (finance profiles)'],
'body' => [
'ro' => 'Fiecare angajat are: tarif orar de bază, marja internă (%), tip contract (procent din manoperă sau salariu fix), CNP/CIF pentru facturi. Datele astea alimentează calculul automat din Salarii.',
'ru' => 'У каждого сотрудника: базовая ставка, внутренняя маржа, тип договора (% с работы или оклад), налоговый номер. Эти данные питают авторасчёт зарплат.',
'en' => 'Each employee: base hourly rate, internal margin, contract type (% of labor or fixed salary), tax ID. These feed the Salaries auto-calculation.',
],
],
'finante.consolidated.overview' => [
'area' => 'finante', 'title' => ['ro' => 'Finanțe consolidat', 'ru' => 'Финансы (сводно)', 'en' => 'Finance (consolidated)'],
'body' => [
'ro' => 'Vedere pe o singură pagină: încasări zi/săptămână/lună, cheltuieli, salariu de plătit, profit net. Comparație cu perioada anterioară. Ideal la începutul zilei sau pentru manager la sfârșit de lună.',
'ru' => 'Одна страница: приход день/неделя/месяц, расход, к выплате, чистая прибыль. Сравнение с прошлым периодом. Для утреннего обзора или отчёта месяца.',
'en' => 'Single page overview: income day/week/month, expenses, salaries due, net profit. Compared to prior period. Great for a morning check or end-of-month review.',
],
],
// Magazin
'shop.orders.overview' => [
'area' => 'crm', 'title' => ['ro' => 'Comenzi online (magazin)', 'ru' => 'Онлайн-заказы (магазин)', 'en' => 'Online orders (shop)'],
'body' => [
'ro' => 'Comenzi primite din magazin-ul public (subdomeniu tenant). Poți accepta/refuza, marca livrat, genera factură. Stocul scade automat la livrare.',
'ru' => 'Заказы из публичного магазина (тенант-поддомен). Принять/отклонить, отметить доставку, счёт. Остаток списывается при доставке.',
'en' => 'Orders from the public shop (tenant subdomain). Accept/refuse, mark delivered, generate invoice. Stock decrements on delivery.',
],
],
'shop.customers.overview' => [
'area' => 'crm', 'title' => ['ro' => 'Clienți magazin', 'ru' => 'Клиенты магазина', 'en' => 'Shop customers'],
'body' => [
'ro' => 'Clienți care s-au înregistrat pe magazin-ul online (separați de baza CRM service). Poți converti într-un client CRM cu 1 click atunci când vine în service.',
'ru' => 'Клиенты онлайн-магазина (отдельно от CRM-базы). При приезде в сервис — 1 клик → CRM-клиент.',
'en' => 'Customers registered in the online shop (separate from service CRM base). One click converts to a CRM client when they show up at the service.',
],
],
// Marketing
'marketing.channels.overview' => [
'area' => 'crm', 'title' => ['ro' => 'Canale marketing', 'ru' => 'Маркетинговые каналы', 'en' => 'Marketing channels'],
'body' => [
'ro' => 'Sursele de leaduri: Google Ads, Facebook, recomandare, walk-in, telefon direct. Fiecare cerere se atribuie unui canal → vezi în Rapoarte care canal aduce cel mai bun ROI.',
'ru' => 'Источники лидов: Google Ads, Facebook, рекомендация, walk-in, звонок. Каждая заявка привязывается к каналу → в Отчётах видишь ROI по каналу.',
'en' => 'Lead sources: Google Ads, Facebook, referral, walk-in, direct call. Each lead ties to a channel → Reports show which channel has best ROI.',
],
],
'marketing.templates.overview' => [
'area' => 'crm', 'title' => ['ro' => 'Template-uri mesaje', 'ru' => 'Шаблоны сообщений', 'en' => 'Message templates'],
'body' => [
'ro' => 'Mesaje pre-scrise pentru trimitere rapidă către client: „Fișa e gata", „Confirmare programare", „Ofertă piesă". Suportă variabile ({client.name}, {wo.number}, {eta}). Se folosesc din Chat client sau notificări automate.',
'ru' => 'Готовые сообщения: «Заказ готов», «Подтверждение записи», «Оферта на запчасть». Поддерживают переменные ({client.name}, {wo.number}, {eta}).',
'en' => 'Pre-written messages: "WO ready", "Booking confirmed", "Part quote". Support variables ({client.name}, {wo.number}, {eta}).',
],
],
// Analiză
'analytics.recommendations.overview' => [
'area' => 'finante', 'title' => ['ro' => 'Recomandări automate', 'ru' => 'Автоматические рекомендации', 'en' => 'Auto recommendations'],
'body' => [
'ro' => 'Sistemul analizează activitatea și îți spune: „Piese cu stoc mort de X luni", „Manopere neprofitabile", „Clienți inactivi > 6 luni". Fiecare are un buton de acțiune (ex: „Trimite ofertă").',
'ru' => 'Система анализирует и подсказывает: «Мёртвый сток X месяцев», «Убыточные работы», «Клиенты 6+ мес. без визитов». Кнопка действия рядом (напр. «Отправить оффер»).',
'en' => 'The system analyzes activity and suggests: "Dead stock X months", "Unprofitable labor", "Clients inactive 6+ months". Each has an action button (e.g. "Send offer").',
],
],
'analytics.ai.overview' => [
'area' => 'finante', 'title' => ['ro' => 'Asistent AI', 'ru' => 'AI-ассистент', 'en' => 'AI assistant'],
'body' => [
'ro' => 'Întreabă în limbaj natural: „Cât am câștigat luna trecută?", „Care e piesa cea mai vândută la BMW-uri?", „Ce mecanic e cel mai productiv?". AI-ul răspunde din datele tale, cu link-uri către raportul relevant.',
'ru' => 'Спрашивай на естественном языке: «Сколько заработал в прошлом месяце?», «Какая запчасть чаще продаётся на BMW?», «Кто самый продуктивный механик?». AI отвечает по твоим данным + ссылки на отчёты.',
'en' => 'Ask in plain language: "How much did I earn last month?", "Best-selling part for BMWs?", "Most productive mechanic?". AI answers from your data with links to relevant reports.',
],
],
'analytics.workload.overview' => [
'area' => 'finante', 'title' => ['ro' => 'Încărcare STO', 'ru' => 'Загрузка СТО', 'en' => 'Workshop load'],
'body' => [
'ro' => 'Grafic pe post × zi cu ore rezervate + capacitate. Roșu = supra-încărcat, verde = liber. Ideal pentru planificarea programărilor și evitarea aglomerării unui maistru.',
'ru' => 'График по посту × день: занятые часы + мощность. Красный — перегруз, зелёный — свободно. Помогает планировать записи.',
'en' => 'Chart per post × day: booked hours + capacity. Red = overloaded, green = free. Helps schedule bookings without overloading a master.',
],
],
// Admin
'admin.users.overview' => [
'area' => 'crm', 'title' => ['ro' => 'Utilizatori (echipa)', 'ru' => 'Пользователи (команда)', 'en' => 'Users (team)'],
'body' => [
'ro' => 'Invită oameni pe email — primesc link de acceptare + parolă temporară. Alocare rol (owner/admin/master/accountant/receptionist) → rolul definește ce văd și ce pot modifica. Dezactivarea unui user îl blochează fără să șterge datele.',
'ru' => 'Приглашай по email — пользователь получает ссылку + временный пароль. Роль (owner/admin/master/accountant/receptionist) — определяет права. Деактивация блокирует без удаления данных.',
'en' => 'Invite people via email — they get an accept link + temp password. Role (owner/admin/master/accountant/receptionist) sets what they can see + change. Deactivating blocks access without deleting data.',
],
],
'admin.roles.overview' => [
'area' => 'crm', 'title' => ['ro' => 'Roluri & drepturi', 'ru' => 'Роли и права', 'en' => 'Roles & permissions'],
'body' => [
'ro' => 'Fiecare rol are un set de permisiuni granulare (poate vedea marja internă? poate șterge fișe? poate exporta rapoarte?). Owner-ul are toate. Poți crea roluri custom pentru cazuri speciale.',
'ru' => 'У каждой роли — набор гранулярных прав (видит внутреннюю маржу? может удалять? экспортировать?). У Owner — все. Можно создать кастомные роли.',
'en' => 'Each role has granular permissions (can see internal margin? can delete WOs? can export reports?). Owner has all. You can create custom roles for edge cases.',
],
],
'admin.posts.overview' => [
'area' => 'service', 'title' => ['ro' => 'Posturi de lucru', 'ru' => 'Посты (рабочие места)', 'en' => 'Work posts'],
'body' => [
'ro' => 'Locurile fizice unde se face lucrarea: „Elevator 1", „Elevator 2", „Zona geometrie", „Vopsitorie". Fiecare post are un maistru default (opțional). Se folosesc în Calendar pentru gruparea programărilor.',
'ru' => 'Физические места работ: «Подъёмник 1», «Развал-схождение», «Покраска». У поста может быть мастер по умолчанию. Используются в Календаре для группировки.',
'en' => 'Physical work bays: "Lift 1", "Alignment", "Paint booth". Each post can have a default master. Used in Calendar to group appointments.',
],
],
'admin.settings.overview' => [
'area' => 'service', 'title' => ['ro' => 'Setări service', 'ru' => 'Настройки сервиса', 'en' => 'Service settings'],
'body' => [
'ro' => 'Config-ul general al service-ului: nume, logo, culoare temă, program de lucru, adresă, telefon public, moneda, contul bancar pentru facturi. Modificările sunt vizibile imediat pentru toți userii.',
'ru' => 'Общий конфиг сервиса: имя, лого, цвет темы, график, адрес, телефон, валюта, банк для счетов. Изменения видны всем сразу.',
'en' => 'Service-wide config: name, logo, theme color, working hours, address, public phone, currency, bank account for invoices. Changes are visible to everyone immediately.',
],
],
'admin.integrations.overview' => [
'area' => 'service', 'title' => ['ro' => 'Integrări (Telegram/WhatsApp/Google/Facebook)', 'ru' => 'Интеграции', 'en' => 'Integrations'],
'body' => [
'ro' => 'Activează canale: Telegram bot (token de la @BotFather), WhatsApp Business (token Facebook), Google Ads, Facebook Lead Ads. După activare, mesajele/lead-urile intră automat în CRM.',
'ru' => 'Активируй каналы: Telegram-бот (токен от @BotFather), WhatsApp Business (Facebook), Google Ads, Facebook Lead Ads. После активации всё уходит в CRM автоматом.',
'en' => 'Enable channels: Telegram bot (token from @BotFather), WhatsApp Business (Facebook), Google Ads, Facebook Lead Ads. Once enabled, messages/leads flow into CRM automatically.',
],
],
'admin.tokens.overview' => [
'area' => 'service', 'title' => ['ro' => 'API Tokens', 'ru' => 'API-токены', 'en' => 'API tokens'],
'body' => [
'ro' => 'Token-uri pentru integrări externe (aplicații mobile, script-uri, terți). Fiecare token are un nume + drepturi. Tokenul se afișează O SINGURĂ DATĂ la creare — copiază-l imediat.',
'ru' => 'Токены для внешних интеграций (мобильные приложения, скрипты). У каждого — имя + права. Токен показывается ОДИН РАЗ при создании — копируй сразу.',
'en' => 'Tokens for external integrations (mobile apps, scripts, 3rd parties). Each has a name + permissions. The token is shown ONCE at creation — copy it right away.',
],
],
'admin.backup.overview' => [
'area' => 'service', 'title' => ['ro' => 'Backup date', 'ru' => 'Резервные копии', 'en' => 'Data backup'],
'body' => [
'ro' => 'Descarcă un snapshot complet al datelor tenantului (DB + fișiere media) sub formă de arhivă. Recomandat: o dată pe lună. Se poate importa înapoi manual (contactează suport).',
'ru' => 'Скачивай снапшот всех данных (БД + медиа) архивом. Рекомендуется раз в месяц. Восстановление — через поддержку.',
'en' => 'Download a full snapshot of your tenant data (DB + media files) as an archive. Recommended monthly. Restore is manual via support.',
],
],
'admin.activity.overview' => [
'area' => 'service', 'title' => ['ro' => 'Jurnal activitate', 'ru' => 'Журнал активности', 'en' => 'Activity log'],
'body' => [
'ro' => 'Audit-log complet: cine, ce, când. Utile pentru investigație (ex: „cine a șters fișa X?"). Filtrează pe user, pe entitate, pe interval. Se păstrează 12 luni.',
'ru' => 'Полный аудит: кто, что, когда. Полезно для расследований («кто удалил заказ X?»). Фильтры: пользователь, сущность, период. Хранится 12 месяцев.',
'en' => 'Full audit log: who, what, when. Great for investigating ("who deleted WO X?"). Filter by user, entity, period. Retained 12 months.',
],
],
'finante.expenses.overview' => [
'area' => 'finante',
'title' => [
'ro' => 'Cheltuieli — flux de bani ieșit',
'ru' => 'Расходы — исходящий поток',
'en' => 'Expenses — money out',
],
'body' => [
'ro' => 'Categorie (chirie/utilități/piese/salarii/altele), sumă, dată, poza chitanței. Cheltuielile aici scad din profit (Dashboard → „Profit (luna)"). Distinct de „Achiziții" (piese pentru stoc care se recuperează la vânzare).',
'ru' => 'Категория (аренда/коммунальные/запчасти/зарплата/др.), сумма, дата, фото чека. Уменьшают прибыль. Отличается от «Закупки» (запчасти в склад).',
'en' => 'Category (rent/utilities/parts/salary/other), amount, date, receipt photo. Deducts from profit. Distinct from "Achiziții" (parts stocked to warehouse).',
],
],
'wo.dashboard.chat' => [
'area' => 'service',
'title' => [
'ro' => 'Chat cu clientul (Telegram/WhatsApp)',
'ru' => 'Чат с клиентом (Telegram/WhatsApp)',
'en' => 'Client chat (Telegram/WhatsApp)',
],
'body' => [
'ro' => 'Trimite mesaje direct din dashboard dacă ai configurat integrarea Telegram sau WhatsApp în Setări → Integrări. Dacă vezi „Mesageria nu este configurată" — mergi la Integrări și completează token-ul.',
'ru' => 'Отправляйте сообщения из дашборда, если настроен Telegram или WhatsApp в Настройки → Интеграции. Если написано «Мессенджер не настроен» — заполните токен.',
'en' => 'Send messages from the dashboard when Telegram/WhatsApp is configured under Settings → Integrations. If it says "Messaging not configured" — go set the token.',
],
'links' => [
['label_ro' => 'Setări integrări', 'label_ru' => 'Настроить интеграции', 'label_en' => 'Configure integrations', 'url' => '/app/integrations'],
],
],
// ─── CRM ──────────────────────────────────────────────────
'crm.pipeline.overview' => [
'area' => 'crm',
'title' => [
'ro' => 'Pipeline — de la lead la fișă',
'ru' => 'Pipeline — от лида до заказа',
'en' => 'Pipeline — from lead to WO',
],
'body' => [
'ro' => 'Fiecare deal trece prin coloane (New → Contactat → Diagnostic → Confirmat → Fișă creată → Închis/Pierdut). Trage-și cardurile între coloane. Când ajunge la „Fișă creată" se generează automat un WO legat de client + mașină.',
'ru' => 'Каждый deal проходит через колонки (New → Контакт → Диагностика → Подтверждён → Заказ создан → Закрыт/Проигран). Перетаскивайте карточки. На «Заказ создан» автоматически генерируется WO.',
'en' => 'Each deal moves across columns (New → Contacted → Diagnosed → Confirmed → WO created → Closed/Lost). Drag cards between columns. Reaching "WO created" auto-generates a work order.',
],
'next' => [
'ro' => 'Trage un card la stânga/dreapta',
'ru' => 'Перетащите карточку',
'en' => 'Drag a card left/right',
],
],
'crm.leads.overview' => [
'area' => 'crm',
'title' => [
'ro' => 'Cereri (leaduri) — intrare centralizată',
'ru' => 'Заявки (лиды) — единая точка входа',
'en' => 'Leads — single inbox',
],
'body' => [
'ro' => 'Aici ajung toate cererile: formularul de pe site, telefoane, mesaje Telegram, campanii Google/Facebook (dacă e configurat). Convertește-le în client + deal cu un click. Statusul „nou" apare cu galben pe dashboard.',
'ru' => 'Все входящие заявки: сайт, звонки, Telegram, Google/Facebook кампании. Одним кликом превращаешь в клиента + deal. Статус «новый» подсвечивается жёлтым на дашборде.',
'en' => 'All incoming requests: website form, calls, Telegram, Google/Facebook (if configured). Convert to client + deal in one click. "New" status shows amber on the dashboard.',
],
],
'crm.calendar.overview' => [
'area' => 'crm',
'title' => [
'ro' => 'Calendar programări (5 vederi)',
'ru' => 'Календарь записей (5 видов)',
'en' => 'Appointments calendar (5 views)',
],
'body' => [
'ro' => 'Zi / Săptămână / Lună / Custom / Listă — comută cu butoanele de sus. Grupare pe post de lucru sau pe maistru. Trage evenimentele pentru re-programare. Butonul „🖨 PDF programări" exportă perioada curentă.',
'ru' => 'День / Неделя / Месяц / Свой / Список — кнопки сверху. Группировка по посту или мастеру. Перетаскивайте события. «🖨 PDF записей» экспортирует текущий период.',
'en' => 'Day / Week / Month / Custom / List — top buttons. Group by post or master. Drag events to reschedule. "🖨 PDF" exports the current period.',
],
],
// ─── Depozit ──────────────────────────────────────────────
'depozit.parts.overview' => [
'area' => 'depozit',
'title' => [
'ro' => 'Piese — catalog + stoc',
'ru' => 'Запчасти — каталог и остатки',
'en' => 'Parts — catalog + stock',
],
'body' => [
'ro' => 'Fiecare piesă are cod, preț cost/vânzare, stoc curent, stoc minim și furnizor preferat. Când stocul scade sub minim, apare în widget-ul „Stoc minim atins" pe dashboard. Adaugă la o fișă din tab-ul „Piese" al fișei.',
'ru' => 'У каждой запчасти: код, цена (закупка/продажа), остаток, минимум, поставщик. Когда остаток ниже минимума — попадает в виджет «Минимальный остаток». Добавляй в заказ через таб «Запчасти».',
'en' => 'Each part has SKU, cost/sell price, current + min stock, preferred supplier. When stock drops below min, it shows up in the "Low stock" widget. Add to a WO via the WO\'s "Parts" tab.',
],
],
'depozit.excel.import' => [
'area' => 'depozit',
'title' => [
'ro' => 'Import factură Excel',
'ru' => 'Импорт счёта из Excel',
'en' => 'Excel invoice import',
],
'body' => [
'ro' => 'Încarcă factura de la furnizor în Excel/CSV. Wizard-ul mapează coloanele (cod, denumire, preț, cant.) și le arată în preview. Piese noi se creează automat, cele existente se actualizează. Maparea coloanelor se salvează per furnizor.',
'ru' => 'Загрузите счёт поставщика в Excel/CSV. Мастер сопоставит колонки (код, название, цена, кол-во) и покажет превью. Новые запчасти создаются, существующие обновляются. Соответствие колонок сохраняется на поставщика.',
'en' => 'Upload the supplier invoice in Excel/CSV. The wizard maps columns (SKU, name, price, qty) and shows a preview. New parts are created, existing ones updated. Column mapping is remembered per supplier.',
],
],
'depozit.scanner.usage' => [
'area' => 'depozit',
'title' => [
'ro' => 'Scaner barcode',
'ru' => 'Сканер штрихкодов',
'en' => 'Barcode scanner',
],
'body' => [
'ro' => 'Scanează codul de bare al piesei cu telefonul (camera browser) sau cu un scanner USB. Sistemul găsește piesa în catalog și te lasă să o adaugi rapid la o fișă activă sau să ajustezi stocul.',
'ru' => 'Сканируй штрихкод телефоном (камерой) или USB-сканером. Система найдёт запчасть в каталоге — можно добавить в заказ или изменить остаток.',
'en' => 'Scan the part barcode with your phone camera or a USB scanner. The system finds it in the catalog — add to an active WO or adjust stock.',
],
],
// ─── Finanțe ──────────────────────────────────────────────
'finante.payments.overview' => [
'area' => 'finante',
'title' => [
'ro' => 'Plăți — încasările tale',
'ru' => 'Оплаты — приход',
'en' => 'Payments — cash in',
],
'body' => [
'ro' => 'Fiecare plată se leagă de o fișă (WO), o metodă (cash, card, transfer) și un user care a primit-o. Suma totală apare pe dashboard-ul principal la „Încasări (luna)" și pe dashboard-ul fișei la „Plătit".',
'ru' => 'Каждая оплата привязана к заказу, способу (наличные/карта/перевод) и пользователю. Общая сумма — на главном дашборде «Приход (месяц)» и на дашборде заказа «Оплачено».',
'en' => 'Each payment ties to a WO, a method (cash/card/transfer) and the user who took it. The total shows on the main dashboard ("Cash in / month") and on the WO dashboard ("Paid").',
],
],
'finante.salaries.overview' => [
'area' => 'finante',
'title' => [
'ro' => 'Salarii — calcul automat per mecanic',
'ru' => 'Зарплаты — авторасчёт по механику',
'en' => 'Salaries — auto per mechanic',
],
'body' => [
'ro' => 'La sfârșit de perioadă (săptămână/lună), rulează „Închide perioada" în Salarii. Sistemul calculează pentru fiecare mecanic: manoperele făcute × marja internă + bonusuri avansuri = net de plată. Toate valorile pot fi ajustate manual înainte de export.',
'ru' => 'В конце периода (неделя/месяц) нажми «Закрыть период» в Зарплатах. Система посчитает по каждому механику: работы × внутренняя маржа + бонусы − авансы = к выплате. Значения можно поправить вручную.',
'en' => 'At period end (week/month), hit "Close period" in Salaries. The system computes per mechanic: labor × internal margin + bonuses advances = net pay. All values are editable before export.',
],
'links' => [
['label_ro' => 'Bonusuri & avansuri', 'label_ru' => 'Бонусы и авансы', 'label_en' => 'Bonuses & advances', 'url' => '/app/payroll-adjustments'],
],
],
'finante.reports.overview' => [
'area' => 'finante',
'title' => [
'ro' => 'Rapoarte financiare',
'ru' => 'Финансовые отчёты',
'en' => 'Financial reports',
],
'body' => [
'ro' => 'Vezi aici P&L pe perioadă selectabilă: încasări, cheltuieli, salarii, profit brut, top clienți, top piese vândute, comparație lună-lună. Export CSV pentru contabilitate.',
'ru' => 'P&L за выбранный период: приход, расход, зарплаты, валовая прибыль, топ клиентов, топ запчастей, сравнение месяцев. Экспорт CSV.',
'en' => 'P&L for a selectable period: income, expenses, salaries, gross profit, top clients, top parts, month-over-month comparison. CSV export for accounting.',
],
],
];
}
public static function get(string $key): ?array
{
return static::all()[$key] ?? null;
}
/**
* URL path → hint key map. Used by the tenant panel render hook to
* auto-inject a "?" on top of any page that has a matching entry.
* Order matters — first match wins, so put specific paths before
* broader ones. Paths are matched with str_starts_with().
*/
public static function forPath(string $path): ?string
{
$path = trim($path, '/');
$map = [
// Service / Work orders
'app/work-orders/create' => 'wo.create.overview',
'app/work-orders' => 'wo.list.overview',
'app/mechanic-board' => 'service.mechanic_board.overview',
'app/mechanic-kpi' => 'service.kpi.overview',
'app/labors' => 'service.labors.overview',
'app/masters' => 'service.masters.overview',
'app/service-templates' => 'service.templates.overview',
'app/injector-protocols' => 'service.injector.overview',
'app/bodyshop-jobs' => 'service.bodyshop.overview',
'app/tire-sets' => 'service.tires.overview',
'app/subcontract-jobs' => 'service.subcontract.overview',
'app/subcontractors' => 'service.subcontractors.overview',
// CRM
'app/clients' => 'crm.clients.overview',
'app/vehicles' => 'crm.vehicles.overview',
'app/leads' => 'crm.leads.overview',
'app/deals' => 'crm.pipeline.overview',
'app/pipeline-board' => 'crm.pipeline.overview',
'app/calendar-board' => 'crm.calendar.overview',
'app/appointments' => 'crm.calendar.overview',
'app/calls' => 'crm.calls.overview',
// Depozit
'app/parts' => 'depozit.parts.overview',
'app/purchases' => 'depozit.purchases.overview',
'app/suppliers' => 'depozit.suppliers.overview',
'app/warehouses' => 'depozit.warehouses.overview',
'app/pricing-coefficients' => 'depozit.pricing.overview',
'app/markup-rules' => 'depozit.markup.overview',
'app/units' => 'depozit.units.overview',
'app/scanner' => 'depozit.scanner.usage',
'app/vin-search' => 'depozit.vin_search.overview',
'app/excel-import-wizard' => 'depozit.excel.import',
// Finanțe
'app/payments' => 'finante.payments.overview',
'app/expenses' => 'finante.expenses.overview',
'app/payroll-runs' => 'finante.salaries.overview',
'app/payroll-adjustments' => 'finante.adjustments.overview',
'app/employee-profiles' => 'finante.employees.overview',
'app/reports' => 'finante.reports.overview',
'app/finance' => 'finante.consolidated.overview',
// Magazin
'app/online-orders' => 'shop.orders.overview',
'app/shop-customers' => 'shop.customers.overview',
// Marketing
'app/marketing-channels' => 'marketing.channels.overview',
'app/message-templates' => 'marketing.templates.overview',
// Analiză
'app/recommendations' => 'analytics.recommendations.overview',
'app/ai-assistant' => 'analytics.ai.overview',
'app/workload' => 'analytics.workload.overview',
// Admin
'app/users' => 'admin.users.overview',
'app/roles' => 'admin.roles.overview',
'app/posts' => 'admin.posts.overview',
'app/settings' => 'admin.settings.overview',
'app/integrations' => 'admin.integrations.overview',
'app/api-tokens' => 'admin.tokens.overview',
'app/backup' => 'admin.backup.overview',
'app/activities' => 'admin.activity.overview',
];
foreach ($map as $prefix => $key) {
if (str_starts_with($path, $prefix)) return $key;
}
return null;
}
/** Group all hints by area, preserving insertion order. */
public static function byArea(): array
{
$out = [];
foreach (static::all() as $key => $h) {
$out[$h['area']] ??= [];
$out[$h['area']][$key] = $h;
}
return $out;
}
public static function locale(): string
{
$l = app()->getLocale();
return in_array($l, ['ro', 'ru', 'en'], true) ? $l : 'ro';
}
}