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')
-
+
+
+
+ RUT |
+ Nombre |
+ Contacto |
+ Contratos |
+
+
+ |
+
+
+ @foreach($brokers as $broker)
+
+ {{$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
+
+ |
+
+
+
+ |
+
+ @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 @@
+
+
+
+
+
+ Cancelar
+
+
+ Agregar
+
+
+
+
+
+@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 {