diff --git a/resources/views/livewire/inspections/template-manager.blade.php b/resources/views/livewire/inspections/template-manager.blade.php
index 572fad0..b0905cd 100644
--- a/resources/views/livewire/inspections/template-manager.blade.php
+++ b/resources/views/livewire/inspections/template-manager.blade.php
@@ -2,7 +2,15 @@
π {{ __('Inspection templates') }}
-
+
+
+
@@ -159,4 +167,129 @@
+
+ {{-- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+ MODAL: Importar desde CSV/Excel
+ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ --}}
+ @if($showImportFileModal)
+
+
+
+
+
{{ __('Import from CSV/Excel') }}
+
+
+
+
+ {{ __('Columns: name, label, type, required, options, min, max, step') }}.
+
+
+
+
+
+
+ @error('importTemplateName'){{ $message }}@enderror
+
+
+
+
+ @if($importError)
+
{{ $importError }}
+ @endif
+
+
+
+
+
+ {{-- Vista previa de campos detectados --}}
+ @if(!empty($importPreviewFields))
+
+
{{ count($importPreviewFields) }} {{ __('fields detected') }}:
+
+
+ | {{ __('Label') }} | {{ __('Name') }} | {{ __('Type') }} | {{ __('Required') }} |
+
+ @foreach($importPreviewFields as $f)
+
+ | {{ $f['label'] }} |
+ {{ $f['name'] }} |
+ {{ $f['type'] }} |
+ {{ !empty($f['required']) ? 'β' : '' }} |
+
+ @endforeach
+
+
+
+
+ @endif
+
+
+
+
+
+
+
+ @endif
+
+ {{-- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
+ MODAL: Importar desde otro proyecto
+ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ --}}
+ @if($showImportProjectModal)
+
+
+
+
+
{{ __('Import from another project') }}
+
+
+
+
+
+
+
+
+ @if($importProjectId)
+ @if(count($importableTemplates))
+
+ @foreach($importableTemplates as $t)
+
+ @endforeach
+
+ @else
+
{{ __('This project has no templates.') }}
+ @endif
+ @endif
+
+
+
+
+
+
+
+ @endif
diff --git a/tests/Feature/TemplateImportTest.php b/tests/Feature/TemplateImportTest.php
new file mode 100644
index 0000000..e18b66b
--- /dev/null
+++ b/tests/Feature/TemplateImportTest.php
@@ -0,0 +1,79 @@
+ $ref, 'name' => 'Proyecto ' . $ref, 'address' => 'x',
+ 'lat' => 40.0, 'lng' => -3.0, 'start_date' => now()->toDateString(),
+ 'end_date_estimated' => now()->addMonth()->toDateString(),
+ 'status' => 'in_progress', 'created_by' => $member->id,
+ ]);
+ $p->users()->attach($member->id, ['role_in_project' => 'supervisor']);
+ return $p;
+ }
+
+ public function test_import_templates_from_another_project(): void
+ {
+ $user = User::factory()->create();
+ $source = $this->project($user, 'SRC');
+ $target = $this->project($user, 'DST');
+
+ $tpl = InspectionTemplate::create([
+ 'project_id' => $source->id, 'name' => 'RecepciΓ³n acero',
+ 'fields' => [['name' => 'ok', 'label' => 'OK', 'type' => 'boolean']],
+ ]);
+
+ Livewire::actingAs($user)
+ ->test(TemplateManager::class, ['project' => $target])
+ ->call('openImportProjectModal')
+ ->set('importProjectId', $source->id)
+ ->set('selectedImportTemplateIds', [$tpl->id])
+ ->call('importFromProject')
+ ->assertHasNoErrors();
+
+ $this->assertDatabaseHas('inspection_templates', [
+ 'project_id' => $target->id, 'name' => 'RecepciΓ³n acero',
+ ]);
+ }
+
+ public function test_import_template_from_csv(): void
+ {
+ $user = User::factory()->create();
+ $project = $this->project($user, 'CSV');
+
+ $csv = "name,label,type,required,options,min,max,step\n"
+ . "resistencia,Resistencia,integer,1,,,,\n"
+ . "acabado,Acabado,select,0,bueno;regular;malo,,,\n";
+ $file = UploadedFile::fake()->createWithContent('campos.csv', $csv);
+
+ Livewire::actingAs($user)
+ ->test(TemplateManager::class, ['project' => $project])
+ ->call('openImportFileModal')
+ ->set('importTemplateName', 'Plantilla CSV')
+ ->set('importFile', $file)
+ ->call('parseImportFile')
+ ->assertHasNoErrors()
+ ->call('confirmImportFile');
+
+ $this->assertDatabaseHas('inspection_templates', [
+ 'project_id' => $project->id, 'name' => 'Plantilla CSV',
+ ]);
+ $tpl = InspectionTemplate::where('name', 'Plantilla CSV')->first();
+ $this->assertCount(2, $tpl->fields);
+ }
+}