Quellcode durchsuchen

Add boat service mode with configurable service type (#89)

* added boat mode

* translations

* type dropdown

* save button

* lint
Bernt Christian Egeland vor 6 Monaten
Ursprung
Commit
47cbc8929a
96 geänderte Dateien mit 556 neuen und 69 gelöschten Zeilen
  1. 1 0
      messages/de/customers.json
  2. 2 0
      messages/de/pdf.json
  3. 2 0
      messages/de/service.json
  4. 7 1
      messages/de/settings.json
  5. 1 0
      messages/de/share.json
  6. 12 0
      messages/de/vehicles.json
  7. 1 0
      messages/en/customers.json
  8. 2 0
      messages/en/pdf.json
  9. 2 0
      messages/en/service.json
  10. 7 1
      messages/en/settings.json
  11. 1 0
      messages/en/share.json
  12. 12 0
      messages/en/vehicles.json
  13. 1 0
      messages/es/customers.json
  14. 2 0
      messages/es/pdf.json
  15. 2 0
      messages/es/service.json
  16. 7 1
      messages/es/settings.json
  17. 1 0
      messages/es/share.json
  18. 12 0
      messages/es/vehicles.json
  19. 1 0
      messages/fr/customers.json
  20. 2 0
      messages/fr/pdf.json
  21. 2 0
      messages/fr/service.json
  22. 7 1
      messages/fr/settings.json
  23. 1 0
      messages/fr/share.json
  24. 12 0
      messages/fr/vehicles.json
  25. 1 0
      messages/it/customers.json
  26. 2 0
      messages/it/pdf.json
  27. 2 0
      messages/it/service.json
  28. 7 1
      messages/it/settings.json
  29. 1 0
      messages/it/share.json
  30. 12 0
      messages/it/vehicles.json
  31. 1 0
      messages/nb/customers.json
  32. 2 0
      messages/nb/pdf.json
  33. 2 0
      messages/nb/service.json
  34. 7 1
      messages/nb/settings.json
  35. 1 0
      messages/nb/share.json
  36. 12 0
      messages/nb/vehicles.json
  37. 1 0
      messages/nl/customers.json
  38. 2 0
      messages/nl/pdf.json
  39. 2 0
      messages/nl/service.json
  40. 7 1
      messages/nl/settings.json
  41. 1 0
      messages/nl/share.json
  42. 12 0
      messages/nl/vehicles.json
  43. 1 0
      messages/pl/customers.json
  44. 2 0
      messages/pl/pdf.json
  45. 2 0
      messages/pl/service.json
  46. 7 1
      messages/pl/settings.json
  47. 1 0
      messages/pl/share.json
  48. 12 0
      messages/pl/vehicles.json
  49. 1 0
      messages/pt-BR/customers.json
  50. 2 0
      messages/pt-BR/pdf.json
  51. 2 0
      messages/pt-BR/service.json
  52. 7 1
      messages/pt-BR/settings.json
  53. 1 0
      messages/pt-BR/share.json
  54. 12 0
      messages/pt-BR/vehicles.json
  55. 1 0
      messages/ru/customers.json
  56. 2 0
      messages/ru/pdf.json
  57. 2 0
      messages/ru/service.json
  58. 7 1
      messages/ru/settings.json
  59. 1 0
      messages/ru/share.json
  60. 12 0
      messages/ru/vehicles.json
  61. 1 0
      messages/tr/customers.json
  62. 2 0
      messages/tr/pdf.json
  63. 2 0
      messages/tr/service.json
  64. 7 1
      messages/tr/settings.json
  65. 1 0
      messages/tr/share.json
  66. 12 0
      messages/tr/vehicles.json
  67. 3 1
      src/app/(authenticated)/customers/[id]/customer-detail-client.tsx
  68. 3 0
      src/app/(authenticated)/layout.tsx
  69. 16 14
      src/app/(authenticated)/settings/company/company-settings.tsx
  70. 55 0
      src/app/(authenticated)/settings/company/service-type-selector.tsx
  71. 1 1
      src/app/(authenticated)/vehicles/[id]/page.tsx
  72. 3 1
      src/app/(authenticated)/vehicles/[id]/service-records-table.tsx
  73. 8 5
      src/app/(authenticated)/vehicles/[id]/vehicle-detail-client.tsx
  74. 3 1
      src/app/(authenticated)/vehicles/vehicles-client.tsx
  75. 12 4
      src/app/(public)/portal/[orgId]/vehicles/[vehicleId]/page.tsx
  76. 5 3
      src/app/(public)/share/inspection/[orgId]/[token]/inspection-view.tsx
  77. 2 0
      src/app/(public)/share/inspection/[orgId]/[token]/page.tsx
  78. 5 3
      src/app/(public)/share/invoice/[orgId]/[token]/invoice-view.tsx
  79. 2 0
      src/app/(public)/share/invoice/[orgId]/[token]/page.tsx
  80. 2 0
      src/app/(public)/share/quote/[orgId]/[token]/page.tsx
  81. 4 2
      src/app/(public)/share/quote/[orgId]/[token]/quote-view.tsx
  82. 11 0
      src/app/api/protected/inspections/[id]/pdf/route.ts
  83. 8 0
      src/app/api/protected/quotes/[id]/pdf/route.ts
  84. 12 0
      src/app/api/protected/services/[id]/pdf/route.ts
  85. 11 0
      src/app/api/public/share/inspection/[orgId]/[token]/pdf/route.ts
  86. 12 0
      src/app/api/public/share/invoice/[orgId]/[token]/pdf/route.ts
  87. 8 0
      src/app/api/public/share/quote/[orgId]/[token]/pdf/route.ts
  88. 28 0
      src/components/service-type-context.tsx
  89. 3 1
      src/features/inspections/Components/InspectionPageClient.tsx
  90. 4 2
      src/features/inspections/Components/NewInspectionDialog.tsx
  91. 15 2
      src/features/settings/Components/InvoiceLayoutPreviewRenderer.tsx
  92. 1 0
      src/features/settings/Schema/settingsSchema.ts
  93. 34 15
      src/features/vehicles/Components/VehicleForm.tsx
  94. 4 2
      src/features/vehicles/Components/service-detail/ServiceSidebar.tsx
  95. 3 1
      src/features/vehicles/Components/service-edit/BasicInfoSection.tsx
  96. 3 0
      src/lib/get-layout-data.ts

+ 1 - 0
messages/de/customers.json

@@ -40,6 +40,7 @@
       "plate": "Kennzeichen",
       "plate": "Kennzeichen",
       "vehicle": "Fahrzeug",
       "vehicle": "Fahrzeug",
       "mileage": "Kilometerstand",
       "mileage": "Kilometerstand",
+      "mileageBoat": "Betriebsstunden",
       "services": "Wartungen"
       "services": "Wartungen"
     },
     },
     "noVehicles": "Diesem Kunden sind keine Fahrzeuge zugewiesen"
     "noVehicles": "Diesem Kunden sind keine Fahrzeuge zugewiesen"

+ 2 - 0
messages/de/pdf.json

@@ -7,6 +7,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Kennzeichen: {plate}",
     "plate": "Kennzeichen: {plate}",
     "mileage": "Kilometerstand: {mileage}",
     "mileage": "Kilometerstand: {mileage}",
+    "mileageBoat": "Betriebsstunden: {mileage}",
     "km": "km",
     "km": "km",
     "mi": "mi",
     "mi": "mi",
     "service": "Service",
     "service": "Service",
@@ -81,6 +82,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Kennzeichen: {plate}",
     "plate": "Kennzeichen: {plate}",
     "mileage": "Kilometerstand: {mileage}",
     "mileage": "Kilometerstand: {mileage}",
+    "mileageBoat": "Betriebsstunden: {mileage}",
     "customer": "Kunde",
     "customer": "Kunde",
     "inspectionDetails": "Inspektionsdetails",
     "inspectionDetails": "Inspektionsdetails",
     "statusCompleted": "Abgeschlossen",
     "statusCompleted": "Abgeschlossen",

+ 2 - 0
messages/de/service.json

@@ -36,6 +36,7 @@
     "date": "Datum",
     "date": "Datum",
     "type": "Typ",
     "type": "Typ",
     "mileage": "Kilometerstand",
     "mileage": "Kilometerstand",
+    "mileageBoat": "Betriebsstunden",
     "status": "Status",
     "status": "Status",
     "technician": "Techniker",
     "technician": "Techniker",
     "invoiceNumber": "Rechnungsnummer",
     "invoiceNumber": "Rechnungsnummer",
@@ -195,6 +196,7 @@
     "customer": "Kunde",
     "customer": "Kunde",
     "vin": "FIN: {vin}",
     "vin": "FIN: {vin}",
     "mileageAtService": "Kilometerstand bei Service: {mileage} {unit}",
     "mileageAtService": "Kilometerstand bei Service: {mileage} {unit}",
+    "engineHoursAtService": "Betriebsstunden bei Service: {mileage} {unit}",
     "sharedLink": {
     "sharedLink": {
       "title": "Geteilter Link",
       "title": "Geteilter Link",
       "sharedOn": "Geteilt am {date}",
       "sharedOn": "Geteilt am {date}",

+ 7 - 1
messages/de/settings.json

@@ -137,7 +137,13 @@
     "createCompany": "Firma erstellen",
     "createCompany": "Firma erstellen",
     "settingsSaved": "Firmeneinstellungen gespeichert",
     "settingsSaved": "Firmeneinstellungen gespeichert",
     "failedSave": "Einstellungen konnten nicht gespeichert werden",
     "failedSave": "Einstellungen konnten nicht gespeichert werden",
-    "companyCreated": "Firma erfolgreich erstellt"
+    "companyCreated": "Firma erfolgreich erstellt",
+    "serviceType": "Dienstleistungstyp",
+    "serviceTypeDescription": "Wählen Sie die Art der Dienstleistung, die Ihre Werkstatt anbietet. Dies ändert die Feldbezeichnungen in der gesamten Anwendung.",
+    "automotive": "Automobil",
+    "automotiveDescription": "Autos, LKWs und andere Straßenfahrzeuge",
+    "boatService": "Bootsservice",
+    "boatServiceDescription": "Boote, Yachten und Wasserfahrzeuge"
   },
   },
   "account": {
   "account": {
     "profileTitle": "Profil",
     "profileTitle": "Profil",

+ 1 - 0
messages/de/share.json

@@ -109,6 +109,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Kennzeichen: {plate}",
     "plate": "Kennzeichen: {plate}",
     "mileage": "Kilometerstand: {mileage}",
     "mileage": "Kilometerstand: {mileage}",
+    "mileageBoat": "Betriebsstunden: {mileage}",
     "inspected": "geprüft",
     "inspected": "geprüft",
     "pass": "Bestanden",
     "pass": "Bestanden",
     "fail": "Nicht bestanden",
     "fail": "Nicht bestanden",

+ 12 - 0
messages/de/vehicles.json

@@ -12,6 +12,7 @@
       "vehicle": "Fahrzeug",
       "vehicle": "Fahrzeug",
       "customer": "Kunde",
       "customer": "Kunde",
       "mileage": "Kilometerstand",
       "mileage": "Kilometerstand",
+      "mileageBoat": "Betriebsstunden",
       "services": "Services"
       "services": "Services"
     },
     },
     "edit": "Bearbeiten",
     "edit": "Bearbeiten",
@@ -38,6 +39,7 @@
     "notFound": "Fahrzeug nicht gefunden",
     "notFound": "Fahrzeug nicht gefunden",
     "predictedKm": "Prognostizierte Km",
     "predictedKm": "Prognostizierte Km",
     "predictedMileage": "Prognostizierter Kilometerstand",
     "predictedMileage": "Prognostizierter Kilometerstand",
+    "predictedHours": "Geschätzte Stunden",
     "predictedTooltip": "Geschätzter aktueller Kilometerstand basierend auf der Servicehistorie. Der Prozentsatz zeigt die Zuverlässigkeit der Berechnung.",
     "predictedTooltip": "Geschätzter aktueller Kilometerstand basierend auf der Servicehistorie. Der Prozentsatz zeigt die Zuverlässigkeit der Berechnung.",
     "dismissed": "Verworfen",
     "dismissed": "Verworfen",
     "undo": "R\u00fcckg\u00e4ngig",
     "undo": "R\u00fcckg\u00e4ngig",
@@ -141,6 +143,7 @@
       "type": "Typ",
       "type": "Typ",
       "status": "Status",
       "status": "Status",
       "mileage": "Kilometerstand",
       "mileage": "Kilometerstand",
+      "mileageBoat": "Betriebsstunden",
       "technician": "Techniker",
       "technician": "Techniker",
       "files": "Dateien",
       "files": "Dateien",
       "total": "Gesamt"
       "total": "Gesamt"
@@ -210,6 +213,15 @@
     "manual": "Schaltgetriebe",
     "manual": "Schaltgetriebe",
     "cvt": "CVT",
     "cvt": "CVT",
     "engineSize": "Hubraum",
     "engineSize": "Hubraum",
+    "makeBoat": "Hersteller *",
+    "mileageBoat": "Betriebsstunden",
+    "transmissionBoat": "Motortyp",
+    "outboard": "Außenborder",
+    "inboard": "Innenborder",
+    "engineSizeBoat": "Motor",
+    "twoStroke": "Zweitakt",
+    "vinBoat": "HIN",
+    "licensePlateBoat": "Registrierungsnummer",
     "vehicleUpdated": "Fahrzeug aktualisiert",
     "vehicleUpdated": "Fahrzeug aktualisiert",
     "vehicleAdded": "Fahrzeug hinzugef\u00fcgt",
     "vehicleAdded": "Fahrzeug hinzugef\u00fcgt",
     "saveError": "Fehler beim Speichern des Fahrzeugs"
     "saveError": "Fehler beim Speichern des Fahrzeugs"

+ 1 - 0
messages/en/customers.json

@@ -40,6 +40,7 @@
       "plate": "Plate",
       "plate": "Plate",
       "vehicle": "Vehicle",
       "vehicle": "Vehicle",
       "mileage": "Mileage",
       "mileage": "Mileage",
+      "mileageBoat": "Engine Hours",
       "services": "Services"
       "services": "Services"
     },
     },
     "noVehicles": "No vehicles assigned to this customer"
     "noVehicles": "No vehicles assigned to this customer"

+ 2 - 0
messages/en/pdf.json

@@ -7,6 +7,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Plate: {plate}",
     "plate": "Plate: {plate}",
     "mileage": "Mileage: {mileage}",
     "mileage": "Mileage: {mileage}",
+    "mileageBoat": "Engine Hours: {mileage}",
     "km": "km",
     "km": "km",
     "mi": "mi",
     "mi": "mi",
     "service": "Service",
     "service": "Service",
@@ -81,6 +82,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Plate: {plate}",
     "plate": "Plate: {plate}",
     "mileage": "Mileage: {mileage}",
     "mileage": "Mileage: {mileage}",
+    "mileageBoat": "Engine Hours: {mileage}",
     "customer": "Customer",
     "customer": "Customer",
     "inspectionDetails": "Inspection Details",
     "inspectionDetails": "Inspection Details",
     "statusCompleted": "Completed",
     "statusCompleted": "Completed",

+ 2 - 0
messages/en/service.json

@@ -36,6 +36,7 @@
     "date": "Date",
     "date": "Date",
     "type": "Type",
     "type": "Type",
     "mileage": "Mileage",
     "mileage": "Mileage",
+    "mileageBoat": "Engine Hours",
     "status": "Status",
     "status": "Status",
     "technician": "Technician",
     "technician": "Technician",
     "invoiceNumber": "Invoice Number",
     "invoiceNumber": "Invoice Number",
@@ -195,6 +196,7 @@
     "customer": "Customer",
     "customer": "Customer",
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "mileageAtService": "Mileage at service: {mileage} {unit}",
     "mileageAtService": "Mileage at service: {mileage} {unit}",
+    "engineHoursAtService": "Engine hours at service: {mileage} {unit}",
     "sharedLink": {
     "sharedLink": {
       "title": "Shared Link",
       "title": "Shared Link",
       "sharedOn": "Shared on {date}",
       "sharedOn": "Shared on {date}",

+ 7 - 1
messages/en/settings.json

@@ -137,7 +137,13 @@
     "createCompany": "Create Company",
     "createCompany": "Create Company",
     "settingsSaved": "Company settings saved",
     "settingsSaved": "Company settings saved",
     "failedSave": "Failed to save settings",
     "failedSave": "Failed to save settings",
-    "companyCreated": "Company created successfully"
+    "companyCreated": "Company created successfully",
+    "serviceType": "Service Type",
+    "serviceTypeDescription": "Select the type of service your workshop provides. This changes field labels throughout the application.",
+    "automotive": "Automotive",
+    "automotiveDescription": "Cars, trucks, and other road vehicles",
+    "boatService": "Boat Service",
+    "boatServiceDescription": "Boats, yachts, and marine vessels"
   },
   },
   "account": {
   "account": {
     "profileTitle": "Profile",
     "profileTitle": "Profile",

+ 1 - 0
messages/en/share.json

@@ -109,6 +109,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Plate: {plate}",
     "plate": "Plate: {plate}",
     "mileage": "Mileage: {mileage}",
     "mileage": "Mileage: {mileage}",
+    "mileageBoat": "Engine Hours: {mileage}",
     "inspected": "inspected",
     "inspected": "inspected",
     "pass": "Pass",
     "pass": "Pass",
     "fail": "Fail",
     "fail": "Fail",

+ 12 - 0
messages/en/vehicles.json

@@ -12,6 +12,7 @@
       "vehicle": "Vehicle",
       "vehicle": "Vehicle",
       "customer": "Customer",
       "customer": "Customer",
       "mileage": "Mileage",
       "mileage": "Mileage",
+      "mileageBoat": "Engine Hours",
       "services": "Services"
       "services": "Services"
     },
     },
     "edit": "Edit",
     "edit": "Edit",
@@ -38,6 +39,7 @@
     "notFound": "Vehicle not found",
     "notFound": "Vehicle not found",
     "predictedKm": "Predicted Km",
     "predictedKm": "Predicted Km",
     "predictedMileage": "Predicted Mileage",
     "predictedMileage": "Predicted Mileage",
