feat(injector-protocols): full module — resource + PDF export via Browsershot

Implements the injector diagnostic protocol module per spec:
- Migration: injector_protocols + injector_protocol_rows with company_id
  (multi-tenant), vehicle_id (not car_id — this CRM uses Vehicle),
  master_id FK to users, snapshot fields (car_model/plate/vin/mileage/year/
  injector_brand) captured at protocol time.
- Models with BelongsToTenant; auto-generate protocol_number as
  PS-{tenantId}-{year}-{seq6}; auto-seed 8 empty rows on create.
- Permissions: injector_protocols.view + injector_protocols.conclude.
  Default roles: owner/admin (both), manager (both), receptionist (view
  only), mechanic (both). Test permission count updated 52→54.
- InjectorProtocolResource under Service nav group with 4 sections:
  data auto+client (with client_id/vehicle_id lookups auto-filling
  snapshot fields), reason checkboxes, 8-row repeater for measurements
  (Repeater with position hidden; fixed 8, non-addable/deletable),
  conclusion + comment + master signature.
- Table with columns, badge filters, PDF action.
- Blade PDF template: pixel-close to reference (graphite/gold/blue
  brand tokens, striped rows, rotated 'ФОРСУНКИ' header).
- Route /app/injector-protocols/{id}/pdf with permission gate,
  streams PDF via new InjectorProtocolPdfService (Browsershot).
- Dockerfile: install nodejs 22 + chromium + noto fonts + puppeteer-core
  in /opt/browsershot; env vars for Browsershot binary paths.
- +71 RU/EN translations covering resource + PDF template.

