From 67b15ab337a0f47b3f148f0c6a5067ef7d990c33 Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 29 Apr 2026 08:44:03 +0300 Subject: [PATCH] Seeder for test --- .../database/seeders/ContactSeeder.php | 43 +++++++ .../database/seeders/DatabaseSeeder.php | 4 + .../database/seeders/DeceasedSeeder.php | 40 ++++++ .../database/seeders/InterventionSeeder.php | 91 +++++++++++++ .../seeders/ProductCategorySeeder.php | 118 ++++++++++++++--- .../database/seeders/ProductSeeder.php | 121 ++++++++++++++++++ 6 files changed, 399 insertions(+), 18 deletions(-) create mode 100644 thanasoft-back/database/seeders/ContactSeeder.php create mode 100644 thanasoft-back/database/seeders/DeceasedSeeder.php create mode 100644 thanasoft-back/database/seeders/InterventionSeeder.php create mode 100644 thanasoft-back/database/seeders/ProductSeeder.php diff --git a/thanasoft-back/database/seeders/ContactSeeder.php b/thanasoft-back/database/seeders/ContactSeeder.php new file mode 100644 index 0000000..dec3faf --- /dev/null +++ b/thanasoft-back/database/seeders/ContactSeeder.php @@ -0,0 +1,43 @@ +orderBy('id')->get()->each(function (Client $client, int $index): void { + Contact::updateOrCreate( + [ + 'client_id' => $client->id, + 'email' => sprintf('contact.%d@clients.thanasoft.test', $client->id), + ], + [ + 'first_name' => 'Contact', + 'last_name' => sprintf('Client %d', $client->id), + 'phone' => sprintf('+26134000%04d', $client->id), + 'role' => $index % 2 === 0 ? 'Responsable funéraire' : 'Assistant administratif', + ] + ); + + if ($index < 8) { + Contact::updateOrCreate( + [ + 'client_id' => $client->id, + 'email' => sprintf('famille.%d@clients.thanasoft.test', $client->id), + ], + [ + 'first_name' => 'Référent', + 'last_name' => sprintf('Famille %d', $client->id), + 'phone' => sprintf('+26135000%04d', $client->id), + 'role' => 'Référent famille', + ] + ); + } + }); + } +} \ No newline at end of file diff --git a/thanasoft-back/database/seeders/DatabaseSeeder.php b/thanasoft-back/database/seeders/DatabaseSeeder.php index 7dba4cd..34ec56d 100644 --- a/thanasoft-back/database/seeders/DatabaseSeeder.php +++ b/thanasoft-back/database/seeders/DatabaseSeeder.php @@ -18,8 +18,12 @@ class DatabaseSeeder extends Seeder $this->call(AdminAccessSeeder::class); $this->call(ProductCategorySeeder::class); + $this->call(ProductSeeder::class); $this->call(EmployeeSeeder::class); $this->call(ThanatopractitionerSeeder::class); $this->call(ClientSeeder::class); + $this->call(ContactSeeder::class); + $this->call(DeceasedSeeder::class); + $this->call(InterventionSeeder::class); } } diff --git a/thanasoft-back/database/seeders/DeceasedSeeder.php b/thanasoft-back/database/seeders/DeceasedSeeder.php new file mode 100644 index 0000000..5b68cb7 --- /dev/null +++ b/thanasoft-back/database/seeders/DeceasedSeeder.php @@ -0,0 +1,40 @@ + 'Martin', 'first_name' => 'Jeanne', 'birth_date' => '1942-03-11', 'death_date' => '2026-04-12', 'place_of_death' => 'Antananarivo'], + ['last_name' => 'Rabe', 'first_name' => 'Joseph', 'birth_date' => '1951-07-22', 'death_date' => '2026-04-10', 'place_of_death' => 'Fianarantsoa'], + ['last_name' => 'Rakoto', 'first_name' => 'Marie', 'birth_date' => '1938-12-01', 'death_date' => '2026-04-08', 'place_of_death' => 'Mahajanga'], + ['last_name' => 'Dubois', 'first_name' => 'Henri', 'birth_date' => '1947-09-14', 'death_date' => '2026-04-05', 'place_of_death' => 'Toamasina'], + ['last_name' => 'Rasolo', 'first_name' => 'Lucienne', 'birth_date' => '1955-11-09', 'death_date' => '2026-04-02', 'place_of_death' => 'Antsirabe'], + ['last_name' => 'Petit', 'first_name' => 'Alain', 'birth_date' => '1960-01-19', 'death_date' => '2026-03-30', 'place_of_death' => 'Antananarivo'], + ['last_name' => 'Andriamihaingo', 'first_name' => 'Suzanne', 'birth_date' => '1949-06-17', 'death_date' => '2026-03-27', 'place_of_death' => 'Moramanga'], + ['last_name' => 'Ranaivo', 'first_name' => 'Claude', 'birth_date' => '1958-08-05', 'death_date' => '2026-03-22', 'place_of_death' => 'Antananarivo'], + ['last_name' => 'Simon', 'first_name' => 'Madeleine', 'birth_date' => '1940-10-03', 'death_date' => '2026-03-19', 'place_of_death' => 'Antsiranana'], + ['last_name' => 'Raharisoa', 'first_name' => 'Paul', 'birth_date' => '1953-04-24', 'death_date' => '2026-03-15', 'place_of_death' => 'Toliara'], + ]; + + foreach ($records as $record) { + Deceased::updateOrCreate( + [ + 'last_name' => $record['last_name'], + 'first_name' => $record['first_name'], + 'death_date' => $record['death_date'], + ], + [ + 'birth_date' => $record['birth_date'], + 'place_of_death' => $record['place_of_death'], + 'notes' => 'Donnée de démonstration pour les interventions et le suivi défunt.', + ] + ); + } + } +} \ No newline at end of file diff --git a/thanasoft-back/database/seeders/InterventionSeeder.php b/thanasoft-back/database/seeders/InterventionSeeder.php new file mode 100644 index 0000000..db3cf71 --- /dev/null +++ b/thanasoft-back/database/seeders/InterventionSeeder.php @@ -0,0 +1,91 @@ +whereHas('category', fn ($query) => $query->where('intervention', true)) + ->get(); + $deceasedCollection = Deceased::query()->get(); + $practitioners = Thanatopractitioner::query()->get(); + $clients = Client::query()->limit(12)->get(); + $creatorId = User::query()->value('id'); + $types = ['thanatopraxie', 'toilette_mortuaire', 'exhumation', 'retrait_pacemaker', 'retrait_bijoux', 'autre']; + $statuses = ['demande', 'planifie', 'en_cours', 'termine', 'annule']; + + if ($products->isEmpty() || $deceasedCollection->isEmpty() || $clients->isEmpty()) { + return; + } + + foreach ($clients as $index => $client) { + $location = ClientLocation::updateOrCreate( + [ + 'client_id' => $client->id, + 'name' => 'Site principal', + ], + [ + 'address_line1' => $client->billing_address_line1, + 'address_line2' => $client->billing_address_line2, + 'postal_code' => $client->billing_postal_code, + 'city' => $client->billing_city, + 'country_code' => $client->billing_country_code ?: 'FR', + 'is_default' => true, + ] + ); + + $intervention = Intervention::updateOrCreate( + [ + 'client_id' => $client->id, + 'scheduled_at' => now()->subDays($index)->format('Y-m-d H:i:s'), + 'type' => $types[$index % count($types)], + ], + [ + 'deceased_id' => optional($deceasedCollection->get($index % $deceasedCollection->count()))->id, + 'order_giver' => $faker->name, + 'location_id' => $location->id, + 'product_id' => optional($products->get($index % $products->count()))->id, + 'duration_min' => [60, 75, 90, 120][$index % 4], + 'status' => $statuses[$index % count($statuses)], + 'attachments_count' => 0, + 'notes' => $faker->sentence, + 'created_by' => $creatorId, + ] + ); + + if ($practitioners->isNotEmpty()) { + $principal = $practitioners->get($index % $practitioners->count()); + $assistant = $practitioners->get(($index + 1) % $practitioners->count()); + + $syncData = [ + $principal->id => [ + 'role' => 'principal', + 'assigned_at' => now()->subDays($index), + ], + ]; + + if ($assistant && $assistant->id !== $principal->id) { + $syncData[$assistant->id] = [ + 'role' => 'assistant', + 'assigned_at' => now()->subDays($index)->addMinutes(10), + ]; + } + + $intervention->practitioners()->sync($syncData); + } + } + } +} \ No newline at end of file diff --git a/thanasoft-back/database/seeders/ProductCategorySeeder.php b/thanasoft-back/database/seeders/ProductCategorySeeder.php index d8e834c..3fe0252 100644 --- a/thanasoft-back/database/seeders/ProductCategorySeeder.php +++ b/thanasoft-back/database/seeders/ProductCategorySeeder.php @@ -12,89 +12,171 @@ class ProductCategorySeeder extends Seeder */ public function run(): void { - // Create root categories - $electronique = ProductCategory::create([ + // Create generic root categories + $electronique = ProductCategory::firstOrCreate([ 'code' => 'ELECTRONIQUE', + ], [ 'name' => 'Électronique', 'description' => 'Produits électroniques et technologiques', + 'intervention' => false, 'active' => true, ]); - $alimentaire = ProductCategory::create([ + $alimentaire = ProductCategory::firstOrCreate([ 'code' => 'ALIMENTAIRE', + ], [ 'name' => 'Alimentaire', 'description' => 'Produits alimentaires et boissons', + 'intervention' => false, 'active' => true, ]); - $medical = ProductCategory::create([ + $medical = ProductCategory::firstOrCreate([ 'code' => 'MEDICAL', + ], [ 'name' => 'Médical', 'description' => 'Produits médicaux et pharmaceutiques', + 'intervention' => false, + 'active' => true, + ]); + + $interventions = ProductCategory::firstOrCreate([ + 'code' => 'INTERVENTIONS', + ], [ + 'name' => 'Interventions', + 'description' => 'Catégories de soins et prestations dédiées aux interventions funéraires.', + 'intervention' => true, + 'active' => true, + ]); + + $produits = ProductCategory::firstOrCreate([ + 'code' => 'PRODUITS', + ], [ + 'name' => 'Produits', + 'description' => 'Catégories de produits généraux et consommables.', + 'intervention' => false, 'active' => true, ]); // Create subcategories - ProductCategory::create([ - 'parent_id' => $electronique->id, + ProductCategory::firstOrCreate([ 'code' => 'TELEPHONE', + ], [ + 'parent_id' => $electronique->id, 'name' => 'Téléphones', 'description' => 'Smartphones et téléphones mobiles', + 'intervention' => false, 'active' => true, ]); - ProductCategory::create([ - 'parent_id' => $electronique->id, + ProductCategory::firstOrCreate([ 'code' => 'ORDINATEUR', + ], [ + 'parent_id' => $electronique->id, 'name' => 'Ordinateurs', 'description' => 'Ordinateurs portables et de bureau', + 'intervention' => false, 'active' => true, ]); - ProductCategory::create([ - 'parent_id' => $alimentaire->id, + ProductCategory::firstOrCreate([ 'code' => 'FRUITS', + ], [ + 'parent_id' => $alimentaire->id, 'name' => 'Fruits', 'description' => 'Fruits frais et transformés', + 'intervention' => false, 'active' => true, ]); - ProductCategory::create([ - 'parent_id' => $alimentaire->id, + ProductCategory::firstOrCreate([ 'code' => 'LEGUMES', + ], [ + 'parent_id' => $alimentaire->id, 'name' => 'Légumes', 'description' => 'Légumes frais et transformés', + 'intervention' => false, 'active' => true, ]); - ProductCategory::create([ - 'parent_id' => $medical->id, + ProductCategory::firstOrCreate([ 'code' => 'MEDICAMENT', + ], [ + 'parent_id' => $medical->id, 'name' => 'Médicaments', 'description' => 'Médicaments et traitements', + 'intervention' => false, 'active' => true, ]); - ProductCategory::create([ - 'parent_id' => $medical->id, + ProductCategory::firstOrCreate([ 'code' => 'MATERIEL', + ], [ + 'parent_id' => $medical->id, 'name' => 'Matériel Médical', 'description' => 'Équipements et instruments médicaux', + 'intervention' => false, + 'active' => true, + ]); + + ProductCategory::firstOrCreate([ + 'code' => 'SOINS_THANATO', + ], [ + 'parent_id' => $interventions->id, + 'name' => 'Soins thanatopraxiques', + 'description' => 'Soins de conservation, présentation et préparation du défunt.', + 'intervention' => true, + 'active' => true, + ]); + + ProductCategory::firstOrCreate([ + 'code' => 'PREPARATION_DEFUNT', + ], [ + 'parent_id' => $interventions->id, + 'name' => 'Préparation du défunt', + 'description' => 'Toilette mortuaire, habillage et préparation avant cérémonie.', + 'intervention' => true, + 'active' => true, + ]); + + ProductCategory::firstOrCreate([ + 'code' => 'ACCESSOIRES_FUNERAIRES', + ], [ + 'parent_id' => $produits->id, + 'name' => 'Accessoires funéraires', + 'description' => 'Consommables et accessoires utilisés lors des prestations funéraires.', + 'intervention' => false, + 'active' => true, + ]); + + ProductCategory::firstOrCreate([ + 'code' => 'CONSOMMABLES_SOINS', + ], [ + 'parent_id' => $produits->id, + 'name' => 'Consommables de soins', + 'description' => 'Produits consommables utilisés pendant les soins d\'intervention.', + 'intervention' => false, 'active' => true, ]); // Create some inactive categories for testing - ProductCategory::create([ + ProductCategory::firstOrCreate([ + 'code' => 'COSMETIQUE', + ], [ 'code' => 'COSMETIQUE', 'name' => 'Cosmétique', 'description' => 'Produits cosmétiques et de beauté', + 'intervention' => false, 'active' => false, ]); - ProductCategory::create([ + ProductCategory::firstOrCreate([ + 'code' => 'MENAGE', + ], [ 'code' => 'MENAGE', 'name' => 'Ménage', 'description' => 'Produits d\'entretien et de nettoyage', + 'intervention' => false, 'active' => false, ]); } diff --git a/thanasoft-back/database/seeders/ProductSeeder.php b/thanasoft-back/database/seeders/ProductSeeder.php new file mode 100644 index 0000000..a2fe0b3 --- /dev/null +++ b/thanasoft-back/database/seeders/ProductSeeder.php @@ -0,0 +1,121 @@ + 'Soin de thanatopraxie standard', + 'reference' => 'INT-THAN-001', + 'category_code' => 'SOINS_THANATO', + 'fabricant' => 'Thanasoft Care', + 'stock_actuel' => 50, + 'stock_minimum' => 10, + 'unite' => 'prestation', + 'prix_unitaire' => 320.00, + 'conditionnement_nom' => 'Unité', + 'conditionnement_quantite' => 1, + 'conditionnement_unite' => 'prestation', + ], + [ + 'nom' => 'Toilette mortuaire complète', + 'reference' => 'INT-TOIL-001', + 'category_code' => 'PREPARATION_DEFUNT', + 'fabricant' => 'Thanasoft Care', + 'stock_actuel' => 40, + 'stock_minimum' => 8, + 'unite' => 'prestation', + 'prix_unitaire' => 180.00, + 'conditionnement_nom' => 'Unité', + 'conditionnement_quantite' => 1, + 'conditionnement_unite' => 'prestation', + ], + [ + 'nom' => 'Retrait pacemaker', + 'reference' => 'INT-PACE-001', + 'category_code' => 'PREPARATION_DEFUNT', + 'fabricant' => 'Thanasoft Care', + 'stock_actuel' => 20, + 'stock_minimum' => 4, + 'unite' => 'prestation', + 'prix_unitaire' => 95.00, + 'conditionnement_nom' => 'Unité', + 'conditionnement_quantite' => 1, + 'conditionnement_unite' => 'prestation', + ], + [ + 'nom' => 'Kit de soins de conservation', + 'reference' => 'PROD-SOIN-001', + 'category_code' => 'CONSOMMABLES_SOINS', + 'fabricant' => 'Mortuary Supply', + 'stock_actuel' => 120, + 'stock_minimum' => 25, + 'unite' => 'kit', + 'prix_unitaire' => 42.50, + 'conditionnement_nom' => 'Carton', + 'conditionnement_quantite' => 10, + 'conditionnement_unite' => 'kit', + ], + [ + 'nom' => 'Housse funéraire premium', + 'reference' => 'PROD-HOUS-001', + 'category_code' => 'ACCESSOIRES_FUNERAIRES', + 'fabricant' => 'Funeral Equip', + 'stock_actuel' => 75, + 'stock_minimum' => 15, + 'unite' => 'unité', + 'prix_unitaire' => 28.90, + 'conditionnement_nom' => 'Paquet', + 'conditionnement_quantite' => 5, + 'conditionnement_unite' => 'unité', + ], + [ + 'nom' => 'Produit de désinfection mortuaire', + 'reference' => 'PROD-DES-001', + 'category_code' => 'CONSOMMABLES_SOINS', + 'fabricant' => 'Mortuary Supply', + 'stock_actuel' => 90, + 'stock_minimum' => 20, + 'unite' => 'litre', + 'prix_unitaire' => 14.75, + 'conditionnement_nom' => 'Bidon', + 'conditionnement_quantite' => 5, + 'conditionnement_unite' => 'litre', + ], + ]; + + foreach ($products as $data) { + $category = ProductCategory::where('code', $data['category_code'])->first(); + + if (! $category) { + continue; + } + + Product::updateOrCreate( + ['reference' => $data['reference']], + [ + 'nom' => $data['nom'], + 'categorie_id' => $category->id, + 'fabricant' => $data['fabricant'], + 'stock_actuel' => $data['stock_actuel'], + 'stock_minimum' => $data['stock_minimum'], + 'unite' => $data['unite'], + 'prix_unitaire' => $data['prix_unitaire'], + 'conditionnement_nom' => $data['conditionnement_nom'], + 'conditionnement_quantite' => $data['conditionnement_quantite'], + 'conditionnement_unite' => $data['conditionnement_unite'], + 'date_expiration' => null, + 'numero_lot' => null, + 'fournisseur_id' => null, + ] + ); + } + } +} \ No newline at end of file