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
@@ -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>