feat(i18n): mega-wrap 494 raw RO strings + 269 lang entries + 161 human RU/163 EN

Broad sweep across the whole codebase:
- Blade views (39 files, 315 wraps): tag-text and title/placeholder/alt
  attributes wrapped with {{ __() }}. Excludes scripts, styles, @php,
  @verbatim, {{ }}, {!! !!}, comments to avoid touching interpolations.
- PHP (54 files, 179 wraps): array 'key' => 'RO value' patterns and
  list items with diacritics wrapped with __(). Reverted __() inside
  const arrays (PHP disallows non-constant expressions).
- Added 269 new keys to lang/{ru,en}.json (identity fallback for
  unknowns → 161 human RU + 163 EN translations added for the most
  common enums, stages, roles, statuses, payment methods, vehicle
  categories, warehouse, portal, form actions.

Missing translations fall back to RO so the UI never breaks. All 306
tests pass; view cache compiles cleanly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-15 05:53:22 +00:00
parent 2d447e6294
commit 3911012c65
68 changed files with 1211 additions and 429 deletions
@@ -5,14 +5,14 @@
'email' => $email ?? null,
'city' => $city ?? null,
'logoUrl' => $logoUrl ?? null,
'title' => 'Programare confirmată',
])
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};">📅 Programare confirmată</h2>
'title' => {{ __('\'Programare confirmată\',
])') }}
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};">{{ __('📅 Programare confirmată') }}</h2>
<p>Bună ziua{{ $client?->name ? ', ' . $client->name : '' }},</p>
<p>Programarea dvs. este confirmată:</p>
<p>{{ __('Programarea dvs. este confirmată:') }}</p>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:16px 0;background:#f9fafb;border-radius:8px;">
<tr><td style="padding:14px 18px;font-size:13px;color:#374151;">Data</td>
<tr><td style="padding:14px 18px;font-size:13px;color:#374151;">{{ __('Data') }}</td>
<td style="padding:14px 18px;font-size:18px;text-align:right;font-weight:700;color:{{ $themeColor }};">
{{ $appointment->date?->format('d.m.Y') }}
</td></tr>
@@ -25,7 +25,7 @@
<td style="padding:8px 18px;font-size:12px;text-align:right;">{{ $appointment->title }}</td></tr>
@endif
@if ($vehicle)
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">Auto</td>
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">{{ __('Auto') }}</td>
<td style="padding:8px 18px;font-size:12px;text-align:right;">
{{ $vehicle->make }} {{ $vehicle->model }}
@if ($vehicle->plate) <b>[{{ $vehicle->plate }}]</b> @endif
@@ -41,6 +41,6 @@
@endif
</table>
<p> așteptăm! 🚗</p>
<p>{{ __('Vă așteptăm! 🚗') }}</p>
<p style="font-size:12px;color:#6b7280;">Pentru reprogramare sau anulare, sunați-ne la {{ $phone ?? '—' }}.</p>
@endcomponent
+1 -1
View File
@@ -28,7 +28,7 @@
<div>{{ $companyName ?? 'AutoCRM' }}</div>
@if (!empty($phone)) <div>📞 {{ $phone }}</div> @endif
@if (!empty($email)) <div> {{ $email }}</div> @endif
<div style="margin-top:8px;color:#9ca3af;">Acest email a fost generat automat. rugăm nu răspundeți.</div>
<div style="margin-top:8px;color:#9ca3af;">{{ __('Acest email a fost generat automat. Vă rugăm nu răspundeți.') }}</div>
</td></tr>
</table>
</td></tr>
@@ -5,14 +5,14 @@
'email' => $email ?? null,
'city' => $city ?? null,
'logoUrl' => $logoUrl ?? null,
'title' => 'Plată confirmată',
])
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};">💳 Plată confirmată</h2>
'title' => {{ __('\'Plată confirmată\',
])') }}
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};">{{ __('💳 Plată confirmată') }}</h2>
<p>Bună ziua{{ $client?->name ? ', ' . $client->name : '' }},</p>
<p>Confirmăm primirea plății dvs.:</p>
<p>{{ __('Confirmăm primirea plății dvs.:') }}</p>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:16px 0;background:#f9fafb;border-radius:8px;">
<tr><td style="padding:14px 18px;font-size:13px;color:#374151;">Sumă achitată</td>
<tr><td style="padding:14px 18px;font-size:13px;color:#374151;">{{ __('Sumă achitată') }}</td>
<td style="padding:14px 18px;font-size:18px;text-align:right;font-weight:700;color:#059669;">
{{ number_format((float) $payment->amount, 2, '.', ' ') }} {{ $currency }}
</td></tr>
@@ -20,17 +20,17 @@
<td style="padding:8px 18px;font-size:12px;text-align:right;">
{{ \App\Models\Tenant\Payment::METHODS[$payment->method] ?? $payment->method }}
</td></tr>
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">Data</td>
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">{{ __('Data') }}</td>
<td style="padding:8px 18px;font-size:12px;text-align:right;">{{ $payment->paid_at?->format('d.m.Y') }}</td></tr>
@if ($payment->reference)
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">Referință</td>
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">{{ __('Referință') }}</td>
<td style="padding:8px 18px;font-size:12px;text-align:right;font-family:monospace;">{{ $payment->reference }}</td></tr>
@endif
@if ($workOrder)
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">Fișă lucru</td>
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">{{ __('Fișă lucru') }}</td>
<td style="padding:8px 18px;font-size:12px;text-align:right;font-weight:600;">{{ $workOrder->number }}</td></tr>
@endif
</table>
<p> mulțumim!</p>
<p>{{ __('Vă mulțumim!') }}</p>
@endcomponent
@@ -42,5 +42,5 @@
</div>
@endif
<p>Programați- online sau sunați la <b>{{ $phone ?? '—' }}</b>.</p>
<p>{{ __('Programați-vă online sau sunați la') }} <b>{{ $phone ?? '—' }}</b>.</p>
@endcomponent
@@ -2,13 +2,13 @@
<html>
<head>
<meta charset="UTF-8">
<title>Comandă primită</title>
<title>{{ __('Comandă primită') }}</title>
</head>
<body style="font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; max-width: 600px; margin: 0 auto; padding: 24px; color: #1f2937;">
@php $brand = $company->display_name ?? $company->name; @endphp
<h2 style="font-size: 22px; margin-bottom: 4px;">{{ $brand }}</h2>
<p style="color: #6b7280; margin-bottom: 24px;">Comanda ta a fost primită cu succes.</p>
<p style="color: #6b7280; margin-bottom: 24px;">{{ __('Comanda ta a fost primită cu succes.') }}</p>
<div style="background: #f9fafb; border-radius: 10px; padding: 18px; margin-bottom: 18px;">
<div style="font-size: 14px; color: #6b7280;">Comanda</div>
@@ -39,7 +39,7 @@
</tr>
@endif
<tr>
<td style="padding: 12px 0 4px; font-weight: 700;">Total</td>
<td style="padding: 12px 0 4px; font-weight: 700;">{{ __('Total') }}</td>
<td style="padding: 12px 0 4px; font-weight: 700; font-size: 18px; text-align: right;">
{{ number_format((float) $order->total, 2) }} {{ $currency }}
</td>
@@ -48,13 +48,13 @@
@if ($order->address)
<p style="background: #fefce8; border-left: 3px solid #facc15; padding: 10px 12px; font-size: 13px; color: #713f12;">
<strong>Adresă livrare:</strong> {{ $order->address }}
<strong>{{ __('Adresă livrare:') }}</strong> {{ $order->address }}
</p>
@endif
<p style="margin: 24px 0;">
<a href="{{ $trackingUrl }}" style="display: inline-block; background: #3b82f6; color: #fff; padding: 12px 24px; border-radius: 8px; text-decoration: none; font-weight: 600;">
Urmărește comanda
{{ __('Urmărește comanda →') }}
</a>
</p>
@@ -2,22 +2,22 @@
<html>
<head>
<meta charset="UTF-8">
<title>Resetare parolă</title>
<title>{{ __('Resetare parolă') }}</title>
</head>
<body style="font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; max-width: 560px; margin: 0 auto; padding: 24px; color: #1f2937;">
@php $brand = $company->display_name ?? $company->name; @endphp
<h2 style="font-size: 22px; margin-bottom: 16px;">{{ $brand }}</h2>
<p>Salut {{ $customer->name }},</p>
<p>Ai cerut resetarea parolei pentru contul tău de magazin. Apasă linkul de mai jos ca setezi o parolă nouă:</p>
<p>{{ __('Ai cerut resetarea parolei pentru contul tău de magazin. Apasă linkul de mai jos ca să setezi o parolă nouă:') }}</p>
<p style="margin: 24px 0;">
<a href="{{ $resetUrl }}" style="display: inline-block; background: #3b82f6; color: #fff; padding: 12px 24px; border-radius: 8px; text-decoration: none; font-weight: 600;">
Resetează parola
{{ __('Resetează parola') }}
</a>
</p>
<p style="color: #6b7280; font-size: 14px;">Linkul expiră în 60 de minute. Dacă nu ai cerut tu acest reset, ignoră emailul contul tău e în siguranță.</p>
<p style="color: #6b7280; font-size: 14px;">{{ __('Linkul expiră în 60 de minute. Dacă nu ai cerut tu acest reset, ignoră emailul — contul tău e în siguranță.') }}</p>
<p style="color: #9ca3af; font-size: 12px; margin-top: 32px; border-top: 1px solid #e5e7eb; padding-top: 12px;">
Email automat de la {{ $brand }} nu răspunde la el.
@@ -6,11 +6,11 @@ Ai fost invitat de **{{ $invitedBy }}** să acce­sezi **{{ $companyName }}** pe
Pentru a-ți activa contul și a-ți seta parola, apasă pe linkul de mai jos:
<x-mail::button :url="$acceptUrl" color="primary">
Acceptă invitația
{{ __('Acceptă invitația') }}
</x-mail::button>
Linkul expiră în 7 zile. Dacă nu te aștepți la această invitație, ignoră acest mesaj.
{{ __('Linkul expiră în 7 zile. Dacă nu te aștepți la această invitație, ignoră acest mesaj.
Mulțumim,<br>
Mulțumim,') }}<br>
**{{ $companyName }}**
</x-mail::message>
@@ -6,15 +6,15 @@
'email' => $email ?? null,
'city' => $city ?? null,
'logoUrl' => $logoUrl ?? null,
'title' => 'Mașina e gata',
])
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};"> Mașina dvs. este gata!</h2>
'title' => {{ __('\'Mașina e gata\',
])') }}
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};">{{ __('✅ Mașina dvs. este gata!') }}</h2>
<p>Bună ziua{{ $client?->name ? ', ' . $client->name : '' }},</p>
<p> informăm lucrările pentru autoturismul dvs. au fost finalizate. Puteți veni -l ridicați.</p>
<p>{{ __('Vă informăm că lucrările pentru autoturismul dvs. au fost finalizate. Puteți veni să-l ridicați.') }}</p>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:16px 0;border:1px solid #e5e7eb;border-radius:8px;">
<tr><td style="padding:14px;">
<div style="font-size:11px;text-transform:uppercase;color:#6b7280;letter-spacing:.5px;">Fișă lucru</div>
<div style="font-size:11px;text-transform:uppercase;color:#6b7280;letter-spacing:.5px;">{{ __('Fișă lucru') }}</div>
<div style="font-size:16px;font-weight:700;margin-top:4px;">{{ $workOrder->number }}</div>
@if ($vehicle)
<div style="margin-top:10px;font-size:13px;">
@@ -27,7 +27,7 @@
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:16px 0;background:#f9fafb;border-radius:8px;">
<tr>
<td style="padding:12px 16px;font-size:13px;color:#374151;">Total</td>
<td style="padding:12px 16px;font-size:13px;color:#374151;">{{ __('Total') }}</td>
<td style="padding:12px 16px;font-size:13px;text-align:right;font-weight:600;">{{ number_format($total, 2, '.', ' ') }} {{ $currency }}</td>
</tr>
@if ($paid > 0)
@@ -38,7 +38,7 @@
@endif
@if ($balance > 0)
<tr>
<td style="padding:12px 16px;font-size:14px;font-weight:700;border-top:1px solid #e5e7eb;color:{{ $themeColor }};">Rest de plată</td>
<td style="padding:12px 16px;font-size:14px;font-weight:700;border-top:1px solid #e5e7eb;color:{{ $themeColor }};">{{ __('Rest de plată') }}</td>
<td style="padding:12px 16px;font-size:16px;text-align:right;font-weight:700;border-top:1px solid #e5e7eb;color:{{ $themeColor }};">{{ number_format($balance, 2, '.', ' ') }} {{ $currency }}</td>
</tr>
@endif
@@ -46,11 +46,11 @@
@if ($workOrder->recommendations)
<div style="background:#fef3c7;border-left:4px solid #f59e0b;padding:12px;margin:16px 0;border-radius:6px;font-size:13px;">
<b style="color:#92400e;"> Recomandări:</b><br>
<b style="color:#92400e;">{{ __('⚠ Recomandări:') }}</b><br>
{{ $workOrder->recommendations }}
</div>
@endif
<p style="margin-top:20px;">Atașat veți găsi <b>fișa de lucru completă</b> (PDF).</p>
<p> mulțumim pentru încredere!</p>
<p style="margin-top:20px;">{{ __('Atașat veți găsi') }} <b>{{ __('fișa de lucru completă') }}</b> (PDF).</p>
<p>{{ __('Vă mulțumim pentru încredere!') }}</p>
@endcomponent
@@ -7,27 +7,27 @@
class="fi-btn fi-btn-color-primary"
style="padding: 10px 24px; background: #6366f1; color: white; border-radius: 8px; border: none; cursor: pointer; font-weight: 500;"
wire:loading.attr="disabled">
<span wire:loading.remove>💾 Salvează setările</span>
<span wire:loading>Se salvează...</span>
<span wire:loading.remove>{{ __('💾 Salvează setările') }}</span>
<span wire:loading>{{ __('Se salvează...') }}</span>
</button>
</div>
</form>
<div style="margin-top:24px;background:#f9fafb;border:1px dashed #e5e7eb;border-radius:8px;padding:16px;font-size:13px;line-height:1.7;">
<b style="color:#6366f1;">📚 Cum se face plata în sistem:</b>
<b style="color:#6366f1;">{{ __('📚 Cum se face plata în sistem:') }}</b>
<ol style="margin:8px 0 0 18px;padding:0;">
<li>Operatorul (tu) creezi factură: <code>/admin/companies/{id}</code> „Generează factură"</li>
<li>Tenantul vede factura în interiorul lui la <code>https://{slug}.service.mir.md/billing</code></li>
<li>Click „Plătește" → opțiuni: card (Stripe), PayPal, sau transfer manual</li>
<li>{{ __('Operatorul (tu) creezi factură:') }} <code>/admin/companies/{id}</code> {{ __('→ „Generează factură"') }}</li>
<li>{{ __('Tenantul vede factura în interiorul lui la') }} <code>https://{slug}.service.mir.md/billing</code></li>
<li>{{ __('Click „Plătește" → opțiuni: card (Stripe), PayPal, sau transfer manual') }}</li>
<li>La succes: webhook automat status=paid + extends company.active_until</li>
<li>La transfer manual: tenant trimite confirmare; operator click „Marchează plătit" în /admin/subscriptions</li>
<li>{{ __('La transfer manual: tenant trimite confirmare; operator click „Marchează plătit" în /admin/subscriptions') }}</li>
</ol>
<div style="margin-top:12px;padding-top:12px;border-top:1px solid #e5e7eb;">
<b> Pentru a primi plăți LIVE:</b>
<b>{{ __('⚠ Pentru a primi plăți LIVE:') }}</b>
<ul style="margin:4px 0 0 18px;padding:0;font-size:12px;">
<li>Stripe: înregistrează cont la <a href="https://dashboard.stripe.com" target="_blank" style="color:#6366f1;">dashboard.stripe.com</a> ia keys setează webhook la URL-ul de mai sus</li>
<li>PayPal: <a href="https://developer.paypal.com/dashboard/applications" target="_blank" style="color:#6366f1;">developer.paypal.com</a> creează aplicație live ia credentials</li>
<li>Transfer bancar: pune doar IBAN-ul tău, fără cont gateway</li>
<li>{{ __('Stripe: înregistrează cont la') }} <a href="https://dashboard.stripe.com" target="_blank" style="color:#6366f1;">dashboard.stripe.com</a> {{ __('→ ia keys → setează webhook la URL-ul de mai sus') }}</li>
<li>PayPal: <a href="https://developer.paypal.com/dashboard/applications" target="_blank" style="color:#6366f1;">developer.paypal.com</a> {{ __('→ creează aplicație live → ia credentials') }}</li>
<li>{{ __('Transfer bancar: pune doar IBAN-ul tău, fără cont gateway') }}</li>
</ul>
</div>
</div>
@@ -88,7 +88,7 @@
@if ($this->record->plan)
<span class="cv-badge cv-badge-gray">📦 {{ $this->record->plan->name }}</span>
@else
<span class="cv-badge cv-badge-warning"> Fără plan</span>
<span class="cv-badge cv-badge-warning">{{ __('⚠ Fără plan') }}</span>
@endif
@if ($daysLeft !== null)
@if ($daysLeft < 0)
@@ -112,39 +112,39 @@
<div class="value">{{ $stats['users'] }}</div>
</div>
<div class="cv-card">
<div class="label">Clienți</div>
<div class="label">{{ __('Clienți') }}</div>
<div class="value">{{ $stats['clients'] }}</div>
</div>
<div class="cv-card">
<div class="label">Mașini</div>
<div class="label">{{ __('Mașini') }}</div>
<div class="value">{{ $stats['vehicles'] }}</div>
</div>
<div class="cv-card {{ $stats['work_orders_open'] > 0 ? 'warn' : '' }}">
<div class="label">Fișe lucru</div>
<div class="label">{{ __('Fișe lucru') }}</div>
<div class="value">{{ $stats['work_orders'] }}</div>
<div class="sub">{{ $stats['work_orders_open'] }} deschise</div>
</div>
<div class="cv-card {{ $stats['parts_low_stock'] > 0 ? 'warn' : '' }}">
<div class="label">Piese în stoc</div>
<div class="label">{{ __('Piese în stoc') }}</div>
<div class="value">{{ $stats['parts'] }}</div>
@if ($stats['parts_low_stock'])
<div class="sub"> {{ $stats['parts_low_stock'] }} sub minim</div>
@endif
</div>
<div class="cv-card success">
<div class="label">Venit luna curentă</div>
<div class="label">{{ __('Venit luna curentă') }}</div>
<div class="value">{{ number_format($stats['revenue_this_month'], 0, ',', ' ') }}</div>
<div class="sub">{{ $this->record->settings['currency'] ?? 'MDL' }}</div>
</div>
<div class="cv-card">
<div class="label">Venit luna trecută</div>
<div class="label">{{ __('Venit luna trecută') }}</div>
<div class="value">{{ number_format($stats['revenue_last_month'], 0, ',', ' ') }}</div>
<div class="sub">{{ $this->record->settings['currency'] ?? 'MDL' }}</div>
</div>
<div class="cv-card">
<div class="label">Storage media</div>
<div class="value">{{ $stats['storage_mb'] }}</div>
<div class="sub">MB folosiți</div>
<div class="sub">{{ __('MB folosiți') }}</div>
</div>
<div class="cv-card {{ $stats['last_login'] && \Carbon\Carbon::parse($stats['last_login'])->diffInDays() > 14 ? 'danger' : '' }}">
<div class="label">Ultima logare</div>
@@ -163,18 +163,18 @@
<div class="cv-section-title">💳 Istoric abonamente</div>
@if ($this->record->subscriptions->isEmpty())
<div style="padding:32px;text-align:center;color:#9ca3af;font-size:13px;border:1px dashed #e5e7eb;border-radius:8px;">
Niciun abonament emis. Folosește „Generează factură" de sus.
{{ __('Niciun abonament emis. Folosește „Generează factură" de sus.') }}
</div>
@else
<table class="cv-table">
<thead>
<tr>
<th>Factură</th>
<th>{{ __('Factură') }}</th>
<th>Plan</th>
<th>Perioadă</th>
<th>Sumă</th>
<th>{{ __('Perioadă') }}</th>
<th>{{ __('Sumă') }}</th>
<th>Status</th>
<th>Plătit</th>
<th>{{ __('Plătit') }}</th>
</tr>
</thead>
<tbody>
@@ -202,17 +202,17 @@
<div class="cv-section-title"> Configurare tenant</div>
<div class="cv-grid" style="grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));">
<div class="cv-card">
<div class="label">Limbă</div>
<div class="label">{{ __('Limbă') }}</div>
<div class="value" style="font-size:14px;">
{{ ['ro' => 'Română', 'ru' => 'Русский', 'en' => 'English'][$this->record->settings['language'] ?? 'ro'] ?? '—' }}
</div>
</div>
<div class="cv-card">
<div class="label">Monedă</div>
<div class="label">{{ __('Monedă') }}</div>
<div class="value" style="font-size:14px;">{{ $this->record->settings['currency'] ?? 'MDL' }}</div>
</div>
<div class="cv-card">
<div class="label">Tarif normo-oră</div>
<div class="label">{{ __('Tarif normo-oră') }}</div>
<div class="value" style="font-size:14px;">{{ $this->record->settings['labor_rate'] ?? '—' }}</div>
</div>
<div class="cv-card">
@@ -104,7 +104,7 @@
<div class="ai-wrap" x-data x-init="$nextTick(() => { const m = $refs.msgs; if (m) m.scrollTop = m.scrollHeight; })">
{{-- Sidebar: chat history --}}
<div class="ai-side">
<button type="button" class="ai-new-btn" wire:click="newChat">+ Conversație nouă</button>
<button type="button" class="ai-new-btn" wire:click="newChat">{{ __('+ Conversație nouă') }}</button>
@forelse ($chats as $c)
<div class="ai-chat-item {{ $c->id === $chatId ? 'active' : '' }}">
<span class="ai-chat-title" wire:click="selectChat({{ $c->id }})" style="cursor:pointer;">
@@ -114,7 +114,7 @@
wire:confirm="Șterge conversația?">×</button>
</div>
@empty
<div style="font-size:11px;color:#9ca3af;padding:8px;">Nicio conversație</div>
<div style="font-size:11px;color:#9ca3af;padding:8px;">{{ __('Nicio conversație') }}</div>
@endforelse
</div>
@@ -126,9 +126,9 @@
<div class="ai-empty">
<div style="font-size:32px;margin-bottom:8px;"></div>
<div style="font-size:14px;font-weight:600;margin-bottom:4px;">Asistent AI pentru autoservice</div>
<div style="font-size:12px;">Întreabă- orice diagnostic, sumar, sugestii, redactare mesaje către clienți...</div>
<div style="font-size:12px;">{{ __('Întreabă-mă orice — diagnostic, sumar, sugestii, redactare mesaje către clienți...') }}</div>
<div style="font-size:11px;margin-top:16px;color:#9ca3af;">
<b>Configurare:</b> mergi la Setări Asistent AI și adaugă cheia API (Claude / GPT / Gemini).
<b>Configurare:</b> {{ __('mergi la Setări → Asistent AI și adaugă cheia API (Claude / GPT / Gemini).') }}
</div>
</div>
@else
@@ -152,7 +152,7 @@
@if ($loading)
<div class="ai-loading">
<span class="dot"></span><span class="dot"></span><span class="dot"></span>
<span>asistent gândește...</span>
<span>{{ __('asistent gândește...') }}</span>
</div>
@endif
</div>
@@ -161,12 +161,12 @@
<textarea
class="ai-input"
wire:model="newMessage"
placeholder="Scrie mesajul tău..."
placeholder="{{ __('Scrie mesajul tău...') }}"
@keydown.enter.exact.prevent="$wire.send()"
@keydown.shift.enter="$el.value += '\n'"
rows="1"
></textarea>
<button type="submit" class="ai-send" wire:loading.attr="disabled">Trimite</button>
<button type="submit" class="ai-send" wire:loading.attr="disabled">{{ __('Trimite') }}</button>
</form>
</div>
</div>
@@ -23,13 +23,13 @@
@if ($newToken)
<div class="at-card" style="border-color: #f59e0b; border-width: 2px;">
<h3 style="font-weight:600;font-size:15px;margin-bottom:6px;"> Token-ul tău nou (afișat o singură dată):</h3>
<h3 style="font-weight:600;font-size:15px;margin-bottom:6px;">{{ __('⚠ Token-ul tău nou (afișat o singură dată):') }}</h3>
<div class="at-token" x-data="{ copied: false }">
<span x-ref="t">{{ $newToken }}</span>
<button type="button"
@click="navigator.clipboard.writeText($refs.t.innerText); copied = true; setTimeout(() => copied = false, 2000)"
style="margin-left:12px;background:#3b82f6;color:white;padding:4px 10px;border:none;border-radius:4px;cursor:pointer;font-size:11px;">
<span x-show="!copied">📋 Copiază</span>
<span x-show="!copied">{{ __('📋 Copiază') }}</span>
<span x-show="copied" x-cloak> Copiat</span>
</button>
</div>
@@ -42,13 +42,13 @@
<div class="at-card" style="margin-top:16px;">
@php $tokens = $this->getTokens(); @endphp
@if (empty($tokens))
<div class="at-empty">Niciun token generat. Folosește butonul „Generează token" de sus.</div>
<div class="at-empty">{{ __('Niciun token generat. Folosește butonul „Generează token" de sus.') }}</div>
@else
<table class="at-table">
<thead>
<tr>
<th>Nume</th>
<th>Folosit ultima dată</th>
<th>{{ __('Nume') }}</th>
<th>{{ __('Folosit ultima dată') }}</th>
<th>Creat</th>
<th>Permisiuni</th>
<th></th>
@@ -65,7 +65,7 @@
<button type="button"
wire:click="deleteToken({{ $t['id'] }})"
wire:confirm="Revoci token-ul „{{ $t['name'] }}"? Apelurile API vor eșua imediat."
class="at-revoke">Revocă</button>
class="at-revoke">{{ __('Revocă') }}</button>
</td>
</tr>
@endforeach
@@ -75,13 +75,13 @@
</div>
<div class="at-doc" style="margin-top:16px;">
<b>Cum folosești API-ul:</b>
<b>{{ __('Cum folosești API-ul:') }}</b>
<ol style="margin:8px 0 0 20px;">
<li>Obține token cu <code>POST /api/v1/login</code> cu <code>email</code>+<code>password</code> JSON</li>
<li>Sau generează unul aici (recomandat pentru integrări permanente)</li>
<li>Adaugă header <code>Authorization: Bearer &lt;token&gt;</code> la fiecare request</li>
<li>{{ __('Obține token cu') }} <code>POST /api/v1/login</code> cu <code>email</code>+<code>password</code> JSON</li>
<li>{{ __('Sau generează unul aici (recomandat pentru integrări permanente)') }}</li>
<li>{{ __('Adaugă header') }} <code>Authorization: Bearer &lt;token&gt;</code> la fiecare request</li>
<li>Endpoints disponibile: <code>/api/v1/clients</code>, <code>/api/v1/vehicles</code>, <code>/api/v1/work-orders</code> (GET, POST, PATCH, DELETE)</li>
<li>Tot apelul trebuie făcut pe subdomain-ul tău: <code>https://{{ tenant()?->slug ?? 'YOURSLUG' }}.service.mir.md/api/v1/...</code></li>
<li>{{ __('Tot apelul trebuie făcut pe subdomain-ul tău:') }} <code>https://{{ tenant()?->slug ?? 'YOURSLUG' }}.service.mir.md/api/v1/...</code></li>
</ol>
</div>
</x-filament-panels::page>
@@ -16,31 +16,31 @@
</style>
<div class="bk-card">
<h2 class="bk-h2">📦 Export complet date tenant</h2>
<h2 class="bk-h2">{{ __('📦 Export complet date tenant') }}</h2>
<p class="bk-p">
Exportă toate datele companiei tale într-un fișier ZIP. Util pentru:
{{ __('Exportă toate datele companiei tale într-un fișier ZIP. Util pentru:') }}
</p>
<ul class="bk-list">
<li>Backup periodic (descarcă local sau sincronizează cu cloud)</li>
<li>{{ __('Backup periodic (descarcă local sau sincronizează cu cloud)') }}</li>
<li>Migrare la alt sistem CRM</li>
<li>Audit / verificări fiscale</li>
<li>Conformitate GDPR (la cererea ștergerii datelor)</li>
<li>{{ __('Audit / verificări fiscale') }}</li>
<li>{{ __('Conformitate GDPR (la cererea ștergerii datelor)') }}</li>
</ul>
<p class="bk-p">
<b>Conține:</b> clienți, mașini, lead-uri, deal-uri, programări, fișe de lucru cu manopere și piese,
depozit, furnizori, achiziții, plăți, cheltuieli, salarii, useri, logo + favicon, manifest cu metadata.
<b>{{ __('Conține:') }}</b> {{ __('clienți, mașini, lead-uri, deal-uri, programări, fișe de lucru cu manopere și piese,
depozit, furnizori, achiziții, plăți, cheltuieli, salarii, useri, logo + favicon, manifest cu metadata.') }}
</p>
<p class="bk-p">
<b>Format:</b> ZIP cu fișiere JSON (1 per tabel) + media + manifest.json.
<b>Format:</b> {{ __('ZIP cu fișiere JSON (1 per tabel) + media + manifest.json.') }}
</p>
<button type="button" class="bk-btn" wire:click="downloadBackup" wire:loading.attr="disabled">
<span wire:loading.remove wire:target="downloadBackup"> Descarcă backup acum</span>
<span wire:loading.remove wire:target="downloadBackup">{{ __('⬇ Descarcă backup acum') }}</span>
<span wire:loading wire:target="downloadBackup">Generez ZIP...</span>
</button>
<p class="bk-p" style="margin-top:24px;font-size:11px;color:#9ca3af;">
Backup-urile pot conține date sensibile (telefoane, emailuri, plăți). Stochează-le în siguranță.
{{ __('⚠ Backup-urile pot conține date sensibile (telefoane, emailuri, plăți). Stochează-le în siguranță.') }}
</p>
</div>
</x-filament-panels::page>
@@ -155,26 +155,26 @@
<div class="cv-shell" x-data="{ dragEventId: null }">
<div class="cv-head">
<div>
<div class="cv-breadcrumb">CRM Programări <strong style="color:var(--cv-text);">Calendar vizual</strong></div>
<div class="cv-breadcrumb">{{ __('CRM Programări ') }} <strong style="color:var(--cv-text);">Calendar vizual</strong></div>
<h1>Calendar vizual</h1>
</div>
<div class="cv-btn-group">
<button class="cv-btn" wire:click="exportPdf">🖨 PDF programări</button>
<button class="cv-btn" wire:click="exportPdf">{{ __('🖨 PDF programări') }}</button>
<button class="cv-btn" wire:click="openNewPostForm">+ Pod nou</button>
<button class="cv-btn cv-btn-primary" wire:click="openNewForm">+ Programare nouă</button>
<button class="cv-btn cv-btn-primary" wire:click="openNewForm">{{ __('+ Programare nouă') }}</button>
</div>
</div>
<div class="cv-kpi-bar">
<div class="cv-kpi">
<div class="cv-kpi-label">Ore programate</div>
<div class="cv-kpi-label">{{ __('Ore programate') }}</div>
<div class="cv-kpi-value">{{ $stats['scheduled_hours'] }} / {{ $stats['capacity_hours'] }}</div>
<div class="cv-kpi-sub">săptămâna curentă · {{ $stats['utilization_pct'] }}% capacitate</div>
</div>
<div class="cv-kpi">
<div class="cv-kpi-label">Fișe deschise</div>
<div class="cv-kpi-label">{{ __('Fișe deschise') }}</div>
<div class="cv-kpi-value orange">{{ $stats['open_count'] }}</div>
<div class="cv-kpi-sub">programări active</div>
<div class="cv-kpi-sub">{{ __('programări active') }}</div>
</div>
<div class="cv-kpi">
<div class="cv-kpi-label">Confirmate</div>
@@ -184,7 +184,7 @@
<div class="cv-kpi">
<div class="cv-kpi-label">No-show alert</div>
<div class="cv-kpi-value red">{{ $stats['no_show_alert'] }}</div>
<div class="cv-kpi-sub">programări neconfirmate &lt; 24h</div>
<div class="cv-kpi-sub">{{ __('programări neconfirmate &lt; 24h') }}</div>
</div>
</div>
@@ -193,16 +193,16 @@
<button class="cv-btn cv-btn-icon" wire:click="shiftWeek(-1)"></button>
<div class="cv-date">{{ $this->getWeekLabel() }}</div>
<button class="cv-btn cv-btn-icon" wire:click="shiftWeek(1)"></button>
<button class="cv-btn" wire:click="setWeekToday">Astăzi</button>
<button class="cv-btn" wire:click="setWeekToday">{{ __('Astăzi') }}</button>
</div>
<div class="cv-toolbar-group">
<span class="cv-toolbar-label">Mod:</span>
<div class="cv-view-switcher">
<button class="{{ $viewMode === 'day' ? 'active' : '' }}" wire:click="setViewMode('day')">Zi</button>
<button class="{{ $viewMode === 'week' ? 'active' : '' }}" wire:click="setViewMode('week')">Săpt</button>
<button class="{{ $viewMode === 'month' ? 'active' : '' }}" wire:click="setViewMode('month')">Lună</button>
<button class="{{ $viewMode === 'week' ? 'active' : '' }}" wire:click="setViewMode('week')">{{ __('Săpt') }}</button>
<button class="{{ $viewMode === 'month' ? 'active' : '' }}" wire:click="setViewMode('month')">{{ __('Lună') }}</button>
<button class="{{ $viewMode === 'custom' ? 'active' : '' }}" wire:click="setViewMode('custom')">Custom</button>
<button class="{{ $viewMode === 'list' ? 'active' : '' }}" wire:click="setViewMode('list')">Listă</button>
<button class="{{ $viewMode === 'list' ? 'active' : '' }}" wire:click="setViewMode('list')">{{ __('Listă') }}</button>
</div>
</div>
<div class="cv-toolbar-group">
@@ -216,37 +216,37 @@
<div class="cv-toolbar-group">
<span class="cv-toolbar-label">De la:</span>
<input type="date" class="cv-select" wire:model.live="customStart">
<span class="cv-toolbar-label">Până la:</span>
<span class="cv-toolbar-label">{{ __('Până la:') }}</span>
<input type="date" class="cv-select" wire:model.live="customEnd">
</div>
@endif
<div class="cv-toolbar-group" style="margin-left:auto;">
<span class="cv-toolbar-label">Filtru:</span>
<select class="cv-select" wire:change="setMasterFilter($event.target.value)">
<option value="">Toți mecanicii</option>
<option value="">{{ __('Toți mecanicii') }}</option>
@foreach ($this->getMasterOptions() as $id => $name)
<option value="{{ $id }}" {{ $masterFilter == $id ? 'selected' : '' }}>{{ $name }}</option>
@endforeach
</select>
<select class="cv-select" wire:change="setStatusFilter($event.target.value)">
<option value="all">Toate statusurile</option>
<option value="all">{{ __('Toate statusurile') }}</option>
<option value="confirmed" @if($statusFilter==='confirmed')selected @endif>Confirmate</option>
<option value="unconfirmed" @if($statusFilter==='unconfirmed')selected @endif>Neconfirmate</option>
<option value="in_work" @if($statusFilter==='in_work')selected @endif>În lucru</option>
<option value="in_work" @if($statusFilter==='in_work')selected @endif>{{ __('În lucru') }}</option>
</select>
</div>
</div>
<div class="cv-notes">
<strong> Cum funcționează:</strong>
Matricea <strong>{{ $groupBy === 'post' ? 'Pod' : 'Mecanic' }} × Zile</strong>. Drag-and-drop între celule pentru a reprograma. Indicator de încărcare pe fiecare celulă (ore_planificate / capacitate). Click pe celulă goală programare rapidă. Click pe eveniment detalii.
<strong>{{ __('⚙ Cum funcționează:') }}</strong>
Matricea <strong>{{ $groupBy === 'post' ? 'Pod' : 'Mecanic' }} × Zile</strong>{{ __('. Drag-and-drop între celule pentru a reprograma. Indicator de încărcare pe fiecare celulă (ore_planificate / capacitate). Click pe celulă goală → programare rapidă. Click pe eveniment → detalii.') }}
</div>
@if ($viewMode === 'list')
@php $list = $this->getListAppointments(); @endphp
<div class="cv-matrix-wrap">
@if (empty($list))
<div style="padding:32px; text-align:center; color:#718096;">Nicio programare în perioada selectată.</div>
<div style="padding:32px; text-align:center; color:#718096;">{{ __('Nicio programare în perioada selectată.') }}</div>
@else
<table style="width:100%; border-collapse:collapse; font-size:13px;">
<thead>
@@ -335,7 +335,7 @@
@endif
<div class="cv-legend">
<h3>Legendă</h3>
<h3>{{ __('Legendă') }}</h3>
<div class="cv-legend-row">
<div>
<div class="cv-legend-col">Mecanici</div>
@@ -351,9 +351,9 @@
</div>
</div>
<div>
<div class="cv-legend-col">Încărcare celulă</div>
<div class="cv-legend-col">{{ __('Încărcare celulă') }}</div>
<div class="cv-legend-items">
<div class="cv-legend-item"><span class="cv-load" style="position:static;">05h/10</span> liber/ușor</div>
<div class="cv-legend-item"><span class="cv-load" style="position:static;">05h/10</span> {{ __('liber/ușor') }}</div>
<div class="cv-legend-item"><span class="cv-load warn" style="position:static;">58.5h/10</span> mediu</div>
<div class="cv-legend-item"><span class="cv-load full" style="position:static;">≥9h/10</span> plin</div>
</div>
@@ -362,8 +362,8 @@
<div class="cv-legend-col">Stare zi</div>
<div class="cv-legend-items">
<div class="cv-legend-item"><span class="cv-legend-dot" style="background:#FAFAFA; border:1px solid var(--cv-border);"></span> Weekend</div>
<div class="cv-legend-item"><span class="cv-legend-dot" style="background:repeating-linear-gradient(45deg,#FAFAFA,#FAFAFA 2px,#F1F5F9 2px,#F1F5F9 4px); border:1px solid var(--cv-border);"></span> Închis (Duminică/sărbătoare)</div>
<div class="cv-legend-item"><span class="cv-legend-dot" style="background:var(--cv-blue-bg); border:1px solid var(--cv-blue);"></span> Astăzi</div>
<div class="cv-legend-item"><span class="cv-legend-dot" style="background:repeating-linear-gradient(45deg,#FAFAFA,#FAFAFA 2px,#F1F5F9 2px,#F1F5F9 4px); border:1px solid var(--cv-border);"></span> {{ __('Închis (Duminică/sărbătoare)') }}</div>
<div class="cv-legend-item"><span class="cv-legend-dot" style="background:var(--cv-blue-bg); border:1px solid var(--cv-blue);"></span> {{ __('Astăzi') }}</div>
</div>
</div>
</div>
@@ -381,19 +381,19 @@
</div>
<div class="cv-panel-body">
<div class="cv-two-cols">
@if ($openEvent['client_name'])<div class="cv-pfield"><label>Client</label><div class="cv-pfield-val">{{ $openEvent['client_name'] }}</div></div>@endif
@if ($openEvent['client_name'])<div class="cv-pfield"><label>{{ __('Client') }}</label><div class="cv-pfield-val">{{ $openEvent['client_name'] }}</div></div>@endif
@if ($openEvent['client_phone'])<div class="cv-pfield"><label>Telefon</label><div class="cv-pfield-val" style="color:var(--cv-blue);">{{ $openEvent['client_phone'] }}</div></div>@endif
@if ($openEvent['vehicle'])<div class="cv-pfield"><label>Auto</label><div class="cv-pfield-val">{{ $openEvent['vehicle'] }}</div></div>@endif
@if ($openEvent['vehicle'])<div class="cv-pfield"><label>{{ __('Auto') }}</label><div class="cv-pfield-val">{{ $openEvent['vehicle'] }}</div></div>@endif
@if ($openEvent['plate'])<div class="cv-pfield"><label>Numar</label><div class="cv-pfield-val">{{ $openEvent['plate'] }}</div></div>@endif
@if ($openEvent['master_name'])<div class="cv-pfield"><label>Maistru</label><div class="cv-pfield-val">{{ $openEvent['master_name'] }}</div></div>@endif
@if ($openEvent['post_name'])<div class="cv-pfield"><label>Pod</label><div class="cv-pfield-val">{{ $openEvent['post_name'] }}</div></div>@endif
</div>
@if ($openEvent['notes'])
<div class="cv-pfield"><label>Notițe</label><div class="cv-pfield-val" style="white-space:pre-wrap;">{{ $openEvent['notes'] }}</div></div>
<div class="cv-pfield"><label>{{ __('Notițe') }}</label><div class="cv-pfield-val" style="white-space:pre-wrap;">{{ $openEvent['notes'] }}</div></div>
@endif
</div>
<div class="cv-panel-actions">
<button class="cv-btn" wire:click="deleteEvent({{ $openEvent['id'] }})" onclick="return confirm('Ștergi această programare?')">🗑 Șterge</button>
<button class="cv-btn" wire:click="deleteEvent({{ $openEvent['id'] }})" onclick="return confirm('Ștergi această programare?')">{{ __('🗑 Șterge') }}</button>
<a class="cv-btn cv-btn-primary" href="{{ route('filament.tenant.resources.appointments.edit', ['record' => $openEvent['id']]) }}"> Editare</a>
</div>
@endif
@@ -404,7 +404,7 @@
@if ($showNewForm)
<div class="cv-panel-head">
<div>
<div class="cv-panel-title">Programare nouă</div>
<div class="cv-panel-title">{{ __('Programare nouă') }}</div>
<div class="cv-panel-sub">{{ $newAppt['date'] ?? '' }}</div>
</div>
<div class="cv-close" wire:click="$set('showNewForm', false)"></div>
@@ -412,7 +412,7 @@
<div class="cv-panel-body">
<div class="cv-pfield"><label>Subiect *</label><input wire:model="newAppt.title" type="text" placeholder="Schimb ulei + filtru"></div>
<div class="cv-two-cols">
<div class="cv-pfield"><label>Data *</label><input wire:model="newAppt.date" type="date"></div>
<div class="cv-pfield"><label>{{ __('Data *') }}</label><input wire:model="newAppt.date" type="date"></div>
<div class="cv-pfield"><label>Pod</label>
<select wire:model="newAppt.post_id">
<option value=""></option>
@@ -422,9 +422,9 @@
</select>
</div>
<div class="cv-pfield"><label>De la</label><input wire:model="newAppt.time_start" type="time"></div>
<div class="cv-pfield"><label>Până la</label><input wire:model="newAppt.time_end" type="time"></div>
<div class="cv-pfield"><label>{{ __('Până la') }}</label><input wire:model="newAppt.time_end" type="time"></div>
</div>
<div class="cv-pfield"><label>Client</label>
<div class="cv-pfield"><label>{{ __('Client') }}</label>
<select wire:model.live="newAppt.client_id">
<option value=""></option>
@foreach ($this->getClientOptions() as $id => $name)
@@ -440,11 +440,11 @@
@endforeach
</select>
</div>
<div class="cv-pfield"><label>Notițe</label><textarea wire:model="newAppt.notes" rows="3"></textarea></div>
<div class="cv-pfield"><label>{{ __('Notițe') }}</label><textarea wire:model="newAppt.notes" rows="3"></textarea></div>
</div>
<div class="cv-panel-actions">
<button class="cv-btn" wire:click="$set('showNewForm', false)">Anulează</button>
<button class="cv-btn cv-btn-primary" wire:click="createAppt">Salvează</button>
<button class="cv-btn" wire:click="$set('showNewForm', false)">{{ __('Anulează') }}</button>
<button class="cv-btn cv-btn-primary" wire:click="createAppt">{{ __('Salvează') }}</button>
</div>
@endif
</div>
@@ -453,10 +453,10 @@
@if ($showNewPostForm)
<div style="position:fixed; inset:0; background:rgba(0,0,0,0.4); z-index:9999; display:flex; align-items:center; justify-content:center;" wire:click="$set('showNewPostForm', false)">
<div style="background:white; border-radius:12px; padding:20px; max-width:420px; width:92%;" wire:click.stop>
<h2 style="font-size:18px; font-weight:600; margin-bottom:12px;">+ Pod / spațiu nou</h2>
<p style="font-size:13px; color:#4a5568; margin-bottom:16px;">Poți adăuga un loc de muncă (cu lift sau fără ex: curte, atelier electric).</p>
<h2 style="font-size:18px; font-weight:600; margin-bottom:12px;">{{ __('+ Pod / spațiu nou') }}</h2>
<p style="font-size:13px; color:#4a5568; margin-bottom:16px;">{{ __('Poți adăuga un loc de muncă (cu lift sau fără — ex: curte, atelier electric).') }}</p>
<div class="cv-pfield">
<label>Nume *</label>
<label>{{ __('Nume *') }}</label>
<input type="text" wire:model="newPost.name" placeholder="Ex: Curte 1, Pod 4, Atelier electric" autofocus>
</div>
<div class="cv-two-cols">
@@ -465,17 +465,17 @@
<input type="color" wire:model="newPost.color" style="height:40px; padding:4px;">
</div>
<div class="cv-pfield">
<label>Ore/zi</label>
<label>{{ __('Ore/zi') }}</label>
<input type="number" wire:model="newPost.hours_per_day" min="1" step="0.5">
</div>
</div>
<div class="cv-pfield">
<label>Descriere (opțional)</label>
<input type="text" wire:model="newPost.description" placeholder="Ex: fără lift, doar diagnoză...">
<label>{{ __('Descriere (opțional)') }}</label>
<input type="text" wire:model="newPost.description" placeholder="{{ __('Ex: fără lift, doar diagnoză...') }}">
</div>
<div style="display:flex; gap:8px; margin-top:16px;">
<button class="cv-btn" wire:click="$set('showNewPostForm', false)" style="flex:1;">Anulează</button>
<button class="cv-btn cv-btn-primary" wire:click="createPost" style="flex:1;">Adaugă</button>
<button class="cv-btn" wire:click="$set('showNewPostForm', false)" style="flex:1;">{{ __('Anulează') }}</button>
<button class="cv-btn cv-btn-primary" wire:click="createPost" style="flex:1;">{{ __('Adaugă') }}</button>
</div>
</div>
</div>
@@ -485,9 +485,9 @@
@if ($renamingPostId)
<div style="position:fixed; inset:0; background:rgba(0,0,0,0.4); z-index:9999; display:flex; align-items:center; justify-content:center;" wire:click="$set('renamingPostId', null)">
<div style="background:white; border-radius:12px; padding:20px; max-width:420px; width:92%;" wire:click.stop>
<h2 style="font-size:18px; font-weight:600; margin-bottom:12px;"> Editează pod</h2>
<h2 style="font-size:18px; font-weight:600; margin-bottom:12px;">{{ __('✏ Editează pod') }}</h2>
<div class="cv-pfield">
<label>Nume *</label>
<label>{{ __('Nume *') }}</label>
<input type="text" wire:model="renamingPostName" autofocus>
</div>
<div class="cv-pfield">
@@ -498,11 +498,11 @@
<option value="{{ $id }}">{{ $name }}</option>
@endforeach
</select>
<p style="font-size:11px; color:#718096; margin-top:4px;">Pre-completat automat la programări noi pe acest pod.</p>
<p style="font-size:11px; color:#718096; margin-top:4px;">{{ __('Pre-completat automat la programări noi pe acest pod.') }}</p>
</div>
<div style="display:flex; gap:8px; margin-top:16px;">
<button class="cv-btn" wire:click="$set('renamingPostId', null)" style="flex:1;">Anulează</button>
<button class="cv-btn cv-btn-primary" wire:click="saveRenamePost" style="flex:1;">Salvează</button>
<button class="cv-btn" wire:click="$set('renamingPostId', null)" style="flex:1;">{{ __('Anulează') }}</button>
<button class="cv-btn cv-btn-primary" wire:click="saveRenamePost" style="flex:1;">{{ __('Salvează') }}</button>
</div>
</div>
</div>
@@ -49,10 +49,10 @@
<div class="wiz-card">
{{-- STEP 1: Upload --}}
@if ($step === 1)
<h2 style="font-size:18px;font-weight:600;margin-bottom:16px;">Pasul 1: Încarcă fișierul</h2>
<h2 style="font-size:18px;font-weight:600;margin-bottom:16px;">{{ __('Pasul 1: Încarcă fișierul') }}</h2>
<div class="wiz-field">
<label>Furnizor *</label>
<label>{{ __('Furnizor *') }}</label>
<select wire:model="supplierId">
<option value=""> alege </option>
@foreach ($this->getSupplierOptions() as $id => $name)
@@ -62,7 +62,7 @@
</div>
<div class="wiz-field">
<label>Fișier Excel (.xlsx) sau CSV *</label>
<label>{{ __('Fișier Excel (.xlsx) sau CSV *') }}</label>
<input type="file" wire:model="upload" accept=".xlsx,.xls,.csv" />
@if ($upload)
<div style="margin-top:6px;font-size:12px;color:#4a5568;">Selectat: {{ $upload->getClientOriginalName() }}</div>
@@ -70,14 +70,14 @@
</div>
<div class="wiz-actions">
<button class="wiz-btn wiz-btn-primary" wire:click="goToStep2" wire:loading.attr="disabled">Următorul </button>
<button class="wiz-btn wiz-btn-primary" wire:click="goToStep2" wire:loading.attr="disabled">{{ __('Următorul →') }}</button>
</div>
@endif
{{-- STEP 2: Mapping --}}
@if ($step === 2)
<h2 style="font-size:18px;font-weight:600;margin-bottom:16px;">Pasul 2: Mapează coloanele</h2>
<p style="color:#4a5568;font-size:13px;margin-bottom:16px;">Spune-i sistemului ce reprezintă fiecare coloană din fișier. Vom salva configurația pentru imporțările viitoare.</p>
<h2 style="font-size:18px;font-weight:600;margin-bottom:16px;">{{ __('Pasul 2: Mapează coloanele') }}</h2>
<p style="color:#4a5568;font-size:13px;margin-bottom:16px;">{{ __('Spune-i sistemului ce reprezintă fiecare coloană din fișier. Vom salva configurația pentru imporțările viitoare.') }}</p>
<div style="overflow-x:auto;margin-bottom:20px;">
<table class="wiz-preview-table">
@@ -123,21 +123,21 @@
</select>
</div>
<div class="wiz-field">
<label>Coloana Preț *</label>
<label>{{ __('Coloana Preț *') }}</label>
<select wire:model="mapping.price_col">
<option value=""></option>
@foreach ($headersPreview['columns'] as $c)<option value="{{ $c }}">{{ $c }}</option>@endforeach
</select>
</div>
<div class="wiz-field">
<label>Coloana Brand (opțional)</label>
<label>{{ __('Coloana Brand (opțional)') }}</label>
<select wire:model="mapping.brand_col">
<option value=""></option>
@foreach ($headersPreview['columns'] as $c)<option value="{{ $c }}">{{ $c }}</option>@endforeach
</select>
</div>
<div class="wiz-field">
<label>De la rândul (sărim header) *</label>
<label>{{ __('De la rândul (sărim header) *') }}</label>
<input type="number" min="1" wire:model="mapping.header_row" />
</div>
</div>
@@ -145,12 +145,12 @@
<div class="wiz-field">
<label style="display:flex;align-items:center;gap:8px;text-transform:none;">
<input type="checkbox" wire:model="rememberMapping" />
<span>Salvează configurația pentru acest furnizor</span>
<span>{{ __('Salvează configurația pentru acest furnizor') }}</span>
</label>
</div>
<div class="wiz-actions">
<button class="wiz-btn" wire:click="$set('step', 1)"> Înapoi</button>
<button class="wiz-btn" wire:click="$set('step', 1)">{{ __('← Înapoi') }}</button>
<button class="wiz-btn wiz-btn-primary" wire:click="goToStep3">Previzualizare </button>
</div>
@endif
@@ -162,7 +162,7 @@
<div class="wiz-summary">
<div class="wiz-summary-item">
<strong style="color:#15803d;">{{ $previewSummary['found'] }}</strong>
Găsite (cu articol existent)
{{ __('Găsite (cu articol existent)') }}
</div>
<div class="wiz-summary-item">
<strong style="color:#92400e;">{{ $previewSummary['new'] }}</strong>
@@ -170,7 +170,7 @@
</div>
<div class="wiz-summary-item">
<strong style="color:#991b1b;">{{ $previewSummary['no_article'] }}</strong>
Fără articol (manual)
{{ __('Fără articol (manual)') }}
</div>
</div>
@@ -178,7 +178,7 @@
<table class="wiz-preview-table">
<thead>
<tr>
<th>Articol</th><th>Denumire</th><th>Brand</th><th>Cant.</th><th>Preț</th><th>Status</th>
<th>Articol</th><th>Denumire</th><th>Brand</th><th>Cant.</th><th>{{ __('Preț') }}</th><th>Status</th>
</tr>
</thead>
<tbody>
@@ -199,13 +199,13 @@
<div class="wiz-field">
<label style="display:flex;align-items:center;gap:8px;text-transform:none;">
<input type="checkbox" wire:model="createNew" />
<span>Creează automat articolele noi în nomenclatură</span>
<span>{{ __('Creează automat articolele noi în nomenclatură') }}</span>
</label>
</div>
<div class="wiz-actions">
<button class="wiz-btn" wire:click="$set('step', 2)"> Înapoi</button>
<button class="wiz-btn wiz-btn-primary" wire:click="confirmImport">Confirmă și importă</button>
<button class="wiz-btn" wire:click="$set('step', 2)">{{ __('← Înapoi') }}</button>
<button class="wiz-btn wiz-btn-primary" wire:click="confirmImport">{{ __('Confirmă și importă') }}</button>
</div>
@endif
@@ -213,13 +213,13 @@
@if ($step === 4)
<div style="text-align:center;padding:32px;">
<div style="font-size:48px;margin-bottom:16px;"></div>
<h2 style="font-size:20px;font-weight:600;margin-bottom:8px;">Import finalizat cu succes</h2>
<h2 style="font-size:20px;font-weight:600;margin-bottom:8px;">{{ __('Import finalizat cu succes') }}</h2>
<p style="color:#4a5568;">{{ $previewSummary['total'] }} poziții importate în Purchase nouă</p>
<div style="margin-top:24px;">
@if (session('purchase_id'))
<a class="wiz-btn wiz-btn-primary" href="{{ route('filament.tenant.resources.purchases.edit', ['record' => session('purchase_id')]) }}"> Deschide Purchase</a>
<a class="wiz-btn wiz-btn-primary" href="{{ route('filament.tenant.resources.purchases.edit', ['record' => session('purchase_id')]) }}">{{ __('↗ Deschide Purchase') }}</a>
@endif
<button class="wiz-btn" wire:click="reset_">Import nou</button>
<button class="wiz-btn" wire:click="reset_">{{ __('Import nou') }}</button>
</div>
</div>
@endif
@@ -39,7 +39,7 @@
</style>
<div class="fn-bar">
<span style="font-size:13px;font-weight:500;">Perioadă:</span>
<span style="font-size:13px;font-weight:500;">{{ __('Perioadă:') }}</span>
@foreach ($periods as $key => $label)
<button type="button" wire:click="setPeriod('{{ $key }}')"
class="fn-pill {{ $period === $key ? 'active' : '' }}">{{ $label }}</button>
@@ -55,19 +55,19 @@
@if ($tab === 'overview')
<div class="fn-grid fn-grid-4">
<div class="fn-card"><div class="fn-stat-l">Încasări</div><div class="fn-stat-v fn-success">{{ number_format($data['income'], 2, '.', ' ') }} MDL</div></div>
<div class="fn-card"><div class="fn-stat-l">{{ __('Încasări') }}</div><div class="fn-stat-v fn-success">{{ number_format($data['income'], 2, '.', ' ') }} MDL</div></div>
<div class="fn-card"><div class="fn-stat-l">Cheltuieli</div><div class="fn-stat-v fn-danger">{{ number_format($data['expenses'], 2, '.', ' ') }} MDL</div></div>
<div class="fn-card"><div class="fn-stat-l">Profit</div><div class="fn-stat-v {{ $data['profit'] >= 0 ? 'fn-success' : 'fn-danger' }}">{{ number_format($data['profit'], 2, '.', ' ') }} MDL</div></div>
<div class="fn-card"><div class="fn-stat-l">Datorii clienți</div><div class="fn-stat-v fn-warning">{{ number_format($data['debtTotal'], 2, '.', ' ') }} MDL</div></div>
<div class="fn-card"><div class="fn-stat-l">{{ __('Datorii clienți') }}</div><div class="fn-stat-v fn-warning">{{ number_format($data['debtTotal'], 2, '.', ' ') }} MDL</div></div>
</div>
@elseif ($tab === 'cashflow')
<div class="fn-grid fn-grid-2" style="margin-bottom: 16px;">
<div class="fn-card"><div class="fn-stat-l">Total intrări</div><div class="fn-stat-v fn-success">{{ number_format($data['totalIn'], 2, '.', ' ') }} MDL</div></div>
<div class="fn-card"><div class="fn-stat-l">Total ieșiri</div><div class="fn-stat-v fn-danger">{{ number_format($data['totalOut'], 2, '.', ' ') }} MDL</div></div>
<div class="fn-card"><div class="fn-stat-l">{{ __('Total intrări') }}</div><div class="fn-stat-v fn-success">{{ number_format($data['totalIn'], 2, '.', ' ') }} MDL</div></div>
<div class="fn-card"><div class="fn-stat-l">{{ __('Total ieșiri') }}</div><div class="fn-stat-v fn-danger">{{ number_format($data['totalOut'], 2, '.', ' ') }} MDL</div></div>
</div>
<div class="fn-card">
<div class="fn-h3">Cashflow zilnic verde = încasări, roșu = cheltuieli</div>
<div class="fn-h3">{{ __('Cashflow zilnic — verde = încasări, roșu = cheltuieli') }}</div>
<div class="fn-chart">
@foreach ($data['rows'] as $r)
<div class="fn-chart-day" title="{{ $r['date'] }}: in {{ number_format($r['in']) }} / out {{ number_format($r['out']) }}">
@@ -90,18 +90,18 @@
<div class="fn-h3">Venituri</div>
<table class="fn-tbl">
<tr><td>Manopere</td><td class="fn-r">{{ number_format($data['worksRevenue'], 2, '.', ' ') }}</td></tr>
<tr><td>Piese (vânzare)</td><td class="fn-r">{{ number_format($data['partsRevenue'], 2, '.', ' ') }}</td></tr>
<tr style="border-top:2px solid #e5e7eb;"><td class="fn-bold">Total venituri</td><td class="fn-r fn-bold fn-success">{{ number_format($data['totalRevenue'], 2, '.', ' ') }}</td></tr>
<tr><td>{{ __('Piese (vânzare)') }}</td><td class="fn-r">{{ number_format($data['partsRevenue'], 2, '.', ' ') }}</td></tr>
<tr style="border-top:2px solid #e5e7eb;"><td class="fn-bold">{{ __('Total venituri') }}</td><td class="fn-r fn-bold fn-success">{{ number_format($data['totalRevenue'], 2, '.', ' ') }}</td></tr>
</table>
</div>
<div class="fn-card">
<div class="fn-h3">Costuri</div>
<table class="fn-tbl">
<tr><td>Cost piese (achiziție)</td><td class="fn-r fn-danger">{{ number_format($data['partsCost'], 2, '.', ' ') }}</td></tr>
<tr><td>{{ __('Cost piese (achiziție)') }}</td><td class="fn-r fn-danger">{{ number_format($data['partsCost'], 2, '.', ' ') }}</td></tr>
@foreach ($data['expensesByCat'] as $row)
<tr><td>{{ \App\Models\Tenant\Expense::CATEGORIES[$row->category] ?? $row->category }}</td><td class="fn-r fn-danger">{{ number_format((float) $row->total, 2, '.', ' ') }}</td></tr>
@endforeach
<tr style="border-top:2px solid #e5e7eb;"><td class="fn-bold">Total costuri</td><td class="fn-r fn-bold fn-danger">{{ number_format($data['partsCost'] + $data['totalExpenses'], 2, '.', ' ') }}</td></tr>
<tr style="border-top:2px solid #e5e7eb;"><td class="fn-bold">{{ __('Total costuri') }}</td><td class="fn-r fn-bold fn-danger">{{ number_format($data['partsCost'] + $data['totalExpenses'], 2, '.', ' ') }}</td></tr>
</table>
</div>
</div>
@@ -117,17 +117,17 @@
<div class="fn-card">
<div class="fn-h3">Active</div>
<table class="fn-tbl">
<tr><td>Numerar net (toate plățile - cheltuieli)</td><td class="fn-r fn-bold fn-success">{{ number_format($data['netCash'], 2, '.', ' ') }} MDL</td></tr>
<tr><td>Datorii clienți (de încasat)</td><td class="fn-r fn-warning">{{ number_format($data['debt'], 2, '.', ' ') }} MDL</td></tr>
<tr><td>Stoc piese (la preț achiziție)</td><td class="fn-r">{{ number_format($data['stockValue'], 2, '.', ' ') }} MDL</td></tr>
<tr style="border-top:2px solid #e5e7eb;"><td class="fn-bold">Total active</td><td class="fn-r fn-bold">{{ number_format($data['netCash'] + $data['debt'] + $data['stockValue'], 2, '.', ' ') }}</td></tr>
<tr><td>{{ __('Numerar net (toate plățile - cheltuieli)') }}</td><td class="fn-r fn-bold fn-success">{{ number_format($data['netCash'], 2, '.', ' ') }} MDL</td></tr>
<tr><td>{{ __('Datorii clienți (de încasat)') }}</td><td class="fn-r fn-warning">{{ number_format($data['debt'], 2, '.', ' ') }} MDL</td></tr>
<tr><td>{{ __('Stoc piese (la preț achiziție)') }}</td><td class="fn-r">{{ number_format($data['stockValue'], 2, '.', ' ') }} MDL</td></tr>
<tr style="border-top:2px solid #e5e7eb;"><td class="fn-bold">{{ __('Total active') }}</td><td class="fn-r fn-bold">{{ number_format($data['netCash'] + $data['debt'] + $data['stockValue'], 2, '.', ' ') }}</td></tr>
</table>
</div>
<div class="fn-card">
<div class="fn-h3">Toate timpurile</div>
<div class="fn-h3">{{ __('Toate timpurile') }}</div>
<table class="fn-tbl">
<tr><td>Total încasat</td><td class="fn-r fn-success">{{ number_format($data['allTimePayments'], 2, '.', ' ') }} MDL</td></tr>
<tr><td>Total cheltuit</td><td class="fn-r fn-danger">{{ number_format($data['allTimeExpenses'], 2, '.', ' ') }} MDL</td></tr>
<tr><td>{{ __('Total încasat') }}</td><td class="fn-r fn-success">{{ number_format($data['allTimePayments'], 2, '.', ' ') }} MDL</td></tr>
<tr><td>{{ __('Total cheltuit') }}</td><td class="fn-r fn-danger">{{ number_format($data['allTimeExpenses'], 2, '.', ' ') }} MDL</td></tr>
</table>
</div>
</div>
@@ -35,8 +35,8 @@
</style>
<div style="background: #fef3c7; border-left: 4px solid #f59e0b; padding: 12px 16px; border-radius: 6px; margin-bottom: 16px; font-size: 13px;">
<b>Status:</b> aceste integrări sunt placeholder UI le configurezi aici, dar implementarea actuală a fiecărui canal e proiect separat.
Pentru moment, valorile salvate sunt accesibile în cod via <code>$tenant->settings['integrations']</code>.
<b>Status:</b> {{ __('aceste integrări sunt placeholder UI le configurezi aici, dar implementarea actuală a fiecărui canal e proiect separat.
Pentru moment, valorile salvate sunt accesibile în cod via') }} <code>$tenant->settings['integrations']</code>.
</div>
<div class="ig-grid">
@@ -71,7 +71,7 @@
</div>
@endforeach
</div>
<button type="button" class="ig-save" wire:click="save">Salvează</button>
<button type="button" class="ig-save" wire:click="save">{{ __('Salvează') }}</button>
</div>
@endforeach
</div>
@@ -19,22 +19,22 @@
</style>
<div class="kpi-toolbar">
<button class="kpi-btn" wire:click="shiftMonth(-1)"> Luna precedentă</button>
<button class="kpi-btn" wire:click="shiftMonth(-1)">{{ __('◀ Luna precedentă') }}</button>
<div class="kpi-period">{{ $this->getPeriodLabel() }}</div>
<button class="kpi-btn" wire:click="shiftMonth(1)">Luna următoare </button>
<button class="kpi-btn" wire:click="shiftMonth(1)">{{ __('Luna următoare ▶') }}</button>
</div>
@if (empty($rows))
<div class="kpi-empty">Niciun mecanic nu a finalizat lucrări în această perioadă.</div>
<div class="kpi-empty">{{ __('Niciun mecanic nu a finalizat lucrări în această perioadă.') }}</div>
@else
<table class="kpi-table">
<thead>
<tr>
<th>Mecanic</th>
<th>Lucrări</th>
<th>{{ __('Lucrări') }}</th>
<th>Norma ore</th>
<th>Real ore</th>
<th>Eficiență</th>
<th>{{ __('Eficiență') }}</th>
<th>Venit manopere</th>
</tr>
</thead>
@@ -39,8 +39,8 @@
<div class="ob-wrap">
<div class="ob-intro">
<h3>👋 Bun venit!</h3>
Hai facem 30 de secunde de configurare ca AutoCRM-ul tău arate exact cum vrei tu.
Toate aceste setări pot fi schimbate oricând din meniul „Setări".
{{ __('Hai facem 30 de secunde de configurare ca AutoCRM-ul tău arate exact cum vrei tu.
Toate aceste setări pot fi schimbate oricând din meniul „Setări".') }}
</div>
{{-- Stepper --}}
@@ -61,14 +61,14 @@
<div class="ob-buttons">
<div>
@if ($step > 1)
<button type="button" class="ob-btn ob-btn-secondary" wire:click="prev"> Înapoi</button>
<button type="button" class="ob-btn ob-btn-secondary" wire:click="prev">{{ __('← Înapoi') }}</button>
@endif
</div>
<div>
@if ($step < 3)
<button type="button" class="ob-btn ob-btn-primary" wire:click="next">Continuă </button>
<button type="button" class="ob-btn ob-btn-primary" wire:click="next">{{ __('Continuă →') }}</button>
@else
<button type="submit" class="ob-btn ob-btn-success">🎉 Termină configurarea</button>
<button type="submit" class="ob-btn ob-btn-success">{{ __('🎉 Termină configurarea') }}</button>
@endif
</div>
</div>
@@ -21,8 +21,8 @@
<div class="rc-grid">
<div class="rc-card">
<div class="rc-h3">😴 Clienți pierduți <span class="rc-count">{{ $lost->count() }}</span></div>
<div style="font-size:11px;color:#6b7280;margin-bottom:12px;">Clienți care n-au mai venit de peste 6 luni bun moment pentru un mesaj de revenire.</div>
<div class="rc-h3">{{ __('😴 Clienți pierduți') }} <span class="rc-count">{{ $lost->count() }}</span></div>
<div style="font-size:11px;color:#6b7280;margin-bottom:12px;">{{ __('Clienți care n-au mai venit de peste 6 luni — bun moment pentru un mesaj de revenire.') }}</div>
<table class="rc-tbl">
@forelse ($lost as $c)
<tr>
@@ -31,7 +31,7 @@
<div style="font-size:10px;color:#9ca3af;">{{ $c->phone }}</div>
</td>
<td class="rc-r" style="color:#9ca3af;font-size:11px;">
ultima fișă<br>{{ $c->workOrders->first()?->opened_at?->diffForHumans() ?? '—' }}
{{ __('ultima fișă') }}<br>{{ $c->workOrders->first()?->opened_at?->diffForHumans() ?? '—' }}
</td>
</tr>
@empty
@@ -41,8 +41,8 @@
</div>
<div class="rc-card">
<div class="rc-h3">🚗 Mașini cu kilometraj mare <span class="rc-count">{{ $highMileage->count() }}</span></div>
<div style="font-size:11px;color:#6b7280;margin-bottom:12px;">Sugerează revizie / piese de uzură.</div>
<div class="rc-h3">{{ __('🚗 Mașini cu kilometraj mare') }} <span class="rc-count">{{ $highMileage->count() }}</span></div>
<div style="font-size:11px;color:#6b7280;margin-bottom:12px;">{{ __('Sugerează revizie / piese de uzură.') }}</div>
<table class="rc-tbl">
@forelse ($highMileage as $v)
<tr>
@@ -62,8 +62,8 @@
</div>
<div class="rc-card">
<div class="rc-h3">💰 Fișe neplătite <span class="rc-count">{{ $unpaid->count() }}</span></div>
<div style="font-size:11px;color:#6b7280;margin-bottom:12px;">Sună-i sau trimite-le un email cu suma datorată.</div>
<div class="rc-h3">{{ __('💰 Fișe neplătite') }} <span class="rc-count">{{ $unpaid->count() }}</span></div>
<div style="font-size:11px;color:#6b7280;margin-bottom:12px;">{{ __('Sună-i sau trimite-le un email cu suma datorată.') }}</div>
<table class="rc-tbl">
@forelse ($unpaid as $w)
<tr>
@@ -77,14 +77,14 @@
</td>
</tr>
@empty
<tr><td colspan="2" class="rc-empty">Niciun rest de încasat. 🎉</td></tr>
<tr><td colspan="2" class="rc-empty">{{ __('Niciun rest de încasat. 🎉') }}</td></tr>
@endforelse
</table>
</div>
<div class="rc-card">
<div class="rc-h3"> VIP fără contact recent <span class="rc-count">{{ $vip->count() }}</span></div>
<div style="font-size:11px;color:#6b7280;margin-bottom:12px;">Clienți VIP cu care nu s-a vorbit de peste 30 zile.</div>
<div class="rc-h3">{{ __('⭐ VIP fără contact recent') }} <span class="rc-count">{{ $vip->count() }}</span></div>
<div style="font-size:11px;color:#6b7280;margin-bottom:12px;">{{ __('Clienți VIP cu care nu s-a vorbit de peste 30 zile.') }}</div>
<table class="rc-tbl">
@forelse ($vip as $c)
<tr>
@@ -97,7 +97,7 @@
</td>
</tr>
@empty
<tr><td colspan="2" class="rc-empty">Toți VIP-ii sunt în contact recent.</td></tr>
<tr><td colspan="2" class="rc-empty">{{ __('Toți VIP-ii sunt în contact recent.') }}</td></tr>
@endforelse
</table>
</div>
@@ -69,7 +69,7 @@
<div class="rp-stack">
<div class="rp-bar">
<span class="rp-label">Perioadă:</span>
<span class="rp-label">{{ __('Perioadă:') }}</span>
@foreach ($periods as $key => $label)
<button type="button" wire:click="setPeriod('{{ $key }}')"
class="rp-pill {{ $period === $key ? 'active' : '' }}">{{ $label }}</button>
@@ -88,9 +88,9 @@
@foreach ([
['Încasări', $data['income'], 'success'],
['Cheltuieli', $data['expenses'], 'danger'],
['Profit', $data['profit'], $data['profit'] >= 0 ? 'success' : 'danger'],
['Datorii clienți', $data['debt'], 'warning'],
] as [$label, $value, $color])
['Profit', $data['profit'], $data['profit'] >{{ __('= 0 ? \'success\' : \'danger\'],
[\'Datorii clienți\', $data[\'debt\'], \'warning\'],
] as [$label, $value, $color])') }}
<div class="rp-card">
<div class="rp-stat-label">{{ $label }}</div>
<div class="rp-stat-value rp-{{ $color }}">
@@ -102,9 +102,9 @@
<div class="rp-grid rp-grid-2">
<div class="rp-card">
<div class="rp-h3">Încasări pe metodă</div>
<div class="rp-h3">{{ __('Încasări pe metodă') }}</div>
<table class="rp-tbl">
<thead><tr><th>Metodă</th><th class="rp-right">Tranz.</th><th class="rp-right">Total</th></tr></thead>
<thead><tr><th>{{ __('Metodă') }}</th><th class="rp-right">Tranz.</th><th class="rp-right">{{ __('Total') }}</th></tr></thead>
<tbody>
@forelse ($data['by_method'] as $row)
<tr>
@@ -113,7 +113,7 @@
<td class="rp-right rp-bold">{{ number_format((float)$row->total, 2, '.', ' ') }}</td>
</tr>
@empty
<tr><td colspan="3" class="rp-muted">Nicio plată în perioada selectată.</td></tr>
<tr><td colspan="3" class="rp-muted">{{ __('Nicio plată în perioada selectată.') }}</td></tr>
@endforelse
</tbody>
</table>
@@ -121,7 +121,7 @@
<div class="rp-card">
<div class="rp-h3">Cheltuieli pe categorie</div>
<table class="rp-tbl">
<thead><tr><th>Categorie</th><th class="rp-right">Nr.</th><th class="rp-right">Total</th></tr></thead>
<thead><tr><th>Categorie</th><th class="rp-right">{{ __('Nr.') }}</th><th class="rp-right">{{ __('Total') }}</th></tr></thead>
<tbody>
@forelse ($data['by_category'] as $row)
<tr>
@@ -130,22 +130,22 @@
<td class="rp-right rp-bold rp-danger">{{ number_format((float)$row->total, 2, '.', ' ') }}</td>
</tr>
@empty
<tr><td colspan="3" class="rp-muted">Nicio cheltuială.</td></tr>
<tr><td colspan="3" class="rp-muted">{{ __('Nicio cheltuială.') }}</td></tr>
@endforelse
</tbody>
</table>
</div>
</div>
<div style="font-size: 13px; color: #6b7280;">Marjă profit: <b>{{ $data['margin_pct'] }}%</b></div>
<div style="font-size: 13px; color: #6b7280;">{{ __('Marjă profit:') }} <b>{{ $data['margin_pct'] }}%</b></div>
@elseif ($tab === 'workload')
<div class="rp-grid rp-grid-2">
<div class="rp-card">
<div class="rp-stat-label">Fișe deschise</div>
<div class="rp-stat-label">{{ __('Fișe deschise') }}</div>
<div class="rp-stat-value">{{ $data['opened'] }}</div>
</div>
<div class="rp-card">
<div class="rp-stat-label">Fișe închise</div>
<div class="rp-stat-label">{{ __('Fișe închise') }}</div>
<div class="rp-stat-value rp-success">{{ $data['closed'] }}</div>
</div>
</div>
@@ -159,7 +159,7 @@
<td class="rp-right rp-bold">{{ $row->cnt }}</td>
</tr>
@empty
<tr><td colspan="2" class="rp-muted">Nicio fișă în perioada selectată.</td></tr>
<tr><td colspan="2" class="rp-muted">{{ __('Nicio fișă în perioada selectată.') }}</td></tr>
@endforelse
</tbody>
</table>
@@ -172,7 +172,7 @@
<th>Mecanic</th>
<th>Specializare</th>
<th class="rp-right">Manopere</th>
<th class="rp-right">Ore</th>
<th class="rp-right">{{ __('Ore') }}</th>
<th class="rp-right">Venit</th>
</tr></thead>
<tbody>
@@ -195,9 +195,9 @@
<div class="rp-card" style="overflow-x: auto;">
<table class="rp-tbl">
<thead><tr>
<th>Manoperă</th>
<th class="rp-right">Nr.</th>
<th class="rp-right">Ore total</th>
<th>{{ __('Manoperă') }}</th>
<th class="rp-right">{{ __('Nr.') }}</th>
<th class="rp-right">{{ __('Ore total') }}</th>
<th class="rp-right">Venit</th>
</tr></thead>
<tbody>
@@ -209,7 +209,7 @@
<td class="rp-right rp-success">{{ number_format((float)$r->revenue, 2, '.', ' ') }}</td>
</tr>
@empty
<tr><td colspan="4" class="rp-muted">Nicio manoperă efectuată.</td></tr>
<tr><td colspan="4" class="rp-muted">{{ __('Nicio manoperă efectuată.') }}</td></tr>
@endforelse
</tbody>
</table>
@@ -218,9 +218,9 @@
@elseif ($tab === 'parts')
<div class="rp-grid rp-grid-2">
<div class="rp-card" style="overflow-x: auto;">
<div class="rp-h3">Top piese vândute</div>
<div class="rp-h3">{{ __('Top piese vândute') }}</div>
<table class="rp-tbl">
<thead><tr><th>Piesă</th><th class="rp-right">Cant.</th><th class="rp-right">Venit</th><th class="rp-right">Marjă</th></tr></thead>
<thead><tr><th>{{ __('Piesă') }}</th><th class="rp-right">Cant.</th><th class="rp-right">Venit</th><th class="rp-right">{{ __('Marjă') }}</th></tr></thead>
<tbody>
@forelse ($data['sold'] as $r)
<tr>
@@ -230,15 +230,15 @@
<td class="rp-right rp-success">{{ number_format((float)$r->margin, 2, '.', ' ') }}</td>
</tr>
@empty
<tr><td colspan="4" class="rp-muted">Nicio piesă montată.</td></tr>
<tr><td colspan="4" class="rp-muted">{{ __('Nicio piesă montată.') }}</td></tr>
@endforelse
</tbody>
</table>
</div>
<div class="rp-card">
<div class="rp-h3">⚠️ Stoc minim atins</div>
<div class="rp-h3">{{ __('⚠️ Stoc minim atins') }}</div>
<table class="rp-tbl">
<thead><tr><th>Piesă</th><th class="rp-right">Stoc</th><th class="rp-right">Min.</th></tr></thead>
<thead><tr><th>{{ __('Piesă') }}</th><th class="rp-right">{{ __('Stoc') }}</th><th class="rp-right">Min.</th></tr></thead>
<tbody>
@forelse ($data['low'] as $p)
<tr>
@@ -247,7 +247,7 @@
<td class="rp-right">{{ $p->min_qty }}</td>
</tr>
@empty
<tr><td colspan="3" class="rp-muted">Toate piesele sunt în stoc.</td></tr>
<tr><td colspan="3" class="rp-muted">{{ __('Toate piesele sunt în stoc.') }}</td></tr>
@endforelse
</tbody>
</table>
@@ -257,11 +257,11 @@
@elseif ($tab === 'clients')
<div class="rp-grid rp-grid-2">
<div class="rp-card">
<div class="rp-stat-label">Clienți noi în perioadă</div>
<div class="rp-stat-label">{{ __('Clienți noi în perioadă') }}</div>
<div class="rp-stat-value">{{ $data['new_count'] }}</div>
</div>
<div class="rp-card">
<div class="rp-h3">Lead-uri pe sursă</div>
<div class="rp-h3">{{ __('Lead-uri pe sursă') }}</div>
<table class="rp-tbl">
<tbody>
@forelse ($data['by_source'] as $row)
@@ -38,17 +38,17 @@
@php $pending = $this->getPendingItems(); @endphp
<div style="background:#ecfdf5;border-left:3px solid #10b981;padding:12px 14px;margin-bottom:12px;border-radius:6px;font-size:13px;">
<div style="font-weight:600;color:#065f46;margin-bottom:4px;">📦 Mod recepție {{ $purchase->number }}</div>
<div style="color:#047857;">Scanează codurile pieselor pentru a marca ca recepționate. <strong>{{ count($pending) }}</strong> linii neîncasate.</div>
<div style="color:#047857;">{{ __('Scanează codurile pieselor pentru a marca ca recepționate.') }} <strong>{{ count($pending) }}</strong> {{ __('linii neîncasate.') }}</div>
@if (! empty($receivedToasts))
<div style="margin-top:8px;font-size:12px;color:#065f46;">
<strong>Recepție acum:</strong>
<strong>{{ __('Recepție acum:') }}</strong>
@foreach (array_reverse(array_slice($receivedToasts, -5)) as $t)
<div>· {{ $t['at'] }} {{ $t['article'] }}: {{ rtrim(rtrim(number_format($t['qty_received'], 2), '0'), '.') }}/{{ rtrim(rtrim(number_format($t['qty_total'], 2), '0'), '.') }}</div>
@endforeach
</div>
@endif
<div style="margin-top:8px;">
<a href="{{ route('filament.tenant.resources.purchases.edit', ['record' => $purchase->id]) }}" style="font-size:12px;color:#0369a1;"> Deschide comanda în Filament</a>
<a href="{{ route('filament.tenant.resources.purchases.edit', ['record' => $purchase->id]) }}" style="font-size:12px;color:#0369a1;">{{ __('↗ Deschide comanda în Filament') }}</a>
</div>
</div>
@endif
@@ -59,14 +59,14 @@
<div class="sc-cam" wire:ignore>
<div id="reader"></div>
<div class="placeholder" x-show="!running && !error" x-cloak>
Apasă „Pornește" pentru a deschide camera.
{{ __('Apasă „Pornește" pentru a deschide camera.') }}
</div>
<div class="placeholder" x-show="error" x-text="error" x-cloak></div>
</div>
<div class="sc-controls">
<button class="sc-btn" type="button" @click="start" x-show="!running">📷 Pornește scanner</button>
<button class="sc-btn gray" type="button" @click="stop" x-show="running"> Oprește</button>
<button class="sc-btn" type="button" @click="start" x-show="!running">{{ __('📷 Pornește scanner') }}</button>
<button class="sc-btn gray" type="button" @click="stop" x-show="running">{{ __('⏹ Oprește') }}</button>
</div>
<div x-show="lastDecoded" class="sc-status" x-cloak>
@@ -76,7 +76,7 @@
<div class="sc-manual">
<form wire:submit="submitManual" style="display:flex;gap:8px;align-items:stretch;">
<input type="text" wire:model="manual" placeholder="Sau introdu manual (cod articol / barcode)…" />
<button type="submit" class="sc-btn">Caută</button>
<button type="submit" class="sc-btn">{{ __('Caută') }}</button>
</form>
</div>
</div>
@@ -4,7 +4,7 @@
<div class="mt-6 flex justify-end">
<x-filament::button type="submit">
Salvează
{{ __('Salvează') }}
</x-filament::button>
</div>
</form>
@@ -24,7 +24,7 @@
<h2 style="font-size:16px;font-weight:600;margin-bottom:12px;">🔎 Decode VIN</h2>
<form wire:submit="decode" style="display:flex;gap:12px;flex-wrap:wrap;">
<input type="text" wire:model="vin" class="vs-input" placeholder="WBAFE81070CY34521" maxlength="17" style="flex:1;min-width:300px;">
<button type="submit" class="vs-btn">Decodează</button>
<button type="submit" class="vs-btn">{{ __('Decodează') }}</button>
</form>
</div>
@@ -33,8 +33,8 @@
@if ($decoded['valid'])
<h3 style="font-size:14px;font-weight:600;margin-bottom:16px;"> VIN decodificat</h3>
<div class="vs-grid">
<div><div class="vs-stat-l">Producător</div><div class="vs-stat-v">{{ $decoded['manufacturer'] }}</div></div>
<div><div class="vs-stat-l">Țară</div><div class="vs-stat-v">{{ $decoded['country'] }}</div></div>
<div><div class="vs-stat-l">{{ __('Producător') }}</div><div class="vs-stat-v">{{ $decoded['manufacturer'] }}</div></div>
<div><div class="vs-stat-l">{{ __('Țară') }}</div><div class="vs-stat-v">{{ $decoded['country'] }}</div></div>
<div><div class="vs-stat-l">An model (estimat)</div><div class="vs-stat-v">{{ $decoded['year'] ?? '—' }}</div></div>
<div><div class="vs-stat-l">WMI</div><div class="vs-stat-v" style="font-family:monospace;">{{ $decoded['wmi'] }}</div></div>
<div><div class="vs-stat-l">Serial</div><div class="vs-stat-v" style="font-family:monospace;font-size:12px;">{{ $decoded['serial'] }}</div></div>
@@ -47,9 +47,9 @@
@php $matches = $this->vehicleMatches(); @endphp
@if ($matches->isNotEmpty())
<div class="vs-card">
<h3 style="font-size:14px;font-weight:600;margin-bottom:12px;">🚗 Mașini cu acest VIN în CRM</h3>
<h3 style="font-size:14px;font-weight:600;margin-bottom:12px;">{{ __('🚗 Mașini cu acest VIN în CRM') }}</h3>
<table class="vs-tbl">
<thead><tr><th>VIN</th><th>Marca/Model</th><th>Plate</th><th>Client</th><th>Km</th></tr></thead>
<thead><tr><th>VIN</th><th>Marca/Model</th><th>Plate</th><th>{{ __('Client') }}</th><th>Km</th></tr></thead>
<tbody>
@foreach ($matches as $v)
<tr>
@@ -67,9 +67,9 @@
@endif
<div class="vs-card">
<h2 style="font-size:16px;font-weight:600;margin-bottom:12px;">📦 Caută piesă în catalog</h2>
<h2 style="font-size:16px;font-weight:600;margin-bottom:12px;">{{ __('📦 Caută piesă în catalog') }}</h2>
<input type="text" wire:model.live.debounce.300ms="partsQuery" class="vs-input"
placeholder="Nume, cod articol, brand..." style="font-size:14px;text-transform:none;font-family:inherit;">
placeholder="{{ __('Nume, cod articol, brand...') }}" style="font-size:14px;text-transform:none;font-family:inherit;">
@php $parts = $this->partsResults(); @endphp
@if ($partsQuery)
@@ -78,7 +78,7 @@
<div style="color:#9ca3af;text-align:center;padding:20px;">Niciun rezultat pentru {{ $partsQuery }}"</div>
@else
<table class="vs-tbl">
<thead><tr><th>Denumire</th><th>Cod</th><th>Brand</th><th>Stoc</th><th>Preț</th></tr></thead>
<thead><tr><th>Denumire</th><th>{{ __('Cod') }}</th><th>Brand</th><th>{{ __('Stoc') }}</th><th>{{ __('Preț') }}</th></tr></thead>
<tbody>
@foreach ($parts as $p)
<tr>
@@ -29,9 +29,9 @@
</style>
<div class="wl-bar">
<button class="wl-btn" wire:click="setWeek(-1)"> Săpt. anterioară</button>
<button class="wl-btn" wire:click="setWeek(-1)">{{ __('← Săpt. anterioară') }}</button>
<span class="wl-week">{{ $data['weekLabel'] }}</span>
<button class="wl-btn" wire:click="setWeek(1)">Săpt. următoare </button>
<button class="wl-btn" wire:click="setWeek(1)">{{ __('Săpt. următoare →') }}</button>
<span style="margin-left:auto;font-size:11px;color:#6b7280;">capacitate ref: {{ $data['capacity'] }}h/zi</span>
</div>
@@ -84,9 +84,9 @@
</tbody>
</table>
<div class="wl-legend">
Legendă:
{{ __('Legendă:') }}
<span class="wl-sw" style="background:#f3f4f6;"></span> liber
<span class="wl-sw" style="background:rgba(64,200,80,0.3);"></span> ușor
<span class="wl-sw" style="background:rgba(64,200,80,0.3);"></span> {{ __('ușor') }}
<span class="wl-sw" style="background:rgba(160,160,80,0.3);"></span> mediu
<span class="wl-sw" style="background:rgba(255,80,80,0.3);"></span> plin (peste capacitate)
</div>
@@ -1,6 +1,6 @@
<div class="space-y-3 text-sm">
<div class="flex justify-between">
<span class="text-gray-500 dark:text-gray-400">Preț de bază (markup)</span>
<span class="text-gray-500 dark:text-gray-400">{{ __('Preț de bază (markup)') }}</span>
<span class="font-mono">{{ number_format($quote['base'], 2) }} MDL</span>
</div>
@@ -14,11 +14,11 @@
@endforeach
</div>
@else
<div class="text-gray-400 text-xs">Niciun coeficient contextual nu se aplică (preț de bază).</div>
<div class="text-gray-400 text-xs">{{ __('Niciun coeficient contextual nu se aplică (preț de bază).') }}</div>
@endif
<div class="flex justify-between border-t-2 border-gray-300 dark:border-gray-600 pt-2 text-base font-bold">
<span>Preț recomandat</span>
<span>{{ __('Preț recomandat') }}</span>
<span class="text-primary-600">{{ number_format($quote['final'], 2) }} MDL</span>
</div>
@@ -10,7 +10,7 @@
@endphp
<div class="space-y-4">
<p class="text-sm text-gray-600 dark:text-gray-300">
Trimite acest link clientului vede statusul fișei, ETA și fotografiile fără se logheze.
{{ __('Trimite acest link clientului — vede statusul fișei, ETA și fotografiile fără să se logheze.') }}
</p>
<div class="flex justify-center bg-white rounded-lg p-4 border border-gray-200 dark:border-gray-700">
@@ -33,7 +33,7 @@
rel="noopener"
class="inline-flex items-center px-3 py-2 text-sm rounded-md bg-primary-600 text-white hover:bg-primary-700"
>
Deschide
{{ __('Deschide →') }}
</a>
</div>
</div>
@@ -43,6 +43,6 @@
href="{{ route('tracking.qr', $wo->tracking_token) }}"
download="WO-{{ $wo->number }}-qr.svg"
class="text-xs text-primary-600 hover:underline"
>Descarcă QR (SVG)</a>
>{{ __('Descarcă QR (SVG)') }}</a>
</div>
</div>
@@ -14,16 +14,16 @@
<dt class="text-gray-500 dark:text-gray-400">Regiune</dt>
<dd class="text-gray-900 dark:text-gray-100">{{ $info['region'] ?? '—' }}</dd>
<dt class="text-gray-500 dark:text-gray-400">Țară</dt>
<dt class="text-gray-500 dark:text-gray-400">{{ __('Țară') }}</dt>
<dd class="text-gray-900 dark:text-gray-100">{{ $info['country'] ?? '—' }}</dd>
<dt class="text-gray-500 dark:text-gray-400">Producător</dt>
<dt class="text-gray-500 dark:text-gray-400">{{ __('Producător') }}</dt>
<dd class="text-gray-900 dark:text-gray-100 font-semibold">{{ $info['manufacturer'] ?? '— (WMI necunoscut)' }}</dd>
<dt class="text-gray-500 dark:text-gray-400">An model</dt>
<dd class="text-gray-900 dark:text-gray-100 font-semibold">{{ $info['year'] ?? '—' }}</dd>
<dt class="text-gray-500 dark:text-gray-400">Cod uzină</dt>
<dt class="text-gray-500 dark:text-gray-400">{{ __('Cod uzină') }}</dt>
<dd class="font-mono text-gray-900 dark:text-gray-100">{{ $info['plant'] ?? '—' }}</dd>
<dt class="text-gray-500 dark:text-gray-400">Checksum (ISO)</dt>
@@ -31,13 +31,13 @@
@if ($info['checksum_valid'])
<span class="text-green-600 dark:text-green-400"> valid</span>
@else
<span class="text-gray-500"> (multe VIN-uri europene nu respectă checksum-ul NA)</span>
<span class="text-gray-500">{{ __('— (multe VIN-uri europene nu respectă checksum-ul NA)') }}</span>
@endif
</dd>
</dl>
<div class="text-xs text-gray-500 dark:text-gray-400 border-t border-gray-200 dark:border-gray-700 pt-2">
Detalii granulare (model, motorizare) necesită bază TecDoc/NHTSA. Folosește butonul „AI: recomandări" pentru sugestii bazate pe an + producător.
{{ __('Detalii granulare (model, motorizare) necesită bază TecDoc/NHTSA. Folosește butonul „AI: recomandări" pentru sugestii bazate pe an + producător.') }}
</div>
@endif
</div>
+1 -1
View File
@@ -42,7 +42,7 @@
<body>
<div class="toolbar">
<strong>{{ $labels->count() }} etichete</strong>
<button class="btn" onclick="window.print()">🖨 Tipărește</button>
<button class="btn" onclick="window.print()">{{ __('🖨 Tipărește') }}</button>
</div>
<div class="grid">
+2 -2
View File
@@ -31,7 +31,7 @@
<tr>
<th style="width:60px;">Ora</th>
<th>Subiect</th>
<th>Client / Auto</th>
<th>{{ __('Client / Auto') }}</th>
<th>Pod</th>
<th>Maistru</th>
<th style="width:60px;">Status</th>
@@ -57,7 +57,7 @@
</tbody>
</table>
@empty
<div class="empty">Nicio programare în această perioadă.</div>
<div class="empty">{{ __('Nicio programare în această perioadă.') }}</div>
@endforelse
<div class="footer">AutoCRM PSauto · psauto.service.mir.md</div>
+17 -17
View File
@@ -133,11 +133,11 @@
@endif
</div>
<div class="col col-half">
<div class="doc-title">FIȘĂ DE LUCRU</div>
<div class="doc-title">{{ __('FIȘĂ DE LUCRU') }}</div>
<div class="doc-meta">Nr.: <b>{{ $wo->number }}</b></div>
<div class="doc-meta">Data deschiderii: <b>{{ $wo->opened_at?->format('d.m.Y') }}</b></div>
<div class="doc-meta">{{ __('Data deschiderii:') }} <b>{{ $wo->opened_at?->format('d.m.Y') }}</b></div>
@if ($wo->closed_at)
<div class="doc-meta">Data închiderii: <b>{{ $wo->closed_at->format('d.m.Y') }}</b></div>
<div class="doc-meta">{{ __('Data închiderii:') }} <b>{{ $wo->closed_at->format('d.m.Y') }}</b></div>
@endif
<div class="doc-meta">
Status: <b>{{ \App\Models\Tenant\WorkOrder::STATUSES[$wo->status] ?? $wo->status }}</b>
@@ -149,9 +149,9 @@
<div class="row">
<div class="col col-half" style="padding-right: 8px;">
<div class="box">
<h3>Client</h3>
<h3>{{ __('Client') }}</h3>
<div class="kv">
<div><b>Nume:</b> {{ $wo->client?->name ?? '—' }}</div>
<div><b>{{ __('Nume:') }}</b> {{ $wo->client?->name ?? '—' }}</div>
<div><b>Telefon:</b> {{ $wo->client?->phone ?? '—' }}</div>
@if ($wo->client?->email)
<div><b>Email:</b> {{ $wo->client->email }}</div>
@@ -161,7 +161,7 @@
</div>
<div class="col col-half" style="padding-left: 8px;">
<div class="box">
<h3>Auto</h3>
<h3>{{ __('Auto') }}</h3>
<div class="kv">
<div><b>Marca/Model:</b> {{ $wo->vehicle?->make }} {{ $wo->vehicle?->model }} {{ $wo->vehicle?->year }}</div>
<div><b>Nr.:</b> {{ $wo->vehicle?->plate ?? '—' }}</div>
@@ -170,7 +170,7 @@
@endif
<div><b>Km la intrare:</b> {{ $wo->mileage_in ? number_format($wo->mileage_in, 0, '.', ' ') : '—' }}</div>
@if ($wo->mileage_out)
<div><b>Km la ieșire:</b> {{ number_format($wo->mileage_out, 0, '.', ' ') }}</div>
<div><b>{{ __('Km la ieșire:') }}</b> {{ number_format($wo->mileage_out, 0, '.', ' ') }}</div>
@endif
</div>
</div>
@@ -180,7 +180,7 @@
@if ($wo->complaint || $wo->diagnosis)
<div class="box">
@if ($wo->complaint)
<h3>Plângere client</h3>
<h3>{{ __('Plângere client') }}</h3>
<div style="margin-bottom: 8px;">{{ $wo->complaint }}</div>
@endif
@if ($wo->diagnosis)
@@ -196,9 +196,9 @@
<thead>
<tr>
<th style="width: 50%;">Denumire</th>
<th class="r" style="width: 12%;">Ore</th>
<th class="r" style="width: 18%;">Preț/h</th>
<th class="r" style="width: 20%;">Total</th>
<th class="r" style="width: 12%;">{{ __('Ore') }}</th>
<th class="r" style="width: 18%;">{{ __('Preț/h') }}</th>
<th class="r" style="width: 20%;">{{ __('Total') }}</th>
</tr>
</thead>
<tbody>
@@ -226,10 +226,10 @@
<thead>
<tr>
<th style="width: 40%;">Denumire</th>
<th style="width: 18%;">Cod</th>
<th style="width: 18%;">{{ __('Cod') }}</th>
<th class="r" style="width: 10%;">Cant.</th>
<th class="r" style="width: 14%;">Preț</th>
<th class="r" style="width: 18%;">Total</th>
<th class="r" style="width: 14%;">{{ __('Preț') }}</th>
<th class="r" style="width: 18%;">{{ __('Total') }}</th>
</tr>
</thead>
<tbody>
@@ -268,7 +268,7 @@
@if ($wo->recommendations)
<div class="recommendations">
<h3> Recomandări</h3>
<h3>{{ __('⚠ Recomandări') }}</h3>
<div>{{ $wo->recommendations }}</div>
</div>
@endif
@@ -277,11 +277,11 @@
<table style="width: 100%;">
<tr>
<td class="sig-cell">
<div>Client (nume, semnătură):</div>
<div>{{ __('Client (nume, semnătură):') }}</div>
<div class="sig-line"></div>
</td>
<td class="sig-cell">
<div>Maistru / Recepție:</div>
<div>{{ __('Maistru / Recepție:') }}</div>
<div class="sig-line"></div>
</td>
</tr>
@@ -17,18 +17,18 @@
</head>
<body>
<div class="box">
<h1>🏦 Instrucțiuni transfer bancar</h1>
<h1>{{ __('🏦 Instrucțiuni transfer bancar') }}</h1>
<div class="row"><span>Beneficiar:</span> <b>{{ $bank['beneficiary'] ?? '—' }}</b></div>
<div class="row"><span>IBAN:</span> <code onclick="navigator.clipboard.writeText(this.textContent)">{{ $bank['iban'] ?? '—' }}</code></div>
<div class="row"><span>BIC / SWIFT:</span> <code>{{ $bank['bic'] ?? '—' }}</code></div>
<div class="row"><span>Banca:</span> {{ $bank['bank_name'] ?? '—' }}</div>
<div class="row"><span>Sumă:</span> <b>{{ number_format($sub->amount, 2) }} {{ $sub->currency }}</b></div>
<div class="row"><span>{{ __('Sumă:') }}</span> <b>{{ number_format($sub->amount, 2) }} {{ $sub->currency }}</b></div>
<div class="ref-box">
<b> Important la „Detalii plată" / „Reference" scrie EXACT:</b><br>
<b>{{ __('⚠ Important — la „Detalii plată" / „Reference" scrie EXACT:') }}</b><br>
<code style="font-size:14px;font-weight:700;display:block;margin:8px 0;padding:8px;background:#fff;border-radius:4px;">{{ $sub->invoice_number ?? 'INV-' . $sub->id }}</code>
Fără acest cod, plata va fi greu de identificat.
{{ __('Fără acest cod, plata va fi greu de identificat.') }}
</div>
@if (! empty($bank['instructions']))
@@ -36,15 +36,15 @@
@endif
<div style="margin-top:20px;padding-top:16px;border-top:1px solid #e5e7eb;font-size:12px;color:#6b7280;line-height:1.6;">
După efectuarea transferului:
{{ __('După efectuarea transferului:') }}
<ul style="margin: 8px 0 0 20px;">
<li>Plata apare în 1-3 zile lucrătoare</li>
<li>Operatorul confirmă manual factura ca plătită</li>
<li>{{ __('Plata apare în 1-3 zile lucrătoare') }}</li>
<li>{{ __('Operatorul confirmă manual factura ca plătită') }}</li>
<li>Abonamentul se extinde automat</li>
</ul>
</div>
<a href="/billing" class="btn-back"> Înapoi la facturi</a>
<a href="/billing" class="btn-back">{{ __('← Înapoi la facturi') }}</a>
</div>
</body>
</html>
+8 -8
View File
@@ -56,15 +56,15 @@
</head>
<body>
<div class="wrap">
<a href="/app" class="nav-back"> Înapoi la AutoCRM</a>
<a href="/app" class="nav-back">{{ __('← Înapoi la AutoCRM') }}</a>
<h1>Facturi & abonament</h1>
<p class="sub">{{ $tenant->display_name ?? $tenant->name }} · {{ $tenant->slug }}.service.mir.md</p>
@if ($invoices->isEmpty())
<div class="empty">
<div style="font-size:48px;margin-bottom:8px;">📄</div>
<div style="font-size:16px;font-weight:600;margin-bottom:4px;">Nicio factură emisă încă</div>
<div style="font-size:13px;">Operatorul îți va emite factură când e timpul abonamentului.</div>
<div style="font-size:16px;font-weight:600;margin-bottom:4px;">{{ __('Nicio factură emisă încă') }}</div>
<div style="font-size:13px;">{{ __('Operatorul îți va emite factură când e timpul abonamentului.') }}</div>
</div>
@else
@foreach ($invoices as $inv)
@@ -95,7 +95,7 @@
<span style="color:#10b981;font-weight:600;"></span>
@else
<button class="btn-pay" onclick="document.getElementById('m-{{ $inv->id }}').classList.add('open')">
💳 Plătește
{{ __('💳 Plătește') }}
</button>
@endif
</div>
@@ -106,7 +106,7 @@
<div class="modal-box">
<span class="modal-close" onclick="document.getElementById('m-{{ $inv->id }}').classList.remove('open')">×</span>
<h3>Plătește {{ $inv->invoice_number ?? '#' . $inv->id }}</h3>
<p>Sumă: <b>{{ number_format($inv->amount, 2) }} {{ $inv->currency }}</b></p>
<p>{{ __('Sumă:') }} <b>{{ number_format($inv->amount, 2) }} {{ $inv->currency }}</b></p>
@if ($methods['stripe'])
<form method="POST" action="{{ route('pay.start', ['subscription' => $inv->id]) }}" class="method-form">
@@ -165,7 +165,7 @@
<div class="icon">🏦</div>
<div>
<div class="label">Transfer bancar</div>
<div class="desc">Plătește direct din bancă (1-3 zile)</div>
<div class="desc">{{ __('Plătește direct din bancă (1-3 zile)') }}</div>
</div>
</div>
</button>
@@ -174,7 +174,7 @@
@if (! $methods['stripe'] && ! $methods['paypal'] && ! $methods['paynet'] && ! $methods['bank'])
<div style="text-align:center;color:#9ca3af;padding:32px 16px;font-size:13px;">
Nicio metodă de plată configurată. Contactează operatorul.
{{ __('Nicio metodă de plată configurată. Contactează operatorul.') }}
</div>
@endif
</div>
@@ -184,7 +184,7 @@
@if (! empty($legal['name']))
<div style="margin-top:32px;padding:16px;background:#fff;border:1px solid #e5e7eb;border-radius:8px;font-size:12px;color:#6b7280;">
<b>Operator platformă:</b> {{ $legal['name'] }}
<b>{{ __('Operator platformă:') }}</b> {{ $legal['name'] }}
@if (! empty($legal['idno'])) · IDNO {{ $legal['idno'] }} @endif
@if (! empty($legal['address'])) · {{ $legal['address'] }} @endif
@if (! empty($legal['email'])) · {{ $legal['email'] }} @endif
+2 -2
View File
@@ -16,7 +16,7 @@
<div class="box">
<div style="font-size:48px;margin-bottom:12px;">🚧</div>
<h1>{{ $gateway }} Checkout</h1>
<p style="color:#6b7280;font-size:14px;">Factură: <b>{{ $sub->invoice_number ?? '#' . $sub->id }}</b> · {{ number_format($sub->amount, 2) }} {{ $sub->currency }}</p>
<p style="color:#6b7280;font-size:14px;">{{ __('Factură:') }} <b>{{ $sub->invoice_number ?? '#' . $sub->id }}</b> · {{ number_format($sub->amount, 2) }} {{ $sub->currency }}</p>
<div class="note">
<b>Mod stub:</b><br>
@@ -24,7 +24,7 @@
În prod, aici redirectează la pagina {{ $gateway }} Checkout cu sumele și metadatele facturii. La success, webhook-ul marchează automat factura ca plătită.
</div>
<a href="/billing" class="btn"> Înapoi</a>
<a href="/billing" class="btn">{{ __('← Înapoi') }}</a>
</div>
</body>
</html>
+6 -6
View File
@@ -82,20 +82,20 @@
<section class="section">
<div class="info">
<div class="info-block">
<h3>📍 Locație & contact</h3>
@if ($city) <p><b>Oraș:</b> {{ $city }}</p> @endif
<h3>{{ __('📍 Locație & contact') }}</h3>
@if ($city) <p><b>{{ __('Oraș:') }}</b> {{ $city }}</p> @endif
@if ($phone) <p><b>Telefon:</b> <a href="tel:{{ $phone }}" style="color:inherit;">{{ $phone }}</a></p> @endif
@if ($email) <p><b>Email:</b> <a href="mailto:{{ $email }}" style="color:inherit;">{{ $email }}</a></p> @endif
</div>
<div class="info-block">
<h3>🕒 Program de lucru</h3>
<p>Luni Vineri: 08:00 18:00</p>
<p>Sâmbătă: 09:00 14:00</p>
<p>Duminică: închis</p>
<p>{{ __('Sâmbătă: 09:00 14:00') }}</p>
<p>{{ __('Duminică: închis') }}</p>
</div>
@if (! empty($cars))
<div class="info-block">
<h3>🚗 Mărci suportate</h3>
<h3>{{ __('🚗 Mărci suportate') }}</h3>
<p>{{ implode(', ', array_slice($cars, 0, 12)) }}@if (count($cars) > 12), @endif</p>
</div>
@endif
@@ -103,7 +103,7 @@
</section>
<section class="cta">
<h2>Rezervă o programare</h2>
<h2>{{ __('Rezervă o programare') }}</h2>
@if ($phone)
<a href="tel:{{ $phone }}">📞 {{ $phone }}</a>
@endif
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<html lang="ro">
<head><meta charset="UTF-8"><title>Plată anulată</title>
<head><meta charset="UTF-8"><title>{{ __('Plată anulată') }}</title>
<style>
body { font-family: system-ui, sans-serif; background: #fef2f2; padding: 60px 20px; text-align: center; color: #1f2937; }
.box { max-width: 480px; margin: 0 auto; background:#fff; padding:40px 24px; border-radius:12px; }
@@ -10,9 +10,9 @@
<body>
<div class="box">
<div style="font-size:48px;"></div>
<h1 style="color:#ef4444;">Plată anulată</h1>
<p style="color:#6b7280;">Nu a fost prelevată nicio sumă. Poți încerca din nou oricând.</p>
<a href="/billing" class="btn"> Înapoi la facturi</a>
<h1 style="color:#ef4444;">{{ __('Plată anulată') }}</h1>
<p style="color:#6b7280;">{{ __('Nu a fost prelevată nicio sumă. Poți încerca din nou oricând.') }}</p>
<a href="/billing" class="btn">{{ __('← Înapoi la facturi') }}</a>
</div>
</body>
</html>
@@ -2,7 +2,7 @@
<html lang="ro">
<head>
<meta charset="UTF-8">
<title>Plată reușită</title>
<title>{{ __('Plată reușită') }}</title>
<style>
body { font-family: system-ui, sans-serif; background: #f0fdf4; padding: 60px 20px; text-align: center; color: #1f2937; }
.box { max-width: 480px; margin: 0 auto; background:#fff; padding:40px 24px; border-radius:12px; box-shadow:0 4px 12px rgba(0,0,0,.05); }
@@ -13,9 +13,9 @@
<body>
<div class="box">
<div style="font-size:64px;"></div>
<h1>Plată reușită!</h1>
<h1>{{ __('Plată reușită!') }}</h1>
<p style="color:#6b7280;">Factura {{ $sub->invoice_number ?? '#' . $sub->id }} a fost achitată.</p>
<p style="color:#6b7280;font-size:13px;margin-top:8px;">Abonamentul tău a fost extins.</p>
<p style="color:#6b7280;font-size:13px;margin-top:8px;">{{ __('Abonamentul tău a fost extins.') }}</p>
<a href="/app" class="btn"> Mergi la AutoCRM</a>
</div>
</body>
+1 -1
View File
@@ -15,7 +15,7 @@
<div class="card">
<h1> Abonament expirat</h1>
<p>Abonamentul pentru <b>{{ $company->name }}</b> a expirat.</p>
<p>Pentru a continua folosiți aplicația, rugăm achitați factura.</p>
<p>{{ __('Pentru a continua să folosiți aplicația, vă rugăm să achitați factura.') }}</p>
</div>
</body>
</html>
+1 -1
View File
@@ -15,7 +15,7 @@
<div class="card">
<h1> Cont suspendat</h1>
<p>Contul <b>{{ $company->name }}</b> a fost suspendat.</p>
<p>Pentru detalii, contactați administratorul platformei.</p>
<p>{{ __('Pentru detalii, contactați administratorul platformei.') }}</p>
</div>
</body>
</html>