+    "predictedHours": "Predicted Hours",
     "predictedTooltip": "Estimated current mileage based on service history trends. The percentage indicates prediction confidence.",
     "predictedTooltip": "Estimated current mileage based on service history trends. The percentage indicates prediction confidence.",
     "dismissed": "Dismissed",
     "dismissed": "Dismissed",
     "undo": "Undo",
     "undo": "Undo",
@@ -141,6 +143,7 @@
       "type": "Type",
       "type": "Type",
       "status": "Status",
       "status": "Status",
       "mileage": "Mileage",
       "mileage": "Mileage",
+      "mileageBoat": "Engine Hours",
       "technician": "Technician",
       "technician": "Technician",
       "files": "Files",
       "files": "Files",
       "total": "Total"
       "total": "Total"
@@ -210,6 +213,15 @@
     "manual": "Manual",
     "manual": "Manual",
     "cvt": "CVT",
     "cvt": "CVT",
     "engineSize": "Engine Size",
     "engineSize": "Engine Size",
+    "makeBoat": "Manufacturer *",
+    "mileageBoat": "Engine Hours",
+    "transmissionBoat": "Engine Type",
+    "outboard": "Outboard",
+    "inboard": "Inboard",
+    "engineSizeBoat": "Engine",
+    "twoStroke": "Two-Stroke",
+    "vinBoat": "HIN",
+    "licensePlateBoat": "Registration Number",
     "vehicleUpdated": "Vehicle updated",
     "vehicleUpdated": "Vehicle updated",
     "vehicleAdded": "Vehicle added",
     "vehicleAdded": "Vehicle added",
     "saveError": "Failed to save vehicle"
     "saveError": "Failed to save vehicle"

+ 1 - 0
messages/es/customers.json

@@ -40,6 +40,7 @@
       "plate": "Placa",
       "plate": "Placa",
       "vehicle": "Vehículo",
       "vehicle": "Vehículo",
       "mileage": "Kilometraje",
       "mileage": "Kilometraje",
+      "mileageBoat": "Horas de Motor",
       "services": "Servicios"
       "services": "Servicios"
     },
     },
     "noVehicles": "No hay vehículos asignados a este cliente"
     "noVehicles": "No hay vehículos asignados a este cliente"

+ 2 - 0
messages/es/pdf.json

@@ -7,6 +7,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Placa: {plate}",
     "plate": "Placa: {plate}",
     "mileage": "Kilometraje: {mileage}",
     "mileage": "Kilometraje: {mileage}",
+    "mileageBoat": "Horas de Motor: {mileage}",
     "km": "km",
     "km": "km",
     "mi": "mi",
     "mi": "mi",
     "service": "Servicio",
     "service": "Servicio",
@@ -81,6 +82,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Placa: {plate}",
     "plate": "Placa: {plate}",
     "mileage": "Kilometraje: {mileage}",
     "mileage": "Kilometraje: {mileage}",
+    "mileageBoat": "Horas de Motor: {mileage}",
     "customer": "Cliente",
     "customer": "Cliente",
     "inspectionDetails": "Detalles de la inspección",
     "inspectionDetails": "Detalles de la inspección",
     "statusCompleted": "Completado",
     "statusCompleted": "Completado",

+ 2 - 0
messages/es/service.json

@@ -36,6 +36,7 @@
     "date": "Fecha",
     "date": "Fecha",
     "type": "Tipo",
     "type": "Tipo",
     "mileage": "Millaje",
     "mileage": "Millaje",
+    "mileageBoat": "Horas de Motor",
     "status": "Estado",
     "status": "Estado",
     "technician": "Técnico",
     "technician": "Técnico",
     "invoiceNumber": "Número de Factura",
     "invoiceNumber": "Número de Factura",
@@ -195,6 +196,7 @@
     "customer": "Cliente",
     "customer": "Cliente",
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "mileageAtService": "Millaje en el servicio: {mileage} {unit}",
     "mileageAtService": "Millaje en el servicio: {mileage} {unit}",
+    "engineHoursAtService": "Horas de motor en servicio: {mileage} {unit}",
     "sharedLink": {
     "sharedLink": {
       "title": "Enlace compartido",
       "title": "Enlace compartido",
       "sharedOn": "Compartido el {date}",
       "sharedOn": "Compartido el {date}",

+ 7 - 1
messages/es/settings.json

@@ -137,7 +137,13 @@
     "createCompany": "Crear empresa",
     "createCompany": "Crear empresa",
     "settingsSaved": "Configuracion de empresa guardada",
     "settingsSaved": "Configuracion de empresa guardada",
     "failedSave": "Error al guardar la configuracion",
     "failedSave": "Error al guardar la configuracion",
-    "companyCreated": "Empresa creada exitosamente"
+    "companyCreated": "Empresa creada exitosamente",
+    "serviceType": "Tipo de Servicio",
+    "serviceTypeDescription": "Seleccione el tipo de servicio que ofrece su taller. Esto cambia las etiquetas de los campos en toda la aplicación.",
+    "automotive": "Automotriz",
+    "automotiveDescription": "Coches, camiones y otros vehículos de carretera",
+    "boatService": "Servicio Náutico",
+    "boatServiceDescription": "Barcos, yates y embarcaciones"
   },
   },
   "account": {
   "account": {
     "profileTitle": "Perfil",
     "profileTitle": "Perfil",

+ 1 - 0
messages/es/share.json

@@ -109,6 +109,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Placa: {plate}",
     "plate": "Placa: {plate}",
     "mileage": "Kilometraje: {mileage}",
     "mileage": "Kilometraje: {mileage}",
+    "mileageBoat": "Horas de Motor: {mileage}",
     "inspected": "inspeccionado",
     "inspected": "inspeccionado",
     "pass": "Aprobado",
     "pass": "Aprobado",
     "fail": "Reprobado",
     "fail": "Reprobado",

+ 12 - 0
messages/es/vehicles.json

@@ -12,6 +12,7 @@
       "vehicle": "Vehiculo",
       "vehicle": "Vehiculo",
       "customer": "Cliente",
       "customer": "Cliente",
       "mileage": "Kilometraje",
       "mileage": "Kilometraje",
+      "mileageBoat": "Horas de Motor",
       "services": "Servicios"
       "services": "Servicios"
     },
     },
     "edit": "Editar",
     "edit": "Editar",
@@ -38,6 +39,7 @@
     "notFound": "Vehiculo no encontrado",
     "notFound": "Vehiculo no encontrado",
     "predictedKm": "Km predichos",
     "predictedKm": "Km predichos",
     "predictedMileage": "Kilometraje predicho",
     "predictedMileage": "Kilometraje predicho",
+    "predictedHours": "Horas Previstas",
     "predictedTooltip": "Kilometraje actual estimado basado en el historial de servicio. El porcentaje indica la confianza de la predicción.",
     "predictedTooltip": "Kilometraje actual estimado basado en el historial de servicio. El porcentaje indica la confianza de la predicción.",
     "dismissed": "Descartado",
     "dismissed": "Descartado",
     "undo": "Deshacer",
     "undo": "Deshacer",
@@ -141,6 +143,7 @@
       "type": "Tipo",
       "type": "Tipo",
       "status": "Estado",
       "status": "Estado",
       "mileage": "Kilometraje",
       "mileage": "Kilometraje",
+      "mileageBoat": "Horas de Motor",
       "technician": "Tecnico",
       "technician": "Tecnico",
       "files": "Archivos",
       "files": "Archivos",
       "total": "Total"
       "total": "Total"
@@ -210,6 +213,15 @@
     "manual": "Manual",
     "manual": "Manual",
     "cvt": "CVT",
     "cvt": "CVT",
     "engineSize": "Tamano del motor",
     "engineSize": "Tamano del motor",
+    "makeBoat": "Fabricante *",
+    "mileageBoat": "Horas de Motor",
+    "transmissionBoat": "Tipo de Motor",
+    "outboard": "Fueraborda",
+    "inboard": "Intraborda",
+    "engineSizeBoat": "Motor",
+    "twoStroke": "Dos Tiempos",
+    "vinBoat": "HIN",
+    "licensePlateBoat": "Número de Registro",
     "vehicleUpdated": "Vehiculo actualizado",
     "vehicleUpdated": "Vehiculo actualizado",
     "vehicleAdded": "Vehiculo agregado",
     "vehicleAdded": "Vehiculo agregado",
     "saveError": "Error al guardar vehiculo"
     "saveError": "Error al guardar vehiculo"

+ 1 - 0
messages/fr/customers.json

@@ -40,6 +40,7 @@
       "plate": "Plaque",
       "plate": "Plaque",
       "vehicle": "Véhicule",
       "vehicle": "Véhicule",
       "mileage": "Kilométrage",
       "mileage": "Kilométrage",
+      "mileageBoat": "Heures Moteur",
       "services": "Services"
       "services": "Services"
     },
     },
     "noVehicles": "Aucun véhicule associé à ce client"
     "noVehicles": "Aucun véhicule associé à ce client"

+ 2 - 0
messages/fr/pdf.json

@@ -7,6 +7,7 @@
     "vin": "VIN : {vin}",
     "vin": "VIN : {vin}",
     "plate": "Plaque : {plate}",
     "plate": "Plaque : {plate}",
     "mileage": "Kilométrage : {mileage}",
     "mileage": "Kilométrage : {mileage}",
+    "mileageBoat": "Heures Moteur: {mileage}",
     "km": "km",
     "km": "km",
     "mi": "mi",
     "mi": "mi",
     "service": "Service",
     "service": "Service",
@@ -81,6 +82,7 @@
     "vin": "VIN : {vin}",
     "vin": "VIN : {vin}",
     "plate": "Plaque : {plate}",
     "plate": "Plaque : {plate}",
     "mileage": "Kilométrage : {mileage}",
     "mileage": "Kilométrage : {mileage}",
+    "mileageBoat": "Heures Moteur: {mileage}",
     "customer": "Client",
     "customer": "Client",
     "inspectionDetails": "Détails de l'inspection",
     "inspectionDetails": "Détails de l'inspection",
     "statusCompleted": "Terminé",
     "statusCompleted": "Terminé",

+ 2 - 0
messages/fr/service.json

@@ -36,6 +36,7 @@
     "date": "Date",
     "date": "Date",
     "type": "Type",
     "type": "Type",
     "mileage": "Kilométrage",
     "mileage": "Kilométrage",
+    "mileageBoat": "Heures Moteur",
     "status": "Statut",
     "status": "Statut",
     "technician": "Technicien",
     "technician": "Technicien",
     "invoiceNumber": "Numéro de Facture",
     "invoiceNumber": "Numéro de Facture",
@@ -195,6 +196,7 @@
     "customer": "Client",
     "customer": "Client",
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "mileageAtService": "Kilométrage au service: {mileage} {unit}",
     "mileageAtService": "Kilométrage au service: {mileage} {unit}",
+    "engineHoursAtService": "Heures moteur au service: {mileage} {unit}",
     "sharedLink": {
     "sharedLink": {
       "title": "Lien partagé",
       "title": "Lien partagé",
       "sharedOn": "Partagé le {date}",
       "sharedOn": "Partagé le {date}",

+ 7 - 1
messages/fr/settings.json

@@ -137,7 +137,13 @@
     "createCompany": "Creer l'entreprise",
     "createCompany": "Creer l'entreprise",
     "settingsSaved": "Parametres de l'entreprise enregistres",
     "settingsSaved": "Parametres de l'entreprise enregistres",
     "failedSave": "Echec de l'enregistrement des parametres",
     "failedSave": "Echec de l'enregistrement des parametres",
-    "companyCreated": "Entreprise creee avec succes"
+    "companyCreated": "Entreprise creee avec succes",
+    "serviceType": "Type de Service",
+    "serviceTypeDescription": "Sélectionnez le type de service proposé par votre atelier. Cela modifie les libellés des champs dans toute l'application.",
+    "automotive": "Automobile",
+    "automotiveDescription": "Voitures, camions et autres véhicules routiers",
+    "boatService": "Service Nautique",
+    "boatServiceDescription": "Bateaux, yachts et navires"
   },
   },
   "account": {
   "account": {
     "profileTitle": "Profil",
     "profileTitle": "Profil",

+ 1 - 0
messages/fr/share.json

@@ -109,6 +109,7 @@
     "vin": "VIN : {vin}",
     "vin": "VIN : {vin}",
     "plate": "Plaque : {plate}",
     "plate": "Plaque : {plate}",
     "mileage": "Kilométrage : {mileage}",
     "mileage": "Kilométrage : {mileage}",
+    "mileageBoat": "Heures Moteur: {mileage}",
     "inspected": "inspecté",
     "inspected": "inspecté",
     "pass": "Conforme",
     "pass": "Conforme",
     "fail": "Non conforme",
     "fail": "Non conforme",

+ 12 - 0
messages/fr/vehicles.json

@@ -12,6 +12,7 @@
       "vehicle": "V\u00e9hicule",
       "vehicle": "V\u00e9hicule",
       "customer": "Client",
       "customer": "Client",
       "mileage": "Kilom\u00e9trage",
       "mileage": "Kilom\u00e9trage",
+      "mileageBoat": "Heures Moteur",
       "services": "Services"
       "services": "Services"
     },
     },
     "edit": "Modifier",
     "edit": "Modifier",
@@ -38,6 +39,7 @@
     "notFound": "V\u00e9hicule introuvable",
     "notFound": "V\u00e9hicule introuvable",
     "predictedKm": "Km pr\u00e9vus",
     "predictedKm": "Km pr\u00e9vus",
     "predictedMileage": "Kilom\u00e9trage pr\u00e9vu",
     "predictedMileage": "Kilom\u00e9trage pr\u00e9vu",
+    "predictedHours": "Heures Prévues",
     "predictedTooltip": "Kilom\u00e9trage actuel estim\u00e9 bas\u00e9 sur l'historique d'entretien. Le pourcentage indique la fiabilit\u00e9 de la pr\u00e9diction.",
     "predictedTooltip": "Kilom\u00e9trage actuel estim\u00e9 bas\u00e9 sur l'historique d'entretien. Le pourcentage indique la fiabilit\u00e9 de la pr\u00e9diction.",
     "dismissed": "Ignor\u00e9",
     "dismissed": "Ignor\u00e9",
     "undo": "Annuler",
     "undo": "Annuler",
@@ -141,6 +143,7 @@
       "type": "Type",
       "type": "Type",
       "status": "Statut",
       "status": "Statut",
       "mileage": "Kilom\u00e9trage",
       "mileage": "Kilom\u00e9trage",
+      "mileageBoat": "Heures Moteur",
       "technician": "Technicien",
       "technician": "Technicien",
       "files": "Fichiers",
       "files": "Fichiers",
       "total": "Total"
       "total": "Total"
@@ -210,6 +213,15 @@
     "manual": "Manuelle",
     "manual": "Manuelle",
     "cvt": "CVT",
     "cvt": "CVT",
     "engineSize": "Cylindr\u00e9e",
     "engineSize": "Cylindr\u00e9e",
+    "makeBoat": "Fabricant *",
+    "mileageBoat": "Heures Moteur",
+    "transmissionBoat": "Type de Moteur",
+    "outboard": "Hors-bord",
+    "inboard": "In-bord",
+    "engineSizeBoat": "Moteur",
+    "twoStroke": "Deux Temps",
+    "vinBoat": "HIN",
+    "licensePlateBoat": "Numéro d'Immatriculation",
     "vehicleUpdated": "V\u00e9hicule mis \u00e0 jour",
     "vehicleUpdated": "V\u00e9hicule mis \u00e0 jour",
     "vehicleAdded": "V\u00e9hicule ajout\u00e9",
     "vehicleAdded": "V\u00e9hicule ajout\u00e9",
     "saveError": "\u00c9chec de l'enregistrement du v\u00e9hicule"
     "saveError": "\u00c9chec de l'enregistrement du v\u00e9hicule"

+ 1 - 0
messages/it/customers.json

@@ -40,6 +40,7 @@
       "plate": "Targa",
       "plate": "Targa",
       "vehicle": "Veicolo",
       "vehicle": "Veicolo",
       "mileage": "Chilometraggio",
       "mileage": "Chilometraggio",
+      "mileageBoat": "Ore Motore",
       "services": "Servizi"
       "services": "Servizi"
     },
     },
     "noVehicles": "Nessun veicolo assegnato a questo cliente"
     "noVehicles": "Nessun veicolo assegnato a questo cliente"

+ 2 - 0
messages/it/pdf.json

@@ -7,6 +7,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Targa: {plate}",
     "plate": "Targa: {plate}",
     "mileage": "Chilometraggio: {mileage}",
     "mileage": "Chilometraggio: {mileage}",
+    "mileageBoat": "Ore Motore: {mileage}",
     "km": "km",
     "km": "km",
     "mi": "mi",
     "mi": "mi",
     "service": "Servizio",
     "service": "Servizio",
@@ -81,6 +82,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Targa: {plate}",
     "plate": "Targa: {plate}",
     "mileage": "Chilometraggio: {mileage}",
     "mileage": "Chilometraggio: {mileage}",
+    "mileageBoat": "Ore Motore: {mileage}",
     "customer": "Cliente",
     "customer": "Cliente",
     "inspectionDetails": "Dettagli Ispezione",
     "inspectionDetails": "Dettagli Ispezione",
     "statusCompleted": "Completato",
     "statusCompleted": "Completato",

+ 2 - 0
messages/it/service.json

@@ -36,6 +36,7 @@
     "date": "Data",
     "date": "Data",
     "type": "Tipo",
     "type": "Tipo",
     "mileage": "Chilometraggio",
     "mileage": "Chilometraggio",
+    "mileageBoat": "Ore Motore",
     "status": "Stato",
     "status": "Stato",
     "technician": "Tecnico",
     "technician": "Tecnico",
     "invoiceNumber": "Numero Fattura",
     "invoiceNumber": "Numero Fattura",
@@ -195,6 +196,7 @@
     "customer": "Cliente",
     "customer": "Cliente",
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "mileageAtService": "Chilometraggio al servizio: {mileage} {unit}",
     "mileageAtService": "Chilometraggio al servizio: {mileage} {unit}",
