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:
@@ -71,7 +71,7 @@ class CompanyResource extends Resource
|
|||||||
Forms\Components\Select::make('status')
|
Forms\Components\Select::make('status')
|
||||||
->options([
|
->options([
|
||||||
'trial' => 'Trial',
|
'trial' => 'Trial',
|
||||||
'active' => 'Activ',
|
'active' => __('Activ'),
|
||||||
'expired' => 'Expirat',
|
'expired' => 'Expirat',
|
||||||
'suspended' => 'Suspendat',
|
'suspended' => 'Suspendat',
|
||||||
'archived' => 'Arhivat',
|
'archived' => 'Arhivat',
|
||||||
@@ -136,7 +136,7 @@ class CompanyResource extends Resource
|
|||||||
])
|
])
|
||||||
->filters([
|
->filters([
|
||||||
Tables\Filters\SelectFilter::make('status')->options([
|
Tables\Filters\SelectFilter::make('status')->options([
|
||||||
'trial' => 'Trial', 'active' => 'Activ', 'expired' => 'Expirat',
|
'trial' => 'Trial', 'active' => __('Activ'), 'expired' => 'Expirat',
|
||||||
'suspended' => 'Suspendat', 'archived' => 'Arhivat',
|
'suspended' => 'Suspendat', 'archived' => 'Arhivat',
|
||||||
]),
|
]),
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ class SuperAdminResource extends Resource
|
|||||||
'owner' => 'Proprietar',
|
'owner' => 'Proprietar',
|
||||||
'admin' => 'Administrator',
|
'admin' => 'Administrator',
|
||||||
'support' => 'Suport',
|
'support' => 'Suport',
|
||||||
'sales' => 'Vânzări',
|
'sales' => __('Vânzări'),
|
||||||
'finance' => 'Financiar',
|
'finance' => 'Financiar',
|
||||||
default => $s,
|
default => $s,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ class AiAssistant extends Page
|
|||||||
$chat = AiChat::create([
|
$chat = AiChat::create([
|
||||||
'company_id' => $companyId,
|
'company_id' => $companyId,
|
||||||
'user_id' => $userId,
|
'user_id' => $userId,
|
||||||
'title' => 'Conversație nouă',
|
'title' => __('Conversație nouă'),
|
||||||
'provider' => $this->defaultProvider(),
|
'provider' => $this->defaultProvider(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -81,7 +81,7 @@ class AiAssistant extends Page
|
|||||||
$chat = AiChat::create([
|
$chat = AiChat::create([
|
||||||
'company_id' => app(TenantManager::class)->currentId(),
|
'company_id' => app(TenantManager::class)->currentId(),
|
||||||
'user_id' => auth()->id(),
|
'user_id' => auth()->id(),
|
||||||
'title' => 'Conversație nouă',
|
'title' => __('Conversație nouă'),
|
||||||
'provider' => $this->defaultProvider(),
|
'provider' => $this->defaultProvider(),
|
||||||
]);
|
]);
|
||||||
$this->chatId = $chat->id;
|
$this->chatId = $chat->id;
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ class CalendarBoard extends Page
|
|||||||
public function getDays(): array
|
public function getDays(): array
|
||||||
{
|
{
|
||||||
$today = Carbon::today()->toDateString();
|
$today = Carbon::today()->toDateString();
|
||||||
$names = ['Luni', 'Marți', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă', 'Duminică'];
|
$names = ['Luni', __('Marți'), 'Miercuri', 'Joi', 'Vineri', __('Sâmbătă'), __('Duminică')];
|
||||||
$start = Carbon::parse($this->weekStart);
|
$start = Carbon::parse($this->weekStart);
|
||||||
|
|
||||||
$count = match ($this->viewMode) {
|
$count = match ($this->viewMode) {
|
||||||
@@ -173,7 +173,7 @@ class CalendarBoard extends Page
|
|||||||
'capacity_hours' => 8.0,
|
'capacity_hours' => 8.0,
|
||||||
])->all();
|
])->all();
|
||||||
// Always include "Fără maistru" row at the bottom
|
// Always include "Fără maistru" row at the bottom
|
||||||
$rows[] = ['kind' => 'master', 'id' => 0, 'name' => 'Fără maistru', 'color' => '#94a3b8', 'meta' => '—', 'capacity_hours' => 0];
|
$rows[] = ['kind' => 'master', 'id' => 0, 'name' => __('Fără maistru'), 'color' => '#94a3b8', 'meta' => '—', 'capacity_hours' => 0];
|
||||||
return $rows;
|
return $rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,15 +48,15 @@ class Finance extends Page
|
|||||||
'overview' => '📊 Overview',
|
'overview' => '📊 Overview',
|
||||||
'cashflow' => '💸 Cashflow',
|
'cashflow' => '💸 Cashflow',
|
||||||
'pnl' => '📈 P&L',
|
'pnl' => '📈 P&L',
|
||||||
'balance' => '⚖️ Balanță',
|
'balance' => __('⚖️ Balanță'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function periods(): array
|
public function periods(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'this_month' => 'Luna curentă',
|
'this_month' => __('Luna curentă'),
|
||||||
'last_month' => 'Luna trecută',
|
'last_month' => __('Luna trecută'),
|
||||||
'this_year' => 'Anul curent',
|
'this_year' => 'Anul curent',
|
||||||
'last_30' => 'Ultimele 30 zile',
|
'last_30' => 'Ultimele 30 zile',
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class Integrations extends Page
|
|||||||
'name' => 'Telegram Bot',
|
'name' => 'Telegram Bot',
|
||||||
'icon' => '✈️',
|
'icon' => '✈️',
|
||||||
'color' => '#229ED9',
|
'color' => '#229ED9',
|
||||||
'description' => 'Primește cereri din canalul Telegram + trimite confirmări automate.',
|
'description' => __('Primește cereri din canalul Telegram + trimite confirmări automate.'),
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'bot_token' => ['label' => 'Bot Token', 'type' => 'password', 'placeholder' => 'din @BotFather'],
|
'bot_token' => ['label' => 'Bot Token', 'type' => 'password', 'placeholder' => 'din @BotFather'],
|
||||||
'chat_id' => ['label' => 'Channel/Chat ID', 'type' => 'text', 'placeholder' => '@psauto_md'],
|
'chat_id' => ['label' => 'Channel/Chat ID', 'type' => 'text', 'placeholder' => '@psauto_md'],
|
||||||
@@ -79,7 +79,7 @@ class Integrations extends Page
|
|||||||
'name' => 'WhatsApp Business',
|
'name' => 'WhatsApp Business',
|
||||||
'icon' => '💬',
|
'icon' => '💬',
|
||||||
'color' => '#25D366',
|
'color' => '#25D366',
|
||||||
'description' => 'Trimite mesaje template către clienți (programări, confirmări).',
|
'description' => __('Trimite mesaje template către clienți (programări, confirmări).'),
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'phone_id' => ['label' => 'Phone Number ID', 'type' => 'text'],
|
'phone_id' => ['label' => 'Phone Number ID', 'type' => 'text'],
|
||||||
'token' => ['label' => 'Permanent Access Token', 'type' => 'password'],
|
'token' => ['label' => 'Permanent Access Token', 'type' => 'password'],
|
||||||
@@ -99,7 +99,7 @@ class Integrations extends Page
|
|||||||
'name' => 'Facebook / Instagram Lead Ads',
|
'name' => 'Facebook / Instagram Lead Ads',
|
||||||
'icon' => '📘',
|
'icon' => '📘',
|
||||||
'color' => '#1877F2',
|
'color' => '#1877F2',
|
||||||
'description' => 'Importă lead-uri direct din Lead Ads forms.',
|
'description' => __('Importă lead-uri direct din Lead Ads forms.'),
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'page_id' => ['label' => 'Page ID', 'type' => 'text'],
|
'page_id' => ['label' => 'Page ID', 'type' => 'text'],
|
||||||
'access_token' => ['label' => 'Access Token', 'type' => 'password'],
|
'access_token' => ['label' => 'Access Token', 'type' => 'password'],
|
||||||
@@ -109,7 +109,7 @@ class Integrations extends Page
|
|||||||
'name' => 'SMS Gateway',
|
'name' => 'SMS Gateway',
|
||||||
'icon' => '📱',
|
'icon' => '📱',
|
||||||
'color' => '#6366F1',
|
'color' => '#6366F1',
|
||||||
'description' => 'Trimite SMS-uri prin gateway local (Moldcell/Orange API).',
|
'description' => __('Trimite SMS-uri prin gateway local (Moldcell/Orange API).'),
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'provider' => ['label' => 'Provider', 'type' => 'text', 'placeholder' => 'moldcell / orange / twilio'],
|
'provider' => ['label' => 'Provider', 'type' => 'text', 'placeholder' => 'moldcell / orange / twilio'],
|
||||||
'api_key' => ['label' => 'API Key', 'type' => 'password'],
|
'api_key' => ['label' => 'API Key', 'type' => 'password'],
|
||||||
@@ -117,10 +117,10 @@ class Integrations extends Page
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
'webhook_in' => [
|
'webhook_in' => [
|
||||||
'name' => 'Webhook intrări (formulare site)',
|
'name' => __('Webhook intrări (formulare site)'),
|
||||||
'icon' => '🪝',
|
'icon' => '🪝',
|
||||||
'color' => '#8B5CF6',
|
'color' => '#8B5CF6',
|
||||||
'description' => 'URL secret pentru POST direct cu lead-uri din site-ul tău.',
|
'description' => __('URL secret pentru POST direct cu lead-uri din site-ul tău.'),
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'secret' => ['label' => 'Secret token', 'type' => 'text', 'placeholder' => 'random string'],
|
'secret' => ['label' => 'Secret token', 'type' => 'text', 'placeholder' => 'random string'],
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -75,9 +75,9 @@ class Onboarding extends Page
|
|||||||
'MDL' => 'MDL — Leu moldovenesc',
|
'MDL' => 'MDL — Leu moldovenesc',
|
||||||
'EUR' => 'EUR — Euro',
|
'EUR' => 'EUR — Euro',
|
||||||
'USD' => 'USD — US Dollar',
|
'USD' => 'USD — US Dollar',
|
||||||
'RON' => 'RON — Leu românesc',
|
'RON' => __('RON — Leu românesc'),
|
||||||
'UAH' => 'UAH — Hryvnia',
|
'UAH' => 'UAH — Hryvnia',
|
||||||
'RUB' => 'RUB — Rublă',
|
'RUB' => __('RUB — Rublă'),
|
||||||
])
|
])
|
||||||
->default('MDL')
|
->default('MDL')
|
||||||
->required()
|
->required()
|
||||||
@@ -89,7 +89,7 @@ class Onboarding extends Page
|
|||||||
->schema([
|
->schema([
|
||||||
Forms\Components\Select::make('language')
|
Forms\Components\Select::make('language')
|
||||||
->label(__('Limbă'))
|
->label(__('Limbă'))
|
||||||
->options(['ro' => 'Română', 'ru' => 'Русский', 'en' => 'English'])
|
->options(['ro' => __('Română'), 'ru' => 'Русский', 'en' => 'English'])
|
||||||
->required(),
|
->required(),
|
||||||
Forms\Components\ColorPicker::make('theme_color')
|
Forms\Components\ColorPicker::make('theme_color')
|
||||||
->label(__('Culoare brand')),
|
->label(__('Culoare brand')),
|
||||||
|
|||||||
@@ -624,7 +624,7 @@ class PipelineBoard extends Page
|
|||||||
'Telefon' => $lead->phone,
|
'Telefon' => $lead->phone,
|
||||||
'Email' => $lead->email,
|
'Email' => $lead->email,
|
||||||
'Automobil' => trim(($lead->car ?: '') . ' ' . ($lead->model ?: '')),
|
'Automobil' => trim(($lead->car ?: '') . ' ' . ($lead->model ?: '')),
|
||||||
'Sursă' => Lead::SOURCES[$lead->source] ?? $lead->source,
|
__('Sursă') => Lead::SOURCES[$lead->source] ?? $lead->source,
|
||||||
'Buget estimat' => $lead->budget ? number_format($lead->budget, 0, '.', ' ') . ' MDL' : null,
|
'Buget estimat' => $lead->budget ? number_format($lead->budget, 0, '.', ' ') . ' MDL' : null,
|
||||||
],
|
],
|
||||||
'note' => $lead->message ?? $lead->notes,
|
'note' => $lead->message ?? $lead->notes,
|
||||||
@@ -651,9 +651,9 @@ class PipelineBoard extends Page
|
|||||||
'Client' => $deal->client?->name,
|
'Client' => $deal->client?->name,
|
||||||
'Telefon' => $deal->client?->phone,
|
'Telefon' => $deal->client?->phone,
|
||||||
'Automobil' => trim(($deal->vehicle?->make ?? '') . ' ' . ($deal->vehicle?->model ?? '') . ' · ' . ($deal->vehicle?->plate ?? '')),
|
'Automobil' => trim(($deal->vehicle?->make ?? '') . ' ' . ($deal->vehicle?->model ?? '') . ' · ' . ($deal->vehicle?->plate ?? '')),
|
||||||
'Sursă' => $deal->source ? (Lead::SOURCES[$deal->source] ?? $deal->source) : null,
|
__('Sursă') => $deal->source ? (Lead::SOURCES[$deal->source] ?? $deal->source) : null,
|
||||||
'Responsabil' => $deal->assignedTo?->name,
|
'Responsabil' => $deal->assignedTo?->name,
|
||||||
'Sumă' => number_format($deal->price, 0, '.', ' ') . ' MDL',
|
__('Sumă') => number_format($deal->price, 0, '.', ' ') . ' MDL',
|
||||||
],
|
],
|
||||||
'note' => $deal->note,
|
'note' => $deal->note,
|
||||||
'activity' => $this->loadActivity($deal),
|
'activity' => $this->loadActivity($deal),
|
||||||
@@ -682,7 +682,7 @@ class PipelineBoard extends Page
|
|||||||
'Telefon' => $wo->client?->phone,
|
'Telefon' => $wo->client?->phone,
|
||||||
'Automobil' => trim(($wo->vehicle?->make ?? '') . ' · ' . ($wo->vehicle?->plate ?? '')),
|
'Automobil' => trim(($wo->vehicle?->make ?? '') . ' · ' . ($wo->vehicle?->plate ?? '')),
|
||||||
'Responsabil' => $wo->master?->name,
|
'Responsabil' => $wo->master?->name,
|
||||||
'Sumă' => number_format($wo->total, 0, '.', ' ') . ' MDL',
|
__('Sumă') => number_format($wo->total, 0, '.', ' ') . ' MDL',
|
||||||
'De achitat' => number_format(max(0, $balanceDue), 0, '.', ' ') . ' MDL',
|
'De achitat' => number_format(max(0, $balanceDue), 0, '.', ' ') . ' MDL',
|
||||||
],
|
],
|
||||||
'note' => $wo->diagnosis ?: $wo->complaint,
|
'note' => $wo->diagnosis ?: $wo->complaint,
|
||||||
|
|||||||
@@ -58,10 +58,10 @@ class Reports extends Page
|
|||||||
public function periods(): array
|
public function periods(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'today' => 'Astăzi',
|
'today' => __('Astăzi'),
|
||||||
'this_week' => 'Săptămâna curentă',
|
'this_week' => __('Săptămâna curentă'),
|
||||||
'this_month' => 'Luna curentă',
|
'this_month' => __('Luna curentă'),
|
||||||
'last_month' => 'Luna trecută',
|
'last_month' => __('Luna trecută'),
|
||||||
'this_year' => 'Anul curent',
|
'this_year' => 'Anul curent',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -69,12 +69,12 @@ class Reports extends Page
|
|||||||
public function tabs(): array
|
public function tabs(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'finance' => '💰 Finanțe',
|
'finance' => __('💰 Finanțe'),
|
||||||
'workload' => '📊 Încărcare',
|
'workload' => __('📊 Încărcare'),
|
||||||
'masters' => '👨🔧 Mecanici',
|
'masters' => '👨🔧 Mecanici',
|
||||||
'works' => '🔧 Manopere top',
|
'works' => '🔧 Manopere top',
|
||||||
'parts' => '📦 Piese',
|
'parts' => '📦 Piese',
|
||||||
'clients' => '👥 Clienți',
|
'clients' => __('👥 Clienți'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ class Settings extends Page
|
|||||||
->schema([
|
->schema([
|
||||||
Forms\Components\Select::make('language')
|
Forms\Components\Select::make('language')
|
||||||
->label(__('Limbă default'))
|
->label(__('Limbă default'))
|
||||||
->options(['ro' => 'Română', 'ru' => 'Русский', 'en' => 'English'])
|
->options(['ro' => __('Română'), 'ru' => 'Русский', 'en' => 'English'])
|
||||||
->required(),
|
->required(),
|
||||||
Forms\Components\Select::make('currency')
|
Forms\Components\Select::make('currency')
|
||||||
->label(__('Monedă'))
|
->label(__('Monedă'))
|
||||||
@@ -107,9 +107,9 @@ class Settings extends Page
|
|||||||
'MDL' => 'MDL — Leu moldovenesc',
|
'MDL' => 'MDL — Leu moldovenesc',
|
||||||
'EUR' => 'EUR — Euro',
|
'EUR' => 'EUR — Euro',
|
||||||
'USD' => 'USD — US Dollar',
|
'USD' => 'USD — US Dollar',
|
||||||
'RON' => 'RON — Leu românesc',
|
'RON' => __('RON — Leu românesc'),
|
||||||
'UAH' => 'UAH — Hryvnia',
|
'UAH' => 'UAH — Hryvnia',
|
||||||
'RUB' => 'RUB — Rublă',
|
'RUB' => __('RUB — Rublă'),
|
||||||
])
|
])
|
||||||
->required()
|
->required()
|
||||||
->searchable(),
|
->searchable(),
|
||||||
@@ -339,7 +339,7 @@ class Settings extends Page
|
|||||||
$r = $svc->sendToUser(
|
$r = $svc->sendToUser(
|
||||||
(int) auth()->id(),
|
(int) auth()->id(),
|
||||||
'Test AutoCRM',
|
'Test AutoCRM',
|
||||||
'Notificările push funcționează ✅',
|
__('Notificările push funcționează ✅'),
|
||||||
'/app',
|
'/app',
|
||||||
);
|
);
|
||||||
Notification::make()
|
Notification::make()
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ class Workload extends Page
|
|||||||
// Same for appointments without post (drop them on a virtual "—" row).
|
// Same for appointments without post (drop them on a virtual "—" row).
|
||||||
$unposted = $appts->keys()->filter(fn ($k) => str_starts_with($k, '|'));
|
$unposted = $appts->keys()->filter(fn ($k) => str_starts_with($k, '|'));
|
||||||
if ($unposted->isNotEmpty()) {
|
if ($unposted->isNotEmpty()) {
|
||||||
$matrix[0] = ['post' => (object) ['id' => 0, 'name' => '— fără pod —', 'color' => '#9ca3af'], 'days' => []];
|
$matrix[0] = ['post' => (object) ['id' => 0, 'name' => __('— fără pod —'), 'color' => '#9ca3af'], 'days' => []];
|
||||||
foreach ($days as $d) {
|
foreach ($days as $d) {
|
||||||
$key = '|' . $d->format('Y-m-d');
|
$key = '|' . $d->format('Y-m-d');
|
||||||
$items = $appts->get($key, collect());
|
$items = $appts->get($key, collect());
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class ActivityResource extends Resource
|
|||||||
->colors([
|
->colors([
|
||||||
'success' => ['creat'],
|
'success' => ['creat'],
|
||||||
'info' => ['modificat'],
|
'info' => ['modificat'],
|
||||||
'danger' => ['șters'],
|
'danger' => [__('șters')],
|
||||||
'warning' => ['restaurat'],
|
'warning' => ['restaurat'],
|
||||||
]),
|
]),
|
||||||
Tables\Columns\TextColumn::make('subject_type')
|
Tables\Columns\TextColumn::make('subject_type')
|
||||||
@@ -76,7 +76,7 @@ class ActivityResource extends Resource
|
|||||||
->filters([
|
->filters([
|
||||||
Tables\Filters\SelectFilter::make('description')
|
Tables\Filters\SelectFilter::make('description')
|
||||||
->label(__('Acțiune'))
|
->label(__('Acțiune'))
|
||||||
->options(['creat' => 'creat', 'modificat' => 'modificat', 'șters' => 'șters']),
|
->options(['creat' => 'creat', 'modificat' => 'modificat', __('șters') => __('șters')]),
|
||||||
Tables\Filters\Filter::make('today')
|
Tables\Filters\Filter::make('today')
|
||||||
->label(__('Astăzi'))
|
->label(__('Astăzi'))
|
||||||
->query(fn ($q) => $q->whereDate('created_at', today())),
|
->query(fn ($q) => $q->whereDate('created_at', today())),
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ class ClientResource extends Resource
|
|||||||
->schema([
|
->schema([
|
||||||
Forms\Components\Select::make('type')
|
Forms\Components\Select::make('type')
|
||||||
->label(__('Tip'))
|
->label(__('Tip'))
|
||||||
->options(['individual' => 'Persoană fizică', 'company' => 'Persoană juridică'])
|
->options(['individual' => __('Persoană fizică'), 'company' => __('Persoană juridică')])
|
||||||
->default('individual')
|
->default('individual')
|
||||||
->required()
|
->required()
|
||||||
->live(),
|
->live(),
|
||||||
@@ -68,8 +68,8 @@ class ClientResource extends Resource
|
|||||||
->maxLength(160),
|
->maxLength(160),
|
||||||
Forms\Components\Select::make('status')
|
Forms\Components\Select::make('status')
|
||||||
->options([
|
->options([
|
||||||
'new' => 'Nou', 'active' => 'Activ', 'vip' => 'VIP',
|
'new' => __('Nou'), 'active' => __('Activ'), 'vip' => 'VIP',
|
||||||
'debtor' => 'Datornic', 'blocked' => 'Blocat', 'lost' => 'Pierdut',
|
'debtor' => 'Datornic', 'blocked' => __('Blocat'), 'lost' => 'Pierdut',
|
||||||
])
|
])
|
||||||
->default('active')
|
->default('active')
|
||||||
->required(),
|
->required(),
|
||||||
@@ -133,8 +133,8 @@ class ClientResource extends Resource
|
|||||||
])
|
])
|
||||||
->filters([
|
->filters([
|
||||||
Tables\Filters\SelectFilter::make('status')->options([
|
Tables\Filters\SelectFilter::make('status')->options([
|
||||||
'new' => 'Nou', 'active' => 'Activ', 'vip' => 'VIP',
|
'new' => __('Nou'), 'active' => __('Activ'), 'vip' => 'VIP',
|
||||||
'debtor' => 'Datornic', 'blocked' => 'Blocat', 'lost' => 'Pierdut',
|
'debtor' => 'Datornic', 'blocked' => __('Blocat'), 'lost' => 'Pierdut',
|
||||||
]),
|
]),
|
||||||
])
|
])
|
||||||
->actions([
|
->actions([
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ class MasterResource extends Resource
|
|||||||
Forms\Components\TextInput::make('phone')->label(__('Telefon'))->tel()->maxLength(40),
|
Forms\Components\TextInput::make('phone')->label(__('Telefon'))->tel()->maxLength(40),
|
||||||
Forms\Components\TextInput::make('email')->label(__('Email'))->email()->maxLength(120),
|
Forms\Components\TextInput::make('email')->label(__('Email'))->email()->maxLength(120),
|
||||||
Forms\Components\Select::make('status')
|
Forms\Components\Select::make('status')
|
||||||
->options(['active' => 'Activ', 'inactive' => 'Inactiv', 'blocked' => 'Blocat'])
|
->options(['active' => __('Activ'), 'inactive' => __('Inactiv'), 'blocked' => __('Blocat')])
|
||||||
->default('active')
|
->default('active')
|
||||||
->required(),
|
->required(),
|
||||||
]),
|
]),
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class PartResource extends Resource
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'Stoc' => (int) $record->stock . ' ' . ($record->unit ?? 'buc'),
|
'Stoc' => (int) $record->stock . ' ' . ($record->unit ?? 'buc'),
|
||||||
'Preț' => number_format((float) $record->sell_price, 2),
|
__('Preț') => number_format((float) $record->sell_price, 2),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ class TireSetResource extends Resource
|
|||||||
Forms\Components\TextInput::make('model')->maxLength(64),
|
Forms\Components\TextInput::make('model')->maxLength(64),
|
||||||
Forms\Components\TextInput::make('dot_year')->label(__('DOT'))->maxLength(8)->placeholder('3621'),
|
Forms\Components\TextInput::make('dot_year')->label(__('DOT'))->maxLength(8)->placeholder('3621'),
|
||||||
Forms\Components\Toggle::make('has_rims')->label(__('Cu jante')),
|
Forms\Components\Toggle::make('has_rims')->label(__('Cu jante')),
|
||||||
Forms\Components\Select::make('rim_type')->label(__('Tip jante'))->options(['steel' => 'Tablă', 'alloy' => 'Aliaj']),
|
Forms\Components\Select::make('rim_type')->label(__('Tip jante'))->options(['steel' => __('Tablă'), 'alloy' => 'Aliaj']),
|
||||||
Forms\Components\Select::make('condition')->label(__('Stare'))->options(TireSet::CONDITIONS),
|
Forms\Components\Select::make('condition')->label(__('Stare'))->options(TireSet::CONDITIONS),
|
||||||
]),
|
]),
|
||||||
Schemas\Components\Section::make(__('Uzură (mm) per poziție'))
|
Schemas\Components\Section::make(__('Uzură (mm) per poziție'))
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ class UserResource extends Resource
|
|||||||
Forms\Components\TextInput::make('email')->email()->required()->maxLength(120),
|
Forms\Components\TextInput::make('email')->email()->required()->maxLength(120),
|
||||||
Forms\Components\TextInput::make('phone')->tel()->maxLength(40),
|
Forms\Components\TextInput::make('phone')->tel()->maxLength(40),
|
||||||
Forms\Components\Select::make('locale')
|
Forms\Components\Select::make('locale')
|
||||||
->options(['ro' => 'Română', 'ru' => 'Русский', 'en' => 'English'])
|
->options(['ro' => __('Română'), 'ru' => 'Русский', 'en' => 'English'])
|
||||||
->default('ro'),
|
->default('ro'),
|
||||||
]),
|
]),
|
||||||
Schemas\Components\Section::make(__('Acces'))
|
Schemas\Components\Section::make(__('Acces'))
|
||||||
@@ -74,7 +74,7 @@ class UserResource extends Resource
|
|||||||
->default('mechanic')
|
->default('mechanic')
|
||||||
->helperText(__('Rolul principal — sincronizat automat cu drepturile RBAC.')),
|
->helperText(__('Rolul principal — sincronizat automat cu drepturile RBAC.')),
|
||||||
Forms\Components\Select::make('status')
|
Forms\Components\Select::make('status')
|
||||||
->options(['active' => 'Activ', 'inactive' => 'Inactiv', 'blocked' => 'Blocat'])
|
->options(['active' => __('Activ'), 'inactive' => __('Inactiv'), 'blocked' => __('Blocat')])
|
||||||
->default('active')
|
->default('active')
|
||||||
->required(),
|
->required(),
|
||||||
Forms\Components\TextInput::make('password')
|
Forms\Components\TextInput::make('password')
|
||||||
@@ -170,11 +170,11 @@ class UserResource extends Resource
|
|||||||
])
|
])
|
||||||
->filters([
|
->filters([
|
||||||
Tables\Filters\SelectFilter::make('role')->options([
|
Tables\Filters\SelectFilter::make('role')->options([
|
||||||
'admin' => 'Admin', 'manager' => 'Manager', 'receptionist' => 'Recepție',
|
'admin' => 'Admin', 'manager' => 'Manager', 'receptionist' => __('Recepție'),
|
||||||
'mechanic' => 'Mecanic', 'parts_manager' => 'Magazie', 'accountant' => 'Contabil', 'marketer' => 'Marketing',
|
'mechanic' => 'Mecanic', 'parts_manager' => 'Magazie', 'accountant' => 'Contabil', 'marketer' => 'Marketing',
|
||||||
]),
|
]),
|
||||||
Tables\Filters\SelectFilter::make('status')->options([
|
Tables\Filters\SelectFilter::make('status')->options([
|
||||||
'active' => 'Activ', 'inactive' => 'Inactiv', 'blocked' => 'Blocat',
|
'active' => __('Activ'), 'inactive' => __('Inactiv'), 'blocked' => __('Blocat'),
|
||||||
]),
|
]),
|
||||||
])
|
])
|
||||||
->actions([
|
->actions([
|
||||||
|
|||||||
+1
-1
@@ -39,7 +39,7 @@ class PermissionOverridesRelationManager extends RelationManager
|
|||||||
->columnSpanFull(),
|
->columnSpanFull(),
|
||||||
Forms\Components\Select::make('mode')
|
Forms\Components\Select::make('mode')
|
||||||
->required()
|
->required()
|
||||||
->options(['grant' => 'GRANT — adaugă dreptul', 'deny' => 'DENY — interzice dreptul'])
|
->options(['grant' => __('GRANT — adaugă dreptul'), 'deny' => 'DENY — interzice dreptul'])
|
||||||
->default('grant'),
|
->default('grant'),
|
||||||
Forms\Components\DatePicker::make('expires_at')
|
Forms\Components\DatePicker::make('expires_at')
|
||||||
->label(__('Expiră la (opțional)'))
|
->label(__('Expiră la (opțional)'))
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ class VehicleResource extends Resource
|
|||||||
Forms\Components\TextInput::make('gearbox')->maxLength(60),
|
Forms\Components\TextInput::make('gearbox')->maxLength(60),
|
||||||
Forms\Components\Select::make('fuel')
|
Forms\Components\Select::make('fuel')
|
||||||
->options([
|
->options([
|
||||||
'Benzină' => 'Benzină', 'Diesel' => 'Diesel', 'Hybrid' => 'Hybrid',
|
__('Benzină') => __('Benzină'), 'Diesel' => 'Diesel', 'Hybrid' => 'Hybrid',
|
||||||
'EV' => 'Electric', 'GPL' => 'GPL', 'GNC' => 'GNC',
|
'EV' => 'Electric', 'GPL' => 'GPL', 'GNC' => 'GNC',
|
||||||
]),
|
]),
|
||||||
Forms\Components\Select::make('vehicle_class')
|
Forms\Components\Select::make('vehicle_class')
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ class PaymentController
|
|||||||
return view('site.checkout-stub', [
|
return view('site.checkout-stub', [
|
||||||
'gateway' => 'Stripe',
|
'gateway' => 'Stripe',
|
||||||
'sub' => $sub,
|
'sub' => $sub,
|
||||||
'note' => 'Pentru a activa Stripe Checkout, instalează `composer require stripe/stripe-php` și activează în /admin/payment-settings.',
|
'note' => __('Pentru a activa Stripe Checkout, instalează `composer require stripe/stripe-php` și activează în /admin/payment-settings.'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,7 +114,7 @@ class PaymentController
|
|||||||
return view('site.checkout-stub', [
|
return view('site.checkout-stub', [
|
||||||
'gateway' => 'PayPal',
|
'gateway' => 'PayPal',
|
||||||
'sub' => $sub,
|
'sub' => $sub,
|
||||||
'note' => 'Pentru a activa PayPal, instalează `composer require srmklive/paypal` și activează în /admin/payment-settings.',
|
'note' => __('Pentru a activa PayPal, instalează `composer require srmklive/paypal` și activează în /admin/payment-settings.'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class ShopAuthController extends Controller
|
|||||||
|
|
||||||
// Unique per tenant (handled by composite index, but check for nicer error).
|
// Unique per tenant (handled by composite index, but check for nicer error).
|
||||||
if (ShopCustomer::where('phone', $data['phone'])->exists()) {
|
if (ShopCustomer::where('phone', $data['phone'])->exists()) {
|
||||||
return back()->withErrors(['phone' => 'Există deja un cont cu acest telefon.'])->withInput();
|
return back()->withErrors(['phone' => __('Există deja un cont cu acest telefon.')])->withInput();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Auto-link to existing Client by phone if present.
|
// Auto-link to existing Client by phone if present.
|
||||||
@@ -85,7 +85,7 @@ class ShopAuthController extends Controller
|
|||||||
remember: true
|
remember: true
|
||||||
);
|
);
|
||||||
if (! $ok) {
|
if (! $ok) {
|
||||||
return back()->withErrors(['phone' => 'Telefon sau parolă incorecte.'])->withInput();
|
return back()->withErrors(['phone' => __('Telefon sau parolă incorecte.')])->withInput();
|
||||||
}
|
}
|
||||||
|
|
||||||
$request->session()->regenerate();
|
$request->session()->regenerate();
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class TrackingController extends Controller
|
|||||||
default => null,
|
default => null,
|
||||||
};
|
};
|
||||||
if (! $line || ! $line->isPendingApproval()) {
|
if (! $line || ! $line->isPendingApproval()) {
|
||||||
$request->session()->flash('approval_status', ['kind' => 'error', 'message' => 'Linia nu mai necesită aprobare.']);
|
$request->session()->flash('approval_status', ['kind' => 'error', 'message' => __('Linia nu mai necesită aprobare.')]);
|
||||||
return redirect()->route('tracking.show', ['token' => $token]);
|
return redirect()->route('tracking.show', ['token' => $token]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class OcrInvoiceService
|
|||||||
public function extract(string $absPath, ?string $mime = null): array
|
public function extract(string $absPath, ?string $mime = null): array
|
||||||
{
|
{
|
||||||
if (! is_file($absPath)) {
|
if (! is_file($absPath)) {
|
||||||
return ['ok' => false, 'error' => 'Fișierul nu există.'];
|
return ['ok' => false, 'error' => __('Fișierul nu există.')];
|
||||||
}
|
}
|
||||||
|
|
||||||
$mime ??= mime_content_type($absPath) ?: 'image/jpeg';
|
$mime ??= mime_content_type($absPath) ?: 'image/jpeg';
|
||||||
@@ -49,7 +49,7 @@ class OcrInvoiceService
|
|||||||
|
|
||||||
$key = data_get($company->settings, 'ai.claude_key');
|
$key = data_get($company->settings, 'ai.claude_key');
|
||||||
if (! $key) {
|
if (! $key) {
|
||||||
return ['ok' => false, 'error' => '⚠️ Lipsește cheia Claude în Setări → AI.'];
|
return ['ok' => false, 'error' => __('⚠️ Lipsește cheia Claude în Setări → AI.')];
|
||||||
}
|
}
|
||||||
|
|
||||||
$b64 = base64_encode(file_get_contents($absPath));
|
$b64 = base64_encode(file_get_contents($absPath));
|
||||||
@@ -70,7 +70,7 @@ class OcrInvoiceService
|
|||||||
['type' => 'image', 'source' => [
|
['type' => 'image', 'source' => [
|
||||||
'type' => 'base64', 'media_type' => $mime, 'data' => $b64,
|
'type' => 'base64', 'media_type' => $mime, 'data' => $b64,
|
||||||
]],
|
]],
|
||||||
['type' => 'text', 'text' => 'Extrage datele din această factură. Răspunde DOAR cu obiectul JSON, fără text suplimentar și fără ```.'],
|
['type' => 'text', 'text' => __('Extrage datele din această factură. Răspunde DOAR cu obiectul JSON, fără text suplimentar și fără ```.')],
|
||||||
],
|
],
|
||||||
]],
|
]],
|
||||||
]);
|
]);
|
||||||
@@ -87,7 +87,7 @@ class OcrInvoiceService
|
|||||||
|
|
||||||
$data = $this->parseJson($text);
|
$data = $this->parseJson($text);
|
||||||
if ($data === null) {
|
if ($data === null) {
|
||||||
return ['ok' => false, 'error' => 'Răspuns AI ne-parsabil ca JSON.', 'raw' => $text];
|
return ['ok' => false, 'error' => __('Răspuns AI ne-parsabil ca JSON.'), 'raw' => $text];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ class ExcelInvoiceImportService
|
|||||||
'order_date' => today(),
|
'order_date' => today(),
|
||||||
'status' => 'ordered',
|
'status' => 'ordered',
|
||||||
'total' => 0,
|
'total' => 0,
|
||||||
'notes' => 'Auto-import Excel/CSV',
|
'notes' => __('Auto-import Excel/CSV'),
|
||||||
]);
|
]);
|
||||||
$total = 0;
|
$total = 0;
|
||||||
foreach ($rows as $row) {
|
foreach ($rows as $row) {
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ class NotificationDispatcher
|
|||||||
fn () => Mail::to($client->email)->send(new ServiceReminderMail(
|
fn () => Mail::to($client->email)->send(new ServiceReminderMail(
|
||||||
$set->vehicle,
|
$set->vehicle,
|
||||||
'tire_swap',
|
'tire_swap',
|
||||||
'E timpul să schimbi anvelopele ' . ($set->season === 'winter' ? 'de iarnă' : 'de vară') .
|
__('E timpul să schimbi anvelopele ') . ($set->season === 'winter' ? 'de iarnă' : 'de vară') .
|
||||||
' (' . $set->sizeLabel() . ').',
|
' (' . $set->sizeLabel() . ').',
|
||||||
$company
|
$company
|
||||||
)),
|
)),
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ class TelegramService
|
|||||||
public function setWebhook(Company $company): array
|
public function setWebhook(Company $company): array
|
||||||
{
|
{
|
||||||
$token = $this->tokenFor($company);
|
$token = $this->tokenFor($company);
|
||||||
if (! $token) return ['ok' => false, 'error' => 'Lipsește bot token în setări.'];
|
if (! $token) return ['ok' => false, 'error' => __('Lipsește bot token în setări.')];
|
||||||
|
|
||||||
$secret = $this->webhookSecretFor($company);
|
$secret = $this->webhookSecretFor($company);
|
||||||
if (! $secret) {
|
if (! $secret) {
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class VinDecoder
|
|||||||
{
|
{
|
||||||
$vin = strtoupper(trim($vin));
|
$vin = strtoupper(trim($vin));
|
||||||
if (strlen($vin) < 11) {
|
if (strlen($vin) < 11) {
|
||||||
return ['valid' => false, 'error' => 'VIN trebuie să aibă cel puțin 11 caractere.'];
|
return ['valid' => false, 'error' => __('VIN trebuie să aibă cel puțin 11 caractere.')];
|
||||||
}
|
}
|
||||||
|
|
||||||
$wmi = substr($vin, 0, 3);
|
$wmi = substr($vin, 0, 3);
|
||||||
|
|||||||
+418
-27
File diff suppressed because it is too large
Load Diff
+416
-25
File diff suppressed because it is too large
Load Diff
@@ -5,14 +5,14 @@
|
|||||||
'email' => $email ?? null,
|
'email' => $email ?? null,
|
||||||
'city' => $city ?? null,
|
'city' => $city ?? null,
|
||||||
'logoUrl' => $logoUrl ?? null,
|
'logoUrl' => $logoUrl ?? null,
|
||||||
'title' => 'Programare confirmată',
|
'title' => {{ __('\'Programare confirmată\',
|
||||||
])
|
])') }}
|
||||||
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};">📅 Programare confirmată</h2>
|
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};">{{ __('📅 Programare confirmată') }}</h2>
|
||||||
<p>Bună ziua{{ $client?->name ? ', ' . $client->name : '' }},</p>
|
<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;">
|
<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 }};">
|
<td style="padding:14px 18px;font-size:18px;text-align:right;font-weight:700;color:{{ $themeColor }};">
|
||||||
{{ $appointment->date?->format('d.m.Y') }}
|
{{ $appointment->date?->format('d.m.Y') }}
|
||||||
</td></tr>
|
</td></tr>
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
<td style="padding:8px 18px;font-size:12px;text-align:right;">{{ $appointment->title }}</td></tr>
|
<td style="padding:8px 18px;font-size:12px;text-align:right;">{{ $appointment->title }}</td></tr>
|
||||||
@endif
|
@endif
|
||||||
@if ($vehicle)
|
@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;">
|
<td style="padding:8px 18px;font-size:12px;text-align:right;">
|
||||||
{{ $vehicle->make }} {{ $vehicle->model }}
|
{{ $vehicle->make }} {{ $vehicle->model }}
|
||||||
@if ($vehicle->plate) <b>[{{ $vehicle->plate }}]</b> @endif
|
@if ($vehicle->plate) <b>[{{ $vehicle->plate }}]</b> @endif
|
||||||
@@ -41,6 +41,6 @@
|
|||||||
@endif
|
@endif
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<p>Vă 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>
|
<p style="font-size:12px;color:#6b7280;">Pentru reprogramare sau anulare, sunați-ne la {{ $phone ?? '—' }}.</p>
|
||||||
@endcomponent
|
@endcomponent
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
<div>{{ $companyName ?? 'AutoCRM' }}</div>
|
<div>{{ $companyName ?? 'AutoCRM' }}</div>
|
||||||
@if (!empty($phone)) <div>📞 {{ $phone }}</div> @endif
|
@if (!empty($phone)) <div>📞 {{ $phone }}</div> @endif
|
||||||
@if (!empty($email)) <div>✉ {{ $email }}</div> @endif
|
@if (!empty($email)) <div>✉ {{ $email }}</div> @endif
|
||||||
<div style="margin-top:8px;color:#9ca3af;">Acest email a fost generat automat. Vă 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>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|||||||
@@ -5,14 +5,14 @@
|
|||||||
'email' => $email ?? null,
|
'email' => $email ?? null,
|
||||||
'city' => $city ?? null,
|
'city' => $city ?? null,
|
||||||
'logoUrl' => $logoUrl ?? null,
|
'logoUrl' => $logoUrl ?? null,
|
||||||
'title' => 'Plată confirmată',
|
'title' => {{ __('\'Plată confirmată\',
|
||||||
])
|
])') }}
|
||||||
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};">💳 Plată confirmată</h2>
|
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};">{{ __('💳 Plată confirmată') }}</h2>
|
||||||
<p>Bună ziua{{ $client?->name ? ', ' . $client->name : '' }},</p>
|
<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;">
|
<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;">
|
<td style="padding:14px 18px;font-size:18px;text-align:right;font-weight:700;color:#059669;">
|
||||||
{{ number_format((float) $payment->amount, 2, '.', ' ') }} {{ $currency }}
|
{{ number_format((float) $payment->amount, 2, '.', ' ') }} {{ $currency }}
|
||||||
</td></tr>
|
</td></tr>
|
||||||
@@ -20,17 +20,17 @@
|
|||||||
<td style="padding:8px 18px;font-size:12px;text-align:right;">
|
<td style="padding:8px 18px;font-size:12px;text-align:right;">
|
||||||
{{ \App\Models\Tenant\Payment::METHODS[$payment->method] ?? $payment->method }}
|
{{ \App\Models\Tenant\Payment::METHODS[$payment->method] ?? $payment->method }}
|
||||||
</td></tr>
|
</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>
|
<td style="padding:8px 18px;font-size:12px;text-align:right;">{{ $payment->paid_at?->format('d.m.Y') }}</td></tr>
|
||||||
@if ($payment->reference)
|
@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>
|
<td style="padding:8px 18px;font-size:12px;text-align:right;font-family:monospace;">{{ $payment->reference }}</td></tr>
|
||||||
@endif
|
@endif
|
||||||
@if ($workOrder)
|
@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>
|
<td style="padding:8px 18px;font-size:12px;text-align:right;font-weight:600;">{{ $workOrder->number }}</td></tr>
|
||||||
@endif
|
@endif
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<p>Vă mulțumim!</p>
|
<p>{{ __('Vă mulțumim!') }}</p>
|
||||||
@endcomponent
|
@endcomponent
|
||||||
|
|||||||
@@ -42,5 +42,5 @@
|
|||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
<p>Programați-vă online sau sunați la <b>{{ $phone ?? '—' }}</b>.</p>
|
<p>{{ __('Programați-vă online sau sunați la') }} <b>{{ $phone ?? '—' }}</b>.</p>
|
||||||
@endcomponent
|
@endcomponent
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Comandă primită</title>
|
<title>{{ __('Comandă primită') }}</title>
|
||||||
</head>
|
</head>
|
||||||
<body style="font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; max-width: 600px; margin: 0 auto; padding: 24px; color: #1f2937;">
|
<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
|
@php $brand = $company->display_name ?? $company->name; @endphp
|
||||||
|
|
||||||
<h2 style="font-size: 22px; margin-bottom: 4px;">{{ $brand }}</h2>
|
<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="background: #f9fafb; border-radius: 10px; padding: 18px; margin-bottom: 18px;">
|
||||||
<div style="font-size: 14px; color: #6b7280;">Comanda</div>
|
<div style="font-size: 14px; color: #6b7280;">Comanda</div>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
@endif
|
@endif
|
||||||
<tr>
|
<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;">
|
<td style="padding: 12px 0 4px; font-weight: 700; font-size: 18px; text-align: right;">
|
||||||
{{ number_format((float) $order->total, 2) }} {{ $currency }}
|
{{ number_format((float) $order->total, 2) }} {{ $currency }}
|
||||||
</td>
|
</td>
|
||||||
@@ -48,13 +48,13 @@
|
|||||||
|
|
||||||
@if ($order->address)
|
@if ($order->address)
|
||||||
<p style="background: #fefce8; border-left: 3px solid #facc15; padding: 10px 12px; font-size: 13px; color: #713f12;">
|
<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>
|
</p>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
<p style="margin: 24px 0;">
|
<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;">
|
<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>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|||||||
@@ -2,22 +2,22 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Resetare parolă</title>
|
<title>{{ __('Resetare parolă') }}</title>
|
||||||
</head>
|
</head>
|
||||||
<body style="font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; max-width: 560px; margin: 0 auto; padding: 24px; color: #1f2937;">
|
<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
|
@php $brand = $company->display_name ?? $company->name; @endphp
|
||||||
<h2 style="font-size: 22px; margin-bottom: 16px;">{{ $brand }}</h2>
|
<h2 style="font-size: 22px; margin-bottom: 16px;">{{ $brand }}</h2>
|
||||||
|
|
||||||
<p>Salut {{ $customer->name }},</p>
|
<p>Salut {{ $customer->name }},</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>{{ __('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;">
|
<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;">
|
<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>
|
</a>
|
||||||
</p>
|
</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;">
|
<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.
|
Email automat de la {{ $brand }} — nu răspunde la el.
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ Ai fost invitat de **{{ $invitedBy }}** să accesezi **{{ $companyName }}** pe
|
|||||||
Pentru a-ți activa contul și a-ți seta parola, apasă pe linkul de mai jos:
|
Pentru a-ți activa contul și a-ți seta parola, apasă pe linkul de mai jos:
|
||||||
|
|
||||||
<x-mail::button :url="$acceptUrl" color="primary">
|
<x-mail::button :url="$acceptUrl" color="primary">
|
||||||
Acceptă invitația
|
{{ __('Acceptă invitația') }}
|
||||||
</x-mail::button>
|
</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 }}**
|
**{{ $companyName }}**
|
||||||
</x-mail::message>
|
</x-mail::message>
|
||||||
|
|||||||
@@ -6,15 +6,15 @@
|
|||||||
'email' => $email ?? null,
|
'email' => $email ?? null,
|
||||||
'city' => $city ?? null,
|
'city' => $city ?? null,
|
||||||
'logoUrl' => $logoUrl ?? null,
|
'logoUrl' => $logoUrl ?? null,
|
||||||
'title' => 'Mașina e gata',
|
'title' => {{ __('\'Mașina e gata\',
|
||||||
])
|
])') }}
|
||||||
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};">✅ Mașina dvs. este gata!</h2>
|
<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>Bună ziua{{ $client?->name ? ', ' . $client->name : '' }},</p>
|
||||||
<p>Vă informăm că lucrările pentru autoturismul dvs. au fost finalizate. Puteți veni să-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;">
|
<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;">
|
<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>
|
<div style="font-size:16px;font-weight:700;margin-top:4px;">{{ $workOrder->number }}</div>
|
||||||
@if ($vehicle)
|
@if ($vehicle)
|
||||||
<div style="margin-top:10px;font-size:13px;">
|
<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;">
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:16px 0;background:#f9fafb;border-radius:8px;">
|
||||||
<tr>
|
<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>
|
<td style="padding:12px 16px;font-size:13px;text-align:right;font-weight:600;">{{ number_format($total, 2, '.', ' ') }} {{ $currency }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@if ($paid > 0)
|
@if ($paid > 0)
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
@endif
|
@endif
|
||||||
@if ($balance > 0)
|
@if ($balance > 0)
|
||||||
<tr>
|
<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>
|
<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>
|
</tr>
|
||||||
@endif
|
@endif
|
||||||
@@ -46,11 +46,11 @@
|
|||||||
|
|
||||||
@if ($workOrder->recommendations)
|
@if ($workOrder->recommendations)
|
||||||
<div style="background:#fef3c7;border-left:4px solid #f59e0b;padding:12px;margin:16px 0;border-radius:6px;font-size:13px;">
|
<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 }}
|
{{ $workOrder->recommendations }}
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
<p style="margin-top:20px;">Atașat veți găsi <b>fișa de lucru completă</b> (PDF).</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>
|
<p>{{ __('Vă mulțumim pentru încredere!') }}</p>
|
||||||
@endcomponent
|
@endcomponent
|
||||||
|
|||||||
@@ -7,27 +7,27 @@
|
|||||||
class="fi-btn fi-btn-color-primary"
|
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;"
|
style="padding: 10px 24px; background: #6366f1; color: white; border-radius: 8px; border: none; cursor: pointer; font-weight: 500;"
|
||||||
wire:loading.attr="disabled">
|
wire:loading.attr="disabled">
|
||||||
<span wire:loading.remove>💾 Salvează setările</span>
|
<span wire:loading.remove>{{ __('💾 Salvează setările') }}</span>
|
||||||
<span wire:loading>Se salvează...</span>
|
<span wire:loading>{{ __('Se salvează...') }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div style="margin-top:24px;background:#f9fafb;border:1px dashed #e5e7eb;border-radius:8px;padding:16px;font-size:13px;line-height:1.7;">
|
<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;">
|
<ol style="margin:8px 0 0 18px;padding:0;">
|
||||||
<li>Operatorul (tu) creezi factură: <code>/admin/companies/{id}</code> → „Generează factură"</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>{{ __('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>{{ __('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 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>
|
</ol>
|
||||||
<div style="margin-top:12px;padding-top:12px;border-top:1px solid #e5e7eb;">
|
<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;">
|
<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>{{ __('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>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>{{ __('Transfer bancar: pune doar IBAN-ul tău, fără cont gateway') }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -88,7 +88,7 @@
|
|||||||
@if ($this->record->plan)
|
@if ($this->record->plan)
|
||||||
<span class="cv-badge cv-badge-gray">📦 {{ $this->record->plan->name }}</span>
|
<span class="cv-badge cv-badge-gray">📦 {{ $this->record->plan->name }}</span>
|
||||||
@else
|
@else
|
||||||
<span class="cv-badge cv-badge-warning">⚠ Fără plan</span>
|
<span class="cv-badge cv-badge-warning">{{ __('⚠ Fără plan') }}</span>
|
||||||
@endif
|
@endif
|
||||||
@if ($daysLeft !== null)
|
@if ($daysLeft !== null)
|
||||||
@if ($daysLeft < 0)
|
@if ($daysLeft < 0)
|
||||||
@@ -112,39 +112,39 @@
|
|||||||
<div class="value">{{ $stats['users'] }}</div>
|
<div class="value">{{ $stats['users'] }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-card">
|
<div class="cv-card">
|
||||||
<div class="label">Clienți</div>
|
<div class="label">{{ __('Clienți') }}</div>
|
||||||
<div class="value">{{ $stats['clients'] }}</div>
|
<div class="value">{{ $stats['clients'] }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-card">
|
<div class="cv-card">
|
||||||
<div class="label">Mașini</div>
|
<div class="label">{{ __('Mașini') }}</div>
|
||||||
<div class="value">{{ $stats['vehicles'] }}</div>
|
<div class="value">{{ $stats['vehicles'] }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-card {{ $stats['work_orders_open'] > 0 ? 'warn' : '' }}">
|
<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="value">{{ $stats['work_orders'] }}</div>
|
||||||
<div class="sub">{{ $stats['work_orders_open'] }} deschise</div>
|
<div class="sub">{{ $stats['work_orders_open'] }} deschise</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-card {{ $stats['parts_low_stock'] > 0 ? 'warn' : '' }}">
|
<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>
|
<div class="value">{{ $stats['parts'] }}</div>
|
||||||
@if ($stats['parts_low_stock'])
|
@if ($stats['parts_low_stock'])
|
||||||
<div class="sub">⚠ {{ $stats['parts_low_stock'] }} sub minim</div>
|
<div class="sub">⚠ {{ $stats['parts_low_stock'] }} sub minim</div>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-card success">
|
<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="value">{{ number_format($stats['revenue_this_month'], 0, ',', ' ') }}</div>
|
||||||
<div class="sub">{{ $this->record->settings['currency'] ?? 'MDL' }}</div>
|
<div class="sub">{{ $this->record->settings['currency'] ?? 'MDL' }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-card">
|
<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="value">{{ number_format($stats['revenue_last_month'], 0, ',', ' ') }}</div>
|
||||||
<div class="sub">{{ $this->record->settings['currency'] ?? 'MDL' }}</div>
|
<div class="sub">{{ $this->record->settings['currency'] ?? 'MDL' }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-card">
|
<div class="cv-card">
|
||||||
<div class="label">Storage media</div>
|
<div class="label">Storage media</div>
|
||||||
<div class="value">{{ $stats['storage_mb'] }}</div>
|
<div class="value">{{ $stats['storage_mb'] }}</div>
|
||||||
<div class="sub">MB folosiți</div>
|
<div class="sub">{{ __('MB folosiți') }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-card {{ $stats['last_login'] && \Carbon\Carbon::parse($stats['last_login'])->diffInDays() > 14 ? 'danger' : '' }}">
|
<div class="cv-card {{ $stats['last_login'] && \Carbon\Carbon::parse($stats['last_login'])->diffInDays() > 14 ? 'danger' : '' }}">
|
||||||
<div class="label">Ultima logare</div>
|
<div class="label">Ultima logare</div>
|
||||||
@@ -163,18 +163,18 @@
|
|||||||
<div class="cv-section-title">💳 Istoric abonamente</div>
|
<div class="cv-section-title">💳 Istoric abonamente</div>
|
||||||
@if ($this->record->subscriptions->isEmpty())
|
@if ($this->record->subscriptions->isEmpty())
|
||||||
<div style="padding:32px;text-align:center;color:#9ca3af;font-size:13px;border:1px dashed #e5e7eb;border-radius:8px;">
|
<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>
|
</div>
|
||||||
@else
|
@else
|
||||||
<table class="cv-table">
|
<table class="cv-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Factură</th>
|
<th>{{ __('Factură') }}</th>
|
||||||
<th>Plan</th>
|
<th>Plan</th>
|
||||||
<th>Perioadă</th>
|
<th>{{ __('Perioadă') }}</th>
|
||||||
<th>Sumă</th>
|
<th>{{ __('Sumă') }}</th>
|
||||||
<th>Status</th>
|
<th>Status</th>
|
||||||
<th>Plătit</th>
|
<th>{{ __('Plătit') }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -202,17 +202,17 @@
|
|||||||
<div class="cv-section-title">⚙ Configurare tenant</div>
|
<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-grid" style="grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));">
|
||||||
<div class="cv-card">
|
<div class="cv-card">
|
||||||
<div class="label">Limbă</div>
|
<div class="label">{{ __('Limbă') }}</div>
|
||||||
<div class="value" style="font-size:14px;">
|
<div class="value" style="font-size:14px;">
|
||||||
{{ ['ro' => 'Română', 'ru' => 'Русский', 'en' => 'English'][$this->record->settings['language'] ?? 'ro'] ?? '—' }}
|
{{ ['ro' => 'Română', 'ru' => 'Русский', 'en' => 'English'][$this->record->settings['language'] ?? 'ro'] ?? '—' }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-card">
|
<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 class="value" style="font-size:14px;">{{ $this->record->settings['currency'] ?? 'MDL' }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-card">
|
<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 class="value" style="font-size:14px;">{{ $this->record->settings['labor_rate'] ?? '—' }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-card">
|
<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; })">
|
<div class="ai-wrap" x-data x-init="$nextTick(() => { const m = $refs.msgs; if (m) m.scrollTop = m.scrollHeight; })">
|
||||||
{{-- Sidebar: chat history --}}
|
{{-- Sidebar: chat history --}}
|
||||||
<div class="ai-side">
|
<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)
|
@forelse ($chats as $c)
|
||||||
<div class="ai-chat-item {{ $c->id === $chatId ? 'active' : '' }}">
|
<div class="ai-chat-item {{ $c->id === $chatId ? 'active' : '' }}">
|
||||||
<span class="ai-chat-title" wire:click="selectChat({{ $c->id }})" style="cursor:pointer;">
|
<span class="ai-chat-title" wire:click="selectChat({{ $c->id }})" style="cursor:pointer;">
|
||||||
@@ -114,7 +114,7 @@
|
|||||||
wire:confirm="Șterge conversația?">×</button>
|
wire:confirm="Șterge conversația?">×</button>
|
||||||
</div>
|
</div>
|
||||||
@empty
|
@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
|
@endforelse
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -126,9 +126,9 @@
|
|||||||
<div class="ai-empty">
|
<div class="ai-empty">
|
||||||
<div style="font-size:32px;margin-bottom:8px;">✨</div>
|
<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:14px;font-weight:600;margin-bottom:4px;">Asistent AI pentru autoservice</div>
|
||||||
<div style="font-size:12px;">Întreabă-mă 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;">
|
<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>
|
||||||
</div>
|
</div>
|
||||||
@else
|
@else
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
@if ($loading)
|
@if ($loading)
|
||||||
<div class="ai-loading">
|
<div class="ai-loading">
|
||||||
<span class="dot"></span><span class="dot"></span><span class="dot"></span>
|
<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>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
@@ -161,12 +161,12 @@
|
|||||||
<textarea
|
<textarea
|
||||||
class="ai-input"
|
class="ai-input"
|
||||||
wire:model="newMessage"
|
wire:model="newMessage"
|
||||||
placeholder="Scrie mesajul tău..."
|
placeholder="{{ __('Scrie mesajul tău...') }}"
|
||||||
@keydown.enter.exact.prevent="$wire.send()"
|
@keydown.enter.exact.prevent="$wire.send()"
|
||||||
@keydown.shift.enter="$el.value += '\n'"
|
@keydown.shift.enter="$el.value += '\n'"
|
||||||
rows="1"
|
rows="1"
|
||||||
></textarea>
|
></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>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -23,13 +23,13 @@
|
|||||||
|
|
||||||
@if ($newToken)
|
@if ($newToken)
|
||||||
<div class="at-card" style="border-color: #f59e0b; border-width: 2px;">
|
<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 }">
|
<div class="at-token" x-data="{ copied: false }">
|
||||||
<span x-ref="t">{{ $newToken }}</span>
|
<span x-ref="t">{{ $newToken }}</span>
|
||||||
<button type="button"
|
<button type="button"
|
||||||
@click="navigator.clipboard.writeText($refs.t.innerText); copied = true; setTimeout(() => copied = false, 2000)"
|
@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;">
|
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>
|
<span x-show="copied" x-cloak>✓ Copiat</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -42,13 +42,13 @@
|
|||||||
<div class="at-card" style="margin-top:16px;">
|
<div class="at-card" style="margin-top:16px;">
|
||||||
@php $tokens = $this->getTokens(); @endphp
|
@php $tokens = $this->getTokens(); @endphp
|
||||||
@if (empty($tokens))
|
@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
|
@else
|
||||||
<table class="at-table">
|
<table class="at-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Nume</th>
|
<th>{{ __('Nume') }}</th>
|
||||||
<th>Folosit ultima dată</th>
|
<th>{{ __('Folosit ultima dată') }}</th>
|
||||||
<th>Creat</th>
|
<th>Creat</th>
|
||||||
<th>Permisiuni</th>
|
<th>Permisiuni</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
<button type="button"
|
<button type="button"
|
||||||
wire:click="deleteToken({{ $t['id'] }})"
|
wire:click="deleteToken({{ $t['id'] }})"
|
||||||
wire:confirm="Revoci token-ul „{{ $t['name'] }}"? Apelurile API vor eșua imediat."
|
wire:confirm="Revoci token-ul „{{ $t['name'] }}"? Apelurile API vor eșua imediat."
|
||||||
class="at-revoke">Revocă</button>
|
class="at-revoke">{{ __('Revocă') }}</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@endforeach
|
||||||
@@ -75,13 +75,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="at-doc" style="margin-top:16px;">
|
<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;">
|
<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>{{ __('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>{{ __('Sau generează unul aici (recomandat pentru integrări permanente)') }}</li>
|
||||||
<li>Adaugă header <code>Authorization: Bearer <token></code> la fiecare request</li>
|
<li>{{ __('Adaugă header') }} <code>Authorization: Bearer <token></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>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>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
</x-filament-panels::page>
|
</x-filament-panels::page>
|
||||||
|
|||||||
@@ -16,31 +16,31 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="bk-card">
|
<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">
|
<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>
|
</p>
|
||||||
<ul class="bk-list">
|
<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>Migrare la alt sistem CRM</li>
|
||||||
<li>Audit / verificări fiscale</li>
|
<li>{{ __('Audit / verificări fiscale') }}</li>
|
||||||
<li>Conformitate GDPR (la cererea ștergerii datelor)</li>
|
<li>{{ __('Conformitate GDPR (la cererea ștergerii datelor)') }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p class="bk-p">
|
<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,
|
<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.
|
depozit, furnizori, achiziții, plăți, cheltuieli, salarii, useri, logo + favicon, manifest cu metadata.') }}
|
||||||
</p>
|
</p>
|
||||||
<p class="bk-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>
|
</p>
|
||||||
|
|
||||||
<button type="button" class="bk-btn" wire:click="downloadBackup" wire:loading.attr="disabled">
|
<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>
|
<span wire:loading wire:target="downloadBackup">Generez ZIP...</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<p class="bk-p" style="margin-top:24px;font-size:11px;color:#9ca3af;">
|
<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>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</x-filament-panels::page>
|
</x-filament-panels::page>
|
||||||
|
|||||||
@@ -155,26 +155,26 @@
|
|||||||
<div class="cv-shell" x-data="{ dragEventId: null }">
|
<div class="cv-shell" x-data="{ dragEventId: null }">
|
||||||
<div class="cv-head">
|
<div class="cv-head">
|
||||||
<div>
|
<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>
|
<h1>Calendar vizual</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-btn-group">
|
<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" 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>
|
</div>
|
||||||
|
|
||||||
<div class="cv-kpi-bar">
|
<div class="cv-kpi-bar">
|
||||||
<div class="cv-kpi">
|
<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-value">{{ $stats['scheduled_hours'] }} / {{ $stats['capacity_hours'] }}</div>
|
||||||
<div class="cv-kpi-sub">săptămâna curentă · {{ $stats['utilization_pct'] }}% capacitate</div>
|
<div class="cv-kpi-sub">săptămâna curentă · {{ $stats['utilization_pct'] }}% capacitate</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-kpi">
|
<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-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>
|
||||||
<div class="cv-kpi">
|
<div class="cv-kpi">
|
||||||
<div class="cv-kpi-label">Confirmate</div>
|
<div class="cv-kpi-label">Confirmate</div>
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
<div class="cv-kpi">
|
<div class="cv-kpi">
|
||||||
<div class="cv-kpi-label">No-show alert</div>
|
<div class="cv-kpi-label">No-show alert</div>
|
||||||
<div class="cv-kpi-value red">{{ $stats['no_show_alert'] }}</div>
|
<div class="cv-kpi-value red">{{ $stats['no_show_alert'] }}</div>
|
||||||
<div class="cv-kpi-sub">programări neconfirmate < 24h</div>
|
<div class="cv-kpi-sub">{{ __('programări neconfirmate < 24h') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -193,16 +193,16 @@
|
|||||||
<button class="cv-btn cv-btn-icon" wire:click="shiftWeek(-1)">◀</button>
|
<button class="cv-btn cv-btn-icon" wire:click="shiftWeek(-1)">◀</button>
|
||||||
<div class="cv-date">{{ $this->getWeekLabel() }}</div>
|
<div class="cv-date">{{ $this->getWeekLabel() }}</div>
|
||||||
<button class="cv-btn cv-btn-icon" wire:click="shiftWeek(1)">▶</button>
|
<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>
|
||||||
<div class="cv-toolbar-group">
|
<div class="cv-toolbar-group">
|
||||||
<span class="cv-toolbar-label">Mod:</span>
|
<span class="cv-toolbar-label">Mod:</span>
|
||||||
<div class="cv-view-switcher">
|
<div class="cv-view-switcher">
|
||||||
<button class="{{ $viewMode === 'day' ? 'active' : '' }}" wire:click="setViewMode('day')">Zi</button>
|
<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 === 'week' ? 'active' : '' }}" wire:click="setViewMode('week')">{{ __('Săpt') }}</button>
|
||||||
<button class="{{ $viewMode === 'month' ? 'active' : '' }}" wire:click="setViewMode('month')">Lună</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 === '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>
|
</div>
|
||||||
<div class="cv-toolbar-group">
|
<div class="cv-toolbar-group">
|
||||||
@@ -216,37 +216,37 @@
|
|||||||
<div class="cv-toolbar-group">
|
<div class="cv-toolbar-group">
|
||||||
<span class="cv-toolbar-label">De la:</span>
|
<span class="cv-toolbar-label">De la:</span>
|
||||||
<input type="date" class="cv-select" wire:model.live="customStart">
|
<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">
|
<input type="date" class="cv-select" wire:model.live="customEnd">
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
<div class="cv-toolbar-group" style="margin-left:auto;">
|
<div class="cv-toolbar-group" style="margin-left:auto;">
|
||||||
<span class="cv-toolbar-label">Filtru:</span>
|
<span class="cv-toolbar-label">Filtru:</span>
|
||||||
<select class="cv-select" wire:change="setMasterFilter($event.target.value)">
|
<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)
|
@foreach ($this->getMasterOptions() as $id => $name)
|
||||||
<option value="{{ $id }}" {{ $masterFilter == $id ? 'selected' : '' }}>{{ $name }}</option>
|
<option value="{{ $id }}" {{ $masterFilter == $id ? 'selected' : '' }}>{{ $name }}</option>
|
||||||
@endforeach
|
@endforeach
|
||||||
</select>
|
</select>
|
||||||
<select class="cv-select" wire:change="setStatusFilter($event.target.value)">
|
<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="confirmed" @if($statusFilter==='confirmed')selected @endif>Confirmate</option>
|
||||||
<option value="unconfirmed" @if($statusFilter==='unconfirmed')selected @endif>Neconfirmate</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>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="cv-notes">
|
<div class="cv-notes">
|
||||||
<strong>⚙ Cum funcționează:</strong>
|
<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.
|
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>
|
</div>
|
||||||
|
|
||||||
@if ($viewMode === 'list')
|
@if ($viewMode === 'list')
|
||||||
@php $list = $this->getListAppointments(); @endphp
|
@php $list = $this->getListAppointments(); @endphp
|
||||||
<div class="cv-matrix-wrap">
|
<div class="cv-matrix-wrap">
|
||||||
@if (empty($list))
|
@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
|
@else
|
||||||
<table style="width:100%; border-collapse:collapse; font-size:13px;">
|
<table style="width:100%; border-collapse:collapse; font-size:13px;">
|
||||||
<thead>
|
<thead>
|
||||||
@@ -335,7 +335,7 @@
|
|||||||
@endif
|
@endif
|
||||||
|
|
||||||
<div class="cv-legend">
|
<div class="cv-legend">
|
||||||
<h3>Legendă</h3>
|
<h3>{{ __('Legendă') }}</h3>
|
||||||
<div class="cv-legend-row">
|
<div class="cv-legend-row">
|
||||||
<div>
|
<div>
|
||||||
<div class="cv-legend-col">Mecanici</div>
|
<div class="cv-legend-col">Mecanici</div>
|
||||||
@@ -351,9 +351,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</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-items">
|
||||||
<div class="cv-legend-item"><span class="cv-load" style="position:static;">0–5h/10</span> liber/ușor</div>
|
<div class="cv-legend-item"><span class="cv-load" style="position:static;">0–5h/10</span> {{ __('liber/ușor') }}</div>
|
||||||
<div class="cv-legend-item"><span class="cv-load warn" style="position:static;">5–8.5h/10</span> mediu</div>
|
<div class="cv-legend-item"><span class="cv-load warn" style="position:static;">5–8.5h/10</span> mediu</div>
|
||||||
<div class="cv-legend-item"><span class="cv-load full" style="position:static;">≥9h/10</span> plin</div>
|
<div class="cv-legend-item"><span class="cv-load full" style="position:static;">≥9h/10</span> plin</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -362,8 +362,8 @@
|
|||||||
<div class="cv-legend-col">Stare zi</div>
|
<div class="cv-legend-col">Stare zi</div>
|
||||||
<div class="cv-legend-items">
|
<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:#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: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:var(--cv-blue-bg); border:1px solid var(--cv-blue);"></span> {{ __('Astăzi') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -381,19 +381,19 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="cv-panel-body">
|
<div class="cv-panel-body">
|
||||||
<div class="cv-two-cols">
|
<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['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['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['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
|
@if ($openEvent['post_name'])<div class="cv-pfield"><label>Pod</label><div class="cv-pfield-val">{{ $openEvent['post_name'] }}</div></div>@endif
|
||||||
</div>
|
</div>
|
||||||
@if ($openEvent['notes'])
|
@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
|
@endif
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-panel-actions">
|
<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>
|
<a class="cv-btn cv-btn-primary" href="{{ route('filament.tenant.resources.appointments.edit', ['record' => $openEvent['id']]) }}">↗ Editare</a>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
@@ -404,7 +404,7 @@
|
|||||||
@if ($showNewForm)
|
@if ($showNewForm)
|
||||||
<div class="cv-panel-head">
|
<div class="cv-panel-head">
|
||||||
<div>
|
<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 class="cv-panel-sub">{{ $newAppt['date'] ?? '' }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-close" wire:click="$set('showNewForm', false)">✕</div>
|
<div class="cv-close" wire:click="$set('showNewForm', false)">✕</div>
|
||||||
@@ -412,7 +412,7 @@
|
|||||||
<div class="cv-panel-body">
|
<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-pfield"><label>Subiect *</label><input wire:model="newAppt.title" type="text" placeholder="Schimb ulei + filtru"></div>
|
||||||
<div class="cv-two-cols">
|
<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>
|
<div class="cv-pfield"><label>Pod</label>
|
||||||
<select wire:model="newAppt.post_id">
|
<select wire:model="newAppt.post_id">
|
||||||
<option value="">—</option>
|
<option value="">—</option>
|
||||||
@@ -422,9 +422,9 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-pfield"><label>De la</label><input wire:model="newAppt.time_start" type="time"></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>
|
||||||
<div class="cv-pfield"><label>Client</label>
|
<div class="cv-pfield"><label>{{ __('Client') }}</label>
|
||||||
<select wire:model.live="newAppt.client_id">
|
<select wire:model.live="newAppt.client_id">
|
||||||
<option value="">—</option>
|
<option value="">—</option>
|
||||||
@foreach ($this->getClientOptions() as $id => $name)
|
@foreach ($this->getClientOptions() as $id => $name)
|
||||||
@@ -440,11 +440,11 @@
|
|||||||
@endforeach
|
@endforeach
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</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>
|
||||||
<div class="cv-panel-actions">
|
<div class="cv-panel-actions">
|
||||||
<button class="cv-btn" wire:click="$set('showNewForm', false)">Anulează</button>
|
<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 cv-btn-primary" wire:click="createAppt">{{ __('Salvează') }}</button>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
@@ -453,10 +453,10 @@
|
|||||||
@if ($showNewPostForm)
|
@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="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>
|
<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>
|
<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>
|
<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">
|
<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>
|
<input type="text" wire:model="newPost.name" placeholder="Ex: Curte 1, Pod 4, Atelier electric" autofocus>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-two-cols">
|
<div class="cv-two-cols">
|
||||||
@@ -465,17 +465,17 @@
|
|||||||
<input type="color" wire:model="newPost.color" style="height:40px; padding:4px;">
|
<input type="color" wire:model="newPost.color" style="height:40px; padding:4px;">
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-pfield">
|
<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">
|
<input type="number" wire:model="newPost.hours_per_day" min="1" step="0.5">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-pfield">
|
<div class="cv-pfield">
|
||||||
<label>Descriere (opțional)</label>
|
<label>{{ __('Descriere (opțional)') }}</label>
|
||||||
<input type="text" wire:model="newPost.description" placeholder="Ex: fără lift, doar diagnoză...">
|
<input type="text" wire:model="newPost.description" placeholder="{{ __('Ex: fără lift, doar diagnoză...') }}">
|
||||||
</div>
|
</div>
|
||||||
<div style="display:flex; gap:8px; margin-top:16px;">
|
<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" 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 cv-btn-primary" wire:click="createPost" style="flex:1;">{{ __('Adaugă') }}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -485,9 +485,9 @@
|
|||||||
@if ($renamingPostId)
|
@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="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>
|
<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">
|
<div class="cv-pfield">
|
||||||
<label>Nume *</label>
|
<label>{{ __('Nume *') }}</label>
|
||||||
<input type="text" wire:model="renamingPostName" autofocus>
|
<input type="text" wire:model="renamingPostName" autofocus>
|
||||||
</div>
|
</div>
|
||||||
<div class="cv-pfield">
|
<div class="cv-pfield">
|
||||||
@@ -498,11 +498,11 @@
|
|||||||
<option value="{{ $id }}">{{ $name }}</option>
|
<option value="{{ $id }}">{{ $name }}</option>
|
||||||
@endforeach
|
@endforeach
|
||||||
</select>
|
</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>
|
||||||
<div style="display:flex; gap:8px; margin-top:16px;">
|
<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" 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 cv-btn-primary" wire:click="saveRenamePost" style="flex:1;">{{ __('Salvează') }}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -49,10 +49,10 @@
|
|||||||
<div class="wiz-card">
|
<div class="wiz-card">
|
||||||
{{-- STEP 1: Upload --}}
|
{{-- STEP 1: Upload --}}
|
||||||
@if ($step === 1)
|
@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">
|
<div class="wiz-field">
|
||||||
<label>Furnizor *</label>
|
<label>{{ __('Furnizor *') }}</label>
|
||||||
<select wire:model="supplierId">
|
<select wire:model="supplierId">
|
||||||
<option value="">— alege —</option>
|
<option value="">— alege —</option>
|
||||||
@foreach ($this->getSupplierOptions() as $id => $name)
|
@foreach ($this->getSupplierOptions() as $id => $name)
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="wiz-field">
|
<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" />
|
<input type="file" wire:model="upload" accept=".xlsx,.xls,.csv" />
|
||||||
@if ($upload)
|
@if ($upload)
|
||||||
<div style="margin-top:6px;font-size:12px;color:#4a5568;">Selectat: {{ $upload->getClientOriginalName() }}</div>
|
<div style="margin-top:6px;font-size:12px;color:#4a5568;">Selectat: {{ $upload->getClientOriginalName() }}</div>
|
||||||
@@ -70,14 +70,14 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="wiz-actions">
|
<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>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
{{-- STEP 2: Mapping --}}
|
{{-- STEP 2: Mapping --}}
|
||||||
@if ($step === 2)
|
@if ($step === 2)
|
||||||
<h2 style="font-size:18px;font-weight:600;margin-bottom:16px;">Pasul 2: Mapează coloanele</h2>
|
<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>
|
<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;">
|
<div style="overflow-x:auto;margin-bottom:20px;">
|
||||||
<table class="wiz-preview-table">
|
<table class="wiz-preview-table">
|
||||||
@@ -123,21 +123,21 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="wiz-field">
|
<div class="wiz-field">
|
||||||
<label>Coloana Preț *</label>
|
<label>{{ __('Coloana Preț *') }}</label>
|
||||||
<select wire:model="mapping.price_col">
|
<select wire:model="mapping.price_col">
|
||||||
<option value="">—</option>
|
<option value="">—</option>
|
||||||
@foreach ($headersPreview['columns'] as $c)<option value="{{ $c }}">{{ $c }}</option>@endforeach
|
@foreach ($headersPreview['columns'] as $c)<option value="{{ $c }}">{{ $c }}</option>@endforeach
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="wiz-field">
|
<div class="wiz-field">
|
||||||
<label>Coloana Brand (opțional)</label>
|
<label>{{ __('Coloana Brand (opțional)') }}</label>
|
||||||
<select wire:model="mapping.brand_col">
|
<select wire:model="mapping.brand_col">
|
||||||
<option value="">—</option>
|
<option value="">—</option>
|
||||||
@foreach ($headersPreview['columns'] as $c)<option value="{{ $c }}">{{ $c }}</option>@endforeach
|
@foreach ($headersPreview['columns'] as $c)<option value="{{ $c }}">{{ $c }}</option>@endforeach
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="wiz-field">
|
<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" />
|
<input type="number" min="1" wire:model="mapping.header_row" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -145,12 +145,12 @@
|
|||||||
<div class="wiz-field">
|
<div class="wiz-field">
|
||||||
<label style="display:flex;align-items:center;gap:8px;text-transform:none;">
|
<label style="display:flex;align-items:center;gap:8px;text-transform:none;">
|
||||||
<input type="checkbox" wire:model="rememberMapping" />
|
<input type="checkbox" wire:model="rememberMapping" />
|
||||||
<span>Salvează configurația pentru acest furnizor</span>
|
<span>{{ __('Salvează configurația pentru acest furnizor') }}</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="wiz-actions">
|
<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>
|
<button class="wiz-btn wiz-btn-primary" wire:click="goToStep3">Previzualizare →</button>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
@@ -162,7 +162,7 @@
|
|||||||
<div class="wiz-summary">
|
<div class="wiz-summary">
|
||||||
<div class="wiz-summary-item">
|
<div class="wiz-summary-item">
|
||||||
<strong style="color:#15803d;">{{ $previewSummary['found'] }}</strong>
|
<strong style="color:#15803d;">{{ $previewSummary['found'] }}</strong>
|
||||||
Găsite (cu articol existent)
|
{{ __('Găsite (cu articol existent)') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="wiz-summary-item">
|
<div class="wiz-summary-item">
|
||||||
<strong style="color:#92400e;">{{ $previewSummary['new'] }}</strong>
|
<strong style="color:#92400e;">{{ $previewSummary['new'] }}</strong>
|
||||||
@@ -170,7 +170,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="wiz-summary-item">
|
<div class="wiz-summary-item">
|
||||||
<strong style="color:#991b1b;">{{ $previewSummary['no_article'] }}</strong>
|
<strong style="color:#991b1b;">{{ $previewSummary['no_article'] }}</strong>
|
||||||
Fără articol (manual)
|
{{ __('Fără articol (manual)') }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -178,7 +178,7 @@
|
|||||||
<table class="wiz-preview-table">
|
<table class="wiz-preview-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<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>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -199,13 +199,13 @@
|
|||||||
<div class="wiz-field">
|
<div class="wiz-field">
|
||||||
<label style="display:flex;align-items:center;gap:8px;text-transform:none;">
|
<label style="display:flex;align-items:center;gap:8px;text-transform:none;">
|
||||||
<input type="checkbox" wire:model="createNew" />
|
<input type="checkbox" wire:model="createNew" />
|
||||||
<span>Creează automat articolele noi în nomenclatură</span>
|
<span>{{ __('Creează automat articolele noi în nomenclatură') }}</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="wiz-actions">
|
<div class="wiz-actions">
|
||||||
<button class="wiz-btn" wire:click="$set('step', 2)">← Înapoi</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>
|
<button class="wiz-btn wiz-btn-primary" wire:click="confirmImport">{{ __('Confirmă și importă') }}</button>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@@ -213,13 +213,13 @@
|
|||||||
@if ($step === 4)
|
@if ($step === 4)
|
||||||
<div style="text-align:center;padding:32px;">
|
<div style="text-align:center;padding:32px;">
|
||||||
<div style="font-size:48px;margin-bottom:16px;">✅</div>
|
<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>
|
<p style="color:#4a5568;">{{ $previewSummary['total'] }} poziții importate în Purchase nouă</p>
|
||||||
<div style="margin-top:24px;">
|
<div style="margin-top:24px;">
|
||||||
@if (session('purchase_id'))
|
@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
|
@endif
|
||||||
<button class="wiz-btn" wire:click="reset_">Import nou</button>
|
<button class="wiz-btn" wire:click="reset_">{{ __('Import nou') }}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="fn-bar">
|
<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)
|
@foreach ($periods as $key => $label)
|
||||||
<button type="button" wire:click="setPeriod('{{ $key }}')"
|
<button type="button" wire:click="setPeriod('{{ $key }}')"
|
||||||
class="fn-pill {{ $period === $key ? 'active' : '' }}">{{ $label }}</button>
|
class="fn-pill {{ $period === $key ? 'active' : '' }}">{{ $label }}</button>
|
||||||
@@ -55,19 +55,19 @@
|
|||||||
|
|
||||||
@if ($tab === 'overview')
|
@if ($tab === 'overview')
|
||||||
<div class="fn-grid fn-grid-4">
|
<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">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">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>
|
</div>
|
||||||
|
|
||||||
@elseif ($tab === 'cashflow')
|
@elseif ($tab === 'cashflow')
|
||||||
<div class="fn-grid fn-grid-2" style="margin-bottom: 16px;">
|
<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 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 ieșiri') }}</div><div class="fn-stat-v fn-danger">{{ number_format($data['totalOut'], 2, '.', ' ') }} MDL</div></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="fn-card">
|
<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">
|
<div class="fn-chart">
|
||||||
@foreach ($data['rows'] as $r)
|
@foreach ($data['rows'] as $r)
|
||||||
<div class="fn-chart-day" title="{{ $r['date'] }}: in {{ number_format($r['in']) }} / out {{ number_format($r['out']) }}">
|
<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>
|
<div class="fn-h3">Venituri</div>
|
||||||
<table class="fn-tbl">
|
<table class="fn-tbl">
|
||||||
<tr><td>Manopere</td><td class="fn-r">{{ number_format($data['worksRevenue'], 2, '.', ' ') }}</td></tr>
|
<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><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 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>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="fn-card">
|
<div class="fn-card">
|
||||||
<div class="fn-h3">Costuri</div>
|
<div class="fn-h3">Costuri</div>
|
||||||
<table class="fn-tbl">
|
<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)
|
@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>
|
<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
|
@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>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -117,17 +117,17 @@
|
|||||||
<div class="fn-card">
|
<div class="fn-card">
|
||||||
<div class="fn-h3">Active</div>
|
<div class="fn-h3">Active</div>
|
||||||
<table class="fn-tbl">
|
<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>{{ __('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>{{ __('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><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 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>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="fn-card">
|
<div class="fn-card">
|
||||||
<div class="fn-h3">Toate timpurile</div>
|
<div class="fn-h3">{{ __('Toate timpurile') }}</div>
|
||||||
<table class="fn-tbl">
|
<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 î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 cheltuit') }}</td><td class="fn-r fn-danger">{{ number_format($data['allTimeExpenses'], 2, '.', ' ') }} MDL</td></tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -35,8 +35,8 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div style="background: #fef3c7; border-left: 4px solid #f59e0b; padding: 12px 16px; border-radius: 6px; margin-bottom: 16px; font-size: 13px;">
|
<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.
|
ℹ️ <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>.
|
Pentru moment, valorile salvate sunt accesibile în cod via') }} <code>$tenant->settings['integrations']</code>.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ig-grid">
|
<div class="ig-grid">
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
</div>
|
</div>
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
<button type="button" class="ig-save" wire:click="save">Salvează</button>
|
<button type="button" class="ig-save" wire:click="save">{{ __('Salvează') }}</button>
|
||||||
</div>
|
</div>
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -19,22 +19,22 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="kpi-toolbar">
|
<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>
|
<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>
|
</div>
|
||||||
|
|
||||||
@if (empty($rows))
|
@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
|
@else
|
||||||
<table class="kpi-table">
|
<table class="kpi-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Mecanic</th>
|
<th>Mecanic</th>
|
||||||
<th>Lucrări</th>
|
<th>{{ __('Lucrări') }}</th>
|
||||||
<th>Norma ore</th>
|
<th>Norma ore</th>
|
||||||
<th>Real ore</th>
|
<th>Real ore</th>
|
||||||
<th>Eficiență</th>
|
<th>{{ __('Eficiență') }}</th>
|
||||||
<th>Venit manopere</th>
|
<th>Venit manopere</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|||||||
@@ -39,8 +39,8 @@
|
|||||||
<div class="ob-wrap">
|
<div class="ob-wrap">
|
||||||
<div class="ob-intro">
|
<div class="ob-intro">
|
||||||
<h3>👋 Bun venit!</h3>
|
<h3>👋 Bun venit!</h3>
|
||||||
Hai să facem 30 de secunde de configurare ca AutoCRM-ul tău să arate exact cum vrei tu.
|
{{ __('Hai să facem 30 de secunde de configurare ca AutoCRM-ul tău să arate exact cum vrei tu.
|
||||||
Toate aceste setări pot fi schimbate oricând din meniul „Setări".
|
Toate aceste setări pot fi schimbate oricând din meniul „Setări".') }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{-- Stepper --}}
|
{{-- Stepper --}}
|
||||||
@@ -61,14 +61,14 @@
|
|||||||
<div class="ob-buttons">
|
<div class="ob-buttons">
|
||||||
<div>
|
<div>
|
||||||
@if ($step > 1)
|
@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
|
@endif
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
@if ($step < 3)
|
@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
|
@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
|
@endif
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
|
|
||||||
<div class="rc-grid">
|
<div class="rc-grid">
|
||||||
<div class="rc-card">
|
<div class="rc-card">
|
||||||
<div class="rc-h3">😴 Clienți pierduți <span class="rc-count">{{ $lost->count() }}</span></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>
|
<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">
|
<table class="rc-tbl">
|
||||||
@forelse ($lost as $c)
|
@forelse ($lost as $c)
|
||||||
<tr>
|
<tr>
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
<div style="font-size:10px;color:#9ca3af;">{{ $c->phone }}</div>
|
<div style="font-size:10px;color:#9ca3af;">{{ $c->phone }}</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="rc-r" style="color:#9ca3af;font-size:11px;">
|
<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>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@empty
|
@empty
|
||||||
@@ -41,8 +41,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="rc-card">
|
<div class="rc-card">
|
||||||
<div class="rc-h3">🚗 Mașini cu kilometraj mare <span class="rc-count">{{ $highMileage->count() }}</span></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>
|
<div style="font-size:11px;color:#6b7280;margin-bottom:12px;">{{ __('Sugerează revizie / piese de uzură.') }}</div>
|
||||||
<table class="rc-tbl">
|
<table class="rc-tbl">
|
||||||
@forelse ($highMileage as $v)
|
@forelse ($highMileage as $v)
|
||||||
<tr>
|
<tr>
|
||||||
@@ -62,8 +62,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="rc-card">
|
<div class="rc-card">
|
||||||
<div class="rc-h3">💰 Fișe neplătite <span class="rc-count">{{ $unpaid->count() }}</span></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>
|
<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">
|
<table class="rc-tbl">
|
||||||
@forelse ($unpaid as $w)
|
@forelse ($unpaid as $w)
|
||||||
<tr>
|
<tr>
|
||||||
@@ -77,14 +77,14 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@empty
|
@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
|
@endforelse
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="rc-card">
|
<div class="rc-card">
|
||||||
<div class="rc-h3">⭐ VIP fără contact recent <span class="rc-count">{{ $vip->count() }}</span></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>
|
<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">
|
<table class="rc-tbl">
|
||||||
@forelse ($vip as $c)
|
@forelse ($vip as $c)
|
||||||
<tr>
|
<tr>
|
||||||
@@ -97,7 +97,7 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@empty
|
@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
|
@endforelse
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
|
|
||||||
<div class="rp-stack">
|
<div class="rp-stack">
|
||||||
<div class="rp-bar">
|
<div class="rp-bar">
|
||||||
<span class="rp-label">Perioadă:</span>
|
<span class="rp-label">{{ __('Perioadă:') }}</span>
|
||||||
@foreach ($periods as $key => $label)
|
@foreach ($periods as $key => $label)
|
||||||
<button type="button" wire:click="setPeriod('{{ $key }}')"
|
<button type="button" wire:click="setPeriod('{{ $key }}')"
|
||||||
class="rp-pill {{ $period === $key ? 'active' : '' }}">{{ $label }}</button>
|
class="rp-pill {{ $period === $key ? 'active' : '' }}">{{ $label }}</button>
|
||||||
@@ -88,9 +88,9 @@
|
|||||||
@foreach ([
|
@foreach ([
|
||||||
['Încasări', $data['income'], 'success'],
|
['Încasări', $data['income'], 'success'],
|
||||||
['Cheltuieli', $data['expenses'], 'danger'],
|
['Cheltuieli', $data['expenses'], 'danger'],
|
||||||
['Profit', $data['profit'], $data['profit'] >= 0 ? 'success' : 'danger'],
|
['Profit', $data['profit'], $data['profit'] >{{ __('= 0 ? \'success\' : \'danger\'],
|
||||||
['Datorii clienți', $data['debt'], 'warning'],
|
[\'Datorii clienți\', $data[\'debt\'], \'warning\'],
|
||||||
] as [$label, $value, $color])
|
] as [$label, $value, $color])') }}
|
||||||
<div class="rp-card">
|
<div class="rp-card">
|
||||||
<div class="rp-stat-label">{{ $label }}</div>
|
<div class="rp-stat-label">{{ $label }}</div>
|
||||||
<div class="rp-stat-value rp-{{ $color }}">
|
<div class="rp-stat-value rp-{{ $color }}">
|
||||||
@@ -102,9 +102,9 @@
|
|||||||
|
|
||||||
<div class="rp-grid rp-grid-2">
|
<div class="rp-grid rp-grid-2">
|
||||||
<div class="rp-card">
|
<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">
|
<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>
|
<tbody>
|
||||||
@forelse ($data['by_method'] as $row)
|
@forelse ($data['by_method'] as $row)
|
||||||
<tr>
|
<tr>
|
||||||
@@ -113,7 +113,7 @@
|
|||||||
<td class="rp-right rp-bold">{{ number_format((float)$row->total, 2, '.', ' ') }}</td>
|
<td class="rp-right rp-bold">{{ number_format((float)$row->total, 2, '.', ' ') }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@empty
|
@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
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
<div class="rp-card">
|
<div class="rp-card">
|
||||||
<div class="rp-h3">Cheltuieli pe categorie</div>
|
<div class="rp-h3">Cheltuieli pe categorie</div>
|
||||||
<table class="rp-tbl">
|
<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>
|
<tbody>
|
||||||
@forelse ($data['by_category'] as $row)
|
@forelse ($data['by_category'] as $row)
|
||||||
<tr>
|
<tr>
|
||||||
@@ -130,22 +130,22 @@
|
|||||||
<td class="rp-right rp-bold rp-danger">{{ number_format((float)$row->total, 2, '.', ' ') }}</td>
|
<td class="rp-right rp-bold rp-danger">{{ number_format((float)$row->total, 2, '.', ' ') }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@empty
|
@empty
|
||||||
<tr><td colspan="3" class="rp-muted">Nicio cheltuială.</td></tr>
|
<tr><td colspan="3" class="rp-muted">{{ __('Nicio cheltuială.') }}</td></tr>
|
||||||
@endforelse
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</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')
|
@elseif ($tab === 'workload')
|
||||||
<div class="rp-grid rp-grid-2">
|
<div class="rp-grid rp-grid-2">
|
||||||
<div class="rp-card">
|
<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 class="rp-stat-value">{{ $data['opened'] }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="rp-card">
|
<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 class="rp-stat-value rp-success">{{ $data['closed'] }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -159,7 +159,7 @@
|
|||||||
<td class="rp-right rp-bold">{{ $row->cnt }}</td>
|
<td class="rp-right rp-bold">{{ $row->cnt }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@empty
|
@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
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -172,7 +172,7 @@
|
|||||||
<th>Mecanic</th>
|
<th>Mecanic</th>
|
||||||
<th>Specializare</th>
|
<th>Specializare</th>
|
||||||
<th class="rp-right">Manopere</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>
|
<th class="rp-right">Venit</th>
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -195,9 +195,9 @@
|
|||||||
<div class="rp-card" style="overflow-x: auto;">
|
<div class="rp-card" style="overflow-x: auto;">
|
||||||
<table class="rp-tbl">
|
<table class="rp-tbl">
|
||||||
<thead><tr>
|
<thead><tr>
|
||||||
<th>Manoperă</th>
|
<th>{{ __('Manoperă') }}</th>
|
||||||
<th class="rp-right">Nr.</th>
|
<th class="rp-right">{{ __('Nr.') }}</th>
|
||||||
<th class="rp-right">Ore total</th>
|
<th class="rp-right">{{ __('Ore total') }}</th>
|
||||||
<th class="rp-right">Venit</th>
|
<th class="rp-right">Venit</th>
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -209,7 +209,7 @@
|
|||||||
<td class="rp-right rp-success">{{ number_format((float)$r->revenue, 2, '.', ' ') }}</td>
|
<td class="rp-right rp-success">{{ number_format((float)$r->revenue, 2, '.', ' ') }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@empty
|
@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
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -218,9 +218,9 @@
|
|||||||
@elseif ($tab === 'parts')
|
@elseif ($tab === 'parts')
|
||||||
<div class="rp-grid rp-grid-2">
|
<div class="rp-grid rp-grid-2">
|
||||||
<div class="rp-card" style="overflow-x: auto;">
|
<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">
|
<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>
|
<tbody>
|
||||||
@forelse ($data['sold'] as $r)
|
@forelse ($data['sold'] as $r)
|
||||||
<tr>
|
<tr>
|
||||||
@@ -230,15 +230,15 @@
|
|||||||
<td class="rp-right rp-success">{{ number_format((float)$r->margin, 2, '.', ' ') }}</td>
|
<td class="rp-right rp-success">{{ number_format((float)$r->margin, 2, '.', ' ') }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@empty
|
@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
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="rp-card">
|
<div class="rp-card">
|
||||||
<div class="rp-h3">⚠️ Stoc minim atins</div>
|
<div class="rp-h3">{{ __('⚠️ Stoc minim atins') }}</div>
|
||||||
<table class="rp-tbl">
|
<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>
|
<tbody>
|
||||||
@forelse ($data['low'] as $p)
|
@forelse ($data['low'] as $p)
|
||||||
<tr>
|
<tr>
|
||||||
@@ -247,7 +247,7 @@
|
|||||||
<td class="rp-right">{{ $p->min_qty }}</td>
|
<td class="rp-right">{{ $p->min_qty }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@empty
|
@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
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -257,11 +257,11 @@
|
|||||||
@elseif ($tab === 'clients')
|
@elseif ($tab === 'clients')
|
||||||
<div class="rp-grid rp-grid-2">
|
<div class="rp-grid rp-grid-2">
|
||||||
<div class="rp-card">
|
<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 class="rp-stat-value">{{ $data['new_count'] }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="rp-card">
|
<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">
|
<table class="rp-tbl">
|
||||||
<tbody>
|
<tbody>
|
||||||
@forelse ($data['by_source'] as $row)
|
@forelse ($data['by_source'] as $row)
|
||||||
|
|||||||
@@ -38,17 +38,17 @@
|
|||||||
@php $pending = $this->getPendingItems(); @endphp
|
@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="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="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))
|
@if (! empty($receivedToasts))
|
||||||
<div style="margin-top:8px;font-size:12px;color:#065f46;">
|
<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)
|
@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>
|
<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
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
<div style="margin-top:8px;">
|
<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>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
@@ -59,14 +59,14 @@
|
|||||||
<div class="sc-cam" wire:ignore>
|
<div class="sc-cam" wire:ignore>
|
||||||
<div id="reader"></div>
|
<div id="reader"></div>
|
||||||
<div class="placeholder" x-show="!running && !error" x-cloak>
|
<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>
|
||||||
<div class="placeholder" x-show="error" x-text="error" x-cloak></div>
|
<div class="placeholder" x-show="error" x-text="error" x-cloak></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="sc-controls">
|
<div class="sc-controls">
|
||||||
<button class="sc-btn" type="button" @click="start" x-show="!running">📷 Pornește scanner</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>
|
<button class="sc-btn gray" type="button" @click="stop" x-show="running">{{ __('⏹ Oprește') }}</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div x-show="lastDecoded" class="sc-status" x-cloak>
|
<div x-show="lastDecoded" class="sc-status" x-cloak>
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
<div class="sc-manual">
|
<div class="sc-manual">
|
||||||
<form wire:submit="submitManual" style="display:flex;gap:8px;align-items:stretch;">
|
<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)…" />
|
<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>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<div class="mt-6 flex justify-end">
|
<div class="mt-6 flex justify-end">
|
||||||
<x-filament::button type="submit">
|
<x-filament::button type="submit">
|
||||||
Salvează
|
{{ __('Salvează') }}
|
||||||
</x-filament::button>
|
</x-filament::button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<h2 style="font-size:16px;font-weight:600;margin-bottom:12px;">🔎 Decode VIN</h2>
|
<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;">
|
<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;">
|
<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>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -33,8 +33,8 @@
|
|||||||
@if ($decoded['valid'])
|
@if ($decoded['valid'])
|
||||||
<h3 style="font-size:14px;font-weight:600;margin-bottom:16px;">✅ VIN decodificat</h3>
|
<h3 style="font-size:14px;font-weight:600;margin-bottom:16px;">✅ VIN decodificat</h3>
|
||||||
<div class="vs-grid">
|
<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">{{ __('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">{{ __('Ț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">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">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>
|
<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
|
@php $matches = $this->vehicleMatches(); @endphp
|
||||||
@if ($matches->isNotEmpty())
|
@if ($matches->isNotEmpty())
|
||||||
<div class="vs-card">
|
<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">
|
<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>
|
<tbody>
|
||||||
@foreach ($matches as $v)
|
@foreach ($matches as $v)
|
||||||
<tr>
|
<tr>
|
||||||
@@ -67,9 +67,9 @@
|
|||||||
@endif
|
@endif
|
||||||
|
|
||||||
<div class="vs-card">
|
<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"
|
<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
|
@php $parts = $this->partsResults(); @endphp
|
||||||
@if ($partsQuery)
|
@if ($partsQuery)
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
<div style="color:#9ca3af;text-align:center;padding:20px;">Niciun rezultat pentru „{{ $partsQuery }}"</div>
|
<div style="color:#9ca3af;text-align:center;padding:20px;">Niciun rezultat pentru „{{ $partsQuery }}"</div>
|
||||||
@else
|
@else
|
||||||
<table class="vs-tbl">
|
<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>
|
<tbody>
|
||||||
@foreach ($parts as $p)
|
@foreach ($parts as $p)
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -29,9 +29,9 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="wl-bar">
|
<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>
|
<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>
|
<span style="margin-left:auto;font-size:11px;color:#6b7280;">capacitate ref: {{ $data['capacity'] }}h/zi</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -84,9 +84,9 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="wl-legend">
|
<div class="wl-legend">
|
||||||
Legendă:
|
{{ __('Legendă:') }}
|
||||||
<span class="wl-sw" style="background:#f3f4f6;"></span> liber
|
<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(160,160,80,0.3);"></span> mediu
|
||||||
<span class="wl-sw" style="background:rgba(255,80,80,0.3);"></span> plin (peste capacitate)
|
<span class="wl-sw" style="background:rgba(255,80,80,0.3);"></span> plin (peste capacitate)
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<div class="space-y-3 text-sm">
|
<div class="space-y-3 text-sm">
|
||||||
<div class="flex justify-between">
|
<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>
|
<span class="font-mono">{{ number_format($quote['base'], 2) }} MDL</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -14,11 +14,11 @@
|
|||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
@else
|
@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
|
@endif
|
||||||
|
|
||||||
<div class="flex justify-between border-t-2 border-gray-300 dark:border-gray-600 pt-2 text-base font-bold">
|
<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>
|
<span class="text-primary-600">{{ number_format($quote['final'], 2) }} MDL</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
@endphp
|
@endphp
|
||||||
<div class="space-y-4">
|
<div class="space-y-4">
|
||||||
<p class="text-sm text-gray-600 dark:text-gray-300">
|
<p class="text-sm text-gray-600 dark:text-gray-300">
|
||||||
Trimite acest link clientului — vede statusul fișei, ETA și fotografiile fără să se logheze.
|
{{ __('Trimite acest link clientului — vede statusul fișei, ETA și fotografiile fără să se logheze.') }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="flex justify-center bg-white rounded-lg p-4 border border-gray-200 dark:border-gray-700">
|
<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"
|
rel="noopener"
|
||||||
class="inline-flex items-center px-3 py-2 text-sm rounded-md bg-primary-600 text-white hover:bg-primary-700"
|
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>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -43,6 +43,6 @@
|
|||||||
href="{{ route('tracking.qr', $wo->tracking_token) }}"
|
href="{{ route('tracking.qr', $wo->tracking_token) }}"
|
||||||
download="WO-{{ $wo->number }}-qr.svg"
|
download="WO-{{ $wo->number }}-qr.svg"
|
||||||
class="text-xs text-primary-600 hover:underline"
|
class="text-xs text-primary-600 hover:underline"
|
||||||
>Descarcă QR (SVG)</a>
|
>{{ __('Descarcă QR (SVG)') }}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -14,16 +14,16 @@
|
|||||||
<dt class="text-gray-500 dark:text-gray-400">Regiune</dt>
|
<dt class="text-gray-500 dark:text-gray-400">Regiune</dt>
|
||||||
<dd class="text-gray-900 dark:text-gray-100">{{ $info['region'] ?? '—' }}</dd>
|
<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>
|
<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>
|
<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>
|
<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>
|
<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>
|
<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>
|
<dt class="text-gray-500 dark:text-gray-400">Checksum (ISO)</dt>
|
||||||
@@ -31,13 +31,13 @@
|
|||||||
@if ($info['checksum_valid'])
|
@if ($info['checksum_valid'])
|
||||||
<span class="text-green-600 dark:text-green-400">✓ valid</span>
|
<span class="text-green-600 dark:text-green-400">✓ valid</span>
|
||||||
@else
|
@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
|
@endif
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<div class="text-xs text-gray-500 dark:text-gray-400 border-t border-gray-200 dark:border-gray-700 pt-2">
|
<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>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="toolbar">
|
<div class="toolbar">
|
||||||
<strong>{{ $labels->count() }} etichete</strong>
|
<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>
|
||||||
|
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th style="width:60px;">Ora</th>
|
<th style="width:60px;">Ora</th>
|
||||||
<th>Subiect</th>
|
<th>Subiect</th>
|
||||||
<th>Client / Auto</th>
|
<th>{{ __('Client / Auto') }}</th>
|
||||||
<th>Pod</th>
|
<th>Pod</th>
|
||||||
<th>Maistru</th>
|
<th>Maistru</th>
|
||||||
<th style="width:60px;">Status</th>
|
<th style="width:60px;">Status</th>
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@empty
|
@empty
|
||||||
<div class="empty">Nicio programare în această perioadă.</div>
|
<div class="empty">{{ __('Nicio programare în această perioadă.') }}</div>
|
||||||
@endforelse
|
@endforelse
|
||||||
|
|
||||||
<div class="footer">AutoCRM PSauto · psauto.service.mir.md</div>
|
<div class="footer">AutoCRM PSauto · psauto.service.mir.md</div>
|
||||||
|
|||||||
@@ -133,11 +133,11 @@
|
|||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
<div class="col col-half">
|
<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">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)
|
@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
|
@endif
|
||||||
<div class="doc-meta">
|
<div class="doc-meta">
|
||||||
Status: <b>{{ \App\Models\Tenant\WorkOrder::STATUSES[$wo->status] ?? $wo->status }}</b>
|
Status: <b>{{ \App\Models\Tenant\WorkOrder::STATUSES[$wo->status] ?? $wo->status }}</b>
|
||||||
@@ -149,9 +149,9 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col col-half" style="padding-right: 8px;">
|
<div class="col col-half" style="padding-right: 8px;">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<h3>Client</h3>
|
<h3>{{ __('Client') }}</h3>
|
||||||
<div class="kv">
|
<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>
|
<div><b>Telefon:</b> {{ $wo->client?->phone ?? '—' }}</div>
|
||||||
@if ($wo->client?->email)
|
@if ($wo->client?->email)
|
||||||
<div><b>Email:</b> {{ $wo->client->email }}</div>
|
<div><b>Email:</b> {{ $wo->client->email }}</div>
|
||||||
@@ -161,7 +161,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col col-half" style="padding-left: 8px;">
|
<div class="col col-half" style="padding-left: 8px;">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<h3>Auto</h3>
|
<h3>{{ __('Auto') }}</h3>
|
||||||
<div class="kv">
|
<div class="kv">
|
||||||
<div><b>Marca/Model:</b> {{ $wo->vehicle?->make }} {{ $wo->vehicle?->model }} {{ $wo->vehicle?->year }}</div>
|
<div><b>Marca/Model:</b> {{ $wo->vehicle?->make }} {{ $wo->vehicle?->model }} {{ $wo->vehicle?->year }}</div>
|
||||||
<div><b>Nr.:</b> {{ $wo->vehicle?->plate ?? '—' }}</div>
|
<div><b>Nr.:</b> {{ $wo->vehicle?->plate ?? '—' }}</div>
|
||||||
@@ -170,7 +170,7 @@
|
|||||||
@endif
|
@endif
|
||||||
<div><b>Km la intrare:</b> {{ $wo->mileage_in ? number_format($wo->mileage_in, 0, '.', ' ') : '—' }}</div>
|
<div><b>Km la intrare:</b> {{ $wo->mileage_in ? number_format($wo->mileage_in, 0, '.', ' ') : '—' }}</div>
|
||||||
@if ($wo->mileage_out)
|
@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
|
@endif
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
@if ($wo->complaint || $wo->diagnosis)
|
@if ($wo->complaint || $wo->diagnosis)
|
||||||
<div class="box">
|
<div class="box">
|
||||||
@if ($wo->complaint)
|
@if ($wo->complaint)
|
||||||
<h3>Plângere client</h3>
|
<h3>{{ __('Plângere client') }}</h3>
|
||||||
<div style="margin-bottom: 8px;">{{ $wo->complaint }}</div>
|
<div style="margin-bottom: 8px;">{{ $wo->complaint }}</div>
|
||||||
@endif
|
@endif
|
||||||
@if ($wo->diagnosis)
|
@if ($wo->diagnosis)
|
||||||
@@ -196,9 +196,9 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style="width: 50%;">Denumire</th>
|
<th style="width: 50%;">Denumire</th>
|
||||||
<th class="r" style="width: 12%;">Ore</th>
|
<th class="r" style="width: 12%;">{{ __('Ore') }}</th>
|
||||||
<th class="r" style="width: 18%;">Preț/h</th>
|
<th class="r" style="width: 18%;">{{ __('Preț/h') }}</th>
|
||||||
<th class="r" style="width: 20%;">Total</th>
|
<th class="r" style="width: 20%;">{{ __('Total') }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -226,10 +226,10 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style="width: 40%;">Denumire</th>
|
<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: 10%;">Cant.</th>
|
||||||
<th class="r" style="width: 14%;">Preț</th>
|
<th class="r" style="width: 14%;">{{ __('Preț') }}</th>
|
||||||
<th class="r" style="width: 18%;">Total</th>
|
<th class="r" style="width: 18%;">{{ __('Total') }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -268,7 +268,7 @@
|
|||||||
|
|
||||||
@if ($wo->recommendations)
|
@if ($wo->recommendations)
|
||||||
<div class="recommendations">
|
<div class="recommendations">
|
||||||
<h3>⚠ Recomandări</h3>
|
<h3>{{ __('⚠ Recomandări') }}</h3>
|
||||||
<div>{{ $wo->recommendations }}</div>
|
<div>{{ $wo->recommendations }}</div>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
@@ -277,11 +277,11 @@
|
|||||||
<table style="width: 100%;">
|
<table style="width: 100%;">
|
||||||
<tr>
|
<tr>
|
||||||
<td class="sig-cell">
|
<td class="sig-cell">
|
||||||
<div>Client (nume, semnătură):</div>
|
<div>{{ __('Client (nume, semnătură):') }}</div>
|
||||||
<div class="sig-line"></div>
|
<div class="sig-line"></div>
|
||||||
</td>
|
</td>
|
||||||
<td class="sig-cell">
|
<td class="sig-cell">
|
||||||
<div>Maistru / Recepție:</div>
|
<div>{{ __('Maistru / Recepție:') }}</div>
|
||||||
<div class="sig-line"></div>
|
<div class="sig-line"></div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -17,18 +17,18 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="box">
|
<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>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>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>BIC / SWIFT:</span> <code>{{ $bank['bic'] ?? '—' }}</code></div>
|
||||||
<div class="row"><span>Banca:</span> {{ $bank['bank_name'] ?? '—' }}</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">
|
<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>
|
<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>
|
</div>
|
||||||
|
|
||||||
@if (! empty($bank['instructions']))
|
@if (! empty($bank['instructions']))
|
||||||
@@ -36,15 +36,15 @@
|
|||||||
@endif
|
@endif
|
||||||
|
|
||||||
<div style="margin-top:20px;padding-top:16px;border-top:1px solid #e5e7eb;font-size:12px;color:#6b7280;line-height:1.6;">
|
<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;">
|
<ul style="margin: 8px 0 0 20px;">
|
||||||
<li>Plata apare în 1-3 zile lucrătoare</li>
|
<li>{{ __('Plata apare în 1-3 zile lucrătoare') }}</li>
|
||||||
<li>Operatorul confirmă manual factura ca plătită</li>
|
<li>{{ __('Operatorul confirmă manual factura ca plătită') }}</li>
|
||||||
<li>Abonamentul se extinde automat</li>
|
<li>Abonamentul se extinde automat</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a href="/billing" class="btn-back">← Înapoi la facturi</a>
|
<a href="/billing" class="btn-back">{{ __('← Înapoi la facturi') }}</a>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -56,15 +56,15 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="wrap">
|
<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>
|
<h1>Facturi & abonament</h1>
|
||||||
<p class="sub">{{ $tenant->display_name ?? $tenant->name }} · {{ $tenant->slug }}.service.mir.md</p>
|
<p class="sub">{{ $tenant->display_name ?? $tenant->name }} · {{ $tenant->slug }}.service.mir.md</p>
|
||||||
|
|
||||||
@if ($invoices->isEmpty())
|
@if ($invoices->isEmpty())
|
||||||
<div class="empty">
|
<div class="empty">
|
||||||
<div style="font-size:48px;margin-bottom:8px;">📄</div>
|
<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: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:13px;">{{ __('Operatorul îți va emite factură când e timpul abonamentului.') }}</div>
|
||||||
</div>
|
</div>
|
||||||
@else
|
@else
|
||||||
@foreach ($invoices as $inv)
|
@foreach ($invoices as $inv)
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
<span style="color:#10b981;font-weight:600;">✓</span>
|
<span style="color:#10b981;font-weight:600;">✓</span>
|
||||||
@else
|
@else
|
||||||
<button class="btn-pay" onclick="document.getElementById('m-{{ $inv->id }}').classList.add('open')">
|
<button class="btn-pay" onclick="document.getElementById('m-{{ $inv->id }}').classList.add('open')">
|
||||||
💳 Plătește
|
{{ __('💳 Plătește') }}
|
||||||
</button>
|
</button>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
<div class="modal-box">
|
<div class="modal-box">
|
||||||
<span class="modal-close" onclick="document.getElementById('m-{{ $inv->id }}').classList.remove('open')">×</span>
|
<span class="modal-close" onclick="document.getElementById('m-{{ $inv->id }}').classList.remove('open')">×</span>
|
||||||
<h3>Plătește {{ $inv->invoice_number ?? '#' . $inv->id }}</h3>
|
<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'])
|
@if ($methods['stripe'])
|
||||||
<form method="POST" action="{{ route('pay.start', ['subscription' => $inv->id]) }}" class="method-form">
|
<form method="POST" action="{{ route('pay.start', ['subscription' => $inv->id]) }}" class="method-form">
|
||||||
@@ -165,7 +165,7 @@
|
|||||||
<div class="icon">🏦</div>
|
<div class="icon">🏦</div>
|
||||||
<div>
|
<div>
|
||||||
<div class="label">Transfer bancar</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>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
@@ -174,7 +174,7 @@
|
|||||||
|
|
||||||
@if (! $methods['stripe'] && ! $methods['paypal'] && ! $methods['paynet'] && ! $methods['bank'])
|
@if (! $methods['stripe'] && ! $methods['paypal'] && ! $methods['paynet'] && ! $methods['bank'])
|
||||||
<div style="text-align:center;color:#9ca3af;padding:32px 16px;font-size:13px;">
|
<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>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
|
|
||||||
@if (! empty($legal['name']))
|
@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;">
|
<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['idno'])) · IDNO {{ $legal['idno'] }} @endif
|
||||||
@if (! empty($legal['address'])) · {{ $legal['address'] }} @endif
|
@if (! empty($legal['address'])) · {{ $legal['address'] }} @endif
|
||||||
@if (! empty($legal['email'])) · {{ $legal['email'] }} @endif
|
@if (! empty($legal['email'])) · {{ $legal['email'] }} @endif
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<div class="box">
|
<div class="box">
|
||||||
<div style="font-size:48px;margin-bottom:12px;">🚧</div>
|
<div style="font-size:48px;margin-bottom:12px;">🚧</div>
|
||||||
<h1>{{ $gateway }} Checkout</h1>
|
<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">
|
<div class="note">
|
||||||
<b>Mod stub:</b><br>
|
<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ă.
|
În prod, aici redirectează la pagina {{ $gateway }} Checkout cu sumele și metadatele facturii. La success, webhook-ul marchează automat factura ca plătită.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a href="/billing" class="btn">← Înapoi</a>
|
<a href="/billing" class="btn">{{ __('← Înapoi') }}</a>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -82,20 +82,20 @@
|
|||||||
<section class="section">
|
<section class="section">
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<div class="info-block">
|
<div class="info-block">
|
||||||
<h3>📍 Locație & contact</h3>
|
<h3>{{ __('📍 Locație & contact') }}</h3>
|
||||||
@if ($city) <p><b>Oraș:</b> {{ $city }}</p> @endif
|
@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 ($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
|
@if ($email) <p><b>Email:</b> <a href="mailto:{{ $email }}" style="color:inherit;">{{ $email }}</a></p> @endif
|
||||||
</div>
|
</div>
|
||||||
<div class="info-block">
|
<div class="info-block">
|
||||||
<h3>🕒 Program de lucru</h3>
|
<h3>🕒 Program de lucru</h3>
|
||||||
<p>Luni – Vineri: 08:00 – 18:00</p>
|
<p>Luni – Vineri: 08:00 – 18:00</p>
|
||||||
<p>Sâmbătă: 09:00 – 14:00</p>
|
<p>{{ __('Sâmbătă: 09:00 – 14:00') }}</p>
|
||||||
<p>Duminică: închis</p>
|
<p>{{ __('Duminică: închis') }}</p>
|
||||||
</div>
|
</div>
|
||||||
@if (! empty($cars))
|
@if (! empty($cars))
|
||||||
<div class="info-block">
|
<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>
|
<p>{{ implode(', ', array_slice($cars, 0, 12)) }}@if (count($cars) > 12), …@endif</p>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
@@ -103,7 +103,7 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="cta">
|
<section class="cta">
|
||||||
<h2>Rezervă o programare</h2>
|
<h2>{{ __('Rezervă o programare') }}</h2>
|
||||||
@if ($phone)
|
@if ($phone)
|
||||||
<a href="tel:{{ $phone }}">📞 {{ $phone }}</a>
|
<a href="tel:{{ $phone }}">📞 {{ $phone }}</a>
|
||||||
@endif
|
@endif
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="ro">
|
<html lang="ro">
|
||||||
<head><meta charset="UTF-8"><title>Plată anulată</title>
|
<head><meta charset="UTF-8"><title>{{ __('Plată anulată') }}</title>
|
||||||
<style>
|
<style>
|
||||||
body { font-family: system-ui, sans-serif; background: #fef2f2; padding: 60px 20px; text-align: center; color: #1f2937; }
|
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; }
|
.box { max-width: 480px; margin: 0 auto; background:#fff; padding:40px 24px; border-radius:12px; }
|
||||||
@@ -10,9 +10,9 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div style="font-size:48px;">↩</div>
|
<div style="font-size:48px;">↩</div>
|
||||||
<h1 style="color:#ef4444;">Plată anulată</h1>
|
<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>
|
<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>
|
<a href="/billing" class="btn">{{ __('← Înapoi la facturi') }}</a>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html lang="ro">
|
<html lang="ro">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Plată reușită</title>
|
<title>{{ __('Plată reușită') }}</title>
|
||||||
<style>
|
<style>
|
||||||
body { font-family: system-ui, sans-serif; background: #f0fdf4; padding: 60px 20px; text-align: center; color: #1f2937; }
|
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); }
|
.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>
|
<body>
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div style="font-size:64px;">✓</div>
|
<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;">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>
|
<a href="/app" class="btn">→ Mergi la AutoCRM</a>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
<h1>⏰ Abonament expirat</h1>
|
<h1>⏰ Abonament expirat</h1>
|
||||||
<p>Abonamentul pentru <b>{{ $company->name }}</b> a expirat.</p>
|
<p>Abonamentul pentru <b>{{ $company->name }}</b> a expirat.</p>
|
||||||
<p>Pentru a continua să folosiți aplicația, vă rugăm să achitați factura.</p>
|
<p>{{ __('Pentru a continua să folosiți aplicația, vă rugăm să achitați factura.') }}</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
<h1>⛔ Cont suspendat</h1>
|
<h1>⛔ Cont suspendat</h1>
|
||||||
<p>Contul <b>{{ $company->name }}</b> a fost suspendat.</p>
|
<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>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user