'free'], [ 'name' => 'Free', 'price_monthly' => 0, 'currency' => 'MDL', 'features' => ['core'], 'limits' => ['max_users' => 2, 'max_vehicles' => 50], ]); Plan::firstOrCreate(['slug' => 'basic'], [ 'name' => 'Basic', 'price_monthly' => 299, 'currency' => 'MDL', 'features' => ['core', 'workorders', 'kanban'], 'limits' => ['max_users' => 5, 'max_vehicles' => 500], ]); Plan::firstOrCreate(['slug' => 'pro'], [ 'name' => 'Pro', 'price_monthly' => 599, 'currency' => 'MDL', 'features' => ['core', 'workorders', 'kanban', 'reports', 'ai', 'api'], 'limits' => ['max_users' => -1, 'max_vehicles' => -1], ]); // ─── Super-admin (operator platformă) ───────────────────── SuperAdmin::firstOrCreate(['email' => 'vasyka.moraru@gmail.com'], [ 'name' => 'Vasyka', 'password' => Hash::make('admin123'), 'is_active' => true, ]); // ─── PSauto demo company ────────────────────────────────── $psauto = Company::firstOrCreate(['slug' => 'psauto'], [ 'name' => 'PSauto SRL', 'display_name' => 'PSauto', 'city' => 'Chișinău', 'phone' => '+373 22 123 456', 'email' => 'contact@psauto.md', 'contact_name' => 'Manager PSauto', 'status' => 'active', 'plan_id' => $free->id, 'active_until' => now()->addYear(), 'settings' => [ 'currency' => 'MDL', 'language' => 'ro', 'theme_color' => '#3B82F6', 'labor_rate' => 400, 'posts' => ['Post 1', 'Post 2', 'Post 3'], ], ]); // Activate tenant context for the seeded data so global scopes auto-fill company_id. app(TenantManager::class)->setCurrent($psauto); app(PermissionRegistrar::class)->setPermissionsTeamId($psauto->id); // ─── Roles default per tenant ───────────────────────────── $roleNames = ['admin', 'manager', 'receptionist', 'mechanic', 'parts_manager', 'accountant', 'marketer']; foreach ($roleNames as $name) { Role::findOrCreate($name, 'web'); } // ─── Admin user pentru PSauto ───────────────────────────── $admin = User::firstOrCreate( ['company_id' => $psauto->id, 'email' => 'admin@psauto.md'], [ 'name' => 'Administrator PSauto', 'password' => Hash::make('admin123'), 'role' => 'admin', 'status' => 'active', 'phone' => '+373 22 123 456', 'locale' => 'ro', 'email_verified_at' => now(), ] ); $admin->syncRoles(['admin']); // ─── Clienți demo (din AutoCRM.html) ────────────────────── $c1 = Client::firstOrCreate( ['company_id' => $psauto->id, 'phone' => '+373 69 100001'], [ 'type' => 'individual', 'name' => 'Ion Popescu', 'email' => 'ion@mail.com', 'status' => 'vip', 'source' => 'recommend', ] ); $c2 = Client::firstOrCreate( ['company_id' => $psauto->id, 'phone' => '+373 79 200002'], [ 'type' => 'individual', 'name' => 'Maria Dumitru', 'status' => 'active', 'discount_pct' => 5, 'source' => 'site', ] ); $c3 = Client::firstOrCreate( ['company_id' => $psauto->id, 'phone' => '+373 60 300003'], [ 'type' => 'individual', 'name' => 'Andrei Lupu', 'status' => 'active', 'discount_pct' => 10, 'notes' => 'Doar piese originale', 'source' => 'instagram', ] ); // ─── Mașini demo ────────────────────────────────────────── $v1 = Vehicle::firstOrCreate( ['company_id' => $psauto->id, 'client_id' => $c1->id, 'make' => 'BMW', 'model' => 'X5'], ['year' => 2020, 'plate' => 'CIU 001', 'engine' => '3.0i', 'gearbox' => 'Automat 8AT', 'fuel' => 'Benzină', 'mileage' => 85000, 'color' => 'Alb'] ); $v2 = Vehicle::firstOrCreate( ['company_id' => $psauto->id, 'client_id' => $c2->id, 'make' => 'Audi', 'model' => 'A4'], ['year' => 2019, 'plate' => 'CIU 002', 'engine' => '2.0 TDI', 'gearbox' => 'DSG7', 'fuel' => 'Diesel', 'mileage' => 45000, 'color' => 'Negru'] ); $v3 = Vehicle::firstOrCreate( ['company_id' => $psauto->id, 'client_id' => $c3->id, 'make' => 'Porsche', 'model' => 'Cayenne'], ['year' => 2021, 'plate' => 'CIU 003', 'engine' => '3.0 TDI', 'gearbox' => 'Tiptronic', 'fuel' => 'Diesel', 'mileage' => 22000, 'color' => 'Gri'] ); // ─── Posturi (boxe) ─────────────────────────────────────── foreach ([['Pod 1', '#3B82F6'], ['Pod 2', '#E24B4A'], ['Pod 3', '#10B981']] as $i => [$name, $color]) { Post::firstOrCreate( ['company_id' => $psauto->id, 'name' => $name], ['color' => $color, 'is_active' => true, 'sort_order' => $i + 1] ); } // ─── Lead-uri demo ──────────────────────────────────────── Lead::firstOrCreate( ['company_id' => $psauto->id, 'phone' => '+373 79 512 345'], [ 'name' => 'Alexandru Grosu', 'car' => 'BMW', 'model' => 'X5', 'message' => 'Trebuie schimb lichid frână, roți față scrâșnesc', 'source' => 'telegram', 'status' => 'new', ] ); Lead::firstOrCreate( ['company_id' => $psauto->id, 'phone' => '+373 69 234 567'], [ 'name' => 'Irina Cojocaru', 'email' => 'irina@mail.md', 'car' => 'Audi', 'model' => 'A4', 'message' => 'Diagnosticare motor, lampa motor aprinsă', 'source' => 'whatsapp', 'status' => 'contacted', 'budget' => 800, ] ); // ─── Deal-uri demo ──────────────────────────────────────── Deal::firstOrCreate( ['company_id' => $psauto->id, 'client_id' => $c1->id, 'name' => 'BMW X5 — Diagnostic'], [ 'vehicle_id' => $v1->id, 'price' => 800, 'stage' => 'done', 'source' => 'call', 'note' => 'Diagnostică ISTA', 'won_at' => now()->subDays(15), ] ); Deal::firstOrCreate( ['company_id' => $psauto->id, 'client_id' => $c2->id, 'name' => 'Audi A4 — Schimb ulei'], [ 'vehicle_id' => $v2->id, 'price' => 500, 'stage' => 'in_work', 'source' => 'site', 'note' => 'Shell 5W-40', ] ); Deal::firstOrCreate( ['company_id' => $psauto->id, 'client_id' => $c3->id, 'name' => 'Porsche — Frâne Brembo'], [ 'vehicle_id' => $v3->id, 'price' => 2200, 'stage' => 'agree', 'source' => 'instagram', 'note' => 'Așteaptă confirmare comanda Brembo', ] ); // ─── Programări demo (azi + 2 zile) ─────────────────────── $post1 = Post::where('company_id', $psauto->id)->where('name', 'Pod 1')->first(); $post2 = Post::where('company_id', $psauto->id)->where('name', 'Pod 2')->first(); Appointment::firstOrCreate( ['company_id' => $psauto->id, 'client_id' => $c1->id, 'date' => today()->toDateString(), 'time_start' => '09:00:00'], [ 'post_id' => $post1?->id, 'vehicle_id' => $v1->id, 'master_id' => $admin->id, 'time_end' => '11:00:00', 'title' => 'BMW X5 — Diagnostic', 'color' => '#3B82F6', 'status' => 'scheduled', ] ); Appointment::firstOrCreate( ['company_id' => $psauto->id, 'client_id' => $c2->id, 'date' => today()->addDay()->toDateString(), 'time_start' => '10:00:00'], [ 'post_id' => $post2?->id, 'vehicle_id' => $v2->id, 'master_id' => $admin->id, 'time_end' => '12:00:00', 'title' => 'Audi A4 — Schimb ulei', 'color' => '#E24B4A', 'status' => 'scheduled', ] ); // ─── Tehnicieni demo ────────────────────────────────────── $masters = [ ['Vasile Ivanov', 'Motor / Cutie viteze', '#3B82F6', '+373 69 111001'], ['Andrei Popov', 'Suspensie / Frâne', '#E24B4A', '+373 69 222002'], ['Nicolae Lupu', 'Electrică / Diagnosticare', '#10B981', '+373 69 333003'], ]; $masterUsers = []; foreach ($masters as [$name, $spec, $color, $phone]) { $email = strtolower(str_replace(' ', '.', \Illuminate\Support\Str::ascii($name))) . '@psauto.md'; $u = User::firstOrCreate( ['company_id' => $psauto->id, 'email' => $email], [ 'name' => $name, 'phone' => $phone, 'role' => 'mechanic', 'status' => 'active', 'specialization' => $spec, 'color' => $color, 'hourly_rate' => 400, 'password' => Hash::make('mecanic123'), 'email_verified_at' => now(), ] ); $u->syncRoles(['mechanic']); $masterUsers[$name] = $u; } // ─── Catalog norme-ore ──────────────────────────────────── $labors = [ ['Motor', 'Schimb ulei și filtru', 'Замена масла и фильтра', 0.5, 200], ['Motor', 'Schimb distribuție', 'Замена ГРМ', 4, 1600], ['Motor', 'Diagnosticare motor', 'Диагностика двигателя', 1, 400], ['Frâne', 'Schimb plăcuțe față', 'Замена колодок передних', 1, 400], ['Frâne', 'Schimb plăcuțe spate', 'Замена колодок задних', 1.5, 600], ['Frâne', 'Schimb discuri frână', 'Замена дисков', 1.5, 600], ['Suspensie', 'Schimb amortizoare', 'Замена амортизаторов', 2, 800], ['Suspensie', 'Geometrie roți', 'Развал-схождение', 1, 400], ['Anvelope', 'Schimb anvelopă (1 buc)', 'Замена шины', 0.25, 100], ['Electrică', 'Diagnosticare electrică', 'Диагностика электрики', 1, 400], ]; foreach ($labors as [$cat, $ro, $ru, $h, $p]) { Labor::firstOrCreate( ['company_id' => $psauto->id, 'name_ro' => $ro], ['category' => $cat, 'name_ru' => $ru, 'hours' => $h, 'price' => $p, 'is_active' => true] ); } // ─── Fișă lucru demo ────────────────────────────────────── $vasile = $masterUsers['Vasile Ivanov']; $andrei = $masterUsers['Andrei Popov']; $wo = WorkOrder::firstOrCreate( ['company_id' => $psauto->id, 'number' => 'WO-26-0001'], [ 'client_id' => $c1->id, 'vehicle_id' => $v1->id, 'master_id' => $andrei->id, 'opened_at' => today()->subDays(2), 'mileage_in' => 85000, 'complaint' => 'Vibrație la frânare, scrâșnet roți față', 'diagnosis' => 'Uzură plăcuțe + discuri față', 'status' => 'in_work', 'pay_status' => 'unpaid', 'approved' => true, 'approved_at' => today()->subDays(2), ] ); WorkOrderWork::firstOrCreate( ['company_id' => $psauto->id, 'work_order_id' => $wo->id, 'name' => 'Schimb plăcuțe față'], ['hours' => 1, 'price_per_hour' => 400, 'status' => 'done', 'master_id' => $andrei->id] ); WorkOrderPart::firstOrCreate( ['company_id' => $psauto->id, 'work_order_id' => $wo->id, 'name' => 'Plăcuțe Brembo P85020'], [ 'article' => 'P85020', 'brand' => 'Brembo', 'qty' => 1, 'unit' => 'set', 'buy_price' => 280, 'sell_price' => 350, 'status' => 'installed', ] ); $wo->refresh()->recalcTotal(); // ─── Furnizori demo ─────────────────────────────────────── $sup1 = Supplier::firstOrCreate( ['company_id' => $psauto->id, 'name' => 'AutoParts Moldova SRL'], [ 'contact_name' => 'Ion Popescu', 'phone' => '+373 22 123456', 'email' => 'sales@autoparts.md', 'website' => 'autoparts.md', 'pay_terms' => 'Net 30', 'delivery_days' => 1, 'rating' => 5, 'discount_pct' => 10, 'categories' => ['Frâne', 'Filtre', 'Ulei'], 'notes' => 'Furnizor principal', ] ); $sup2 = Supplier::firstOrCreate( ['company_id' => $psauto->id, 'name' => 'Inter Cars Moldova'], [ 'contact_name' => 'Maria Lupu', 'phone' => '+373 22 654321', 'email' => 'md@intercars.eu', 'website' => 'intercars.eu', 'pay_terms' => 'Net 14', 'delivery_days' => 2, 'rating' => 4, 'discount_pct' => 8, 'categories' => ['Toate'], 'notes' => 'Catalog european larg', ] ); // ─── Piese demo ─────────────────────────────────────────── Part::firstOrCreate( ['company_id' => $psauto->id, 'article' => 'SHU5W40'], [ 'name' => 'Ulei motor Shell Helix Ultra 5W-40 1L', 'brand' => 'Shell', 'category' => 'Ulei', 'qty' => 12, 'unit' => 'L', 'min_qty' => 5, 'buy_price' => 65, 'sell_price' => 85, 'location' => 'A1-M1', 'preferred_supplier_id' => $sup1->id, ] ); Part::firstOrCreate( ['company_id' => $psauto->id, 'article' => 'W81180'], [ 'name' => 'Filtru ulei Mann W811/80', 'brand' => 'MANN', 'category' => 'Filtre', 'qty' => 8, 'unit' => 'buc', 'min_qty' => 3, 'buy_price' => 32, 'sell_price' => 45, 'location' => 'A2-M3', 'preferred_supplier_id' => $sup1->id, ] ); Part::firstOrCreate( ['company_id' => $psauto->id, 'article' => 'P85020'], [ 'name' => 'Plăcuțe frână Brembo P85020', 'brand' => 'Brembo', 'category' => 'Frâne', 'qty' => 4, 'unit' => 'set', 'min_qty' => 2, 'buy_price' => 280, 'sell_price' => 350, 'location' => 'B2-M1', 'preferred_supplier_id' => $sup1->id, ] ); Part::firstOrCreate( ['company_id' => $psauto->id, 'article' => 'AF12P'], [ 'name' => 'Antigel G12+ 1L', 'brand' => 'Bosch', 'category' => 'Lichide', 'qty' => 0, 'unit' => 'L', 'min_qty' => 10, 'buy_price' => 28, 'sell_price' => 35, 'location' => 'A3-M2', 'preferred_supplier_id' => $sup2->id, ] ); Part::firstOrCreate( ['company_id' => $psauto->id, 'article' => 'BKR6E'], [ 'name' => 'Bujie NGK BKR6E', 'brand' => 'NGK', 'category' => 'Electrică', 'qty' => 16, 'unit' => 'buc', 'min_qty' => 4, 'buy_price' => 35, 'sell_price' => 45, 'location' => 'C1-M1', 'preferred_supplier_id' => $sup2->id, ] ); // ─── Achiziție demo ─────────────────────────────────────── $purchase = Purchase::firstOrCreate( ['company_id' => $psauto->id, 'number' => 'P-26-0001'], [ 'supplier_id' => $sup1->id, 'order_date' => today()->subDays(7), 'expected_at' => today()->subDays(5), 'received_at' => today()->subDays(5), 'paid_at' => today()->subDays(5), 'status' => 'received', 'notes' => 'Plan stoc curent', ] ); $partOil = Part::where('company_id', $psauto->id)->where('article', 'SHU5W40')->first(); if ($partOil) { PurchaseItem::firstOrCreate( ['company_id' => $psauto->id, 'purchase_id' => $purchase->id, 'part_id' => $partOil->id], ['name' => $partOil->name, 'article' => $partOil->article, 'qty' => 12, 'unit' => 'L', 'buy_price' => 65, 'received' => true] ); } $partFilter = Part::where('company_id', $psauto->id)->where('article', 'W81180')->first(); if ($partFilter) { PurchaseItem::firstOrCreate( ['company_id' => $psauto->id, 'purchase_id' => $purchase->id, 'part_id' => $partFilter->id], ['name' => $partFilter->name, 'article' => $partFilter->article, 'qty' => 8, 'unit' => 'buc', 'buy_price' => 32, 'received' => true] ); } $purchase->refresh()->recalcTotal(); // ─── Plăți demo ────────────────────────────────────────── // Plată parțială pe fișa demo (BMW) Payment::firstOrCreate( ['company_id' => $psauto->id, 'work_order_id' => $wo->id, 'paid_at' => today()->subDays(1), 'amount' => 200], ['client_id' => $c1->id, 'method' => 'cash', 'reference' => 'CHIT-001', 'user_id' => $admin->id] ); // ─── Cheltuieli demo ──────────────────────────────────── $expensesData = [ ['salary', 'Salariu Vasile Ivanov', 8000, today()->startOfMonth(), 'cash'], ['salary', 'Salariu Andrei Popov', 7500, today()->startOfMonth(), 'cash'], ['salary', 'Salariu Nicolae Lupu', 7000, today()->startOfMonth(), 'cash'], ['rent', 'Chirie spațiu service (luna curentă)', 4500, today()->startOfMonth(), 'transfer'], ['utilities', 'Electricitate', 850, today()->subDays(15), 'card'], ['purchase', 'Achiziție stoc (P-26-0001)', 1036, today()->subDays(7), 'transfer'], ]; foreach ($expensesData as [$cat, $name, $amount, $date, $method]) { Expense::firstOrCreate( ['company_id' => $psauto->id, 'name' => $name, 'paid_at' => $date], ['category' => $cat, 'amount' => $amount, 'method' => $method, 'user_id' => $admin->id] ); } app(TenantManager::class)->clear(); } }