+    "engineHoursAtService": "Ore motore al servizio: {mileage} {unit}",
     "sharedLink": {
     "sharedLink": {
       "title": "Link condiviso",
       "title": "Link condiviso",
       "sharedOn": "Condiviso il {date}",
       "sharedOn": "Condiviso il {date}",

+ 7 - 1
messages/it/settings.json

@@ -137,7 +137,13 @@
     "createCompany": "Crea azienda",
     "createCompany": "Crea azienda",
     "settingsSaved": "Impostazioni aziendali salvate",
     "settingsSaved": "Impostazioni aziendali salvate",
     "failedSave": "Salvataggio impostazioni non riuscito",
     "failedSave": "Salvataggio impostazioni non riuscito",
-    "companyCreated": "Azienda creata con successo"
+    "companyCreated": "Azienda creata con successo",
+    "serviceType": "Tipo di Servizio",
+    "serviceTypeDescription": "Seleziona il tipo di servizio offerto dalla tua officina. Questo cambia le etichette dei campi in tutta l'applicazione.",
+    "automotive": "Automobilistico",
+    "automotiveDescription": "Auto, camion e altri veicoli stradali",
+    "boatService": "Servizio Nautico",
+    "boatServiceDescription": "Barche, yacht e imbarcazioni"
   },
   },
   "account": {
   "account": {
     "profileTitle": "Profilo",
     "profileTitle": "Profilo",

+ 1 - 0
messages/it/share.json

@@ -109,6 +109,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Targa: {plate}",
     "plate": "Targa: {plate}",
     "mileage": "Chilometraggio: {mileage}",
     "mileage": "Chilometraggio: {mileage}",
+    "mileageBoat": "Ore Motore: {mileage}",
     "inspected": "ispezionato",
     "inspected": "ispezionato",
     "pass": "Superato",
     "pass": "Superato",
     "fail": "Non Superato",
     "fail": "Non Superato",

+ 12 - 0
messages/it/vehicles.json

@@ -12,6 +12,7 @@
       "vehicle": "Veicolo",
       "vehicle": "Veicolo",
       "customer": "Cliente",
       "customer": "Cliente",
       "mileage": "Chilometraggio",
       "mileage": "Chilometraggio",
+      "mileageBoat": "Ore Motore",
       "services": "Interventi"
       "services": "Interventi"
     },
     },
     "edit": "Modifica",
     "edit": "Modifica",
@@ -38,6 +39,7 @@
     "notFound": "Veicolo non trovato",
     "notFound": "Veicolo non trovato",
     "predictedKm": "Km Previsti",
     "predictedKm": "Km Previsti",
     "predictedMileage": "Chilometraggio Previsto",
     "predictedMileage": "Chilometraggio Previsto",
+    "predictedHours": "Ore Previste",
     "predictedTooltip": "Chilometraggio attuale stimato in base alla cronologia dei servizi. La percentuale indica l'affidabilità della previsione.",
     "predictedTooltip": "Chilometraggio attuale stimato in base alla cronologia dei servizi. La percentuale indica l'affidabilità della previsione.",
     "dismissed": "Ignorato",
     "dismissed": "Ignorato",
     "undo": "Annulla",
     "undo": "Annulla",
@@ -141,6 +143,7 @@
       "type": "Tipo",
       "type": "Tipo",
       "status": "Stato",
       "status": "Stato",
       "mileage": "Chilometraggio",
       "mileage": "Chilometraggio",
+      "mileageBoat": "Ore Motore",
       "technician": "Tecnico",
       "technician": "Tecnico",
       "files": "File",
       "files": "File",
       "total": "Totale"
       "total": "Totale"
@@ -210,6 +213,15 @@
     "manual": "Manuale",
     "manual": "Manuale",
     "cvt": "CVT",
     "cvt": "CVT",
     "engineSize": "Cilindrata",
     "engineSize": "Cilindrata",
+    "makeBoat": "Costruttore *",
+    "mileageBoat": "Ore Motore",
+    "transmissionBoat": "Tipo di Motore",
+    "outboard": "Fuoribordo",
+    "inboard": "Entrobordo",
+    "engineSizeBoat": "Motore",
+    "twoStroke": "Due Tempi",
+    "vinBoat": "HIN",
+    "licensePlateBoat": "Numero di Registrazione",
     "vehicleUpdated": "Veicolo aggiornato",
     "vehicleUpdated": "Veicolo aggiornato",
     "vehicleAdded": "Veicolo aggiunto",
     "vehicleAdded": "Veicolo aggiunto",
     "saveError": "Impossibile salvare il veicolo"
     "saveError": "Impossibile salvare il veicolo"

+ 1 - 0
messages/nb/customers.json

@@ -40,6 +40,7 @@
       "plate": "Registreringsnummer",
       "plate": "Registreringsnummer",
       "vehicle": "Kjøretøy",
       "vehicle": "Kjøretøy",
       "mileage": "Kilometerstand",
       "mileage": "Kilometerstand",
+      "mileageBoat": "Motortimer",
       "services": "Tjenester"
       "services": "Tjenester"
     },
     },
     "noVehicles": "Ingen kjøretøy tilknyttet denne kunden"
     "noVehicles": "Ingen kjøretøy tilknyttet denne kunden"

+ 2 - 0
messages/nb/pdf.json

@@ -7,6 +7,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Reg.nr: {plate}",
     "plate": "Reg.nr: {plate}",
     "mileage": "Kilometerstand: {mileage}",
     "mileage": "Kilometerstand: {mileage}",
+    "mileageBoat": "Motortimer: {mileage}",
     "km": "km",
     "km": "km",
     "mi": "mi",
     "mi": "mi",
     "service": "Tjeneste",
     "service": "Tjeneste",
@@ -81,6 +82,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Reg.nr: {plate}",
     "plate": "Reg.nr: {plate}",
     "mileage": "Kilometerstand: {mileage}",
     "mileage": "Kilometerstand: {mileage}",
+    "mileageBoat": "Motortimer: {mileage}",
     "customer": "Kunde",
     "customer": "Kunde",
     "inspectionDetails": "Kontrolldetaljer",
     "inspectionDetails": "Kontrolldetaljer",
     "statusCompleted": "Fullført",
     "statusCompleted": "Fullført",

+ 2 - 0
messages/nb/service.json

@@ -36,6 +36,7 @@
     "date": "Dato",
     "date": "Dato",
     "type": "Type",
     "type": "Type",
     "mileage": "Kilometerstand",
     "mileage": "Kilometerstand",
+    "mileageBoat": "Motortimer",
     "status": "Status",
     "status": "Status",
     "technician": "Tekniker",
     "technician": "Tekniker",
     "invoiceNumber": "Fakturanummer",
     "invoiceNumber": "Fakturanummer",
@@ -195,6 +196,7 @@
     "customer": "Kunde",
     "customer": "Kunde",
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "mileageAtService": "Kilometerstand ved service: {mileage} {unit}",
     "mileageAtService": "Kilometerstand ved service: {mileage} {unit}",
+    "engineHoursAtService": "Motortimer ved service: {mileage} {unit}",
     "sharedLink": {
     "sharedLink": {
       "title": "Delt lenke",
       "title": "Delt lenke",
       "sharedOn": "Delt {date}",
       "sharedOn": "Delt {date}",

+ 7 - 1
messages/nb/settings.json

@@ -137,7 +137,13 @@
     "createCompany": "Opprett bedrift",
     "createCompany": "Opprett bedrift",
     "settingsSaved": "Bedriftsinnstillinger lagret",
     "settingsSaved": "Bedriftsinnstillinger lagret",
     "failedSave": "Kunne ikke lagre innstillinger",
     "failedSave": "Kunne ikke lagre innstillinger",
-    "companyCreated": "Bedrift opprettet"
+    "companyCreated": "Bedrift opprettet",
+    "serviceType": "Tjenestetype",
+    "serviceTypeDescription": "Velg typen tjeneste verkstedet ditt tilbyr. Dette endrer feltetiketter i hele applikasjonen.",
+    "automotive": "Bil",
+    "automotiveDescription": "Biler, lastebiler og andre kjøretøy",
+    "boatService": "Båtservice",
+    "boatServiceDescription": "Båter, yachter og fartøy"
   },
   },
   "account": {
   "account": {
     "profileTitle": "Profil",
     "profileTitle": "Profil",

+ 1 - 0
messages/nb/share.json

@@ -109,6 +109,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Reg.nr: {plate}",
     "plate": "Reg.nr: {plate}",
     "mileage": "Kilometerstand: {mileage}",
     "mileage": "Kilometerstand: {mileage}",
+    "mileageBoat": "Motortimer: {mileage}",
     "inspected": "kontrollert",
     "inspected": "kontrollert",
     "pass": "Godkjent",
     "pass": "Godkjent",
     "fail": "Ikke godkjent",
     "fail": "Ikke godkjent",

+ 12 - 0
messages/nb/vehicles.json

@@ -12,6 +12,7 @@
       "vehicle": "Kjoretoy",
       "vehicle": "Kjoretoy",
       "customer": "Kunde",
       "customer": "Kunde",
       "mileage": "Kilometerstand",
       "mileage": "Kilometerstand",
+      "mileageBoat": "Motortimer",
       "services": "Tjenester"
       "services": "Tjenester"
     },
     },
     "edit": "Rediger",
     "edit": "Rediger",
@@ -38,6 +39,7 @@
     "notFound": "Kjoretoy ikke funnet",
     "notFound": "Kjoretoy ikke funnet",
     "predictedKm": "Beregnet km",
     "predictedKm": "Beregnet km",
     "predictedMileage": "Beregnet kilometerstand",
     "predictedMileage": "Beregnet kilometerstand",
+    "predictedHours": "Beregnede Timer",
     "predictedTooltip": "Estimert kilometerstand basert på servicehistorikk. Prosenten viser hvor sikker beregningen er.",
     "predictedTooltip": "Estimert kilometerstand basert på servicehistorikk. Prosenten viser hvor sikker beregningen er.",
     "dismissed": "Avvist",
     "dismissed": "Avvist",
     "undo": "Angre",
     "undo": "Angre",
@@ -141,6 +143,7 @@
       "type": "Type",
       "type": "Type",
       "status": "Status",
       "status": "Status",
       "mileage": "Kilometerstand",
       "mileage": "Kilometerstand",
+      "mileageBoat": "Motortimer",
       "technician": "Mekaniker",
       "technician": "Mekaniker",
       "files": "Filer",
       "files": "Filer",
       "total": "Totalt"
       "total": "Totalt"
@@ -210,6 +213,15 @@
     "manual": "Manuell",
     "manual": "Manuell",
     "cvt": "CVT",
     "cvt": "CVT",
     "engineSize": "Motorstorrelse",
     "engineSize": "Motorstorrelse",
+    "makeBoat": "Produsent *",
+    "mileageBoat": "Motortimer",
+    "transmissionBoat": "Motortype",
+    "outboard": "Utenbords",
+    "inboard": "Innenbords",
+    "engineSizeBoat": "Motor",
+    "twoStroke": "Totakt",
+    "vinBoat": "HIN",
+    "licensePlateBoat": "Registreringsnummer",
     "vehicleUpdated": "Kjoretoy oppdatert",
     "vehicleUpdated": "Kjoretoy oppdatert",
     "vehicleAdded": "Kjoretoy lagt til",
     "vehicleAdded": "Kjoretoy lagt til",
     "saveError": "Kunne ikke lagre kjoretoy"
     "saveError": "Kunne ikke lagre kjoretoy"

+ 1 - 0
messages/nl/customers.json

@@ -40,6 +40,7 @@
       "plate": "Kenteken",
       "plate": "Kenteken",
       "vehicle": "Voertuig",
       "vehicle": "Voertuig",
       "mileage": "Kilometerstand",
       "mileage": "Kilometerstand",
+      "mileageBoat": "Motoruren",
       "services": "Services"
       "services": "Services"
     },
     },
     "noVehicles": "Geen voertuigen gekoppeld aan deze klant"
     "noVehicles": "Geen voertuigen gekoppeld aan deze klant"

+ 2 - 0
messages/nl/pdf.json

@@ -7,6 +7,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Kenteken: {plate}",
     "plate": "Kenteken: {plate}",
     "mileage": "Kilometerstand: {mileage}",
     "mileage": "Kilometerstand: {mileage}",
+    "mileageBoat": "Motoruren: {mileage}",
     "km": "km",
     "km": "km",
     "mi": "mi",
     "mi": "mi",
     "service": "Service",
     "service": "Service",
@@ -81,6 +82,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Kenteken: {plate}",
     "plate": "Kenteken: {plate}",
     "mileage": "Kilometerstand: {mileage}",
     "mileage": "Kilometerstand: {mileage}",
+    "mileageBoat": "Motoruren: {mileage}",
     "customer": "Klant",
     "customer": "Klant",
     "inspectionDetails": "Inspectiedetails",
     "inspectionDetails": "Inspectiedetails",
     "statusCompleted": "Afgerond",
     "statusCompleted": "Afgerond",

+ 2 - 0
messages/nl/service.json

@@ -36,6 +36,7 @@
     "date": "Datum",
     "date": "Datum",
     "type": "Type",
     "type": "Type",
     "mileage": "Kilometerstand",
     "mileage": "Kilometerstand",
+    "mileageBoat": "Motoruren",
     "status": "Status",
     "status": "Status",
     "technician": "Technicus",
     "technician": "Technicus",
     "invoiceNumber": "Factuurnummer",
     "invoiceNumber": "Factuurnummer",
@@ -195,6 +196,7 @@
     "customer": "Klant",
     "customer": "Klant",
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "mileageAtService": "Kilometerstand bij service: {mileage} {unit}",
     "mileageAtService": "Kilometerstand bij service: {mileage} {unit}",
+    "engineHoursAtService": "Motoruren bij service: {mileage} {unit}",
     "sharedLink": {
     "sharedLink": {
       "title": "Gedeelde link",
       "title": "Gedeelde link",
       "sharedOn": "Gedeeld op {date}",
       "sharedOn": "Gedeeld op {date}",

+ 7 - 1
messages/nl/settings.json

@@ -137,7 +137,13 @@
     "createCompany": "Bedrijf aanmaken",
     "createCompany": "Bedrijf aanmaken",
     "settingsSaved": "Bedrijfsinstellingen opgeslagen",
     "settingsSaved": "Bedrijfsinstellingen opgeslagen",
     "failedSave": "Instellingen opslaan mislukt",
     "failedSave": "Instellingen opslaan mislukt",
-    "companyCreated": "Bedrijf succesvol aangemaakt"
+    "companyCreated": "Bedrijf succesvol aangemaakt",
+    "serviceType": "Servicetype",
+    "serviceTypeDescription": "Selecteer het type service dat uw werkplaats biedt. Dit verandert de veldlabels in de hele applicatie.",
+    "automotive": "Auto",
+    "automotiveDescription": "Auto's, vrachtwagens en andere wegvoertuigen",
+    "boatService": "Bootservice",
+    "boatServiceDescription": "Boten, jachten en vaartuigen"
   },
   },
   "account": {
   "account": {
     "profileTitle": "Profiel",
     "profileTitle": "Profiel",

+ 1 - 0
messages/nl/share.json

@@ -109,6 +109,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Kenteken: {plate}",
     "plate": "Kenteken: {plate}",
     "mileage": "Kilometerstand: {mileage}",
     "mileage": "Kilometerstand: {mileage}",
+    "mileageBoat": "Motoruren: {mileage}",
     "inspected": "geïnspecteerd",
     "inspected": "geïnspecteerd",
     "pass": "Goedgekeurd",
     "pass": "Goedgekeurd",
     "fail": "Afgekeurd",
     "fail": "Afgekeurd",

+ 12 - 0
messages/nl/vehicles.json

@@ -12,6 +12,7 @@
       "vehicle": "Voertuig",
       "vehicle": "Voertuig",
       "customer": "Klant",
       "customer": "Klant",
       "mileage": "Kilometerstand",
       "mileage": "Kilometerstand",
+      "mileageBoat": "Motoruren",
       "services": "Onderhoud"
       "services": "Onderhoud"
     },
     },
     "edit": "Bewerken",
     "edit": "Bewerken",
@@ -38,6 +39,7 @@
     "notFound": "Voertuig niet gevonden",
     "notFound": "Voertuig niet gevonden",
     "predictedKm": "Voorspelde km",
     "predictedKm": "Voorspelde km",
     "predictedMileage": "Voorspelde kilometerstand",
     "predictedMileage": "Voorspelde kilometerstand",
+    "predictedHours": "Geschatte Uren",
     "predictedTooltip": "Geschatte huidige kilometerstand op basis van servicehistorie. Het percentage geeft de betrouwbaarheid van de voorspelling aan.",
     "predictedTooltip": "Geschatte huidige kilometerstand op basis van servicehistorie. Het percentage geeft de betrouwbaarheid van de voorspelling aan.",
     "dismissed": "Genegeerd",
     "dismissed": "Genegeerd",
     "undo": "Ongedaan maken",
     "undo": "Ongedaan maken",
@@ -141,6 +143,7 @@
       "type": "Type",
       "type": "Type",
       "status": "Status",
       "status": "Status",
       "mileage": "Kilometerstand",
       "mileage": "Kilometerstand",
+      "mileageBoat": "Motoruren",
       "technician": "Monteur",
       "technician": "Monteur",
       "files": "Bestanden",
       "files": "Bestanden",
       "total": "Totaal"
       "total": "Totaal"
@@ -210,6 +213,15 @@
     "manual": "Handgeschakeld",
     "manual": "Handgeschakeld",
     "cvt": "CVT",
     "cvt": "CVT",
     "engineSize": "Motorinhoud",
     "engineSize": "Motorinhoud",
+    "makeBoat": "Fabrikant *",
+    "mileageBoat": "Motoruren",
+    "transmissionBoat": "Motortype",
+    "outboard": "Buitenboord",
+    "inboard": "Binnenboord",
+    "engineSizeBoat": "Motor",
+    "twoStroke": "Tweetakt",
+    "vinBoat": "HIN",
+    "licensePlateBoat": "Registratienummer",
     "vehicleUpdated": "Voertuig bijgewerkt",
     "vehicleUpdated": "Voertuig bijgewerkt",
     "vehicleAdded": "Voertuig toegevoegd",
     "vehicleAdded": "Voertuig toegevoegd",
     "saveError": "Opslaan van voertuig mislukt"
     "saveError": "Opslaan van voertuig mislukt"

+ 1 - 0
messages/pl/customers.json

