From 5055d2703c9b8ecd56801a366c88e49c0c3f80d3 Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Fri, 7 Mar 2025 17:11:59 -0300 Subject: [PATCH] Broker Contact --- .../20250215133419_create_broker_data.php | 4 +- .../20250307190931_create_broker_contacts.php | 38 +++ app/resources/routes/proyectos/brokers.php | 2 +- .../views/proyectos/brokers.blade.php | 250 +++++++++++------- .../proyectos/brokers/add_modal.blade.php | 110 ++++++++ app/src/Controller/Proyectos/Brokers.php | 13 +- app/src/Model/Proyecto/Broker.php | 19 +- app/src/Model/Proyecto/Broker/Contact.php | 24 ++ app/src/Model/Proyecto/Broker/Data.php | 6 +- .../Repository/Proyecto/Broker/Contact.php | 60 +++++ app/src/Repository/Proyecto/Broker/Data.php | 14 +- app/src/Service/Proyecto/Broker.php | 36 ++- 12 files changed, 452 insertions(+), 124 deletions(-) create mode 100644 app/resources/database/migrations/20250307190931_create_broker_contacts.php create mode 100644 app/resources/views/proyectos/brokers/add_modal.blade.php create mode 100644 app/src/Model/Proyecto/Broker/Contact.php create mode 100644 app/src/Repository/Proyecto/Broker/Contact.php diff --git a/app/resources/database/migrations/20250215133419_create_broker_data.php b/app/resources/database/migrations/20250215133419_create_broker_data.php index 828114a..62e0f97 100644 --- a/app/resources/database/migrations/20250215133419_create_broker_data.php +++ b/app/resources/database/migrations/20250215133419_create_broker_data.php @@ -25,10 +25,10 @@ final class CreateBrokerData extends AbstractMigration $this->table('broker_data') ->addColumn('broker_rut', 'integer', ['signed' => false, 'null' => false]) - ->addColumn('representative_rut', 'integer', ['signed' => false, 'null' => true, 'default' => null]) + ->addColumn('representative_id', 'integer', ['signed' => false, 'null' => true, 'default' => null]) ->addColumn('legal_name', 'string', ['length' => 255, 'default' => null, 'null' => true]) ->addForeignKey('broker_rut', 'brokers', ['rut'], ['delete' => 'CASCADE', 'update' => 'CASCADE']) - ->addForeignKey('representative_rut', 'personas', ['rut'], ['delete' => 'CASCADE', 'update' => 'CASCADE']) + ->addForeignKey('representative_id', 'broker_contacts', ['id'], ['delete' => 'CASCADE', 'update' => 'CASCADE']) ->create(); $this->execute('SET unique_checks=1; SET foreign_key_checks=1;'); diff --git a/app/resources/database/migrations/20250307190931_create_broker_contacts.php b/app/resources/database/migrations/20250307190931_create_broker_contacts.php new file mode 100644 index 0000000..15aa701 --- /dev/null +++ b/app/resources/database/migrations/20250307190931_create_broker_contacts.php @@ -0,0 +1,38 @@ +execute('SET unique_checks=0; SET foreign_key_checks=0;'); + $this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';"); + $this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';"); + + $this->table('broker_contacts') + ->addColumn('rut', 'integer', ['signed' => false, 'null' => true]) + ->addColumn('digit', 'string', ['length' => 1, 'null' => true]) + ->addColumn('name', 'string', ['length' => 255, 'null' => true]) + ->addColumn('email', 'string', ['length' => 255, 'null' => true]) + ->addColumn('phone', 'string', ['length' => 255, 'null' => true]) + ->addColumn('address_id', 'integer', ['signed' => false, 'null' => true]) + ->addForeignKey('address_id', 'direccion', ['id'], ['delete' => 'CASCADE', 'update' => 'CASCADE']) + ->create(); + + $this->execute('SET unique_checks=1; SET foreign_key_checks=1;'); + } +} diff --git a/app/resources/routes/proyectos/brokers.php b/app/resources/routes/proyectos/brokers.php index 85fa43a..72e7a5e 100644 --- a/app/resources/routes/proyectos/brokers.php +++ b/app/resources/routes/proyectos/brokers.php @@ -2,5 +2,5 @@ use Incoviba\Controller\Proyectos\Brokers; $app->group('/brokers', function($app) { - $app->get('[/]', [Brokers::class, 'projects']); + $app->get('[/]', Brokers::class); }); diff --git a/app/resources/views/proyectos/brokers.blade.php b/app/resources/views/proyectos/brokers.blade.php index 0f60309..00b8302 100644 --- a/app/resources/views/proyectos/brokers.blade.php +++ b/app/resources/views/proyectos/brokers.blade.php @@ -1,119 +1,181 @@ @extends('proyectos.brokers.base') @section('brokers_content') - @include('proyectos.brokers.proyectos') -
+ + + + + + + + + + + @foreach($brokers as $broker) + + + + + + + + @endforeach +
RUTNombreContactoContratos + +
{{$broker->rutFull()}} + data()?->legalName !== '') + data-tooltip="{{ $broker->data()?->legalName }}" data-position="right center" + @endif + > + {{$broker->name}} + + + data()?->representative?->email !== '' || $broker->data()?->representative?->phone !== '') + data-tooltip="{{ ($broker->data()?->representative?->email !== '') ? "Email: " . $broker->data()?->representative?->email : '' }}{{ ($broker->data()?->representative?->phone !== '') ? ' Teléfono: ' . $broker->data()?->representative?->phone : '' }}" data-position="right center" + @endif + > + {{ $broker->data()?->representative?->name }} + + +
+ @foreach($broker->contracts() as $contract) + + @endforeach +
+
+ + +
+ @include('proyectos.brokers.add_modal') @endsection @push('page_scripts') @endpush diff --git a/app/resources/views/proyectos/brokers/add_modal.blade.php b/app/resources/views/proyectos/brokers/add_modal.blade.php new file mode 100644 index 0000000..b85a8b8 --- /dev/null +++ b/app/resources/views/proyectos/brokers/add_modal.blade.php @@ -0,0 +1,110 @@ + + +@include('layout.body.scripts.rut') +@push('page_scripts') + +@endpush diff --git a/app/src/Controller/Proyectos/Brokers.php b/app/src/Controller/Proyectos/Brokers.php index 99dd82a..8807c81 100644 --- a/app/src/Controller/Proyectos/Brokers.php +++ b/app/src/Controller/Proyectos/Brokers.php @@ -2,6 +2,7 @@ namespace Incoviba\Controller\Proyectos; use Incoviba\Common\Implement\Exception\EmptyResult; +use Incoviba\Exception\ServiceAction\Read; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Incoviba\Common\Alias\View; @@ -11,14 +12,12 @@ use Psr\Log\LoggerInterface; class Brokers { - public function projects(ServerRequestInterface $request, ResponseInterface $response, LoggerInterface $logger, Repository\Proyecto $proyectoRepository, View $view): ResponseInterface + public function __invoke(ServerRequestInterface $request, ResponseInterface $response, LoggerInterface $logger, Service\Proyecto\Broker $brokerService, View $view): ResponseInterface { - $projects = []; + $brokers = []; try { - $projects = $proyectoRepository->fetchAll('descripcion'); - } catch (EmptyResult $exception) { - $logger->debug($exception); - } - return $view->render($response, 'proyectos.brokers', compact('projects')); + $brokers = $brokerService->getAll(); + } catch (Read) {} + return $view->render($response, 'proyectos.brokers', compact('brokers')); } } diff --git a/app/src/Model/Proyecto/Broker.php b/app/src/Model/Proyecto/Broker.php index 1b6c38c..e55df74 100644 --- a/app/src/Model/Proyecto/Broker.php +++ b/app/src/Model/Proyecto/Broker.php @@ -9,7 +9,7 @@ class Broker extends Common\Ideal\Model public string $digit; public string $name; - protected ?Broker\Data $data = null; + protected ?Broker\Data $data; public function data(): ?Broker\Data { if (!isset($this->data)) { @@ -18,13 +18,28 @@ class Broker extends Common\Ideal\Model return $this->data; } + protected array $contracts; + public function contracts(): ?array + { + if (!isset($this->contracts)) { + $this->contracts = $this->runFactory('contracts'); + } + return $this->contracts; + } + + public function rutFull(): string + { + return implode('-', [number_format($this->rut, 0, ',', '.'), $this->digit]); + } + public function jsonSerialize(): mixed { return [ 'rut' => $this->rut, 'digit' => $this->digit, 'name' => $this->name, - 'data' => $this->data() + 'data' => $this->data(), + 'rut_full' => $this->rutFull() ]; } } diff --git a/app/src/Model/Proyecto/Broker/Contact.php b/app/src/Model/Proyecto/Broker/Contact.php new file mode 100644 index 0000000..e3d6362 --- /dev/null +++ b/app/src/Model/Proyecto/Broker/Contact.php @@ -0,0 +1,24 @@ + $this->name, + 'email' => $this->email, + 'phone' => $this->phone, + 'address' => $this->address + ]; + } +} diff --git a/app/src/Model/Proyecto/Broker/Data.php b/app/src/Model/Proyecto/Broker/Data.php index e1de89a..e33c1dc 100644 --- a/app/src/Model/Proyecto/Broker/Data.php +++ b/app/src/Model/Proyecto/Broker/Data.php @@ -7,15 +7,15 @@ use Incoviba\Model; class Data extends Common\Ideal\Model { public Model\Proyecto\Broker $broker; - public ?Model\Persona $representative = null; + public ?Model\Proyecto\Broker\Contact $representative = null; public ?string $legalName = null; protected function jsonComplement(): array { return [ 'broker_rut' => $this->broker->rut, - 'representative_rut' => $this->representative?->rut, + 'representative' => $this->representative, 'legal_name' => $this->legalName ]; } -} \ No newline at end of file +} diff --git a/app/src/Repository/Proyecto/Broker/Contact.php b/app/src/Repository/Proyecto/Broker/Contact.php new file mode 100644 index 0000000..a2360f7 --- /dev/null +++ b/app/src/Repository/Proyecto/Broker/Contact.php @@ -0,0 +1,60 @@ +setTable('broker_contacts'); + } + + public function create(?array $data = null): Model\Proyecto\Broker\Contact + { + $map = (new Common\Implement\Repository\MapperParser(['name', 'email', 'phone'])) + ->register('address_id', (new Common\Implement\Repository\Mapper()) + ->setProperty('address') + ->setDefault(null) + ->setFunction(function($data) { + if ($data['address_id'] === null) return null; + try { + return $this->direccionRepository->fetchById($data['address_id']); + } catch (Common\Implement\Exception\EmptyResult) { + return null; + } + })); + return $this->parseData(new Model\Proyecto\Broker\Contact(), $data, $map); + } + public function save(Define\Model $model): Model\Proyecto\Broker\Contact + { + $model->id = $this->saveNew([ + 'name', 'email', 'phone', 'address_id' + ], [ + $model->name, $model->email, $model->phone, $model->address?->id + ]); + return $model; + } + public function edit(Define\Model $model, array $new_data): Model\Proyecto\Broker\Contact + { + return $this->update($model, ['name', 'email', 'phone', 'address_id'], $new_data); + } + + /** + * @param string $name + * @return Model\Proyecto\Broker\Contact + * @throws Common\Implement\Exception\EmptyResult + */ + public function fetchByName(string $name): Model\Proyecto\Broker\Contact + { + $query = $this->connection->getQueryBuilder() + ->select() + ->from($this->getTable()) + ->where('name = :name'); + return $this->fetchOne($query, ['name' => $name]); + } +} diff --git a/app/src/Repository/Proyecto/Broker/Data.php b/app/src/Repository/Proyecto/Broker/Data.php index d2464d5..b3e4191 100644 --- a/app/src/Repository/Proyecto/Broker/Data.php +++ b/app/src/Repository/Proyecto/Broker/Data.php @@ -9,7 +9,7 @@ class Data extends Common\Ideal\Repository { public function __construct(Common\Define\Connection $connection, protected Repository\Proyecto\Broker $brokerRepository, - protected Repository\Persona $personaRepository) + protected Repository\Proyecto\Broker\Contact $contactRepository) { parent::__construct($connection); } @@ -27,13 +27,13 @@ class Data extends Common\Ideal\Repository ->setFunction(function($data) { return $this->brokerRepository->fetchById($data['broker_rut']); })) - ->register('representative_rut', (new Common\Implement\Repository\Mapper()) + ->register('representative_id', (new Common\Implement\Repository\Mapper()) ->setProperty('representative') ->setDefault(null) ->setFunction(function($data) { - if ($data['representative_rut'] == null) return null; + if ($data['representative_id'] === null) return null; try { - return $this->personaRepository->fetchById($data['representative_rut']); + return $this->contactRepository->fetchById($data['representative_id']); } catch (Common\Implement\Exception\EmptyResult) { return null; } @@ -46,8 +46,8 @@ class Data extends Common\Ideal\Repository public function save(Common\Define\Model $model): Model\Proyecto\Broker\Data { $model->id = $this->saveNew( - ['broker_rut', 'representative_rut', 'legal_name'], - [$model->broker->rut, $model->representative?->rut, $model->legalName]); + ['broker_rut', 'representative_id', 'legal_name'], + [$model->broker->rut, $model->representative?->id, $model->legalName]); return $model; } @@ -59,7 +59,7 @@ class Data extends Common\Ideal\Repository */ public function edit(Common\Define\Model $model, array $new_data): Model\Proyecto\Broker\Data { - return $this->update($model, ['representative_rut', 'legal_name'], $new_data); + return $this->update($model, ['representative_id', 'legal_name'], $new_data); } /** diff --git a/app/src/Service/Proyecto/Broker.php b/app/src/Service/Proyecto/Broker.php index f4f61fd..b2d4aa1 100644 --- a/app/src/Service/Proyecto/Broker.php +++ b/app/src/Service/Proyecto/Broker.php @@ -15,7 +15,9 @@ class Broker extends Ideal\Service { public function __construct(LoggerInterface $logger, protected Repository\Proyecto\Broker $brokerRepository, - protected Repository\Proyecto\Broker\Data $dataRepository, protected Service\Persona $personaService) + protected Repository\Proyecto\Broker\Data $dataRepository, + protected Repository\Proyecto\Broker\Contact $contactRepository, + protected Repository\Proyecto\Broker\Contract $contractRepository) { parent::__construct($logger); } @@ -110,9 +112,11 @@ class Broker extends Ideal\Service protected function process(Model\Proyecto\Broker $broker): Model\Proyecto\Broker { $broker->addFactory('data', (new Factory()) - ->setArgs(['broker_rut' => $broker->rut]) - ->setCallable([$this->dataRepository, 'fetchByBroker']) - ); + ->setArgs(['broker_rut' => $broker->rut]) + ->setCallable([$this->dataRepository, 'fetchByBroker'])) + ->addFactory('contracts', (new Factory()) + ->setArgs(['brokerRut' => $broker->rut]) + ->setCallable([$this->contractRepository, 'fetchByBroker'])); return $broker; } @@ -127,11 +131,27 @@ class Broker extends Ideal\Service { $data['broker_rut'] = $broker->rut; $filteredData = $this->dataRepository->filterData($data); - if (isset($filteredData['representative_rut'])) { + if (isset($data['contact'])) { try { - $this->personaService->getById($filteredData['representative_rut']); - } catch (ServiceAction\Read) { - unset($filteredData['representative_rut']); + $representative = $this->contactRepository->fetchByName($data['contact']); + $filteredData['representative_id'] = $representative->id; + } catch (EmptyResult) { + $representativeData = $this->contactRepository->filterData($data); + $representativeData['name'] = $data['contact']; + $representative = $this->contactRepository->create($representativeData); + try { + $representative = $this->contactRepository->save($representative); + $filteredData['representative_id'] = $representative->id; + } catch (PDOException) { + unset($representative); + } + } + } + if (isset($filteredData['representative_id'])) { + try { + $this->contactRepository->fetchById($filteredData['representative_id']); + } catch (EmptyResult) { + unset($filteredData['representative_id']); } } try {