Explorar o código

feat: :sparkles: feat(importação exames) Foi adicionado uma nova coluna de codigo de exames

Foi adicionado uma nova coluna de codigo de exames, para que fique igual ao que veio no excel na hora de fazer a importação

fase:dev | origin:escopo
kayo henrique hai 1 semana
pai
achega
12c5d058b5

+ 1 - 0
app/Http/Requests/PartnerAgreementServiceRequest.php

@@ -14,6 +14,7 @@ class PartnerAgreementServiceRequest extends FormRequest
         $rules = [
             'partner_agreement_id' => 'sometimes|integer|exists:partner_agreements,id',
             'service_number'       => 'sometimes|nullable|string|max:50',
+            'code_exams'           => 'sometimes|nullable|string|max:50',
             'name'                 => 'sometimes|string|max:255',
             'description'          => 'sometimes|nullable|string',
             'type'                 => ['sometimes', 'nullable', Rule::enum(PartnerAgreementServiceTypeEnum::class)],

+ 1 - 0
app/Http/Resources/PartnerAgreementServiceResource.php

@@ -16,6 +16,7 @@ class PartnerAgreementServiceResource extends JsonResource
             'partner_agreement_id' => $this->partner_agreement_id,
             'partner_agreement'    => $this->whenLoaded('partnerAgreement', fn() => new PartnerAgreementResource($this->partnerAgreement)),
             'service_number'       => $this->service_number,
+            'code_exams'     => $this->code_exams,
             'name'                 => $this->name,
             'description'          => $this->description,
             'type'                 => $this->type,

+ 49 - 25
app/Services/ExamesImportService.php

@@ -41,11 +41,13 @@ class ExamesImportService
             /*
              * Estrutura esperada do Excel:
              *
-             * Coluna 0 = Nome do exame
-             * Coluna 1 = Preço
+             * Coluna 0 = Código do exame
+             * Coluna 1 = Nome do exame
+             * Coluna 2 = Preço
              */
-            $name = $cells->get(0, '');
-            $price = $cells->get(1, '');
+            $codeExams = $cells->get(0, '');
+            $name = $cells->get(1, '');
+            $price = $cells->get(2, '');
 
             /*
              * Ignora linhas sem nome.
@@ -56,25 +58,21 @@ class ExamesImportService
 
             /*
              * Trata cabeçalhos do Excel.
-             *
-             * Exemplos:
-             * EXAME | VALOR
-             * NOME | PREÇO
-             * NOME DO EXAME | PREÇO
              */
+            $codeHeader = mb_strtoupper($codeExams);
             $nameHeader = mb_strtoupper($name);
             $priceHeader = mb_strtoupper($price);
 
             $isHeader =
+                str_contains($codeHeader, 'CÓDIGO') ||
+                str_contains($codeHeader, 'CODIGO') ||
                 $nameHeader === 'EXAME' ||
                 $nameHeader === 'NOME' ||
+                str_contains($nameHeader, 'EXAME') &&
                 (
-                    str_contains($nameHeader, 'EXAME') &&
-                    (
-                        str_contains($priceHeader, 'VALOR') ||
-                        str_contains($priceHeader, 'PREÇO') ||
-                        str_contains($priceHeader, 'PRECO')
-                    )
+                    str_contains($priceHeader, 'VALOR') ||
+                    str_contains($priceHeader, 'PREÇO') ||
+                    str_contains($priceHeader, 'PRECO')
                 );
 
             if ($isHeader) {
@@ -89,17 +87,31 @@ class ExamesImportService
             /*
              * Procura um exame já cadastrado para esse parceiro.
              *
-             * O nome é comparado ignorando:
-             * - maiúsculas/minúsculas
-             * - espaços no início/fim
+             * Primeiro tenta localizar pelo código quando
+             * o código foi informado.
+             */
+            $service = null;
+
+            if ($codeExams !== '') {
+                $service = PartnerAgreementService::withTrashed()
+                    ->where('partner_agreement_id', $partnerAgreementId)
+                    ->where('code_exams', $codeExams)
+                    ->first();
+            }
+
+            /*
+             * Caso não exista código ou não tenha encontrado pelo código,
+             * procura pelo nome.
              */
-            $service = PartnerAgreementService::withTrashed()
-                ->where('partner_agreement_id', $partnerAgreementId)
-                ->whereRaw(
-                    'LOWER(TRIM(name)) = LOWER(TRIM(?))',
-                    [$name]
-                )
-                ->first();
+            if (!$service) {
+                $service = PartnerAgreementService::withTrashed()
+                    ->where('partner_agreement_id', $partnerAgreementId)
+                    ->whereRaw(
+                        'LOWER(TRIM(name)) = LOWER(TRIM(?))',
+                        [$name]
+                    )
+                    ->first();
+            }
 
             /*
              * EXAME JÁ EXISTE
@@ -114,6 +126,17 @@ class ExamesImportService
 
                 $changed = false;
 
+                /*
+                 * Atualiza o código quando informado.
+                 */
+                if (
+                    $codeExams !== '' &&
+                    $service->code_exams !== $codeExams
+                ) {
+                    $service->code_exams = $codeExams;
+                    $changed = true;
+                }
+
                 /*
                  * Atualiza o preço somente quando
                  * o Excel trouxe um preço válido.
@@ -162,6 +185,7 @@ class ExamesImportService
              */
             PartnerAgreementService::create([
                 'partner_agreement_id' => $partnerAgreementId,
+                'code_exams'           => $codeExams !== '' ? $codeExams : null,
                 'name'                 => $name,
                 'associate_price'      => $associatePrice,
                 'type'                 => PartnerAgreementServiceTypeEnum::EXAME,

+ 28 - 0
database/migrations/2026_08_31_105856_add_code_exams_to_partner_agreement_services_table.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('partner_agreement_services', function (Blueprint $table) {
+            $table->string('code_exams')->nullable()->after('name');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('partner_agreement_services', function (Blueprint $table) {
+            $table->dropColumn('code_exams');
+        });
+    }
+};