@@ -40,6 +40,7 @@
       "plate": "Tablica",
       "plate": "Tablica",
       "vehicle": "Pojazd",
       "vehicle": "Pojazd",
       "mileage": "Przebieg",
       "mileage": "Przebieg",
+      "mileageBoat": "Godziny Pracy",
       "services": "Usługi"
       "services": "Usługi"
     },
     },
     "noVehicles": "Brak pojazdów przypisanych do tego klienta"
     "noVehicles": "Brak pojazdów przypisanych do tego klienta"

+ 2 - 0
messages/pl/pdf.json

@@ -7,6 +7,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Tablica: {plate}",
     "plate": "Tablica: {plate}",
     "mileage": "Przebieg: {mileage}",
     "mileage": "Przebieg: {mileage}",
+    "mileageBoat": "Godziny Pracy: {mileage}",
     "km": "km",
     "km": "km",
     "mi": "mi",
     "mi": "mi",
     "service": "Usługa",
     "service": "Usługa",
@@ -81,6 +82,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Tablica: {plate}",
     "plate": "Tablica: {plate}",
     "mileage": "Przebieg: {mileage}",
     "mileage": "Przebieg: {mileage}",
+    "mileageBoat": "Godziny Pracy: {mileage}",
     "customer": "Klient",
     "customer": "Klient",
     "inspectionDetails": "Szczegóły inspekcji",
     "inspectionDetails": "Szczegóły inspekcji",
     "statusCompleted": "Ukończono",
     "statusCompleted": "Ukończono",

+ 2 - 0
messages/pl/service.json

@@ -36,6 +36,7 @@
     "date": "Data",
     "date": "Data",
     "type": "Typ",
     "type": "Typ",
     "mileage": "Przebieg",
     "mileage": "Przebieg",
+    "mileageBoat": "Godziny Pracy",
     "status": "Status",
     "status": "Status",
     "technician": "Technik",
     "technician": "Technik",
     "invoiceNumber": "Numer Faktury",
     "invoiceNumber": "Numer Faktury",
@@ -195,6 +196,7 @@
     "customer": "Klient",
     "customer": "Klient",
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "mileageAtService": "Przebieg w chwili serwisu: {mileage} {unit}",
     "mileageAtService": "Przebieg w chwili serwisu: {mileage} {unit}",
+    "engineHoursAtService": "Godziny pracy przy serwisie: {mileage} {unit}",
     "sharedLink": {
     "sharedLink": {
       "title": "Udostępniony link",
       "title": "Udostępniony link",
       "sharedOn": "Udostępniono {date}",
       "sharedOn": "Udostępniono {date}",

+ 7 - 1
messages/pl/settings.json

@@ -137,7 +137,13 @@
     "createCompany": "Utworz firme",
     "createCompany": "Utworz firme",
     "settingsSaved": "Ustawienia firmy zapisane",
     "settingsSaved": "Ustawienia firmy zapisane",
     "failedSave": "Nie udalo sie zapisac ustawien",
     "failedSave": "Nie udalo sie zapisac ustawien",
-    "companyCreated": "Firma utworzona pomyslnie"
+    "companyCreated": "Firma utworzona pomyslnie",
+    "serviceType": "Typ Usługi",
+    "serviceTypeDescription": "Wybierz typ usługi oferowanej przez Twój warsztat. Zmienia to etykiety pól w całej aplikacji.",
+    "automotive": "Motoryzacja",
+    "automotiveDescription": "Samochody, ciężarówki i inne pojazdy drogowe",
+    "boatService": "Serwis Łodzi",
+    "boatServiceDescription": "Łodzie, jachty i jednostki pływające"
   },
   },
   "account": {
   "account": {
     "profileTitle": "Profil",
     "profileTitle": "Profil",

+ 1 - 0
messages/pl/share.json

@@ -109,6 +109,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Tablica: {plate}",
     "plate": "Tablica: {plate}",
     "mileage": "Przebieg: {mileage}",
     "mileage": "Przebieg: {mileage}",
+    "mileageBoat": "Godziny Pracy: {mileage}",
     "inspected": "sprawdzono",
     "inspected": "sprawdzono",
     "pass": "Zaliczono",
     "pass": "Zaliczono",
     "fail": "Nie zaliczono",
     "fail": "Nie zaliczono",

+ 12 - 0
messages/pl/vehicles.json

@@ -12,6 +12,7 @@
       "vehicle": "Pojazd",
       "vehicle": "Pojazd",
       "customer": "Klient",
       "customer": "Klient",
       "mileage": "Przebieg",
       "mileage": "Przebieg",
+      "mileageBoat": "Godziny Pracy",
       "services": "Usługi"
       "services": "Usługi"
     },
     },
     "edit": "Edytuj",
     "edit": "Edytuj",
@@ -38,6 +39,7 @@
     "notFound": "Nie znaleziono pojazdu",
     "notFound": "Nie znaleziono pojazdu",
     "predictedKm": "Przewidywane km",
     "predictedKm": "Przewidywane km",
     "predictedMileage": "Przewidywany przebieg",
     "predictedMileage": "Przewidywany przebieg",
+    "predictedHours": "Prognozowane Godziny",
     "predictedTooltip": "Szacowany aktualny przebieg na podstawie historii serwisowej. Procent wskazuje pewność prognozy.",
     "predictedTooltip": "Szacowany aktualny przebieg na podstawie historii serwisowej. Procent wskazuje pewność prognozy.",
     "dismissed": "Odrzucono",
     "dismissed": "Odrzucono",
     "undo": "Cofnij",
     "undo": "Cofnij",
@@ -141,6 +143,7 @@
       "type": "Typ",
       "type": "Typ",
       "status": "Status",
       "status": "Status",
       "mileage": "Przebieg",
       "mileage": "Przebieg",
+      "mileageBoat": "Godziny Pracy",
       "technician": "Technik",
       "technician": "Technik",
       "files": "Pliki",
       "files": "Pliki",
       "total": "Suma"
       "total": "Suma"
@@ -210,6 +213,15 @@
     "manual": "Manualna",
     "manual": "Manualna",
     "cvt": "CVT",
     "cvt": "CVT",
     "engineSize": "Pojemność silnika",
     "engineSize": "Pojemność silnika",
+    "makeBoat": "Producent *",
+    "mileageBoat": "Godziny Pracy Silnika",
+    "transmissionBoat": "Typ Silnika",
+    "outboard": "Zaburtowy",
+    "inboard": "Stacjonarny",
+    "engineSizeBoat": "Silnik",
+    "twoStroke": "Dwusuwowy",
+    "vinBoat": "HIN",
+    "licensePlateBoat": "Numer Rejestracyjny",
     "vehicleUpdated": "Pojazd zaktualizowany",
     "vehicleUpdated": "Pojazd zaktualizowany",
     "vehicleAdded": "Pojazd dodany",
     "vehicleAdded": "Pojazd dodany",
     "saveError": "Nie udało się zapisać pojazdu"
     "saveError": "Nie udało się zapisać pojazdu"

+ 1 - 0
messages/pt-BR/customers.json

@@ -40,6 +40,7 @@
       "plate": "Placa",
       "plate": "Placa",
       "vehicle": "Veículo",
       "vehicle": "Veículo",
       "mileage": "Quilometragem",
       "mileage": "Quilometragem",
+      "mileageBoat": "Horas de Motor",
       "services": "Serviços"
       "services": "Serviços"
     },
     },
     "noVehicles": "Nenhum veículo atribuído a este cliente"
     "noVehicles": "Nenhum veículo atribuído a este cliente"

+ 2 - 0
messages/pt-BR/pdf.json

@@ -7,6 +7,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Placa: {plate}",
     "plate": "Placa: {plate}",
     "mileage": "Quilometragem: {mileage}",
     "mileage": "Quilometragem: {mileage}",
+    "mileageBoat": "Horas de Motor: {mileage}",
     "km": "km",
     "km": "km",
     "mi": "mi",
     "mi": "mi",
     "service": "Serviço",
     "service": "Serviço",
@@ -81,6 +82,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Placa: {plate}",
     "plate": "Placa: {plate}",
     "mileage": "Quilometragem: {mileage}",
     "mileage": "Quilometragem: {mileage}",
+    "mileageBoat": "Horas de Motor: {mileage}",
     "customer": "Cliente",
     "customer": "Cliente",
     "inspectionDetails": "Detalhes da Inspeção",
     "inspectionDetails": "Detalhes da Inspeção",
     "statusCompleted": "Concluído",
     "statusCompleted": "Concluído",

+ 2 - 0
messages/pt-BR/service.json

@@ -36,6 +36,7 @@
     "date": "Data",
     "date": "Data",
     "type": "Tipo",
     "type": "Tipo",
     "mileage": "Quilometragem",
     "mileage": "Quilometragem",
+    "mileageBoat": "Horas de Motor",
     "status": "Status",
     "status": "Status",
     "technician": "Técnico",
     "technician": "Técnico",
     "invoiceNumber": "Número da Fatura",
     "invoiceNumber": "Número da Fatura",
@@ -195,6 +196,7 @@
     "customer": "Cliente",
     "customer": "Cliente",
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "mileageAtService": "Quilometragem no serviço: {mileage} {unit}",
     "mileageAtService": "Quilometragem no serviço: {mileage} {unit}",
+    "engineHoursAtService": "Horas de motor no serviço: {mileage} {unit}",
     "sharedLink": {
     "sharedLink": {
       "title": "Link compartilhado",
       "title": "Link compartilhado",
       "sharedOn": "Compartilhado em {date}",
       "sharedOn": "Compartilhado em {date}",

+ 7 - 1
messages/pt-BR/settings.json

@@ -137,7 +137,13 @@
     "createCompany": "Criar empresa",
     "createCompany": "Criar empresa",
     "settingsSaved": "Configuracoes da empresa salvas",
     "settingsSaved": "Configuracoes da empresa salvas",
     "failedSave": "Falha ao salvar configuracoes",
     "failedSave": "Falha ao salvar configuracoes",
-    "companyCreated": "Empresa criada com sucesso"
+    "companyCreated": "Empresa criada com sucesso",
+    "serviceType": "Tipo de Serviço",
+    "serviceTypeDescription": "Selecione o tipo de serviço que sua oficina oferece. Isso altera os rótulos dos campos em todo o aplicativo.",
+    "automotive": "Automotivo",
+    "automotiveDescription": "Carros, caminhões e outros veículos rodoviários",
+    "boatService": "Serviço Náutico",
+    "boatServiceDescription": "Barcos, iates e embarcações"
   },
   },
   "account": {
   "account": {
     "profileTitle": "Perfil",
     "profileTitle": "Perfil",

+ 1 - 0
messages/pt-BR/share.json

@@ -109,6 +109,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Placa: {plate}",
     "plate": "Placa: {plate}",
     "mileage": "Quilometragem: {mileage}",
     "mileage": "Quilometragem: {mileage}",
+    "mileageBoat": "Horas de Motor: {mileage}",
     "inspected": "inspecionado",
     "inspected": "inspecionado",
     "pass": "Aprovado",
     "pass": "Aprovado",
     "fail": "Reprovado",
     "fail": "Reprovado",

+ 12 - 0
messages/pt-BR/vehicles.json

@@ -12,6 +12,7 @@
       "vehicle": "Veículo",
       "vehicle": "Veículo",
       "customer": "Cliente",
       "customer": "Cliente",
       "mileage": "Quilometragem",
       "mileage": "Quilometragem",
+      "mileageBoat": "Horas de Motor",
       "services": "Serviços"
       "services": "Serviços"
     },
     },
     "edit": "Editar",
     "edit": "Editar",
@@ -38,6 +39,7 @@
     "notFound": "Veículo não encontrado",
     "notFound": "Veículo não encontrado",
     "predictedKm": "Km Previsto",
     "predictedKm": "Km Previsto",
     "predictedMileage": "Quilometragem Prevista",
     "predictedMileage": "Quilometragem Prevista",
+    "predictedHours": "Horas Previstas",
     "predictedTooltip": "Quilometragem atual estimada com base no histórico de serviços. A porcentagem indica a confiança da previsão.",
     "predictedTooltip": "Quilometragem atual estimada com base no histórico de serviços. A porcentagem indica a confiança da previsão.",
     "dismissed": "Dispensado",
     "dismissed": "Dispensado",
     "undo": "Desfazer",
     "undo": "Desfazer",
@@ -141,6 +143,7 @@
       "type": "Tipo",
       "type": "Tipo",
       "status": "Status",
       "status": "Status",
       "mileage": "Quilometragem",
       "mileage": "Quilometragem",
+      "mileageBoat": "Horas de Motor",
       "technician": "Técnico",
       "technician": "Técnico",
       "files": "Arquivos",
       "files": "Arquivos",
       "total": "Total"
       "total": "Total"
@@ -210,6 +213,15 @@
     "manual": "Manual",
     "manual": "Manual",
     "cvt": "CVT",
     "cvt": "CVT",
     "engineSize": "Cilindrada",
     "engineSize": "Cilindrada",
+    "makeBoat": "Fabricante *",
+    "mileageBoat": "Horas de Motor",
+    "transmissionBoat": "Tipo de Motor",
+    "outboard": "De Popa",
+    "inboard": "De Centro",
+    "engineSizeBoat": "Motor",
+    "twoStroke": "Dois Tempos",
+    "vinBoat": "HIN",
+    "licensePlateBoat": "Número de Registro",
     "vehicleUpdated": "Veículo atualizado",
     "vehicleUpdated": "Veículo atualizado",
     "vehicleAdded": "Veículo adicionado",
     "vehicleAdded": "Veículo adicionado",
     "saveError": "Falha ao salvar veículo"
     "saveError": "Falha ao salvar veículo"

+ 1 - 0
messages/ru/customers.json

@@ -40,6 +40,7 @@
       "plate": "Госномер",
       "plate": "Госномер",
       "vehicle": "Транспортное средство",
       "vehicle": "Транспортное средство",
       "mileage": "Пробег",
       "mileage": "Пробег",
+      "mileageBoat": "Моточасы",
       "services": "Обслуживания"
       "services": "Обслуживания"
     },
     },
     "noVehicles": "У этого клиента нет транспортных средств"
     "noVehicles": "У этого клиента нет транспортных средств"

+ 2 - 0
messages/ru/pdf.json

@@ -7,6 +7,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Госномер: {plate}",
     "plate": "Госномер: {plate}",
     "mileage": "Пробег: {mileage}",
     "mileage": "Пробег: {mileage}",
+    "mileageBoat": "Моточасы: {mileage}",
     "km": "км",
     "km": "км",
     "mi": "ми",
     "mi": "ми",
     "service": "Обслуживание",
     "service": "Обслуживание",
@@ -81,6 +82,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Госномер: {plate}",
     "plate": "Госномер: {plate}",
     "mileage": "Пробег: {mileage}",
     "mileage": "Пробег: {mileage}",
+    "mileageBoat": "Моточасы: {mileage}",
     "customer": "Клиент",
     "customer": "Клиент",
     "inspectionDetails": "Детали осмотра",
     "inspectionDetails": "Детали осмотра",
     "statusCompleted": "Завершён",
     "statusCompleted": "Завершён",

+ 2 - 0
messages/ru/service.json

@@ -36,6 +36,7 @@
     "date": "Дата",
     "date": "Дата",
     "type": "Тип",
     "type": "Тип",
     "mileage": "Пробег",
     "mileage": "Пробег",
+    "mileageBoat": "Моточасы",
     "status": "Статус",
     "status": "Статус",
     "technician": "Механик",
     "technician": "Механик",
     "invoiceNumber": "Номер счёта",
     "invoiceNumber": "Номер счёта",
@@ -195,6 +196,7 @@
     "customer": "Клиент",
     "customer": "Клиент",
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "mileageAtService": "Пробег при обслуживании: {mileage} {unit}",
     "mileageAtService": "Пробег при обслуживании: {mileage} {unit}",
+    "engineHoursAtService": "Моточасы при обслуживании: {mileage} {unit}",
     "sharedLink": {
     "sharedLink": {
       "title": "Общая ссылка",
       "title": "Общая ссылка",
       "sharedOn": "Опубликовано {date}",
       "sharedOn": "Опубликовано {date}",

+ 7 - 1
messages/ru/settings.json

@@ -137,7 +137,13 @@
     "createCompany": "Создать компанию",
     "createCompany": "Создать компанию",
     "settingsSaved": "Настройки компании сохранены",
     "settingsSaved": "Настройки компании сохранены",
     "failedSave": "Не удалось сохранить настройки",
     "failedSave": "Не удалось сохранить настройки",
-    "companyCreated": "Компания успешно создана"
+    "companyCreated": "Компания успешно создана",
+    "serviceType": "Тип Услуги",
+    "serviceTypeDescription": "Выберите тип услуг, которые предоставляет ваша мастерская. Это изменит названия полей во всём приложении.",
+    "automotive": "Автомобильный",
+    "automotiveDescription": "Легковые автомобили, грузовики и другие транспортные средства",
+    "boatService": "Обслуживание Судов",
+    "boatServiceDescription": "Лодки, яхты и морские суда"
   },
   },
   "account": {
   "account": {
     "profileTitle": "Профиль",
     "profileTitle": "Профиль",

+ 1 - 0
messages/ru/share.json

@@ -109,6 +109,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Госномер: {plate}",
     "plate": "Госномер: {plate}",
     "mileage": "Пробег: {mileage}",
     "mileage": "Пробег: {mileage}",
+    "mileageBoat": "Моточасы: {mileage}",
     "inspected": "осмотрено",
     "inspected": "осмотрено",
     "pass": "Норма",
     "pass": "Норма",
     "fail": "Неисправность",
     "fail": "Неисправность",

+ 12 - 0
messages/ru/vehicles.json

@@ -12,6 +12,7 @@
       "vehicle": "Транспортное средство",
       "vehicle": "Транспортное средство",
       "customer": "Клиент",
       "customer": "Клиент",
       "mileage": "Пробег",
       "mileage": "Пробег",
+      "mileageBoat": "Моточасы",
       "services": "Обслуживания"
       "services": "Обслуживания"
     },
     },
     "edit": "Редактировать",
     "edit": "Редактировать",
@@ -38,6 +39,7 @@
     "notFound": "Транспортное средство не найдено",
     "notFound": "Транспортное средство не найдено",
     "predictedKm": "Прогноз км",
     "predictedKm": "Прогноз км",
     "predictedMileage": "Прогноз пробега",
     "predictedMileage": "Прогноз пробега",