All 306 tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-26 11:27:53 +00:00
parent 0e85035eff
commit 47eb4f62c1
20 changed files with 1218 additions and 8 deletions
+71 -1
View File
@@ -28,6 +28,7 @@
"2FA dezactivat.": "2FA dezactivat.",
"2FA resetat": "2FA reset",
"58.5h/10": "58.5h/10",
"8 forsunki × 6 măsurători (Înainte / După). Introducerea se face pe rând.": "8 injectors × 6 measurements (Before / After). One row at a time.",
":n poziții importate în Purchase nouă": ":n items imported into a new Purchase",
"> 0 calculează automat prețul client.": "> 0 auto-calculates client price.",
"A1-03": "A1-03",
@@ -260,11 +261,13 @@
"Autentificare 2FA": "2FA authentication",
"Auto": "Vehicle",
"Auto / model": "Vehicle / model",
"Auto CRM": "CRM vehicle",
"Auto-import Excel/CSV": "Auto-import Excel/CSV",
"AutoCRM PSauto · psauto.service.mir.md": "AutoCRM PSauto · psauto.service.mir.md",
"AutoCRM SRL": "AutoCRM SRL",
"Automată": "Automatic",
"Automobile": "Vehicles",
"Autoservis / Client": "Auto service / Client",
"Avans": "Advance",
"Avans achitat": "Advance paid",
"Avg zile": "Avg days",
@@ -363,6 +366,7 @@
"Caută": "Search",
"Caută client, mașină, număr...": "Search client, vehicle, number...",
"Caută în tabel": "Search in table",
"Cauza adresării": "Reason for request",
"Caz asigurare": "Insurance case",
"Caz de asigurare": "Insurance case",
"Ce a spus clientul...": "What the client said...",
@@ -403,6 +407,7 @@
"Client ID": "Client ID",
"Client VIP": "VIP client",
"Client existent": "Existing client",
"Client informat / a luat cunoștință": "Client informed / acknowledged",
"Client legat (CRM)": "Linked client (CRM)",
"Client name": "Client name",
"Client nou": "New client",
@@ -445,6 +450,7 @@
"Comandă nouă #": "New order #",
"Comandă primită": "Order received",
"Combustibil": "Fuel",
"Comentariu / recomandări maistru": "Master comment / recommendations",
"Comenzi": "Orders",
"Comercial": "Commercial",
"Comercial (van/camion)": "Commercial (van/truck)",
@@ -527,6 +533,7 @@
"Creează cerere": "Create lead",
"Creează comandă de aprovizionare": "Create purchase order",
"Creează planuri (ex: Free, Basic, Pro) și atribuie-le companiilor.": "Creează planuri (ex: Free, Basic, Pro) și atribuie-le companiilor.",
"Creează primul protocol de diagnostic forsunki. Numărul se generează automat (PS-{tenant}-{an}-{seq}).": "Create the first injector diagnostic protocol. Number is auto-generated (PS-{tenant}-{year}-{seq}).",
"Creează un bot la @BotFather, lipește token-ul aici și apasă „Setează webhook": "Create a bot with @BotFather, paste the token here and click \"Set webhook\".",
"Creează un bot la @BotFather, lipește token-ul aici și apasă „Setează webhook\". Clienții îți scriu la bot, partajează telefonul, iar codul se leagă automat de fișa lor.": "Create a bot with @BotFather, paste the token here and click \"Set webhook\". Clients write to the bot, share their phone, and the code auto-links to their order.",
"Crescător": "Ascending",
@@ -546,6 +553,7 @@
"Cumulabil = se înmulțește cu alți coeficienți. Necumulabil = doar cel mai mare necumulabil se aplică.": "Stackable = multiplies with other coefficients. Non-stackable = only the largest non-stackable applies.",
"Curier": "Courier",
"Currency": "Currency",
"Curățare": "Cleaning",
"Curăță": "Clear",
"Custom": "Custom",
"Cutie": "Gearbox",
@@ -559,6 +567,7 @@
"DENY — interzice dreptul": "DENY — deny the permission",
"DOT": "DOT",
"DSG": "DSG",
"DUPĂ": "AFTER",
"Da, confirmă": "Yes, confirm",
"Da, șterge": "Yes, delete",
"Dacă e gol, generăm 10 caractere random.": "If empty, we generate 10 random characters.",
@@ -570,6 +579,7 @@
"Data comandă": "Order date",
"Data creării": "Created at",
"Data deschiderii:": "Data deschiderii:",
"Data emiterii": "Issue date",
"Data factură": "Invoice date",
"Data ieșire": "Delivery date",
"Data intrare": "Intake date",
@@ -580,6 +590,7 @@
"Data început": "Start date",
"Data închiderii:": "Close date:",
"Date": "Date",
"Date auto & client": "Vehicle & client data",
"Date generale": "General data",
"Date insuficiente": "Insufficient data",
"Date legale (apar pe facturi)": "Date legale (apar pe facturi)",
@@ -605,6 +616,7 @@
"Deal-uri active": "Active deals",
"Deals": "Deals",
"Debit": "Debit",
"Debit ÎNAINTE": "Flow BEFORE",
"Deblochează": "Unblock",
"Decembrie": "December",
"Decode VIN": "Decode VIN",
@@ -644,6 +656,7 @@
"Deschide panoul pe telefon și acceptă notificările întâi.": "Open the panel on the phone and accept notifications first.",
"Deschide tenantul": "Deschide tenantul",
"Deschide →": "Open →",
"Deschidere ÎNAINTE": "Opening BEFORE",
"Deschis": "Opened",
"Deschis la": "Opened at",
"Descrescător": "Descending",
@@ -682,6 +695,7 @@
"Doar arhivate": "Archived only",
"Doar clienți VIP": "VIP clients only",
"Doar clienții mei": "My clients only",
"Doar dacă maistrul nu e în listă.": "Only if the master is not in the list.",
"Doar la manopere (proprii + subcontract). Baza salariu = preț client × (1 marjă/100). Lasă gol pentru a folosi valoarea implicită a companiei.": "Only for labor (own + subcontract). Salary base = client price × (1 margin/100). Leave empty to use company default.",
"Doar pentru cazuri speciale. Lasă gol → folosește marja mecanicului.": "For special cases only. Leave empty → uses the mechanic's margin.",
"Doar tu ești aici": "Only you are here",
@@ -750,6 +764,7 @@
"Engine": "Engine",
"Eroare": "Error",
"Eroare la recepție": "Receiving error",
"Etanșeitate ÎNAINTE": "Tightness BEFORE",
"Etape": "Stages",
"Etapă": "Stage",
"Etichete piese": "Etichete piese",
@@ -830,6 +845,7 @@
"Fișă asociată": "Linked order",
"Fișă de lucru": "Work order",
"Fișă lucru": "Work order",
"Fișă lucru (opțional)": "Work order (opt.)",
"Folie PPF": "PPF film",
"Folosește AI Assistant": "Use AI Assistant",
"Folosește „Check-in depozit": "Use \"Check-in storage\"",
@@ -840,6 +856,7 @@
"Force delete": "Force delete",
"Force logout": "Force logout",
"Format:": "Format:",
"Forsunka": "Injector",
"Foto": "Photo",
"Foto factură": "Invoice photo",
"Foto piesă": "Part photo",
@@ -942,6 +959,8 @@
"Informația de bază — click pe titlul secțiunilor de mai jos pentru detalii.": "Basic information — click on the section titles below for details.",
"Informație": "Info",
"Injectoare": "Injectors",
"Injectoare noi": "New injectors",
"Injectoarele în normă, apte pentru exploatare": "Injectors OK, fit for use",
"Instrucțiuni adiționale": "Additional instructions",
"Integrări": "Integrations",
"Integrări de plată": "Payment integrations",
@@ -1082,7 +1101,8 @@
"Manual": "Manual",
"Manuală": "Manual",
"Mapare coloane": "Column mapping",
"Marca": "Make",
"Marca": "Brand",
"Marca injectoarelor": "Injector brand",
"Marca/Model": "Make/Model",
"Marca/Model:": "Marca/Model:",
"Marchează Gata": "Mark ready",
@@ -1160,6 +1180,7 @@
"Model Claude": "Claude model",
"Model Gemini": "Gemini model",
"Model OpenAI": "OpenAI model",
"Model auto": "Vehicle model",
"Model implicit": "Default model",
"Model year": "Model year",
"Modele": "Models",
@@ -1178,6 +1199,7 @@
"Mulțumim": "Thank you",
"Mâine": "Tomorrow",
"Mărci auto suportate (separate prin virgulă)": "Supported makes (comma-separated)",
"Măsurători mecanica injectoarelor": "Injector mechanics measurements",
"Name": "Name",
"Neachitat": "Unpaid",
"Necesită acțiune": "Needs action",
@@ -1185,6 +1207,7 @@
"Necesită aprobare client": "Needs client approval",
"Necesită atenție": "Needs attention",
"Necesită cel puțin 2 recepții complete cu data așteptată setată.": "Requires at least 2 full receipts with expected date set.",
"Necesită curățare repetată": "Repeat cleaning needed",
"Necompletat": "Empty",
"Neconfirmat": "Unconfirmed",
"Neconfirmate": "Unconfirmed",
@@ -1238,6 +1261,7 @@
"Niciun mecanic nu a finalizat lucrări în această perioadă.": "No mechanic has completed work in this period.",
"Niciun plan definit": "Niciun plan definit",
"Niciun preț înregistrat": "No prices recorded",
"Niciun protocol": "No protocols",
"Niciun rest de încasat. 🎉": "No balance to collect. 🎉",
"Niciun rezultat pentru": "No results for",
"Niciun set de anvelope": "No tire sets",
@@ -1268,10 +1292,13 @@
"Nou tehnician": "New technician",
"Nouă": "New",
"Nr.": "No.",
"Nr. auto": "Plate",
"Nr. dosar daună": "Damage file no.",
"Nr. factură": "Invoice no.",
"Nr. fișă": "Order no.",
"Nr. injectoare": "Injector count",
"Nr. poliță": "Policy no.",
"Nr. protocol": "Protocol no.",
"Nr. telefon": "Phone number",
"Nr. înmatriculare": "License plate",
"Nr.:": "Nr.:",
@@ -1307,6 +1334,7 @@
"Număr": "Number",
"Numărul de zile gratis după ce un tenant alege acest plan.": "Free trial days when a tenant chooses this plan.",
"OCR eșuat": "OCR failed",
"OK": "OK",
"Observații": "Notes",
"Obține token cu": "Get token with",
"Octombrie": "October",
@@ -1556,6 +1584,7 @@
"Progres": "Progress",
"Progres etapă": "Stage progress",
"Proprietar": "Owner",
"Protocol nou": "New protocol",
"Provider implicit": "Default provider",
"Provider:": "Provider:",
"Public": "Public",
@@ -1616,6 +1645,7 @@
"Recomandare": "Referral",
"Recomandat": "Recommended",
"Recomandate": "Recommended",
"Recomandată înlocuire": "Replacement recommended",
"Recomandă": "Recommend",
"Recomandări": "Recommendations",
"Recomandări AI": "AI recommendations",
@@ -1641,6 +1671,7 @@
"Renunță": "Cancel",
"Reordonează": "Reorder",
"Reparație": "Repair",
"Reparație capitală motor": "Engine overhaul",
"Reparație caroserie": "Body repair",
"Reparații": "Repairs",
"Report": "Report",
@@ -1671,6 +1702,7 @@
"Rezervare": "Reservation",
"Rezervat": "Reserved",
"Rezervă o programare": "Rezervă o programare",
"Rezistență ÎNAINTE": "Resistance BEFORE",
"Rezultat": "Result",
"Rezultate": "Results",
"Rezumat": "Summary",
@@ -1762,6 +1794,7 @@
"Selectează perioadă": "Select period",
"Semnat": "Signed",
"Semnat de": "Signed by",
"Semnat de (manual)": "Signed by (manual)",
"Semnează": "Sign",
"Semnătură": "Signature",
"Semnătură digitală": "Digital signature",
@@ -2094,6 +2127,7 @@
"Venit manopere": "Labor revenue",
"Venituri": "Revenue",
"Verificare": "Verification",
"Verificare / diagnostic": "Check / diagnosis",
"Verificat": "Verified",
"Verifică emailul": "Check your email",
"Verifică și amintește": "Verify and remind",
@@ -2392,6 +2426,8 @@
"programări": "appointments",
"programări active": "active appointments",
"programări neconfirmate &lt; 24h": "unconfirmed appointments < 24h",
"protocoale forsunki": "injector protocols",
"protocol forsunki": "injector protocol",
"rata confirmare": "confirmation rate",
"referral": "Referral",
"reguli markup": "markup rules",
@@ -2446,6 +2482,8 @@
"Începe lucrul": "Start work",
"Închide": "Close",
"Închide fișa": "Close order",
"Închidere KZ ÎNAINTE": "Closing KZ BEFORE",
"Închidere ÎNAINTE": "Closing BEFORE",
"Închis": "Closed",
"Închis (Duminică/sărbătoare)": "Closed (Sunday/holiday)",
"Închis la": "Closed at",
@@ -2453,6 +2491,7 @@
"Încărcare STO": "Workshop load",
"Încărcare celulă": "Cell load",
"Încărcare service": "Workshop load",
"Înlocuire": "Replacement",
"Înregistrare": "Register",
"Înregistrat": "Registered",
"Înregistrează cheltuială": "Record expense",
@@ -2487,10 +2526,41 @@
"șters": "șters",
"Țară": "Country",
"Ține-mă minte": "Remember me",
"Автомобиль": "Vehicle",
"Автосервис / Клиент": "Auto service / Client",
"Время закр. в КЗ, мс": "Closing time (KZ), ms",
"Время закрытия, мс": "Closing time, ms",
"Время открытия, мс": "Opening time, ms",
"Герметичность": "Tightness",
"Год выпуска": "Year",
"Гос. номер": "Plate number",
"ДАННЫЕ АВТОМОБИЛЯ И КЛИЕНТА": "VEHICLE AND CLIENT DATA",
"Дата выдачи": "Issue date",
"ЗАКЛЮЧЕНИЕ": "CONCLUSION",
"Заключение": "Conclusion",
"Заполняйте строки по количеству форсунок; лишние строки оставьте пустыми.": "Fill in rows per injector count; leave extra rows empty.",
"ИЗМЕРЕНИЯ МЕХАНИКИ ФОРСУНОК": "INJECTOR MECHANICS MEASUREMENTS",
"Клиент ознакомлен (подпись)": "Client acknowledged (signature)",
"Кол-во форсунок": "Injector count",
"Комментарий / рекомендации мастера": "Master comment / recommendations",
"Марка форсунок": "Injector brand",
"Мастер (ФИО, подпись)": "Master (name, signature)",
"ПРИЧИНА ОБРАЩЕНИЯ": "REASON FOR REQUEST",
"ПРОТОКОЛ ДИАГНОСТИКИ И ОЧИСТКИ": "DIAGNOSTIC AND CLEANING PROTOCOL",
"Пробег, км": "Mileage, km",
"Расход, мл": "Flow, ml",
"Сопротивление, Ом": "Resistance, Ω",
"Телефон": "Phone",
"ФОРСУНКИ": "INJECTORS",
"ЭЛЕКТРОКЛАПАННЫХ ФОРСУНОК": "OF SOLENOID INJECTORS",
"до": "before",
"после": "after",
"— (multe VIN-uri europene nu respectă checksum-ul NA)": "— (multe VIN-uri europene nu respectă checksum-ul NA)",
"— alege —": "— select —",
"— fără pod —": "— no bay —",
"— niciunul —": "— niciunul —",
"№": "No.",
"№ протокола:": "Protocol no.:",
"️": "️",
"← Săpt. anterioară": "← Prev. week",
"← Înapoi": "← Back",
+71 -1
View File
@@ -28,6 +28,7 @@
"2FA dezactivat.": "2FA dezactivat.",
"2FA resetat": "2FA сброшен",
"58.5h/10": "58.5ч/10",
"8 forsunki × 6 măsurători (Înainte / După). Introducerea se face pe rând.": "8 форсунок × 6 измерений (До / После). Ввод — по одной строке.",
":n poziții importate în Purchase nouă": ":n позиций импортировано в новый заказ",
"> 0 calculează automat prețul client.": "> 0 автоматически рассчитывает цену клиента.",
"A1-03": "A1-03",
@@ -260,11 +261,13 @@
"Autentificare 2FA": "2FA аутентификация",
"Auto": "Авто",
"Auto / model": "Авто / модель",
"Auto CRM": "CRM-авто",
"Auto-import Excel/CSV": "Auto-import Excel/CSV",
"AutoCRM PSauto · psauto.service.mir.md": "AutoCRM PSauto · psauto.service.mir.md",
"AutoCRM SRL": "AutoCRM SRL",
"Automată": "Автоматическая",
"Automobile": "Автомобили",
"Autoservis / Client": "Автосервис / Клиент",
"Avans": "Аванс",
"Avans achitat": "Аванс оплачен",
"Avg zile": "Ср. дней",
@@ -363,6 +366,7 @@
"Caută": "Найти",
"Caută client, mașină, număr...": "Поиск клиента, авто, номера...",
"Caută în tabel": "Поиск в таблице",
"Cauza adresării": "Причина обращения",
"Caz asigurare": "Страховой случай",
"Caz de asigurare": "Страховой случай",
"Ce a spus clientul...": "Что сказал клиент...",
@@ -399,10 +403,11 @@
"Client & Auto": "Клиент и авто",
"Client (nume, semnătură):": "Клиент (имя, подпись):",
"Client / Auto": "Client / Auto",
"Client CRM": "Клиент CRM",
"Client CRM": "CRM-клиент",
"Client ID": "ID клиента",
"Client VIP": "VIP-клиент",
"Client existent": "Существующий клиент",
"Client informat / a luat cunoștință": "Клиент проинформирован / ознакомлен",
"Client legat (CRM)": "Привязанный клиент (CRM)",
"Client name": "Имя клиента",
"Client nou": "Новый клиент",
@@ -445,6 +450,7 @@
"Comandă nouă #": "Новый заказ #",
"Comandă primită": "Заказ получен",
"Combustibil": "Топливо",
"Comentariu / recomandări maistru": "Комментарий / рекомендации мастера",
"Comenzi": "Заказы",
"Comercial": "Коммерческий",
"Comercial (van/camion)": "Коммерческий (фургон/грузовик)",
@@ -527,6 +533,7 @@
"Creează cerere": "Создать заявку",
"Creează comandă de aprovizionare": "Создать заказ на закупку",
"Creează planuri (ex: Free, Basic, Pro) și atribuie-le companiilor.": "Creează planuri (ex: Free, Basic, Pro) și atribuie-le companiilor.",
"Creează primul protocol de diagnostic forsunki. Numărul se generează automat (PS-{tenant}-{an}-{seq}).": "Создайте первый протокол диагностики форсунок. Номер генерируется автоматически (PS-{тенант}-{год}-{seq}).",
"Creează un bot la @BotFather, lipește token-ul aici și apasă „Setează webhook": "Создайте бота у @BotFather, вставьте токен здесь и нажмите «Настроить webhook».",
"Creează un bot la @BotFather, lipește token-ul aici și apasă „Setează webhook\". Clienții îți scriu la bot, partajează telefonul, iar codul se leagă automat de fișa lor.": "Создайте бота у @BotFather, вставьте токен здесь и нажмите «Настроить webhook». Клиенты пишут боту, делятся номером, и код автоматически связывается с их нарядом.",
"Crescător": "По возрастанию",
@@ -546,6 +553,7 @@
"Cumulabil = se înmulțește cu alți coeficienți. Necumulabil = doar cel mai mare necumulabil se aplică.": "Накопительный = умножается с другими коэффициентами. Ненакопительный = применяется только наибольший ненакопительный.",
"Curier": "Курьер",
"Currency": "Валюта",
"Curățare": "Чистка",
"Curăță": "Очистить",
"Custom": "Свой",
"Cutie": "Коробка",
@@ -559,6 +567,7 @@
"DENY — interzice dreptul": "DENY — запретить право",
"DOT": "DOT",
"DSG": "DSG",
"DUPĂ": "ПОСЛЕ",
"Da, confirmă": "Да, подтвердить",
"Da, șterge": "Да, удалить",
"Dacă e gol, generăm 10 caractere random.": "Если пусто — сгенерируем 10 случайных символов.",
@@ -570,6 +579,7 @@
"Data comandă": "Дата заказа",
"Data creării": "Дата создания",
"Data deschiderii:": "Data deschiderii:",
"Data emiterii": "Дата выдачи",
"Data factură": "Дата счёта",
"Data ieșire": "Дата выдачи",
"Data intrare": "Дата приёма",
@@ -580,6 +590,7 @@
"Data început": "Дата начала",
"Data închiderii:": "Дата закрытия:",
"Date": "Дата",
"Date auto & client": "Данные авто и клиента",
"Date generale": "Общая информация",
"Date insuficiente": "Недостаточно данных",
"Date legale (apar pe facturi)": "Date legale (apar pe facturi)",
@@ -605,6 +616,7 @@
"Deal-uri active": "Активные сделки",
"Deals": "Сделки",
"Debit": "Дебет",
"Debit ÎNAINTE": "Расход ДО",
"Deblochează": "Разблокировать",
"Decembrie": "Декабрь",
"Decode VIN": "Декодировать VIN",
@@ -644,6 +656,7 @@
"Deschide panoul pe telefon și acceptă notificările întâi.": "Сначала откройте панель на телефоне и разрешите уведомления.",
"Deschide tenantul": "Deschide tenantul",
"Deschide →": "Открыть →",
"Deschidere ÎNAINTE": "Открытие ДО",
"Deschis": "Открыт",
"Deschis la": "Открыт",
"Descrescător": "По убыванию",
@@ -682,6 +695,7 @@
"Doar arhivate": "Только архивные",
"Doar clienți VIP": "Только VIP клиенты",
"Doar clienții mei": "Только мои клиенты",
"Doar dacă maistrul nu e în listă.": "Только если мастер не в списке.",
"Doar la manopere (proprii + subcontract). Baza salariu = preț client × (1 marjă/100). Lasă gol pentru a folosi valoarea implicită a companiei.": "Только для работ (собственных + субподряд). База зарплаты = цена клиенту × (1 − маржа/100). Оставьте пустым для значения по умолчанию компании.",
"Doar pentru cazuri speciale. Lasă gol → folosește marja mecanicului.": "Только для особых случаев. Оставьте пустым → используется маржа механика.",
"Doar tu ești aici": "Только вы здесь",
@@ -750,6 +764,7 @@
"Engine": "Двигатель",
"Eroare": "Ошибка",
"Eroare la recepție": "Ошибка при приёмке",
"Etanșeitate ÎNAINTE": "Герметичность ДО",
"Etape": "Этапы",
"Etapă": "Этап",
"Etichete piese": "Etichete piese",
@@ -830,6 +845,7 @@
"Fișă asociată": "Связанный наряд",
"Fișă de lucru": "Заказ-наряд",
"Fișă lucru": "Заказ-наряд",
"Fișă lucru (opțional)": "Заказ-наряд (опц.)",
"Folie PPF": "Плёнка PPF",
"Folosește AI Assistant": "Использовать AI Assistant",
"Folosește „Check-in depozit": "Используйте «Приёмка на склад»",
@@ -840,6 +856,7 @@
"Force delete": "Удалить безвозвратно",
"Force logout": "Выйти со всех устройств",
"Format:": "Формат:",
"Forsunka": "Форсунка",
"Foto": "Фото",
"Foto factură": "Фото счёта",
"Foto piesă": "Фото запчасти",
@@ -942,6 +959,8 @@
"Informația de bază — click pe titlul secțiunilor de mai jos pentru detalii.": "Основная информация — нажмите на заголовок секции ниже для деталей.",
"Informație": "Информация",
"Injectoare": "Форсунки",
"Injectoare noi": "Новые форсунки",
"Injectoarele în normă, apte pentru exploatare": "Форсунки в норме, годны к эксплуатации",
"Instrucțiuni adiționale": "Дополнительные инструкции",
"Integrări": "Интеграции",
"Integrări de plată": "Платёжные интеграции",
@@ -1083,6 +1102,7 @@
"Manuală": "Ручная",
"Mapare coloane": "Сопоставление колонок",
"Marca": "Марка",
"Marca injectoarelor": "Марка форсунок",
"Marca/Model": "Марка/Модель",
"Marca/Model:": "Marca/Model:",
"Marchează Gata": "Отметить готово",
@@ -1160,6 +1180,7 @@
"Model Claude": "Модель Claude",
"Model Gemini": "Модель Gemini",
"Model OpenAI": "Модель OpenAI",
"Model auto": "Модель авто",
"Model implicit": "Модель по умолчанию",
"Model year": "Модельный год",
"Modele": "Модели",
@@ -1178,6 +1199,7 @@
"Mulțumim": "Спасибо",
"Mâine": "Завтра",
"Mărci auto suportate (separate prin virgulă)": "Поддерживаемые марки (через запятую)",
"Măsurători mecanica injectoarelor": "Измерения механики форсунок",
"Name": "Имя",
"Neachitat": "Не оплачено",
"Necesită acțiune": "Требует действия",
@@ -1185,6 +1207,7 @@
"Necesită aprobare client": "Требуется одобрение клиента",
"Necesită atenție": "Требует внимания",
"Necesită cel puțin 2 recepții complete cu data așteptată setată.": "Требуется минимум 2 полные приёмки с установленной ожидаемой датой.",
"Necesită curățare repetată": "Требуется повторная чистка",
"Necompletat": "Не заполнено",
"Neconfirmat": "Не подтверждено",
"Neconfirmate": "Не подтверждено",
@@ -1238,6 +1261,7 @@
"Niciun mecanic nu a finalizat lucrări în această perioadă.": "Ни один механик не завершил работы за этот период.",
"Niciun plan definit": "Niciun plan definit",
"Niciun preț înregistrat": "Цены не зарегистрированы",
"Niciun protocol": "Нет протоколов",
"Niciun rest de încasat. 🎉": "Нет остатка к получению. 🎉",
"Niciun rezultat pentru": "Нет результатов для",
"Niciun set de anvelope": "Нет комплектов шин",
@@ -1268,10 +1292,13 @@
"Nou tehnician": "Новый техник",
"Nouă": "Новая",
"Nr.": "№",
"Nr. auto": "№ авто",
"Nr. dosar daună": "№ дела о повреждении",
"Nr. factură": "№ счёта",
"Nr. fișă": "№ наряда",
"Nr. injectoare": "Кол-во форсунок",
"Nr. poliță": "№ полиса",
"Nr. protocol": "№ протокола",
"Nr. telefon": "Тел. номер",
"Nr. înmatriculare": "Гос. номер",
"Nr.:": "Nr.:",
@@ -1307,6 +1334,7 @@
"Număr": "Номер",
"Numărul de zile gratis după ce un tenant alege acest plan.": "Дни бесплатного пробного периода при выборе плана.",
"OCR eșuat": "OCR не удалось",
"OK": "OK",
"Observații": "Комментарии",
"Obține token cu": "Получить токен с помощью",
"Octombrie": "Октябрь",
@@ -1556,6 +1584,7 @@
"Progres": "Прогресс",
"Progres etapă": "Прогресс этапа",
"Proprietar": "Владелец",
"Protocol nou": "Новый протокол",
"Provider implicit": "Провайдер по умолчанию",
"Provider:": "Provider:",
"Public": "Публично",
@@ -1616,6 +1645,7 @@
"Recomandare": "Рекомендация",
"Recomandat": "Рекомендуется",
"Recomandate": "Рекомендуемые",
"Recomandată înlocuire": "Рекомендована замена",
"Recomandă": "Рекомендуется",
"Recomandări": "Рекомендации",
"Recomandări AI": "AI-рекомендации",
@@ -1641,6 +1671,7 @@
"Renunță": "Отменить",
"Reordonează": "Изменить порядок",
"Reparație": "Ремонт",
"Reparație capitală motor": "Кап. ремонт двигателя",
"Reparație caroserie": "Ремонт кузова",
"Reparații": "Ремонты",
"Report": "Отчёт",
@@ -1671,6 +1702,7 @@
"Rezervare": "Резерв",
"Rezervat": "Зарезервировано",
"Rezervă o programare": "Rezervă o programare",
"Rezistență ÎNAINTE": "Сопротивление ДО",
"Rezultat": "Результат",
"Rezultate": "Результаты",
"Rezumat": "Резюме",
@@ -1762,6 +1794,7 @@
"Selectează perioadă": "Выберите период",
"Semnat": "Подписано",
"Semnat de": "Подписано",
"Semnat de (manual)": "Подписано (вручную)",
"Semnează": "Подписать",
"Semnătură": "Подпись",
"Semnătură digitală": "Цифровая подпись",
@@ -2094,6 +2127,7 @@
"Venit manopere": "Доход работ",
"Venituri": "Доходы",
"Verificare": "Проверка",
"Verificare / diagnostic": "Проверка / диагностика",
"Verificat": "Проверено",
"Verifică emailul": "Проверьте email",
"Verifică și amintește": "Проверить и напомнить",
@@ -2392,6 +2426,8 @@
"programări": "записи",
"programări active": "активные записи",
"programări neconfirmate &lt; 24h": "неподтверждённые записи < 24ч",
"protocoale forsunki": "протоколы форсунок",
"protocol forsunki": "протокол форсунок",
"rata confirmare": "коэф. подтверждения",
"referral": "Рекомендация",
"reguli markup": "правила наценки",
@@ -2446,6 +2482,8 @@
"Începe lucrul": "Начать работу",
"Închide": "Закрыть",
"Închide fișa": "Закрыть наряд",
"Închidere KZ ÎNAINTE": "Закрытие КЗ ДО",
"Închidere ÎNAINTE": "Закрытие ДО",
"Închis": "Закрыт",
"Închis (Duminică/sărbătoare)": "Закрыто (Воскр./праздник)",
"Închis la": "Закрыт",
@@ -2453,6 +2491,7 @@
"Încărcare STO": "Загрузка СТО",
"Încărcare celulă": "Загрузка ячейки",
"Încărcare service": "Загрузка сервиса",
"Înlocuire": "Замена",
"Înregistrare": "Регистрация",
"Înregistrat": "Зарегистрирован",
"Înregistrează cheltuială": "Регистрация расхода",
@@ -2487,10 +2526,41 @@
"șters": "șters",
"Țară": "Страна",
"Ține-mă minte": "Запомнить меня",
"Автомобиль": "Автомобиль",
"Автосервис / Клиент": "Автосервис / Клиент",
"Время закр. в КЗ, мс": "Время закр. в КЗ, мс",
"Время закрытия, мс": "Время закрытия, мс",
"Время открытия, мс": "Время открытия, мс",
"Герметичность": "Герметичность",
"Год выпуска": "Год выпуска",
"Гос. номер": "Гос. номер",
"ДАННЫЕ АВТОМОБИЛЯ И КЛИЕНТА": "ДАННЫЕ АВТОМОБИЛЯ И КЛИЕНТА",
"Дата выдачи": "Дата выдачи",
"ЗАКЛЮЧЕНИЕ": "ЗАКЛЮЧЕНИЕ",
"Заключение": "Заключение",
"Заполняйте строки по количеству форсунок; лишние строки оставьте пустыми.": "Заполняйте строки по количеству форсунок; лишние строки оставьте пустыми.",
"ИЗМЕРЕНИЯ МЕХАНИКИ ФОРСУНОК": "ИЗМЕРЕНИЯ МЕХАНИКИ ФОРСУНОК",
"Клиент ознакомлен (подпись)": "Клиент ознакомлен (подпись)",
"Кол-во форсунок": "Кол-во форсунок",
"Комментарий / рекомендации мастера": "Комментарий / рекомендации мастера",
"Марка форсунок": "Марка форсунок",
"Мастер (ФИО, подпись)": "Мастер (ФИО, подпись)",
"ПРИЧИНА ОБРАЩЕНИЯ": "ПРИЧИНА ОБРАЩЕНИЯ",
"ПРОТОКОЛ ДИАГНОСТИКИ И ОЧИСТКИ": "ПРОТОКОЛ ДИАГНОСТИКИ И ОЧИСТКИ",
"Пробег, км": "Пробег, км",
"Расход, мл": "Расход, мл",
"Сопротивление, Ом": "Сопротивление, Ом",
"Телефон": "Телефон",
"ФОРСУНКИ": "ФОРСУНКИ",
"ЭЛЕКТРОКЛАПАННЫХ ФОРСУНОК": "ЭЛЕКТРОКЛАПАННЫХ ФОРСУНОК",
"до": "до",
"после": "после",
"— (multe VIN-uri europene nu respectă checksum-ul NA)": "— (multe VIN-uri europene nu respectă checksum-ul NA)",
"— alege —": "— выберите —",
"— fără pod —": "— без поста —",
"— niciunul —": "— niciunul —",
"№": "№",
"№ протокола:": "№ протокола:",
"️": "️",
"← Săpt. anterioară": "← Пред. неделя",
"← Înapoi": "← Назад",