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' => 'Service (fișe lucru)', 'ru' => 'Сервис (заказы)', 'en' => 'Service (work orders)'], 'icon' => '🔧', 'color' => '#0ea5e9'], 'crm' => ['label' => ['ro' => 'CRM & Clienți', 'ru' => 'CRM и клиенты', 'en' => 'CRM & Customers'], 'icon' => '👥', 'color' => '#8b5cf6'], 'depozit' => ['label' => ['ro' => 'Depozit & Piese', 'ru' => 'Склад и запчасти', 'en' => 'Warehouse & Parts'], 'icon' => '📦', 'color' => '#f59e0b'], 'finante' => ['label' => ['ro' => 'Finanțe', 'ru' => 'Финансы', 'en' => 'Finance'], 'icon' => '💰', 'color' => '#10b981'], 'analiza' => ['label' => ['ro' => 'Analiză & Rapoarte', 'ru' => 'Аналитика и отчёты', 'en' => 'Analytics & Reports'], 'icon' => '📊', 'color' => '#ec4899'], 'marketing' => ['label' => ['ro' => 'Marketing', 'ru' => 'Маркетинг', 'en' => 'Marketing'], 'icon' => '📣', 'color' => '#f97316'], 'magazin' => ['label' => ['ro' => 'Magazin online', 'ru' => 'Онлайн-магазин', 'en' => 'Online shop'], 'icon' => '🛒', 'color' => '#06b6d4'], 'admin' => ['label' => ['ro' => 'Administrare', 'ru' => 'Администрирование', 'en' => 'Administration'], 'icon' => '⚙️', 'color' => '#64748b'], ]; /** @return 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' => 'magazin', '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' => 'magazin', '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' => 'marketing', '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' => 'marketing', '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' => 'analiza', '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' => 'analiza', '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' => 'analiza', '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' => 'admin', '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' => 'admin', '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' => 'admin', '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' => 'admin', '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' => 'admin', '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' => 'admin', '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' => 'admin', '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' => 'admin', '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'; } }