+    "predictedHours": "Прогнозируемые Часы",
     "predictedTooltip": "Расчётный текущий пробег на основе тенденций истории обслуживания. Процент показывает уверенность прогноза.",
     "predictedTooltip": "Расчётный текущий пробег на основе тенденций истории обслуживания. Процент показывает уверенность прогноза.",
     "dismissed": "Отклонено",
     "dismissed": "Отклонено",
     "undo": "Отменить",
     "undo": "Отменить",
@@ -141,6 +143,7 @@
       "type": "Тип",
       "type": "Тип",
       "status": "Статус",
       "status": "Статус",
       "mileage": "Пробег",
       "mileage": "Пробег",
+      "mileageBoat": "Моточасы",
       "technician": "Механик",
       "technician": "Механик",
       "files": "Файлы",
       "files": "Файлы",
       "total": "Итого"
       "total": "Итого"
@@ -210,6 +213,15 @@
     "manual": "Механическая",
     "manual": "Механическая",
     "cvt": "Вариатор",
     "cvt": "Вариатор",
     "engineSize": "Объём двигателя",
     "engineSize": "Объём двигателя",
+    "makeBoat": "Производитель *",
+    "mileageBoat": "Моточасы",
+    "transmissionBoat": "Тип Двигателя",
+    "outboard": "Подвесной",
+    "inboard": "Стационарный",
+    "engineSizeBoat": "Двигатель",
+    "twoStroke": "Двухтактный",
+    "vinBoat": "HIN",
+    "licensePlateBoat": "Регистрационный Номер",
     "vehicleUpdated": "Транспортное средство обновлено",
     "vehicleUpdated": "Транспортное средство обновлено",
     "vehicleAdded": "Транспортное средство добавлено",
     "vehicleAdded": "Транспортное средство добавлено",
     "saveError": "Не удалось сохранить транспортное средство"
     "saveError": "Не удалось сохранить транспортное средство"

+ 1 - 0
messages/tr/customers.json

@@ -40,6 +40,7 @@
       "plate": "Plaka",
       "plate": "Plaka",
       "vehicle": "Araç",
       "vehicle": "Araç",
       "mileage": "Kilometre",
       "mileage": "Kilometre",
+      "mileageBoat": "Motor Saatleri",
       "services": "Servisler"
       "services": "Servisler"
     },
     },
     "noVehicles": "Bu müşteriye atanmış araç yok"
     "noVehicles": "Bu müşteriye atanmış araç yok"

+ 2 - 0
messages/tr/pdf.json

@@ -7,6 +7,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Plaka: {plate}",
     "plate": "Plaka: {plate}",
     "mileage": "Kilometre: {mileage}",
     "mileage": "Kilometre: {mileage}",
+    "mileageBoat": "Motor Saatleri: {mileage}",
     "km": "km",
     "km": "km",
     "mi": "mi",
     "mi": "mi",
     "service": "Servis",
     "service": "Servis",
@@ -81,6 +82,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Plaka: {plate}",
     "plate": "Plaka: {plate}",
     "mileage": "Kilometre: {mileage}",
     "mileage": "Kilometre: {mileage}",
+    "mileageBoat": "Motor Saatleri: {mileage}",
     "customer": "Müşteri",
     "customer": "Müşteri",
     "inspectionDetails": "Muayene Detayları",
     "inspectionDetails": "Muayene Detayları",
     "statusCompleted": "Tamamlandı",
     "statusCompleted": "Tamamlandı",

+ 2 - 0
messages/tr/service.json

@@ -36,6 +36,7 @@
     "date": "Tarih",
     "date": "Tarih",
     "type": "Tür",
     "type": "Tür",
     "mileage": "Kilometre",
     "mileage": "Kilometre",
+    "mileageBoat": "Motor Saatleri",
     "status": "Durum",
     "status": "Durum",
     "technician": "Teknisyen",
     "technician": "Teknisyen",
     "invoiceNumber": "Fatura Numarası",
     "invoiceNumber": "Fatura Numarası",
@@ -195,6 +196,7 @@
     "customer": "Müşteri",
     "customer": "Müşteri",
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "mileageAtService": "Servis sırasındaki kilometre: {mileage} {unit}",
     "mileageAtService": "Servis sırasındaki kilometre: {mileage} {unit}",
+    "engineHoursAtService": "Servisteki motor saatleri: {mileage} {unit}",
     "sharedLink": {
     "sharedLink": {
       "title": "Paylaşılan bağlantı",
       "title": "Paylaşılan bağlantı",
       "sharedOn": "{date} tarihinde paylaşıldı",
       "sharedOn": "{date} tarihinde paylaşıldı",

+ 7 - 1
messages/tr/settings.json

@@ -137,7 +137,13 @@
     "createCompany": "Şirket Oluştur",
     "createCompany": "Şirket Oluştur",
     "settingsSaved": "Şirket ayarları kaydedildi",
     "settingsSaved": "Şirket ayarları kaydedildi",
     "failedSave": "Ayarlar kaydedilemedi",
     "failedSave": "Ayarlar kaydedilemedi",
-    "companyCreated": "Şirket başarıyla oluşturuldu"
+    "companyCreated": "Şirket başarıyla oluşturuldu",
+    "serviceType": "Hizmet Türü",
+    "serviceTypeDescription": "Atölyenizin sunduğu hizmet türünü seçin. Bu, uygulama genelinde alan etiketlerini değiştirir.",
+    "automotive": "Otomotiv",
+    "automotiveDescription": "Arabalar, kamyonlar ve diğer kara taşıtları",
+    "boatService": "Tekne Servisi",
+    "boatServiceDescription": "Tekneler, yatlar ve deniz taşıtları"
   },
   },
   "account": {
   "account": {
     "profileTitle": "Profil",
     "profileTitle": "Profil",

+ 1 - 0
messages/tr/share.json

@@ -109,6 +109,7 @@
     "vin": "VIN: {vin}",
     "vin": "VIN: {vin}",
     "plate": "Plaka: {plate}",
     "plate": "Plaka: {plate}",
     "mileage": "Kilometre: {mileage}",
     "mileage": "Kilometre: {mileage}",
+    "mileageBoat": "Motor Saatleri: {mileage}",
     "inspected": "muayene edildi",
     "inspected": "muayene edildi",
     "pass": "Geçti",
     "pass": "Geçti",
     "fail": "Başarısız",
     "fail": "Başarısız",

+ 12 - 0
messages/tr/vehicles.json

@@ -12,6 +12,7 @@
       "vehicle": "Araç",
       "vehicle": "Araç",
       "customer": "Müşteri",
       "customer": "Müşteri",
       "mileage": "Kilometre",
       "mileage": "Kilometre",
+      "mileageBoat": "Motor Saatleri",
       "services": "Servisler"
       "services": "Servisler"
     },
     },
     "edit": "Düzenle",
     "edit": "Düzenle",
@@ -38,6 +39,7 @@
     "notFound": "Araç bulunamadı",
     "notFound": "Araç bulunamadı",
     "predictedKm": "Tahmini Km",
     "predictedKm": "Tahmini Km",
     "predictedMileage": "Tahmini Kilometre",
     "predictedMileage": "Tahmini Kilometre",
+    "predictedHours": "Tahmini Saatler",
     "predictedTooltip": "Servis geçmişine dayalı tahmini güncel kilometre. Yüzde, tahmin güvenilirliğini gösterir.",
     "predictedTooltip": "Servis geçmişine dayalı tahmini güncel kilometre. Yüzde, tahmin güvenilirliğini gösterir.",
     "dismissed": "Kapatıldı",
     "dismissed": "Kapatıldı",
     "undo": "Geri Al",
     "undo": "Geri Al",
@@ -141,6 +143,7 @@
       "type": "Tür",
       "type": "Tür",
       "status": "Durum",
       "status": "Durum",
       "mileage": "Kilometre",
       "mileage": "Kilometre",
+      "mileageBoat": "Motor Saatleri",
       "technician": "Teknisyen",
       "technician": "Teknisyen",
       "files": "Dosyalar",
       "files": "Dosyalar",
       "total": "Toplam"
       "total": "Toplam"
@@ -210,6 +213,15 @@
     "manual": "Manuel",
     "manual": "Manuel",
     "cvt": "CVT",
     "cvt": "CVT",
     "engineSize": "Motor Hacmi",
     "engineSize": "Motor Hacmi",
+    "makeBoat": "Üretici *",
+    "mileageBoat": "Motor Saatleri",
+    "transmissionBoat": "Motor Tipi",
+    "outboard": "Dıştan Takma",
+    "inboard": "İçten Takma",
+    "engineSizeBoat": "Motor",
+    "twoStroke": "İki Zamanlı",
+    "vinBoat": "HIN",
+    "licensePlateBoat": "Tescil Numarası",
     "vehicleUpdated": "Araç güncellendi",
     "vehicleUpdated": "Araç güncellendi",
     "vehicleAdded": "Araç eklendi",
     "vehicleAdded": "Araç eklendi",
     "saveError": "Araç kaydedilemedi"
     "saveError": "Araç kaydedilemedi"

+ 3 - 1
src/app/(authenticated)/customers/[id]/customer-detail-client.tsx

@@ -42,6 +42,7 @@ import { CustomerForm } from "@/features/customers/Components/CustomerForm";
 import { updateServiceRequest, createWorkOrderFromRequest } from "@/features/customers/Actions/customerActions";
 import { updateServiceRequest, createWorkOrderFromRequest } from "@/features/customers/Actions/customerActions";
 import { SendSmsDialog } from "@/features/sms/Components/SendSmsDialog";
 import { SendSmsDialog } from "@/features/sms/Components/SendSmsDialog";
 import { TelegramQrCode } from "@/features/telegram/Components/TelegramQrCode";
 import { TelegramQrCode } from "@/features/telegram/Components/TelegramQrCode";
