Browse Source

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 1 week ago
parent
commit
12c5d058b5

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

@@ -14,6 +14,7 @@ class PartnerAgreementServiceRequest extends FormRequest
         $rules = [
         $rules = [
             'partner_agreement_id' => 'sometimes|integer|exists:partner_agreements,id',
             'partner_agreement_id' => 'sometimes|integer|exists:partner_agreements,id',
             'service_number'       => 'sometimes|nullable|string|max:50',
             'service_number'       => 'sometimes|nullable|string|max:50',
+            'code_exams'           => 'sometimes|nullable|string|max:50',
             'name'                 => 'sometimes|string|max:255',
             'name'                 => 'sometimes|string|max:255',
             'description'          => 'sometimes|nullable|string',
             'description'          => 'sometimes|nullable|string',
             'type'                 => ['sometimes', 'nullable', Rule::enum(PartnerAgreementServiceTypeEnum::class)],
             '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_id' => $this->partner_agreement_id,
             'partner_agreement'    => $this->whenLoaded('partnerAgreement', fn() => new PartnerAgreementResource($this->partnerAgreement)),
             'partner_agreement'    => $this->whenLoaded('partnerAgreement', fn() => new PartnerAgreementResource($this->partnerAgreement)),
             'service_number'       => $this->service_number,
             'service_number'       => $this->service_number,
+            'code_exams'     => $this->code_exams,
             'name'                 => $this->name,
             'name'                 => $this->name,
             'description'          => $this->description,
             'description'          => $this->description,
             'type'                 => $this->type,
             'type'                 => $this->type,

+ 49 - 25
app/Services/ExamesImportService.php

@@ -41,11 +41,13 @@ class ExamesImportService
             /*
             /*
              * Estrutura esperada do Excel:
              * 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.
              * Ignora linhas sem nome.
@@ -56,25 +58,21 @@ class ExamesImportService
 
 
             /*
             /*
              * Trata cabeçalhos do Excel.
              * Trata cabeçalhos do Excel.
-             *
-             * Exemplos:
-             * EXAME | VALOR
-             * NOME | PREÇO
-             * NOME DO EXAME | PREÇO
              */
              */
+            $codeHeader = mb_strtoupper($codeExams);
             $nameHeader = mb_strtoupper($name);
             $nameHeader = mb_strtoupper($name);
             $priceHeader = mb_strtoupper($price);
             $priceHeader = mb_strtoupper($price);
 
 
             $isHeader =
             $isHeader =
+                str_contains($codeHeader, 'CÓDIGO') ||
+                str_contains($codeHeader, 'CODIGO') ||
                 $nameHeader === 'EXAME' ||
                 $nameHeader === 'EXAME' ||
                 $nameHeader === 'NOME' ||
                 $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) {
             if ($isHeader) {
@@ -89,17 +87,31 @@ class ExamesImportService
             /*
             /*
              * Procura um exame já cadastrado para esse parceiro.
              * 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
              * EXAME JÁ EXISTE
@@ -114,6 +126,17 @@ class ExamesImportService
 
 
                 $changed = false;
                 $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
                  * Atualiza o preço somente quando
                  * o Excel trouxe um preço válido.
                  * o Excel trouxe um preço válido.
@@ -162,6 +185,7 @@ class ExamesImportService
              */
              */
             PartnerAgreementService::create([
             PartnerAgreementService::create([
                 'partner_agreement_id' => $partnerAgreementId,
                 'partner_agreement_id' => $partnerAgreementId,
+                'code_exams'           => $codeExams !== '' ? $codeExams : null,
                 'name'                 => $name,
                 'name'                 => $name,
                 'associate_price'      => $associatePrice,
                 'associate_price'      => $associatePrice,
                 'type'                 => PartnerAgreementServiceTypeEnum::EXAME,
                 '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');
+        });
+    }
+};