+import { useServiceType } from "@/components/service-type-context";
 import { toast } from "sonner";
 import { toast } from "sonner";
 
 
 interface ServiceRequestItem {
 interface ServiceRequestItem {
@@ -108,6 +109,7 @@ export function CustomerDetailClient({
   telegramChatId?: string | null;
   telegramChatId?: string | null;
 }) {
 }) {
   const t = useTranslations("customers.detail");
   const t = useTranslations("customers.detail");
+  const serviceType = useServiceType();
   const router = useRouter();
   const router = useRouter();
   const searchParams = useSearchParams();
   const searchParams = useSearchParams();
   const [showEditForm, setShowEditForm] = useState(false);
   const [showEditForm, setShowEditForm] = useState(false);
@@ -301,7 +303,7 @@ export function CustomerDetailClient({
                     <TableRow>
                     <TableRow>
                       <TableHead className="w-[120px]">{t("vehicleTable.plate")}</TableHead>
                       <TableHead className="w-[120px]">{t("vehicleTable.plate")}</TableHead>
                       <TableHead>{t("vehicleTable.vehicle")}</TableHead>
                       <TableHead>{t("vehicleTable.vehicle")}</TableHead>
-                      <TableHead className="hidden sm:table-cell w-[100px] text-right">{t("vehicleTable.mileage")}</TableHead>
+                      <TableHead className="hidden sm:table-cell w-[100px] text-right">{serviceType === 'boat' ? t("vehicleTable.mileageBoat") : t("vehicleTable.mileage")}</TableHead>
                       <TableHead className="w-[80px] text-center">{t("vehicleTable.services")}</TableHead>
                       <TableHead className="w-[80px] text-center">{t("vehicleTable.services")}</TableHead>
                     </TableRow>
                     </TableRow>
                   </TableHeader>
                   </TableHeader>

+ 3 - 0
src/app/(authenticated)/layout.tsx

@@ -12,6 +12,7 @@ import { getCachedMembership } from "@/lib/cached-session";
 import { hasPermission, PermissionAction, PermissionSubject } from "@/lib/permissions";
 import { hasPermission, PermissionAction, PermissionSubject } from "@/lib/permissions";
 import { OnlineTracker } from "@/components/online-tracker";
 import { OnlineTracker } from "@/components/online-tracker";
 import { InstallBanner } from "@/components/pwa-install-prompt";
 import { InstallBanner } from "@/components/pwa-install-prompt";
+import { ServiceTypeProvider } from "@/components/service-type-context";
 import { db } from "@/lib/db";
 import { db } from "@/lib/db";
 
 
 export default async function DashboardLayout({
 export default async function DashboardLayout({
@@ -76,6 +77,7 @@ export default async function DashboardLayout({
   }
   }
 
 
   return (
   return (
+    <ServiceTypeProvider serviceType={data.serviceType}>
     <WhiteLabelCtaProvider show={showWhiteLabelCta}>
     <WhiteLabelCtaProvider show={showWhiteLabelCta}>
     <SidebarProvider
     <SidebarProvider
       style={
       style={
@@ -110,5 +112,6 @@ export default async function DashboardLayout({
       </DateSettingsProvider>
       </DateSettingsProvider>
     </SidebarProvider>
     </SidebarProvider>
     </WhiteLabelCtaProvider>
     </WhiteLabelCtaProvider>
+    </ServiceTypeProvider>
   );
   );
 }
 }

+ 16 - 14
src/app/(authenticated)/settings/company/company-settings.tsx

@@ -9,7 +9,6 @@ import { Input } from "@/components/ui/input";
 import { Label } from "@/components/ui/label";
 import { Label } from "@/components/ui/label";
 import { Button } from "@/components/ui/button";
 import { Button } from "@/components/ui/button";
 import { Textarea } from "@/components/ui/textarea";
 import { Textarea } from "@/components/ui/textarea";
-import { Separator } from "@/components/ui/separator";
 import { toast } from "sonner";
 import { toast } from "sonner";
 import { setSettings, setSetting } from "@/features/settings/Actions/settingsActions";
 import { setSettings, setSetting } from "@/features/settings/Actions/settingsActions";
 import { renameOrganization } from "@/features/team/Actions/renameOrganization";
 import { renameOrganization } from "@/features/team/Actions/renameOrganization";
@@ -18,6 +17,7 @@ import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/u
 import { Building2, ImageIcon, Loader2, Plus, Save, Trash2, Upload } from "lucide-react";
 import { Building2, ImageIcon, Loader2, Plus, Save, Trash2, Upload } from "lucide-react";
 import { createNewOrganization } from "@/features/team/Actions/createNewOrganization";
 import { createNewOrganization } from "@/features/team/Actions/createNewOrganization";
 import { ReadOnlyBanner, SaveButton, ReadOnlyWrapper } from "../read-only-guard";
 import { ReadOnlyBanner, SaveButton, ReadOnlyWrapper } from "../read-only-guard";
+import { ServiceTypeSelector } from "./service-type-selector";
 
 
 export function CompanySettings({ settings, organizationName }: { settings: Record<string, string>; organizationName: string }) {
 export function CompanySettings({ settings, organizationName }: { settings: Record<string, string>; organizationName: string }) {
   const router = useRouter();
   const router = useRouter();
@@ -30,6 +30,7 @@ export function CompanySettings({ settings, organizationName }: { settings: Reco
   const [orgNumber, setOrgNumber] = useState(settings[SETTING_KEYS.INVOICE_ORG_NUMBER] || "");
   const [orgNumber, setOrgNumber] = useState(settings[SETTING_KEYS.INVOICE_ORG_NUMBER] || "");
   const [logoUrl, setLogoUrl] = useState(settings[SETTING_KEYS.COMPANY_LOGO] || "");
   const [logoUrl, setLogoUrl] = useState(settings[SETTING_KEYS.COMPANY_LOGO] || "");
   const [uploadingLogo, setUploadingLogo] = useState(false);
   const [uploadingLogo, setUploadingLogo] = useState(false);
+  const [serviceType, setServiceType] = useState(settings[SETTING_KEYS.SERVICE_TYPE] || "automotive");
   const [showCreateOrg, setShowCreateOrg] = useState(false);
   const [showCreateOrg, setShowCreateOrg] = useState(false);
   const [newOrgName, setNewOrgName] = useState("");
   const [newOrgName, setNewOrgName] = useState("");
   const [creatingOrg, setCreatingOrg] = useState(false);
   const [creatingOrg, setCreatingOrg] = useState(false);
@@ -43,6 +44,7 @@ export function CompanySettings({ settings, organizationName }: { settings: Reco
         [SETTING_KEYS.WORKSHOP_PHONE]: workshopPhone,
         [SETTING_KEYS.WORKSHOP_PHONE]: workshopPhone,
         [SETTING_KEYS.WORKSHOP_EMAIL]: workshopEmail,
         [SETTING_KEYS.WORKSHOP_EMAIL]: workshopEmail,
         [SETTING_KEYS.INVOICE_ORG_NUMBER]: orgNumber,
         [SETTING_KEYS.INVOICE_ORG_NUMBER]: orgNumber,
+        [SETTING_KEYS.SERVICE_TYPE]: serviceType,
       }),
       }),
     ]);
     ]);
     setSaving(false);
     setSaving(false);
@@ -160,21 +162,21 @@ export function CompanySettings({ settings, organizationName }: { settings: Reco
             <Label htmlFor="workshopAddress" className="text-xs">{t('company.address')}</Label>
             <Label htmlFor="workshopAddress" className="text-xs">{t('company.address')}</Label>
             <Textarea id="workshopAddress" placeholder={t('company.addressPlaceholder')} rows={2} value={workshopAddress} onChange={(e) => setWorkshopAddress(e.target.value)} />
             <Textarea id="workshopAddress" placeholder={t('company.addressPlaceholder')} rows={2} value={workshopAddress} onChange={(e) => setWorkshopAddress(e.target.value)} />
           </div>
           </div>
-          <SaveButton>
-            <Separator />
-            <div className="flex items-center justify-between">
-              <Button size="sm" onClick={handleSave} disabled={saving}>
-                {saving ? <Loader2 className="mr-1.5 h-3.5 w-3.5 animate-spin" /> : <Save className="mr-1.5 h-3.5 w-3.5" />}
-                {t('company.saveCompany')}
-              </Button>
-              <Button variant="outline" size="sm" onClick={() => setShowCreateOrg(true)}>
-                <Plus className="mr-1.5 h-3.5 w-3.5" />
-                {t('company.addNewCompany')}
-              </Button>
-            </div>
-          </SaveButton>
         </CardContent>
         </CardContent>
       </Card>
       </Card>
+      <ServiceTypeSelector serviceType={serviceType} onServiceTypeChange={setServiceType} />
+      <SaveButton>
+        <div className="flex items-center justify-between">
+          <Button size="sm" onClick={handleSave} disabled={saving}>
+            {saving ? <Loader2 className="mr-1.5 h-3.5 w-3.5 animate-spin" /> : <Save className="mr-1.5 h-3.5 w-3.5" />}
+            {t('company.saveCompany')}
+          </Button>
+          <Button variant="outline" size="sm" onClick={() => setShowCreateOrg(true)}>
+            <Plus className="mr-1.5 h-3.5 w-3.5" />
+            {t('company.addNewCompany')}
+          </Button>
+        </div>
+      </SaveButton>
       </ReadOnlyWrapper>
       </ReadOnlyWrapper>
       <Dialog open={showCreateOrg} onOpenChange={setShowCreateOrg}>
       <Dialog open={showCreateOrg} onOpenChange={setShowCreateOrg}>
         <DialogContent className="sm:max-w-md">
         <DialogContent className="sm:max-w-md">

+ 55 - 0
src/app/(authenticated)/settings/company/service-type-selector.tsx

@@ -0,0 +1,55 @@
+"use client";
+
+import { useTranslations } from "next-intl";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import {
+  Select,
+  SelectContent,
+  SelectItem,
+  SelectTrigger,
+  SelectValue,
+} from "@/components/ui/select";
+import { Car, Anchor } from "lucide-react";
+
+interface ServiceTypeSelectorProps {
+  serviceType: string;
+  onServiceTypeChange: (value: string) => void;
+}
+
+export function ServiceTypeSelector({ serviceType, onServiceTypeChange }: ServiceTypeSelectorProps) {
+  const t = useTranslations("settings");
+
+  return (
+    <Card className="border-0 shadow-sm">
+      <CardHeader className="pb-2">
+        <CardTitle className="text-sm text-muted-foreground">
+          {t("company.serviceType")}
+        </CardTitle>
+        <p className="text-xs text-muted-foreground">
+          {t("company.serviceTypeDescription")}
+        </p>
+      </CardHeader>
+      <CardContent>
+        <Select value={serviceType || "automotive"} onValueChange={onServiceTypeChange}>
+          <SelectTrigger className="w-full sm:w-64">
+            <SelectValue />
+          </SelectTrigger>
+          <SelectContent>
+            <SelectItem value="automotive">
+              <span className="flex items-center gap-2">
+                <Car className="h-4 w-4" />
+                {t("company.automotive")}
+              </span>
+            </SelectItem>
+            <SelectItem value="boat">
+              <span className="flex items-center gap-2">
+                <Anchor className="h-4 w-4" />
+                {t("company.boatService")}
+              </span>
+            </SelectItem>
+          </SelectContent>
+        </Select>
+      </CardContent>
+    </Card>
+  );
+}

+ 1 - 1
src/app/(authenticated)/vehicles/[id]/page.tsx

@@ -145,7 +145,7 @@ export default async function VehicleDetailPage({
           paginatedServices={paginatedServices}
           paginatedServices={paginatedServices}
           paginatedNotes={paginatedNotes}
           paginatedNotes={paginatedNotes}
           serviceSearch={search}
           serviceSearch={search}
-          serviceType={type}
+          serviceRecordType={type}
           currencyCode={currencyCode}
           currencyCode={currencyCode}
           unitSystem={unitSystem}
           unitSystem={unitSystem}
           predictionData={predictionData}
           predictionData={predictionData}

+ 3 - 1
src/app/(authenticated)/vehicles/[id]/service-records-table.tsx

@@ -35,6 +35,7 @@ import {
   Search,
   Search,
 } from "lucide-react";
 } from "lucide-react";
 import { useTranslations } from "next-intl";
 import { useTranslations } from "next-intl";
+import { useServiceType } from "@/components/service-type-context";
 
 
 interface ServiceRecordRow {
 interface ServiceRecordRow {
   id: string;
   id: string;
@@ -84,6 +85,7 @@ export function ServiceRecordsTable({
   const [searchInput, setSearchInput] = useState(search);
   const [searchInput, setSearchInput] = useState(search);
   const [navigatingId, setNavigatingId] = useState<string | null>(null);
   const [navigatingId, setNavigatingId] = useState<string | null>(null);
   const t = useTranslations("vehicles.services");
   const t = useTranslations("vehicles.services");
+  const serviceType = useServiceType();
 
 
   const createUrl = useCallback(
   const createUrl = useCallback(
     (params: Record<string, string | number | undefined>) => {
     (params: Record<string, string | number | undefined>) => {
@@ -181,7 +183,7 @@ export function ServiceRecordsTable({
               <TableHead>{t("table.title")}</TableHead>
               <TableHead>{t("table.title")}</TableHead>
               <TableHead className="w-[100px]">{t("table.type")}</TableHead>
               <TableHead className="w-[100px]">{t("table.type")}</TableHead>
               <TableHead className="w-[100px]">{t("table.status")}</TableHead>
               <TableHead className="w-[100px]">{t("table.status")}</TableHead>
-              <TableHead className="w-[100px] text-right">{t("table.mileage")}</TableHead>
+              <TableHead className="w-[100px] text-right">{serviceType === 'boat' ? t("table.mileageBoat") : t("table.mileage")}</TableHead>
               <TableHead className="hidden w-[120px] sm:table-cell">{t("table.technician")}</TableHead>
               <TableHead className="hidden w-[120px] sm:table-cell">{t("table.technician")}</TableHead>
               <TableHead className="w-[50px] text-center">{t("table.files")}</TableHead>
               <TableHead className="w-[50px] text-center">{t("table.files")}</TableHead>
               <TableHead className="w-[100px] text-right">{t("table.total")}</TableHead>
               <TableHead className="w-[100px] text-right">{t("table.total")}</TableHead>

+ 8 - 5
src/app/(authenticated)/vehicles/[id]/vehicle-detail-client.tsx

@@ -83,6 +83,7 @@ import {
   AlertDialogTitle,
   AlertDialogTitle,
 } from '@/components/ui/alert-dialog'
 } from '@/components/ui/alert-dialog'
 import { useTranslations } from 'next-intl'
 import { useTranslations } from 'next-intl'
+import { useServiceType } from '@/components/service-type-context'
 
 
 interface CustomerOption {
 interface CustomerOption {
   id: string
   id: string
@@ -199,7 +200,7 @@ export function VehicleDetailClient({
   paginatedServices,
   paginatedServices,
   paginatedNotes,
   paginatedNotes,
   serviceSearch,
   serviceSearch,
-  serviceType,
+  serviceRecordType,
   currencyCode = 'USD',
   currencyCode = 'USD',
   unitSystem = 'imperial',
   unitSystem = 'imperial',
   predictionData,
   predictionData,
@@ -213,7 +214,7 @@ export function VehicleDetailClient({
   paginatedServices: PaginatedServices
   paginatedServices: PaginatedServices
   paginatedNotes: PaginatedNotes
   paginatedNotes: PaginatedNotes
   serviceSearch: string
   serviceSearch: string
-  serviceType: string
+  serviceRecordType: string
   currencyCode?: string
   currencyCode?: string
   unitSystem?: 'metric' | 'imperial'
   unitSystem?: 'metric' | 'imperial'
   predictionData?: {
   predictionData?: {
@@ -238,7 +239,9 @@ export function VehicleDetailClient({
   quotes?: QuoteRecord[]
   quotes?: QuoteRecord[]
   aiEnabled?: boolean
   aiEnabled?: boolean
 }) {
 }) {
-  const distUnit = unitSystem === 'metric' ? 'km' : 'mi'
+  const serviceType = useServiceType()
+  const isBoat = serviceType === 'boat'
+  const distUnit = isBoat ? 'hrs' : unitSystem === 'metric' ? 'km' : 'mi'
   const router = useRouter()
   const router = useRouter()
   const searchParams = useSearchParams()
   const searchParams = useSearchParams()
   const { formatDate } = useFormatDate()
   const { formatDate } = useFormatDate()
@@ -576,7 +579,7 @@ export function VehicleDetailClient({
                     <div className="flex cursor-help items-center gap-1.5">
                     <div className="flex cursor-help items-center gap-1.5">
                       <TrendingUp className="h-3.5 w-3.5" />
                       <TrendingUp className="h-3.5 w-3.5" />
                       <span className="text-xs">
                       <span className="text-xs">
-                        {unitSystem === 'metric' ? t('predictedKm') : t('predictedMileage')}
+                        {isBoat ? t('predictedHours') : unitSystem === 'metric' ? t('predictedKm') : t('predictedMileage')}
                       </span>
                       </span>
                       <span className="font-semibold text-foreground">
                       <span className="font-semibold text-foreground">
                         ~{predictionData.predictedMileage.toLocaleString()}
                         ~{predictionData.predictedMileage.toLocaleString()}
@@ -1032,7 +1035,7 @@ export function VehicleDetailClient({
             pageSize={paginatedServices.pageSize}
             pageSize={paginatedServices.pageSize}
             totalPages={paginatedServices.totalPages}
             totalPages={paginatedServices.totalPages}
             search={serviceSearch}
             search={serviceSearch}
-            type={serviceType}
+            type={serviceRecordType}
             currencyCode={currencyCode}
             currencyCode={currencyCode}
           />
           />
         </TabsContent>
         </TabsContent>

+ 3 - 1
src/app/(authenticated)/vehicles/vehicles-client.tsx

@@ -46,6 +46,7 @@ import {
   Wrench,
   Wrench,
 } from 'lucide-react'
 } from 'lucide-react'
 import { useTranslations } from 'next-intl'
 import { useTranslations } from 'next-intl'
+import { useServiceType } from '@/components/service-type-context'
 
 
 interface Vehicle {
 interface Vehicle {
   id: string
   id: string
@@ -97,6 +98,7 @@ export function VehiclesClient({
   isArchived?: boolean
   isArchived?: boolean
   archivedCount?: number
   archivedCount?: number
 }) {
 }) {
+  const serviceType = useServiceType()
   const router = useRouter()
   const router = useRouter()
   const pathname = usePathname()
   const pathname = usePathname()
   const searchParams = useSearchParams()
   const searchParams = useSearchParams()
@@ -272,7 +274,7 @@ export function VehiclesClient({
                 <TableHead className="w-[120px]">{t('table.plate')}</TableHead>
                 <TableHead className="w-[120px]">{t('table.plate')}</TableHead>
                 <TableHead>{t('table.vehicle')}</TableHead>
                 <TableHead>{t('table.vehicle')}</TableHead>
                 <TableHead className="hidden sm:table-cell">{t('table.customer')}</TableHead>
                 <TableHead className="hidden sm:table-cell">{t('table.customer')}</TableHead>
-                <TableHead className="hidden md:table-cell w-[100px] text-right">{t('table.mileage')}</TableHead>
+                <TableHead className="hidden md:table-cell w-[100px] text-right">{serviceType === 'boat' ? t('table.mileageBoat') : t('table.mileage')}</TableHead>
                 <TableHead className="w-[80px] text-center">{t('table.services')}</TableHead>
                 <TableHead className="w-[80px] text-center">{t('table.services')}</TableHead>
                 <TableHead className="w-[50px]" />
                 <TableHead className="w-[50px]" />
               </TableRow>
               </TableRow>

+ 12 - 4
src/app/(public)/portal/[orgId]/vehicles/[vehicleId]/page.tsx

@@ -8,6 +8,7 @@ import { Badge } from "@/components/ui/badge";
 import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
 import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
 import Link from "next/link";
 import Link from "next/link";
 import { getTranslations } from "next-intl/server";
 import { getTranslations } from "next-intl/server";
+import { db } from "@/lib/db";
 
 
 export default async function PortalVehicleDetailPage({
 export default async function PortalVehicleDetailPage({
   params,
   params,
@@ -16,7 +17,14 @@ export default async function PortalVehicleDetailPage({
 }) {
 }) {
   const { orgId, vehicleId } = await params;
   const { orgId, vehicleId } = await params;
   const t = await getTranslations('portal.vehicles');
   const t = await getTranslations('portal.vehicles');
-  const result = await getPortalVehicleDetail(vehicleId);
+  const [result, serviceTypeSetting] = await Promise.all([
+    getPortalVehicleDetail(vehicleId),
+    db.appSetting.findUnique({
+      where: { organizationId_key: { organizationId: orgId, key: "workshop.serviceType" } },
+      select: { value: true },
+    }),
+  ]);
+  const serviceType = (serviceTypeSetting?.value || "automotive") as "automotive" | "boat";
 
 
   if (!result.success || !result.data) {
   if (!result.success || !result.data) {
     return (
     return (
@@ -47,10 +55,10 @@ export default async function PortalVehicleDetailPage({
               {v.year} {v.make} {v.model}
               {v.year} {v.make} {v.model}
             </h1>
             </h1>
             <div className="mt-1 flex flex-wrap gap-3 text-sm text-muted-foreground">
             <div className="mt-1 flex flex-wrap gap-3 text-sm text-muted-foreground">
-              {v.licensePlate && <span>{t('plate', { plate: v.licensePlate })}</span>}
-              {v.vin && <span>{t('vin', { vin: v.vin })}</span>}
+              {v.licensePlate && <span>{serviceType === 'boat' ? `Reg: ${v.licensePlate}` : t('plate', { plate: v.licensePlate })}</span>}
+              {v.vin && <span>{serviceType === 'boat' ? `HIN: ${v.vin}` : t('vin', { vin: v.vin })}</span>}
               {v.mileage > 0 && (
               {v.mileage > 0 && (
-                <span>{v.mileage.toLocaleString()} mi</span>
+                <span>{serviceType === 'boat' ? `${v.mileage.toLocaleString()} hrs` : `${v.mileage.toLocaleString()} mi`}</span>
               )}
               )}
               {v.color && <span>{v.color}</span>}
               {v.color && <span>{v.color}</span>}
             </div>
             </div>

+ 5 - 3
src/app/(public)/share/inspection/[orgId]/[token]/inspection-view.tsx

@@ -51,6 +51,7 @@ export function InspectionView({
   hasExistingQuoteRequest,
   hasExistingQuoteRequest,
   quoteShareUrl,
   quoteShareUrl,
   portalUrl,
   portalUrl,
+  serviceType = "automotive",
 }: {
 }: {
   inspection: InspectionRecord;
   inspection: InspectionRecord;
   workshop: { name: string; address: string; phone: string; email: string };
   workshop: { name: string; address: string; phone: string; email: string };
@@ -64,6 +65,7 @@ export function InspectionView({
   hasExistingQuoteRequest: boolean;
   hasExistingQuoteRequest: boolean;
   quoteShareUrl?: string;
   quoteShareUrl?: string;
   portalUrl?: string;
   portalUrl?: string;
+  serviceType?: "automotive" | "boat";
 }) {
 }) {
   const t = useTranslations('share.inspection');
   const t = useTranslations('share.inspection');
   const tc = useTranslations('share.common');
   const tc = useTranslations('share.common');
@@ -238,13 +240,13 @@ export function InspectionView({
             {inspection.vehicle.year} {inspection.vehicle.make} {inspection.vehicle.model}
             {inspection.vehicle.year} {inspection.vehicle.make} {inspection.vehicle.model}
           </p>
           </p>
           {inspection.vehicle.vin && (
           {inspection.vehicle.vin && (
-            <p className="text-sm text-gray-500">{t('vin', { vin: inspection.vehicle.vin })}</p>
+            <p className="text-sm text-gray-500">{serviceType === 'boat' ? `HIN: ${inspection.vehicle.vin}` : t('vin', { vin: inspection.vehicle.vin })}</p>
           )}
           )}
           {inspection.vehicle.licensePlate && (
           {inspection.vehicle.licensePlate && (
-            <p className="text-sm text-gray-500">{t('plate', { plate: inspection.vehicle.licensePlate })}</p>
+            <p className="text-sm text-gray-500">{serviceType === 'boat' ? `Reg: ${inspection.vehicle.licensePlate}` : t('plate', { plate: inspection.vehicle.licensePlate })}</p>
           )}
           )}
           {inspection.mileage && (
           {inspection.mileage && (
-            <p className="text-sm text-gray-500">{t('mileage', { mileage: inspection.mileage.toLocaleString() })}</p>
+            <p className="text-sm text-gray-500">{t(serviceType === 'boat' ? 'mileageBoat' : 'mileage', { mileage: inspection.mileage.toLocaleString() })}</p>
           )}
           )}
         </div>
         </div>
         {inspection.vehicle.customer && (
         {inspection.vehicle.customer && (

+ 2 - 0
src/app/(public)/share/inspection/[orgId]/[token]/page.tsx

@@ -63,6 +63,7 @@ export default async function PublicInspectionPage({
             "workshop.currencyCode",
             "workshop.currencyCode",
             "workshop.dateFormat",
             "workshop.dateFormat",
             "workshop.timezone",
             "workshop.timezone",
+            "workshop.serviceType",
             "invoice.primaryColor",
             "invoice.primaryColor",
             "portal.enabled",
             "portal.enabled",
           ],
           ],
@@ -141,6 +142,7 @@ export default async function PublicInspectionPage({
       hasExistingQuoteRequest={!!existingRequest}
       hasExistingQuoteRequest={!!existingRequest}
       quoteShareUrl={quoteShareUrl}
       quoteShareUrl={quoteShareUrl}
       portalUrl={portalUrl}
       portalUrl={portalUrl}
+      serviceType={(settingsMap["workshop.serviceType"] || "automotive") as "automotive" | "boat"}
     />
     />
   );
   );
 }
 }

+ 5 - 3
src/app/(public)/share/invoice/[orgId]/[token]/invoice-view.tsx

@@ -192,6 +192,7 @@ export function InvoiceView({
   layoutConfig,
   layoutConfig,
   customFields = [],
   customFields = [],
   telegramBotLink,
   telegramBotLink,
+  serviceType = "automotive",
 }: {
 }: {
   record: InvoiceRecord
   record: InvoiceRecord
   workshop: { name: string; address: string; phone: string; email: string }
   workshop: { name: string; address: string; phone: string; email: string }
@@ -214,6 +215,7 @@ export function InvoiceView({
   layoutConfig?: InvoiceLayoutConfig
   layoutConfig?: InvoiceLayoutConfig
   customFields?: CustomField[]
   customFields?: CustomField[]
   telegramBotLink?: string
   telegramBotLink?: string
+  serviceType?: "automotive" | "boat"
 }) {
 }) {
   const t = useTranslations('share.invoice')
   const t = useTranslations('share.invoice')
   const tc = useTranslations('share.common')
   const tc = useTranslations('share.common')
@@ -722,9 +724,9 @@ export function InvoiceView({
                     if (!show(fid)) return null
                     if (!show(fid)) return null
                     switch (fid) {
                     switch (fid) {
                       case 'vehicle_name': return <p key={fid} className="font-semibold">{vehicleName}</p>
                       case 'vehicle_name': return <p key={fid} className="font-semibold">{vehicleName}</p>
-                      case 'vin': return record.vehicle.vin ? <p key={fid} className="text-sm text-gray-500">{t('vin', { vin: record.vehicle.vin })}</p> : null
-                      case 'license_plate': return record.vehicle.licensePlate ? <p key={fid} className="text-sm text-gray-500">{t('plate', { plate: record.vehicle.licensePlate })}</p> : null
-                      case 'mileage': return record.vehicle.mileage > 0 ? <p key={fid} className="text-sm text-gray-500">{record.vehicle.mileage}</p> : null
+                      case 'vin': return record.vehicle.vin ? <p key={fid} className="text-sm text-gray-500">{serviceType === 'boat' ? `HIN: ${record.vehicle.vin}` : t('vin', { vin: record.vehicle.vin })}</p> : null
+                      case 'license_plate': return record.vehicle.licensePlate ? <p key={fid} className="text-sm text-gray-500">{serviceType === 'boat' ? `Reg: ${record.vehicle.licensePlate}` : t('plate', { plate: record.vehicle.licensePlate })}</p> : null
+                      case 'mileage': return record.vehicle.mileage > 0 ? <p key={fid} className="text-sm text-gray-500">{serviceType === 'boat' ? `Engine Hours: ${record.vehicle.mileage.toLocaleString()}` : record.vehicle.mileage.toLocaleString()}</p> : null
                       default: return null
                       default: return null
                     }
                     }
                   }
                   }

+ 2 - 0
src/app/(public)/share/invoice/[orgId]/[token]/page.tsx

@@ -95,6 +95,7 @@ export default async function PublicInvoicePage({
             "payment.termsOfSaleUrl",
             "payment.termsOfSaleUrl",
             "workshop.dateFormat",
             "workshop.dateFormat",
             "workshop.timezone",
             "workshop.timezone",
+            "workshop.serviceType",
             "portal.enabled",
             "portal.enabled",
             "invoice.layoutConfig",
             "invoice.layoutConfig",
             "telegram.botUsername",
             "telegram.botUsername",
@@ -210,6 +211,7 @@ export default async function PublicInvoicePage({
       layoutConfig={layoutConfig}
       layoutConfig={layoutConfig}
       customFields={customFields}
       customFields={customFields}
       telegramBotLink={telegramBotLink}
       telegramBotLink={telegramBotLink}
+      serviceType={(settingsMap["workshop.serviceType"] || "automotive") as "automotive" | "boat"}
     />
     />
   );
   );
 }
 }

+ 2 - 0
src/app/(public)/share/quote/[orgId]/[token]/page.tsx

@@ -74,6 +74,7 @@ export default async function PublicQuotePage({
             "invoice.headerStyle",
             "invoice.headerStyle",
             "portal.enabled",
             "portal.enabled",
             "quote.layoutConfig",
             "quote.layoutConfig",
+            "workshop.serviceType",
           ],
           ],
         },
         },
       },
       },
@@ -172,6 +173,7 @@ export default async function PublicQuotePage({
       documentAttachments={documentAttachments}
       documentAttachments={documentAttachments}
       layoutConfig={layoutConfig}
       layoutConfig={layoutConfig}
       customFields={customFields}
       customFields={customFields}
+      serviceType={(settingsMap["workshop.serviceType"] || "automotive") as "automotive" | "boat"}
     />
     />
   );
   );
 }
 }

+ 4 - 2
src/app/(public)/share/quote/[orgId]/[token]/quote-view.tsx

@@ -144,6 +144,7 @@ export function QuoteView({
   documentAttachments = [],
   documentAttachments = [],
   layoutConfig,
   layoutConfig,
   customFields = [],
   customFields = [],
+  serviceType = "automotive",
 }: {
 }: {
   quote: QuoteRecord;
   quote: QuoteRecord;
   workshop: { name: string; address: string; phone: string; email: string };
   workshop: { name: string; address: string; phone: string; email: string };
@@ -162,6 +163,7 @@ export function QuoteView({
   documentAttachments?: QuoteAttachmentView[];
   documentAttachments?: QuoteAttachmentView[];
   layoutConfig?: InvoiceLayoutConfig;
   layoutConfig?: InvoiceLayoutConfig;
   customFields?: CustomField[];
   customFields?: CustomField[];
+  serviceType?: "automotive" | "boat";
 }) {
 }) {
   const t = useTranslations('share.quote');
   const t = useTranslations('share.quote');
   const tc = useTranslations('share.common');
   const tc = useTranslations('share.common');
@@ -472,8 +474,8 @@ export function QuoteView({
                     if (!show(fid)) return null
                     if (!show(fid)) return null
                     switch (fid) {
                     switch (fid) {
                       case 'vehicle_name': return <p key={fid} className="font-semibold">{quote.vehicle!.year} {quote.vehicle!.make} {quote.vehicle!.model}</p>
                       case 'vehicle_name': return <p key={fid} className="font-semibold">{quote.vehicle!.year} {quote.vehicle!.make} {quote.vehicle!.model}</p>
-                      case 'vin': return quote.vehicle!.vin ? <p key={fid} className="text-sm text-gray-500">{t('vin', { vin: quote.vehicle!.vin })}</p> : null
-                      case 'license_plate': return quote.vehicle!.licensePlate ? <p key={fid} className="text-sm text-gray-500">{t('plate', { plate: quote.vehicle!.licensePlate })}</p> : null
+                      case 'vin': return quote.vehicle!.vin ? <p key={fid} className="text-sm text-gray-500">{serviceType === 'boat' ? `HIN: ${quote.vehicle!.vin}` : t('vin', { vin: quote.vehicle!.vin })}</p> : null
+                      case 'license_plate': return quote.vehicle!.licensePlate ? <p key={fid} className="text-sm text-gray-500">{serviceType === 'boat' ? `Reg: ${quote.vehicle!.licensePlate}` : t('plate', { plate: quote.vehicle!.licensePlate })}</p> : null
                       default: return null
                       default: return null
                     }
                     }
                   }
                   }

+ 11 - 0
src/app/api/protected/inspections/[id]/pdf/route.ts

@@ -66,6 +66,17 @@ export async function GET(
     const settingsMap: Record<string, string> = {};
     const settingsMap: Record<string, string> = {};
     for (const s of settings) settingsMap[s.key] = s.value;
     for (const s of settings) settingsMap[s.key] = s.value;
 
 
+    // Override labels for boat service type
+    const serviceType = settingsMap["workshop.serviceType"] || "automotive";
+    if (serviceType === "boat") {
+      if (pdfMessages.inspection.mileageBoat) labels.mileage = pdfMessages.inspection.mileageBoat;
+      if (pdfMessages.inspection.vinBoat) labels.vin = pdfMessages.inspection.vinBoat;
+      if (pdfMessages.inspection.plateBoat) labels.plate = pdfMessages.inspection.plateBoat;
+      if (pdfMessages.inspection.vehicleBoat) labels.vehicle = pdfMessages.inspection.vehicleBoat;
+      if (pdfMessages.inspection.titleBoat) labels.title = pdfMessages.inspection.titleBoat;
+      if (pdfMessages.inspection.footerTextBoat) labels.footerText = pdfMessages.inspection.footerTextBoat;
+    }
+
     let logoDataUri: string | undefined;
     let logoDataUri: string | undefined;
     const logoPath = settingsMap["workshop.logo"];
     const logoPath = settingsMap["workshop.logo"];
     if (logoPath) {
     if (logoPath) {

+ 8 - 0
src/app/api/protected/quotes/[id]/pdf/route.ts

@@ -64,6 +64,14 @@ export async function GET(
     const settingsMap: Record<string, string> = {};
     const settingsMap: Record<string, string> = {};
     for (const s of settings) settingsMap[s.key] = s.value;
     for (const s of settings) settingsMap[s.key] = s.value;
 
 
+    // Override labels for boat service type
+    const serviceType = settingsMap["workshop.serviceType"] || "automotive";
+    if (serviceType === "boat") {
+      if (pdfMessages.quote.vinBoat) labels.vin = pdfMessages.quote.vinBoat;
+      if (pdfMessages.quote.plateBoat) labels.plate = pdfMessages.quote.plateBoat;
+      if (pdfMessages.quote.vehicleBoat) labels.vehicle = pdfMessages.quote.vehicleBoat;
+    }
+
     let logoDataUri: string | undefined;
     let logoDataUri: string | undefined;
     const logoPath = settingsMap["workshop.logo"];
     const logoPath = settingsMap["workshop.logo"];
     if (logoPath) {
     if (logoPath) {

+ 12 - 0
src/app/api/protected/services/[id]/pdf/route.ts

@@ -98,6 +98,18 @@ export async function GET(
     const settingsMap: Record<string, string> = {};
     const settingsMap: Record<string, string> = {};
     for (const s of settings) settingsMap[s.key] = s.value;
     for (const s of settings) settingsMap[s.key] = s.value;
 
 
+    // Override labels for boat service type
+    const serviceType = settingsMap["workshop.serviceType"] || "automotive";
+    if (serviceType === "boat") {
+      if (pdfMessages.invoice.mileageBoat) labels.mileage = pdfMessages.invoice.mileageBoat;
+      if (pdfMessages.invoice.vinBoat) labels.vin = pdfMessages.invoice.vinBoat;
+      if (pdfMessages.invoice.plateBoat) labels.plate = pdfMessages.invoice.plateBoat;
+      if (pdfMessages.invoice.vehicleBoat) labels.vehicle = pdfMessages.invoice.vehicleBoat;
+      // Override unit labels for engine hours
+      labels.km = "hrs";
+      labels.mi = "hrs";
+    }
+
     // Load image attachments as base64 data URIs for PDF embedding
     // Load image attachments as base64 data URIs for PDF embedding
     const imageAttachments: { fileName: string; dataUri: string; description?: string }[] = [];
     const imageAttachments: { fileName: string; dataUri: string; description?: string }[] = [];
     const otherAttachments: { fileName: string; fileType: string }[] = [];
     const otherAttachments: { fileName: string; fileType: string }[] = [];

+ 11 - 0
src/app/api/public/share/inspection/[orgId]/[token]/pdf/route.ts

@@ -66,6 +66,17 @@ export async function GET(
     const settingsMap: Record<string, string> = {};
     const settingsMap: Record<string, string> = {};
     for (const s of settings) settingsMap[s.key] = s.value;
     for (const s of settings) settingsMap[s.key] = s.value;
 
 
+    // Override labels for boat service type
+    const serviceType = settingsMap["workshop.serviceType"] || "automotive";
+    if (serviceType === "boat") {
+      if (pdfMessages.inspection.mileageBoat) labels.mileage = pdfMessages.inspection.mileageBoat;
+      if (pdfMessages.inspection.vinBoat) labels.vin = pdfMessages.inspection.vinBoat;
+      if (pdfMessages.inspection.plateBoat) labels.plate = pdfMessages.inspection.plateBoat;
+      if (pdfMessages.inspection.vehicleBoat) labels.vehicle = pdfMessages.inspection.vehicleBoat;
+      if (pdfMessages.inspection.titleBoat) labels.title = pdfMessages.inspection.titleBoat;
+      if (pdfMessages.inspection.footerTextBoat) labels.footerText = pdfMessages.inspection.footerTextBoat;
+    }
+
     let logoDataUri: string | undefined;
     let logoDataUri: string | undefined;
     const logoPath = settingsMap["workshop.logo"];
     const logoPath = settingsMap["workshop.logo"];
     if (logoPath) {
     if (logoPath) {

+ 12 - 0
src/app/api/public/share/invoice/[orgId]/[token]/pdf/route.ts

@@ -101,6 +101,18 @@ export async function GET(
     const settingsMap: Record<string, string> = {};
     const settingsMap: Record<string, string> = {};
     for (const s of settings) settingsMap[s.key] = s.value;
     for (const s of settings) settingsMap[s.key] = s.value;
 
 
+    // Override labels for boat service type
+    const serviceType = settingsMap["workshop.serviceType"] || "automotive";
+    if (serviceType === "boat") {
+      if (pdfMessages.invoice.mileageBoat) labels.mileage = pdfMessages.invoice.mileageBoat;
+      if (pdfMessages.invoice.vinBoat) labels.vin = pdfMessages.invoice.vinBoat;
+      if (pdfMessages.invoice.plateBoat) labels.plate = pdfMessages.invoice.plateBoat;
+      if (pdfMessages.invoice.vehicleBoat) labels.vehicle = pdfMessages.invoice.vehicleBoat;
+      // Override unit labels for engine hours
+      labels.km = "hrs";
+      labels.mi = "hrs";
+    }
+
     // Load logo
     // Load logo
     let logoDataUri: string | undefined;
     let logoDataUri: string | undefined;
     const logoPath = settingsMap["workshop.logo"];
     const logoPath = settingsMap["workshop.logo"];

+ 8 - 0
src/app/api/public/share/quote/[orgId]/[token]/pdf/route.ts

@@ -68,6 +68,14 @@ export async function GET(
     const settingsMap: Record<string, string> = {};
     const settingsMap: Record<string, string> = {};
     for (const s of settings) settingsMap[s.key] = s.value;
     for (const s of settings) settingsMap[s.key] = s.value;
 
 
+    // Override labels for boat service type
+    const serviceType = settingsMap["workshop.serviceType"] || "automotive";
+    if (serviceType === "boat") {
+      if (pdfMessages.quote.vinBoat) labels.vin = pdfMessages.quote.vinBoat;
+      if (pdfMessages.quote.plateBoat) labels.plate = pdfMessages.quote.plateBoat;
+      if (pdfMessages.quote.vehicleBoat) labels.vehicle = pdfMessages.quote.vehicleBoat;
+    }
+
     let logoDataUri: string | undefined;
     let logoDataUri: string | undefined;
     const logoPath = settingsMap["workshop.logo"];
     const logoPath = settingsMap["workshop.logo"];
     if (logoPath) {
     if (logoPath) {

+ 28 - 0
src/components/service-type-context.tsx

@@ -0,0 +1,28 @@
+"use client";
+
+import { createContext, useContext } from "react";
+
+type ServiceType = "automotive" | "boat";
+
+const ServiceTypeContext = createContext<ServiceType>("automotive");
+
+export function ServiceTypeProvider({
+  serviceType,
+  children,
+}: {
+  serviceType?: string;
+  children: React.ReactNode;
+}) {
+  const value: ServiceType =
+    serviceType === "boat" ? "boat" : "automotive";
+
+  return (
+    <ServiceTypeContext.Provider value={value}>
+      {children}
+    </ServiceTypeContext.Provider>
+  );
+}
+
+export function useServiceType(): ServiceType {
+  return useContext(ServiceTypeContext);
+}

+ 3 - 1
src/features/inspections/Components/InspectionPageClient.tsx

@@ -23,6 +23,7 @@ import { toast } from "sonner";
 import { updateInspectionItem, completeInspection, deleteInspection } from "../Actions/inspectionActions";
 import { updateInspectionItem, completeInspection, deleteInspection } from "../Actions/inspectionActions";
 import { createQuote } from "@/features/quotes/Actions/quoteActions";
 import { createQuote } from "@/features/quotes/Actions/quoteActions";
 import { InspectionShareDialog } from "./InspectionShareDialog";
 import { InspectionShareDialog } from "./InspectionShareDialog";
+import { useServiceType } from "@/components/service-type-context";
 
 
 type Condition = "pass" | "fail" | "attention" | "not_inspected";
 type Condition = "pass" | "fail" | "attention" | "not_inspected";
 
 
@@ -421,6 +422,7 @@ export function InspectionPageClient({
 }) {
 }) {
   const router = useRouter();
   const router = useRouter();
   const { formatDate } = useFormatDate();
   const { formatDate } = useFormatDate();
+  const serviceType = useServiceType();
   const [isPending, startTransition] = useTransition();
   const [isPending, startTransition] = useTransition();
   const [showCompleteDialog, setShowCompleteDialog] = useState(false);
   const [showCompleteDialog, setShowCompleteDialog] = useState(false);
   const [showDeleteDialog, setShowDeleteDialog] = useState(false);
   const [showDeleteDialog, setShowDeleteDialog] = useState(false);
@@ -599,7 +601,7 @@ export function InspectionPageClient({
               {inspection.mileage && (
               {inspection.mileage && (
                 <>
                 <>
                   <span>&middot;</span>
                   <span>&middot;</span>
-                  <span>{inspection.mileage.toLocaleString()} mi</span>
+                  <span>{inspection.mileage.toLocaleString()} {serviceType === 'boat' ? 'hrs' : 'mi'}</span>
                 </>
                 </>
               )}
               )}
               {inspection.vehicle.licensePlate && (
               {inspection.vehicle.licensePlate && (

+ 4 - 2
src/features/inspections/Components/NewInspectionDialog.tsx

@@ -17,6 +17,7 @@ import { Check, ChevronsUpDown, Loader2, Settings } from "lucide-react";
 import { cn } from "@/lib/utils";
 import { cn } from "@/lib/utils";
 import Link from "next/link";
 import Link from "next/link";
 import { toast } from "sonner";
 import { toast } from "sonner";
+import { useServiceType } from "@/components/service-type-context";
 import { createInspection } from "../Actions/inspectionActions";
 import { createInspection } from "../Actions/inspectionActions";
 import { getVehicles } from "@/features/vehicles/Actions/vehicleActions";
 import { getVehicles } from "@/features/vehicles/Actions/vehicleActions";
 
 
@@ -46,6 +47,7 @@ export function NewInspectionDialog({
   preselectedVehicleId?: string;
   preselectedVehicleId?: string;
 }) {
 }) {
   const router = useRouter();
   const router = useRouter();
+  const serviceType = useServiceType();
   const [isPending, startTransition] = useTransition();
   const [isPending, startTransition] = useTransition();
   const [vehicles, setVehicles] = useState<VehicleOption[]>([]);
   const [vehicles, setVehicles] = useState<VehicleOption[]>([]);
   const [loadingVehicles, setLoadingVehicles] = useState(false);
   const [loadingVehicles, setLoadingVehicles] = useState(false);
@@ -193,12 +195,12 @@ export function NewInspectionDialog({
           </div>
           </div>
 
 
           <div className="space-y-2">
           <div className="space-y-2">
-            <Label>Mileage (optional)</Label>
+            <Label>{serviceType === 'boat' ? 'Engine Hours' : 'Mileage'} (optional)</Label>
             <Input
             <Input
               type="number"
               type="number"
               value={mileage}
               value={mileage}
               onChange={(e) => setMileage(e.target.value)}
               onChange={(e) => setMileage(e.target.value)}
-              placeholder="Current mileage"
+              placeholder={serviceType === 'boat' ? "Current engine hours" : "Current mileage"}
               min={0}
               min={0}
             />
             />
           </div>
           </div>

+ 15 - 2
src/features/settings/Components/InvoiceLayoutPreviewRenderer.tsx

@@ -7,6 +7,7 @@ import "@/features/vehicles/Components/invoice-pdf/fonts.client";
 import { InvoicePDF } from "@/features/vehicles/Components/InvoicePDF";
 import { InvoicePDF } from "@/features/vehicles/Components/InvoicePDF";
 import { QuotePDF } from "@/features/quotes/Components/QuotePDF";
 import { QuotePDF } from "@/features/quotes/Components/QuotePDF";
 import type { InvoiceLayoutPreviewProps } from "./InvoiceLayoutPreview";
 import type { InvoiceLayoutPreviewProps } from "./InvoiceLayoutPreview";
+import { useServiceType } from "@/components/service-type-context";
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 // Dummy data matching InvoiceData type exactly
 // Dummy data matching InvoiceData type exactly
@@ -197,15 +198,27 @@ export function InvoiceLayoutPreviewRenderer({
   logoUrl,
   logoUrl,
 }: InvoiceLayoutPreviewProps) {
 }: InvoiceLayoutPreviewProps) {
   const messages = useMessages();
   const messages = useMessages();
+  const serviceType = useServiceType();
 
 
   const labels = useMemo(() => {
   const labels = useMemo(() => {
     const pdf = (messages?.pdf ?? {}) as Record<string, Record<string, string>>;
     const pdf = (messages?.pdf ?? {}) as Record<string, Record<string, string>>;
     const namespace = documentType === "quote" ? "quote" : "invoice";
     const namespace = documentType === "quote" ? "quote" : "invoice";
-    return {
+    const baseLabels = {
       ...(pdf[namespace] ?? {}),
       ...(pdf[namespace] ?? {}),
       ...(pdf.common ?? {}),
       ...(pdf.common ?? {}),
     };
     };
-  }, [messages, documentType]);
+    // Override labels for boat service type
+    if (serviceType === "boat") {
+      const ns = pdf[namespace] ?? {};
+      if (ns.mileageBoat) baseLabels.mileage = ns.mileageBoat;
+      if (ns.vinBoat) baseLabels.vin = ns.vinBoat;
+      if (ns.plateBoat) baseLabels.plate = ns.plateBoat;
+      if (ns.vehicleBoat) baseLabels.vehicle = ns.vehicleBoat;
+      baseLabels.km = "hrs";
+      baseLabels.mi = "hrs";
+    }
+    return baseLabels;
+  }, [messages, documentType, serviceType]);
 
 
   const dummyCf = useMemo(
   const dummyCf = useMemo(
     () => buildDummyCustomFields(customFields),
     () => buildDummyCustomFields(customFields),

+ 1 - 0
src/features/settings/Schema/settingsSchema.ts

@@ -87,6 +87,7 @@ export const SETTING_KEYS = {
   AI_API_KEY: "ai.apiKey",
   AI_API_KEY: "ai.apiKey",
   AI_MODEL: "ai.model",
   AI_MODEL: "ai.model",
   AI_ENABLED: "ai.enabled",
   AI_ENABLED: "ai.enabled",
+  SERVICE_TYPE: "workshop.serviceType",
 } as const;
 } as const;
 
 
 export type SettingKey = (typeof SETTING_KEYS)[keyof typeof SETTING_KEYS];
 export type SettingKey = (typeof SETTING_KEYS)[keyof typeof SETTING_KEYS];

+ 34 - 15
src/features/vehicles/Components/VehicleForm.tsx

@@ -39,6 +39,7 @@ import { Camera, Check, ChevronsUpDown, Loader2, Plus, X } from "lucide-react";
 import { compressImage } from "@/lib/compress-image";
 import { compressImage } from "@/lib/compress-image";
 import { CustomerForm } from "@/features/customers/Components/CustomerForm";
 import { CustomerForm } from "@/features/customers/Components/CustomerForm";
 import { useTranslations } from "next-intl";
 import { useTranslations } from "next-intl";
+import { useServiceType } from "@/components/service-type-context";
 import type { CreateVehicleInput } from "../Schema/vehicleSchema";
 import type { CreateVehicleInput } from "../Schema/vehicleSchema";
 
 
 interface VehicleFormProps {
 interface VehicleFormProps {
@@ -63,6 +64,8 @@ interface VehicleFormProps {
 }
 }
 
 
 export function VehicleForm({ open, onOpenChange, vehicle, customers }: VehicleFormProps) {
 export function VehicleForm({ open, onOpenChange, vehicle, customers }: VehicleFormProps) {
+  const serviceType = useServiceType();
+  const isBoat = serviceType === "boat";
   const router = useRouter();
   const router = useRouter();
   const modal = useGlassModal();
   const modal = useGlassModal();
   const t = useTranslations("vehicles.form");
   const t = useTranslations("vehicles.form");
@@ -304,11 +307,11 @@ export function VehicleForm({ open, onOpenChange, vehicle, customers }: VehicleF
 
 
           <div className="grid grid-cols-2 gap-4">
           <div className="grid grid-cols-2 gap-4">
             <div className="space-y-2">
             <div className="space-y-2">
-              <Label htmlFor="make">{t("make")}</Label>
+              <Label htmlFor="make">{isBoat ? t("makeBoat") : t("make")}</Label>
               <Input
               <Input
                 id="make"
                 id="make"
                 name="make"
                 name="make"
-                placeholder="Toyota"
+                placeholder={isBoat ? "Boston Whaler" : "Toyota"}
                 defaultValue={vehicle?.make}
                 defaultValue={vehicle?.make}
                 required
                 required
               />
               />
@@ -318,7 +321,7 @@ export function VehicleForm({ open, onOpenChange, vehicle, customers }: VehicleF
               <Input
               <Input
                 id="model"
                 id="model"
                 name="model"
                 name="model"
-                placeholder="Camry"
+                placeholder={isBoat ? "Montauk 170" : "Camry"}
                 defaultValue={vehicle?.model}
                 defaultValue={vehicle?.model}
                 required
                 required
               />
               />
@@ -338,7 +341,7 @@ export function VehicleForm({ open, onOpenChange, vehicle, customers }: VehicleF
               />
               />
             </div>
             </div>
             <div className="space-y-2">
             <div className="space-y-2">
-              <Label htmlFor="mileage">{t("mileage")}</Label>
+              <Label htmlFor="mileage">{isBoat ? t("mileageBoat") : t("mileage")}</Label>
               <Input
               <Input
                 id="mileage"
                 id="mileage"
                 name="mileage"
                 name="mileage"
@@ -351,7 +354,7 @@ export function VehicleForm({ open, onOpenChange, vehicle, customers }: VehicleF
 
 
           <div className="grid grid-cols-2 gap-4">
           <div className="grid grid-cols-2 gap-4">
             <div className="space-y-2">
             <div className="space-y-2">
-              <Label htmlFor="vin">{t("vin")}</Label>
+              <Label htmlFor="vin">{isBoat ? t("vinBoat") : t("vin")}</Label>
               <Input
               <Input
                 id="vin"
                 id="vin"
                 name="vin"
                 name="vin"
@@ -360,7 +363,7 @@ export function VehicleForm({ open, onOpenChange, vehicle, customers }: VehicleF
               />
               />
             </div>
             </div>
             <div className="space-y-2">
             <div className="space-y-2">
-              <Label htmlFor="licensePlate">{t("licensePlate")}</Label>
+              <Label htmlFor="licensePlate">{isBoat ? t("licensePlateBoat") : t("licensePlate")}</Label>
               <Input
               <Input
                 id="licensePlate"
                 id="licensePlate"
                 name="licensePlate"
                 name="licensePlate"
@@ -392,36 +395,52 @@ export function VehicleForm({ open, onOpenChange, vehicle, customers }: VehicleF
                 <SelectContent>
                 <SelectContent>
                   <SelectItem value="gasoline">{t("gasoline")}</SelectItem>
                   <SelectItem value="gasoline">{t("gasoline")}</SelectItem>
                   <SelectItem value="diesel">{t("diesel")}</SelectItem>
                   <SelectItem value="diesel">{t("diesel")}</SelectItem>
-                  <SelectItem value="electric">{t("electric")}</SelectItem>
-                  <SelectItem value="hybrid">{t("hybrid")}</SelectItem>
+                  {!isBoat && (
+                    <>
+                      <SelectItem value="electric">{t("electric")}</SelectItem>
+                      <SelectItem value="hybrid">{t("hybrid")}</SelectItem>
+                    </>
+                  )}
+                  {isBoat && (
+                    <SelectItem value="two-stroke">{t("twoStroke")}</SelectItem>
+                  )}
                   <SelectItem value="other">{t("other")}</SelectItem>
                   <SelectItem value="other">{t("other")}</SelectItem>
                 </SelectContent>
                 </SelectContent>
               </Select>
               </Select>
             </div>
             </div>
             <div className="space-y-2">
             <div className="space-y-2">
-              <Label htmlFor="transmission">{t("transmission")}</Label>
+              <Label htmlFor="transmission">{isBoat ? t("transmissionBoat") : t("transmission")}</Label>
               <Select
               <Select
                 name="transmission"
                 name="transmission"
-                defaultValue={vehicle?.transmission ?? "automatic"}
+                defaultValue={vehicle?.transmission ?? (isBoat ? "outboard" : "automatic")}
               >
               >
                 <SelectTrigger>
                 <SelectTrigger>
                   <SelectValue />
                   <SelectValue />
                 </SelectTrigger>
                 </SelectTrigger>
                 <SelectContent>
                 <SelectContent>
-                  <SelectItem value="automatic">{t("automatic")}</SelectItem>
-                  <SelectItem value="manual">{t("manual")}</SelectItem>
-                  <SelectItem value="cvt">{t("cvt")}</SelectItem>
+                  {isBoat ? (
+                    <>
+                      <SelectItem value="outboard">{t("outboard")}</SelectItem>
+                      <SelectItem value="inboard">{t("inboard")}</SelectItem>
+                    </>
+                  ) : (
+                    <>
+                      <SelectItem value="automatic">{t("automatic")}</SelectItem>
+                      <SelectItem value="manual">{t("manual")}</SelectItem>
+                      <SelectItem value="cvt">{t("cvt")}</SelectItem>
+                    </>
+                  )}
                 </SelectContent>
                 </SelectContent>
               </Select>
               </Select>
             </div>
             </div>
           </div>
           </div>
 
 
           <div className="space-y-2">
           <div className="space-y-2">
-            <Label htmlFor="engineSize">{t("engineSize")}</Label>
+            <Label htmlFor="engineSize">{isBoat ? t("engineSizeBoat") : t("engineSize")}</Label>
             <Input
             <Input
               id="engineSize"
               id="engineSize"
               name="engineSize"
               name="engineSize"
-              placeholder="2.5L"
+              placeholder={isBoat ? "Mercury F 350 XXL Verado V-10 (350 hp)" : "2.5L"}
               defaultValue={vehicle?.engineSize ?? ""}
               defaultValue={vehicle?.engineSize ?? ""}
             />
             />
           </div>
           </div>

+ 4 - 2
src/features/vehicles/Components/service-detail/ServiceSidebar.tsx

@@ -2,6 +2,7 @@
 
 
 import Link from "next/link";
 import Link from "next/link";
 import { useTranslations } from "next-intl";
 import { useTranslations } from "next-intl";
+import { useServiceType } from "@/components/service-type-context";
 import { Building2, Car, Mail, MapPin, Phone, Users } from "lucide-react";
 import { Building2, Car, Mail, MapPin, Phone, Users } from "lucide-react";
 import { CustomFieldsForm } from "@/features/custom-fields/Components/CustomFieldsForm";
 import { CustomFieldsForm } from "@/features/custom-fields/Components/CustomFieldsForm";
 import type { Vehicle } from "./types";
 import type { Vehicle } from "./types";
@@ -22,6 +23,7 @@ export function ServiceSidebar({
   mileage,
   mileage,
 }: ServiceSidebarProps) {
 }: ServiceSidebarProps) {
   const t = useTranslations("service.sidebar");
   const t = useTranslations("service.sidebar");
+  const serviceType = useServiceType();
   return (
   return (
     <>
     <>
       {/* Vehicle Info */}
       {/* Vehicle Info */}
@@ -37,11 +39,11 @@ export function ServiceSidebar({
           <p className="font-mono text-xs text-muted-foreground">{vehicle.licensePlate}</p>
           <p className="font-mono text-xs text-muted-foreground">{vehicle.licensePlate}</p>
         )}
         )}
         {vehicle.vin && (
         {vehicle.vin && (
-          <p className="font-mono text-xs text-muted-foreground">{t("vin", { vin: vehicle.vin })}</p>
+          <p className="font-mono text-xs text-muted-foreground">{serviceType === 'boat' ? `HIN: ${vehicle.vin}` : t("vin", { vin: vehicle.vin })}</p>
         )}
         )}
         {mileage && (
         {mileage && (
           <p className="mt-0.5 text-xs text-muted-foreground">
           <p className="mt-0.5 text-xs text-muted-foreground">
-            {t("mileageAtService", { mileage: mileage.toLocaleString(), unit: distUnit })}
+            {serviceType === 'boat' ? t("engineHoursAtService", { mileage: mileage.toLocaleString(), unit: distUnit }) : t("mileageAtService", { mileage: mileage.toLocaleString(), unit: distUnit })}
           </p>
           </p>
         )}
         )}
       </div>
       </div>

+ 3 - 1
src/features/vehicles/Components/service-edit/BasicInfoSection.tsx

@@ -12,6 +12,7 @@ import {
 } from '@/components/ui/select'
 } from '@/components/ui/select'
 import Link from 'next/link'
 import Link from 'next/link'
 import { ExternalLink } from 'lucide-react'
 import { ExternalLink } from 'lucide-react'
+import { useServiceType } from '@/components/service-type-context'
 import type { InitialData } from './form-types'
 import type { InitialData } from './form-types'
 import { VehicleCombobox } from '@/features/quotes/Components/VehicleCombobox'
 import { VehicleCombobox } from '@/features/quotes/Components/VehicleCombobox'
 
 
@@ -50,6 +51,7 @@ export function BasicInfoSection({
   initialVehicle,
   initialVehicle,
 }: BasicInfoSectionProps) {
 }: BasicInfoSectionProps) {
   const t = useTranslations('service.basicInfo')
   const t = useTranslations('service.basicInfo')
+  const serviceType = useServiceType()
 
 
   return (
   return (
     <div className="rounded-lg border p-3 space-y-3">
     <div className="rounded-lg border p-3 space-y-3">
@@ -153,7 +155,7 @@ export function BasicInfoSection({
 
 
       <div className="grid grid-cols-2 gap-2">
       <div className="grid grid-cols-2 gap-2">
         <div className="space-y-1">
         <div className="space-y-1">
-          <Label htmlFor="mileage" className="text-xs">{t('mileage')}</Label>
+          <Label htmlFor="mileage" className="text-xs">{serviceType === 'boat' ? t('mileageBoat') : t('mileage')}</Label>
           <Input
           <Input
             id="mileage"
             id="mileage"
             name="mileage"
             name="mileage"

+ 3 - 0
src/lib/get-layout-data.ts

@@ -16,6 +16,7 @@ type AuthResult =
       dateFormat: string | undefined;
       dateFormat: string | undefined;
       timeFormat: string | undefined;
       timeFormat: string | undefined;
       timezone: string | undefined;
       timezone: string | undefined;
+      serviceType: string | undefined;
       organizations: { id: string; name: string; role: string }[];
       organizations: { id: string; name: string; role: string }[];
     };
     };
 
 
@@ -49,6 +50,7 @@ export async function getLayoutData(): Promise<AuthResult> {
                 SETTING_KEYS.DATE_FORMAT,
                 SETTING_KEYS.DATE_FORMAT,
                 SETTING_KEYS.TIME_FORMAT,
                 SETTING_KEYS.TIME_FORMAT,
                 SETTING_KEYS.TIMEZONE,
                 SETTING_KEYS.TIMEZONE,
+                SETTING_KEYS.SERVICE_TYPE,
               ],
               ],
             },
             },
           },
           },
@@ -77,6 +79,7 @@ export async function getLayoutData(): Promise<AuthResult> {
     dateFormat: orgMap.get(SETTING_KEYS.DATE_FORMAT) || undefined,
     dateFormat: orgMap.get(SETTING_KEYS.DATE_FORMAT) || undefined,
     timeFormat: orgMap.get(SETTING_KEYS.TIME_FORMAT) || undefined,
     timeFormat: orgMap.get(SETTING_KEYS.TIME_FORMAT) || undefined,
     timezone: orgMap.get(SETTING_KEYS.TIMEZONE) || undefined,
     timezone: orgMap.get(SETTING_KEYS.TIMEZONE) || undefined,
+    serviceType: orgMap.get(SETTING_KEYS.SERVICE_TYPE) || undefined,
     organizations: memberships.map((m) => ({
     organizations: memberships.map((m) => ({
       id: m.organization.id,
       id: m.organization.id,
       name: m.organization.name,
       name: m.organization.name,