Promociones para cada subdivicion

This commit is contained in:
Juan Pablo Vial
2025-04-03 16:32:40 -03:00
parent b5d6d0acb9
commit 7b2df74e4d
19 changed files with 495 additions and 247 deletions

View File

@ -17,11 +17,15 @@ final class AlterPromotionsRemovePrice extends AbstractMigration
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change(): void
public function up(): void
{
$this->table('promotions')
->dropForeignKey('price_id')
->removeColumn('price_id')
->update();
if ($this->table('promotions')->hasColumn('price_id')) {
$this->table('promotions')
->dropForeignKey('price_id')
->removeColumn('price_id')
->update();
}
}
public function down(): void {}
}

View File

@ -17,11 +17,12 @@ final class AlterPromotionsNullDates extends AbstractMigration
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change(): void
public function up(): void
{
$this->table('promotions')
->changeColumn('end_date', 'date', ['null' => true])
->changeColumn('valid_until', 'date', ['null' => true])
->update();
}
public function down(): void {}
}

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
use Phinx\Migration\AbstractMigration;
final class CreatePromotionContract extends AbstractMigration
final class CreatePromotionBrokers extends AbstractMigration
{
/**
* Change Method.
@ -19,12 +19,11 @@ final class CreatePromotionContract extends AbstractMigration
*/
public function change(): void
{
$this->table('promotion_contracts')
$this->table('promotion_brokers')
->addColumn('promotion_id', 'integer', ['signed' => false, 'null' => false])
->addColumn('contract_id', 'integer', ['signed' => false, 'null' => false])
->addColumn('created_at', 'datetime', ['null' => false, 'default' => 'CURRENT_TIMESTAMP'])
->addColumn('broker_rut', 'integer', ['signed' => false, 'null' => false])
->addForeignKey('promotion_id', 'promotions', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
->addForeignKey('contract_id', 'broker_contracts', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
->addForeignKey('broker_rut', 'brokers', 'rut', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
->create();
}
}

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
use Phinx\Migration\AbstractMigration;
final class CreatePromotionContractUnits extends AbstractMigration
final class CreatePromotionUnitLines extends AbstractMigration
{
/**
* Change Method.
@ -19,13 +19,11 @@ final class CreatePromotionContractUnits extends AbstractMigration
*/
public function change(): void
{
$this->table('promotion_contract_units')
$this->table('promotion_unit_lines')
->addColumn('promotion_id', 'integer', ['signed' => false, 'null' => false])
->addColumn('contract_id', 'integer', ['signed' => false, 'null' => false])
->addColumn('unit_id', 'integer', ['signed' => false, 'null' => false])
->addForeignKey('promotion_id', 'promotions', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
->addForeignKey('contract_id', 'broker_contracts', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
->addForeignKey('unit_id', 'unidad', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
->addColumn('unit_line_id', 'integer', ['signed' => false, 'null' => false])
->addForeignKey('promotion_id', 'promotions', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
->addForeignKey('unit_line_id', 'proyecto_tipo_unidad', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
->create();
}
}

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
use Phinx\Migration\AbstractMigration;
final class CreatePromotionUnitTypes extends AbstractMigration
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change(): void
{
$this->table('promotion_unit_types')
->addColumn('promotion_id', 'integer', ['signed' => false, 'null' => false])
->addColumn('project_id', 'integer', ['signed' => false, 'null' => false])
->addColumn('unit_type_id', 'integer', ['signed' => false, 'null' => false])
->addForeignKey('promotion_id', 'promotions', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
->addForeignKey('project_id', 'proyecto', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
->addForeignKey('unit_type_id', 'tipo_unidad', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
->create();
}
}

View File

@ -11,12 +11,12 @@ $app->group('/promotion/{promotion_id}', function($app) {
$app->post('/add[/]', [Promotions::class, 'addConnections']);
$app->group('/project/{project_id}', function($app) {
$app->delete('[/]', [Promotions::class, 'removeProject']);
$app->group('/unit-type/{unit_type_id}', function($app) {
$app->delete('[/]', [Promotions::class, 'removeUnitType']);
});
});
$app->group('/contract/{contract_id}', function($app) {
$app->delete('[/]', [Promotions::class, 'removeContract']);
});
$app->group('/unit-type/{unit_type_id}', function($app) {
$app->delete('[/]', [Promotions::class, 'removeUnitType']);
$app->group('/broker/{broker_rut}', function($app) {
$app->delete('[/]', [Promotions::class, 'removeBroker']);
});
$app->group('/unit-line/{unit_line_id}', function($app) {
$app->delete('[/]', [Promotions::class, 'removeUnitLine']);

View File

@ -44,7 +44,7 @@
@push('page_scripts')
<script>
class ContractTable {
class ConnectionTable {
table
constructor(tab) {
const parent = document.querySelector(`.ui.tab.segment[data-tab="${tab}"]`)
@ -70,7 +70,7 @@
parent.appendChild(this.table)
}
static fromProjects(data) {
const table = new ContractTable('projects_table')
const table = new ConnectionTable('projects_table')
data.forEach(project => {
const row = document.createElement('tr')
row.innerHTML = [
@ -93,15 +93,15 @@
})
}
static fromBrokers(data) {
const table = new ContractTable('brokers_table')
data.forEach(contract => {
const table = new ConnectionTable('brokers_table')
data.forEach(broker => {
const row = document.createElement('tr')
row.innerHTML = [
`<td>${contract.project.descripcion}</td>`,
`<td>${contract.broker.name}</td>`,
`<td>Todos los Proyectos</td>`,
`<td>${broker.name}</td>`,
'<td colspan="3">Todas las Unidades</td>',
`<td class="right aligned">`,
`<button class="ui red icon button remove_button broker" data-id="${contract.id}">`,
`<button class="ui red icon button remove_button broker" data-id="${broker.rut}">`,
'<i class="plus icon"></i>',
'</button>',
`</td>`
@ -110,13 +110,13 @@
})
document.querySelectorAll('.remove_button.broker').forEach(button => {
button.addEventListener('click', () => {
const contract_id = button.dataset.id
promotion.remove().contract(contract_id)
const broker_rut = button.dataset.id
promotion.remove().broker(broker_rut)
})
})
}
static fromUnitTypes(data) {
const table = new ContractTable('unit-types_table')
const table = new ConnectionTable('unit-types_table')
data.forEach(unitType => {
const row = document.createElement('tr')
const tipo = unitType.unitType.descripcion
@ -141,7 +141,7 @@
})
}
static fromUnitLines(data) {
const table = new ContractTable('unit-lines_table')
const table = new ConnectionTable('unit-lines_table')
data.forEach(unitLine => {
const row = document.createElement('tr')
const tipo = unitLine.tipo_unidad.descripcion
@ -166,7 +166,7 @@
})
}
static fromUnits(data) {
const table = new ContractTable('units_table')
const table = new ConnectionTable('units_table')
data.forEach(unit => {
const row = document.createElement('tr')
const tipo = unit.proyecto_tipo_unidad.tipo_unidad.descripcion
@ -223,8 +223,8 @@
}
})
},
contract: contract_id => {
const url = `{{$urls->api}}/ventas/promotion/{{ $promotion->id }}/connections/contract/${contract_id}`
broker: broker_rut => {
const url = `{{$urls->api}}/ventas/promotion/{{ $promotion->id }}/connections/broker/${broker_rut}`
const method = 'delete'
return APIClient.fetch(url, {method}).then(response => response.json()).then(json => {
if (json.success) {
@ -271,36 +271,36 @@
this.watch().add()
@if (count($promotion->projects()) > 0)
ContractTable.fromProjects({!! json_encode($promotion->projects()) !!})
ConnectionTable.fromProjects({!! json_encode($promotion->projects()) !!})
@else
ContractTable.fromProjects([])
ConnectionTable.fromProjects([])
@endif
@if (count($promotion->contracts()) > 0)
ContractTable.fromBrokers({!! json_encode(array_map(function($contract) {$arr = json_decode(json_encode($contract));$arr['project'] = $contract->project; $arr['broker'] = $contract->broker;},$promotion->contracts())) !!})
@if (count($promotion->brokers()) > 0)
ConnectionTable.fromBrokers({!! json_encode($promotion->brokers()) !!})
@else
ContractTable.fromBrokers([])
ConnectionTable.fromBrokers([])
@endif
@if (count($promotion->unitTypes()) > 0)
ContractTable.fromUnitTypes({!! json_encode($promotion->unitTypes()) !!})
ConnectionTable.fromUnitTypes({!! json_encode($promotion->unitTypes()) !!})
@else
ContractTable.fromUnitTypes([])
ConnectionTable.fromUnitTypes([])
@endif
@if (count($promotion->unitLines()) > 0)
ContractTable.fromUnitLines({!! json_encode($promotion->unitLines()) !!})
ConnectionTable.fromUnitLines({!! json_encode($promotion->unitLines()) !!})
@else
ContractTable.fromUnitLines([])
ConnectionTable.fromUnitLines([])
@endif
@if (count($promotion->units()) > 0)
ContractTable.fromUnits({!! json_encode($promotion->units()) !!})
ConnectionTable.fromUnits({!! json_encode($promotion->units()) !!})
@else
ContractTable.fromUnits([])
ConnectionTable.fromUnits([])
@endif
}
}
$(document).ready(() => {
promotion.setup({
menu: 'tables_tab_menu',
table: 'contracts',
table: 'connections',
button: {
add: 'add_button'
}

View File

@ -7,7 +7,7 @@
<input type="hidden" name="promotion_id" value="{{$promotion->id}}" />
<div class="field" id="type">
<label>Tipo</label>
@foreach (['Proyecto' => 'project', 'Operador' => 'operator', 'Tipo' => 'type', 'Línea' => 'line', 'Unidad' => 'unit'] as $type => $value)
@foreach (['Proyecto' => 'project', 'Operador' => 'broker', 'Tipo' => 'type', 'Línea' => 'line', 'Unidad' => 'unit'] as $type => $value)
<div class="ui radio checkbox type" data-tab="{{ $value }}">
<input type="radio" name="type" value="{{$value}}" @if ($value === 'project') checked="checked"@endif />
<label>{{$type}}</label>
@ -29,16 +29,16 @@
</div>
</div>
</div>
<div class="ui tab segment" data-tab="operator">
<div class="ui tab segment" data-tab="broker">
<div class="field">
<label>Operador</label>
<div class="ui search multiple selection dropdown" id="operator">
<input type="hidden" name="operator[]" />
<div class="ui search multiple selection dropdown" id="broker">
<input type="hidden" name="broker[]" />
<i class="dropdown icon"></i>
<div class="default text">Operador</div>
<div class="menu">
@foreach ($contracts as $contract)
<div class="item" data-value="{{$contract->id}}">{{$contract->broker->name}} - {{$contract->project->descripcion}}</div>
@foreach ($brokers as $broker)
<div class="item" data-value="{{$broker->rut}}">{{$broker->name}}</div>
@endforeach
</div>
</div>
@ -152,7 +152,7 @@
line: 'line',
unit_project: 'unit_project',
unit: 'unit',
operator: 'operator'
broker: 'broker'
}
this.modal = $(`#${this.ids.modal}`).modal({
onApprove: () => {

View File

@ -163,10 +163,10 @@ class Contracts
try {
$unit = $unitRepository->fetchById($unit_id);
$contractService->getById($contract_id);
$promotion = $promotionRepository->fetchByContractAndUnit($contract_id, $unit->id);
$promotions = $promotionRepository->fetchByContractAndUnit($contract_id, $unit->id);
$output['unidades'] []= [
'id' => $unit->id,
'promotion' => $promotion
'promotions' => $promotions
];
} catch (ServiceAction\Read | Implement\Exception\EmptyResult) {}
}

View File

@ -127,14 +127,14 @@ class Promotions
}
}
}
if (count($input['operator']) > 0 and $input['operator'][0] !== '') {
$contract_ids = array_filter($input['operator'], function($operator_id) { return $operator_id !== ''; });
$total += count($contract_ids);
foreach ($contract_ids as $contract_id) {
if (count($input['broker']) > 0 and $input['broker'][0] !== '') {
$broker_ruts = array_filter($input['broker'], function($broker_rut) { return $broker_rut !== ''; });
$total += count($broker_ruts);
foreach ($broker_ruts as $broker_rut) {
try {
$promotionService->addContract($promotion_id, $contract_id);
$promotionService->addBroker($promotion_id, $broker_rut);
$output['connections'] []= [
'operator_id' => $contract_id,
'broker_rut' => $broker_rut,
'success' => true,
];
$output['partial'] = true;
@ -205,11 +205,79 @@ class Promotions
$output = [
'promotion_id' => $promotion_id,
'project_id' => $project_id,
'connection' => null,
'success' => false,
];
try {
$output['connection'] = $promotionService->removeProject($promotion_id, $project_id);
$promotionService->removeProject($promotion_id, $project_id);
$output['success'] = true;
} catch (ServiceAction\Delete $exception) {
return $this->withError($response, $exception);
}
return $this->withJson($response, $output);
}
public function removeBroker(ServerRequestInterface $request, ResponseInterface $response,
Service\Venta\Promotion $promotionService,
int $promotion_id, string $broker_rut): ResponseInterface
{
$output = [
'promotion_id' => $promotion_id,
'broker_rut' => $broker_rut,
'success' => false,
];
try {
$promotionService->removeBroker($promotion_id, $broker_rut);
$output['success'] = true;
} catch (ServiceAction\Delete $exception) {
return $this->withError($response, $exception);
}
return $this->withJson($response, $output);
}
public function removeUnitType(ServerRequestInterface $request, ResponseInterface $response,
Service\Venta\Promotion $promotionService,
int $promotion_id, int $project_id, int $unit_type_id): ResponseInterface
{
$output = [
'promotion_id' => $promotion_id,
'project_id' => $project_id,
'unit_type_id' => $unit_type_id,
'success' => false,
];
try {
$promotionService->removeUnitType($promotion_id, $project_id, $unit_type_id);
$output['success'] = true;
} catch (ServiceAction\Delete $exception) {
return $this->withError($response, $exception);
}
return $this->withJson($response, $output);
}
public function removeUnitLine(ServerRequestInterface $request, ResponseInterface $response,
Service\Venta\Promotion $promotionService,
int $promotion_id, int $unit_line_id): ResponseInterface
{
$output = [
'promotion_id' => $promotion_id,
'unit_line_id' => $unit_line_id,
'success' => false,
];
try {
$promotionService->removeUnitLine($promotion_id, $unit_line_id);
$output['success'] = true;
} catch (ServiceAction\Delete $exception) {
return $this->withError($response, $exception);
}
return $this->withJson($response, $output);
}
public function removeUnit(ServerRequestInterface $request, ResponseInterface $response,
Service\Venta\Promotion $promotionService,
int $promotion_id, int $unit_id): ResponseInterface
{
$output = [
'promotion_id' => $promotion_id,
'unit_id' => $unit_id,
'success' => false,
];
try {
$promotionService->removeUnit($promotion_id, $unit_id);
$output['success'] = true;
} catch (ServiceAction\Delete $exception) {
return $this->withError($response, $exception);

View File

@ -19,7 +19,7 @@ class Promotions extends Ideal\Controller
}
public function show(ServerRequestInterface $request, ResponseInterface $response, View $view,
Service\Venta\Promotion $promotionService, Service\Proyecto $proyectoService,
Service\Proyecto\Broker $brokerService, Service\Proyecto\Broker\Contract $contractService,
Service\Proyecto\Broker $brokerService,
int $promotion_id): ResponseInterface
{
$promotion = null;
@ -27,9 +27,8 @@ class Promotions extends Ideal\Controller
$promotion = $promotionService->getById($promotion_id);
} catch (ServiceAction\Read) {}
$projects = $proyectoService->getVendibles('descripcion');
$contracts = $contractService->getAll();
$brokers = $brokerService->getAll('name');
return $view->render($response, 'ventas.promotions.show', ['promotion' => $promotion,
'projects' => $projects, 'contracts' => $contracts, 'brokers' => $brokers]);
'projects' => $projects, 'brokers' => $brokers]);
}
}

View File

@ -26,13 +26,13 @@ class Promotion extends Common\Ideal\Model
return $this->projects;
}
protected array $contracts;
public function contracts(): array
protected array $brokers;
public function brokers(): array
{
if (empty($this->contracts)) {
$this->contracts = $this->runFactory('contracts') ?? [];
if (empty($this->brokers)) {
$this->brokers = $this->runFactory('brokers') ?? [];
}
return $this->contracts;
return $this->brokers;
}
protected array $unitTypes;
@ -61,15 +61,6 @@ class Promotion extends Common\Ideal\Model
return $this->units;
}
protected array $contractUnits;
public function contractUnits(): array
{
if (empty($this->contractUnits)) {
$this->contractUnits = $this->runFactory('contractUnits');
}
return $this->contractUnits;
}
public function value(float $price): float
{
if ($this->type === Type::FIXED) {
@ -89,7 +80,7 @@ class Promotion extends Common\Ideal\Model
'type' => $this->type,
'state' => $this->state,
'projects' => $this->projects() ?? [],
'contracts' => $this->contracts() ?? [],
'contracts' => $this->brokers() ?? [],
'units' => $this->units() ?? []
];
}

View File

@ -179,14 +179,8 @@ class Proyecto extends Ideal\Repository
$query = $this->connection->getQueryBuilder()
->select('a.*')
->from("{$this->getTable()} a")
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu ON ptu.proyecto = a.id')
->joined('LEFT OUTER JOIN unidad ON unidad.pt = ptu.id')
->joined('LEFT OUTER JOIN promotion_units pu ON pu.unit_id = unidad.id')
->joined('LEFT OUTER JOIN broker_contracts bc ON bc.project_id = a.id')
->joined('LEFT OUTER JOIN promotion_contracts pc ON pc.contract_id = bc.id')
->where('pu.promotion_id = :promotion_id OR pc.promotion_id = :promotion_id')
->group('a.id');
trigger_error($query . ' ' . json_encode(['promotion_id' => $promotion_id]));
->joined('INNER JOIN promotion_projects pp ON pp.project_id = a.id')
->where('pp.promotion_id = :promotion_id');
return $this->fetchMany($query, ['promotion_id' => $promotion_id]);
}
/*public function fetchSuperficieVendido(int $proyecto_id): float

View File

@ -60,4 +60,19 @@ class Broker extends Common\Ideal\Repository
->where('name = :name');
return $this->fetchOne($query, ['name' => $name]);
}
/**
* @param int $promotion_id
* @return array
* @throws Common\Implement\Exception\EmptyResult
*/
public function fetchByPromotion(int $promotion_id): array
{
$query = $this->connection->getQueryBuilder()
->select('a.*')
->from("{$this->getTable()} a")
->joined('INNER JOIN promotion_brokers pb ON pb.broker_rut = a.rut')
->where('pb.promotion_id = :promotion_id');
return $this->fetchMany($query, ['promotion_id' => $promotion_id]);
}
}

View File

@ -128,21 +128,6 @@ class Contract extends Common\Ideal\Repository
return $this->fetchOne($query, ['project_id' => $projectId, 'broker_rut' => $brokerRut, 'state' => Model\Proyecto\Broker\Contract\State\Type::ACTIVE->value]);
}
/**
* @param int $promotion_id
* @return array
* @throws Common\Implement\Exception\EmptyResult
*/
public function fetchByPromotion(int $promotion_id): array
{
$query = $this->connection->getQueryBuilder()
->select('a.*')
->from("{$this->getTable()} a")
->joined('INNER JOIN promotion_contracts pc ON pc.contract_id = a.id')
->where('pc.promotion_id = :promotion_id');
return $this->fetchMany($query, ['promotion_id' => $promotion_id]);
}
protected function statusJoin(): string
{
return 'INNER JOIN (SELECT bcs1.* FROM broker_contract_states bcs1 INNER JOIN (SELECT MAX(id) AS id, contract_id FROM broker_contract_states GROUP BY contract_id) bcs0 ON bcs0.id = bcs1.id) bcs ON bcs.contract_id = a.id';

View File

@ -54,9 +54,8 @@ class ProyectoTipoUnidad extends Ideal\Repository
$query = $this->connection->getQueryBuilder()
->select('a.*')
->from("{$this->getTable()} a")
->joined('INNER JOIN unidad ON unidad.`pt` = a.`id`')
->joined('INNER JOIN `promotion_units` pu ON pu.`unit_id` = unidad.`id`')
->where('pu.`promotion_id` = :promotion_id')
->joined('INNER JOIN promotion_unit_lines pul ON pul.unit_line_id = a.id')
->where('pul.`promotion_id` = :promotion_id')
->group('a.id');
return $this->fetchMany($query, ['promotion_id' => $promotion_id]);
}

View File

@ -59,12 +59,10 @@ class TipoUnidad extends Ideal\Repository
public function fetchByPromotion(int $promotion_id): array
{
$query = $this->connection->getQueryBuilder()
->select('a.id, ptu.proyecto AS project_id')
->select('a.id, put.project_id')
->from("{$this->getTable()} a")
->joined('INNER JOIN proyecto_tipo_unidad ptu ON ptu.`tipo` = a.`id`')
->joined('INNER JOIN unidad ON unidad.`pt` = ptu.`id`')
->joined('INNER JOIN `promotion_units` pu ON pu.`unit_id` = unidad.`id`')
->where('pu.`promotion_id` = :promotion_id')
->joined('INNER JOIN promotion_unit_types put ON put.`unit_type_id` = a.`id`')
->where('put.`promotion_id` = :promotion_id')
->group('a.id');
try {
$result = $this->connection->execute($query, ['promotion_id' => $promotion_id])->fetchAll(PDO::FETCH_ASSOC);

View File

@ -75,10 +75,23 @@ class Promotion extends Common\Ideal\Repository
public function fetchByContract(int $contract_id): array
{
$query = $this->connection->getQueryBuilder()
->select('a.*')
->select('DISTINCT a.*')
->from("{$this->getTable()} a")
->joined('INNER JOIN promotion_contracts pc ON pc.promotion_id = a.id')
->where('pc.contract_id = :contract_id');
->joined('LEFT OUTER JOIN promotion_broker pb ON pb.promotion_id = a.id')
->joined('LEFT OUTER JOIN broker_contracts bc ON bc.id = pb.contract_id')
->joined('LEFT OUTER JOIN promotion_projects pp ON pp.promotion_id = a.id')
->joined('LEFT OUTER JOIN broker_contracts bc2 ON bc2.project_id = pp.project_id')
->joined('LEFT OUTER JOIN promotion_unit_types put ON put.promotion_id = a.id')
->joined('LEFT OUTER JOIN broker_contracts bc3 ON bc3.project_id = put.project_id')
->joined('LEFT OUTER JOIN promotion_unit_lines pul ON pul.promotion_id = a.id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu ON ptu.id = pul.unit_line_id')
->joined('LEFT OUTER JOIN broker_contracts bc4 ON bc4.project_id = btu.proyecto')
->joined('LEFT OUTER JOIN promotion_units pu ON pu.promotion_id = a.id')
->joined('LEFT OUTER JOIN unidad ON unidad.id = pu.unit_id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu2 ON ptu2.id = unidad.pt')
->joined('LEFT OUTER JOIN broker_contracts bc5 ON bc5.project_id = ptu2.proyecto')
->where('bc.id = :contract_id OR bc2.id = :contract_id OR bc3.id = :contract_id OR bc4.id = :contract_id OR bc5.id = :contract_id')
->group('a.id');
return $this->fetchMany($query, ['contract_id' => $contract_id]);
}
@ -90,10 +103,23 @@ class Promotion extends Common\Ideal\Repository
public function fetchActiveByContract(int $contract_id): array
{
$query = $this->connection->getQueryBuilder()
->select('a.*')
->select('DISTINCT a.*')
->from("{$this->getTable()} a")
->joined('INNER JOIN promotion_contracts pc ON pc.promotion_id = a.id')
->where('pc.contract_id = :contract_id AND a.state = :state');
->joined('LEFT OUTER JOIN promotion_broker pb ON pb.promotion_id = a.id')
->joined('LEFT OUTER JOIN broker_contracts bc ON bc.id = pb.contract_id')
->joined('LEFT OUTER JOIN promotion_projects pp ON pp.promotion_id = a.id')
->joined('LEFT OUTER JOIN broker_contracts bc2 ON bc2.project_id = pp.project_id')
->joined('LEFT OUTER JOIN promotion_unit_types put ON put.promotion_id = a.id')
->joined('LEFT OUTER JOIN broker_contracts bc3 ON bc3.project_id = put.project_id')
->joined('LEFT OUTER JOIN promotion_unit_lines pul ON pul.promotion_id = a.id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu ON ptu.id = pul.unit_line_id')
->joined('LEFT OUTER JOIN broker_contracts bc4 ON bc4.project_id = btu.proyecto')
->joined('LEFT OUTER JOIN promotion_units pu ON pu.promotion_id = a.id')
->joined('LEFT OUTER JOIN unidad ON unidad.id = pu.unit_id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu2 ON ptu2.id = unidad.pt')
->joined('LEFT OUTER JOIN broker_contracts bc5 ON bc5.project_id = ptu2.proyecto')
->where('(bc.id = :contract_id OR bc2.id = :contract_id OR bc3.id = :contract_id OR bc4.id = :contract_id OR bc5.id = :contract_id) AND a.state = :state')
->group('a.id');
return $this->fetchMany($query, ['contract_id' => $contract_id, 'state' => Model\Venta\Promotion\State::ACTIVE]);
}
@ -105,10 +131,19 @@ class Promotion extends Common\Ideal\Repository
public function fetchByUnit(int $unit_id): array
{
$query = $this->connection->getQueryBuilder()
->select('a.*')
->select('DISTINCT a.*')
->from("{$this->getTable()} a")
->joined('INNER JOIN promotion_units pu ON pu.promotion_id = a.id')
->where('pu.unit_id = :unit_id');
->joined('LEFT OUTER JOIN promotion_units pu ON pu.promotion_id = a.id')
->joined('LEFT OUTER JOIN promotion_projects pp ON pp.promotion_id = a.id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu1 ON ptu1.proyecto = pp.project_id')
->joined('LEFT OUTER JOIN unidad u1 ON u1.pt = ptu1.id')
->joined('LEFT OUTER JOIN promotion_unit_types put ON put.promotion_id = a.id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu2 ON ptu2.tipo = put.unit_type_id AND ptu2.proyecto = put.project_id')
->joined('LEFT OUTER JOIN unidad u2 ON u2.pt = ptu2.id')
->joined('LEFT OUTER JOIN promotion_unit_lines pul ON pul.promotion_id = a.id')
->joined('LEFT OUTER JOIN unidad u3 ON u3.pt = pul.unit_line_id')
->where('pu.unit_id = :unit_id OR u1.id = :unit_id OR u2.id = :unit_id OR u3.id = :unit_id')
->group('a.id');
return $this->fetchMany($query, ['unit_id' => $unit_id]);
}
@ -120,10 +155,19 @@ class Promotion extends Common\Ideal\Repository
public function fetchActiveByUnit(int $unit_id): array
{
$query = $this->connection->getQueryBuilder()
->select('a.*')
->select('DISTINCT a.*')
->from("{$this->getTable()} a")
->joined('INNER JOIN promotion_units pu ON pu.promotion_id = a.id')
->where('pu.unit_id = :unit_id AND a.state = :state');
->joined('LEFT OUTER JOIN promotion_units pu ON pu.promotion_id = a.id')
->joined('LEFT OUTER JOIN promotion_projects pp ON pp.promotion_id = a.id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu1 ON ptu1.proyecto = pp.project_id')
->joined('LEFT OUTER JOIN unidad u1 ON u1.pt = ptu1.id')
->joined('LEFT OUTER JOIN promotion_unit_types put ON put.promotion_id = a.id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu2 ON ptu2.tipo = put.unit_type_id AND ptu2.proyecto = put.project_id')
->joined('LEFT OUTER JOIN unidad u2 ON u2.pt = ptu2.id')
->joined('LEFT OUTER JOIN promotion_unit_lines pul ON pul.promotion_id = a.id')
->joined('LEFT OUTER JOIN unidad u3 ON u3.pt = pul.unit_line_id')
->where('(pu.unit_id = :unit_id OR u1.id = :unit_id OR u2.id = :unit_id OR u3.id = :unit_id) AND a.state = :state')
->group('a.id');
return $this->fetchMany($query, ['unit_id' => $unit_id, 'state' => Model\Venta\Promotion\State::ACTIVE]);
}
@ -135,13 +179,17 @@ class Promotion extends Common\Ideal\Repository
public function fetchByProject(int $project_id): array
{
$query = $this->connection->getQueryBuilder()
->select('a.*')
->select('DISTINCT a.*')
->from("{$this->getTable()} a")
->joined('INNER JOIN promotion_units pu ON pu.promotion_id = a.id')
->joined('INNER JOIN unidad ON unidad.id = pu.unit_id')
->joined('INNER JOIN proyecto_tipo_unidad ON proyecto_tipo_unidad.id = unidad.pt')
->joined('INNER JOIN proyecto ON proyecto.id = proyecto_tipo_unidad.proyecto')
->where('proyecto.id = :project_id');
->joined('LEFT OUTER JOIN promotion_projects pp ON pp.promotion_id = a.id')
->joined('LEFT OUTER JOIN promotion_unit_types put ON put.promotion_id = a.id')
->joined('LEFT OUTER JOIN promotion_unit_lines pul ON pul.promotion_id = a.id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu ON ptu.id = pul.unit_line_id')
->joined('LEFT OUTER JOIN promotion_units pu ON pu.promotion_id = a.id')
->joined('LEFT OUTER JOIN unidad ON unidad.id = pu.unit_id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu1 ON ptu.id = unidad.pt')
->where('pp.project_id = :project_id OR put.project_id = :project_id OR ptu.proyecto = :project_id OR ptu1.proyecto = :project_id')
->group('a.id');
return $this->fetchMany($query, ['project_id' => $project_id]);
}
@ -153,56 +201,43 @@ class Promotion extends Common\Ideal\Repository
public function fetchActiveByProject(int $project_id): array
{
$query = $this->connection->getQueryBuilder()
->select('a.*')
->select('DISTINCT a.*')
->from("{$this->getTable()} a")
->joined('INNER JOIN promotion_units pu ON pu.promotion_id = a.id')
->joined('INNER JOIN unidad ON unidad.id = pu.unit_id')
->joined('INNER JOIN proyecto_tipo_unidad ON proyecto_tipo_unidad.id = unidad.pt')
->joined('INNER JOIN proyecto ON proyecto.id = proyecto_tipo_unidad.proyecto')
->where('proyecto.id = :project_id AND a.state = :state');
->joined('LEFT OUTER JOIN promotion_projects pp ON pp.promotion_id = a.id')
->joined('LEFT OUTER JOIN promotion_unit_types put ON put.promotion_id = a.id')
->joined('LEFT OUTER JOIN promotion_unit_lines pul ON pul.promotion_id = a.id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu ON ptu.id = pul.unit_line_id')
->joined('LEFT OUTER JOIN promotion_units pu ON pu.promotion_id = a.id')
->joined('LEFT OUTER JOIN unidad ON unidad.id = pu.unit_id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu1 ON ptu.id = unidad.pt')
->where('(pp.project_id = :project_id OR put.project_id = :project_id OR ptu.proyecto = :project_id OR ptu1.proyecto = :project_id) AND a.state = :state')
->group('a.id');
return $this->fetchMany($query, ['project_id' => $project_id, 'state' => Model\Venta\Promotion\State::ACTIVE]);
}
/**
* @param int $contract_id
* @param int $unit_id
* @return Model\Venta\Promotion
* @throws Common\Implement\Exception\EmptyResult
*/
public function fetchByContractAndUnit(int $contract_id, int $unit_id): Model\Venta\Promotion
{
$query = $this->connection->getQueryBuilder()
->select('a.*')
->from("{$this->getTable()} a")
->joined('INNER JOIN promotion_contracts pc ON pc.promotion_id = a.id')
->joined('INNER JOIN promotion_units pu ON pu.promotion_id = a.id')
->where('pc.contract_id = :contract_id AND pu.unit_id = :unit_id');
return $this->fetchOne($query, ['contract_id' => $contract_id, 'unit_id' => $unit_id]);
}
/**
* @param int $promotion_id
* @return array
* @throws Common\Implement\Exception\EmptyResult
*/
public function fetchContractUnitsByPromotion(int $promotion_id): array
public function fetchByContractAndUnit(int $contract_id, int $unit_id): array
{
$query = $this->connection->getQueryBuilder()
->select('contracts.id, unidad.id')
->select('DISTINCT a.*')
->from("{$this->getTable()} a")
->joined('INNER JOIN promotion_contract_units pcu ON pcu.promotion_id = a.id')
->joined('INNER JOIN unidad ON unidad.id = pcu.unit_id')
->joined('INNER JOIN contracts ON contracts.id = pcu.contract_id')
->where('a.id = :promotion_id');
try {
$result = $this->connection->execute($query, ['promotion_id' => $promotion_id])->fetchAll(PDO::FETCH_ASSOC);
if (empty($result)) {
throw new Common\Implement\Exception\EmptyResult($query);
}
return $result;
} catch (PDOException $exception) {
throw new Common\Implement\Exception\EmptyResult($query, $exception);
}
->joined('LEFT OUTER JOIN promotion_brokers pb ON pb.promotion_id = a.id')
->joined('LEFT OUTER JOIN broker_contracts bc ON bc.broker_rut = pb.broker_rut')
->joined('LEFT OUTER JOIN promotion_units pu ON pu.promotion_id = a.id')
->joined('LEFT OUTER JOIN promotion_projects pp ON pp.promotion_id = a.id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu1 ON ptu1.proyecto = pp.project_id')
->joined('LEFT OUTER JOIN promotion_unit_types put ON put.promotion_id = a.id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu2 ON ptu2.tipo = put.unit_type_id AND ptu2.proyecto = put.project_id')
->joined('LEFT OUTER JOIN promotion_unit_lines pul ON pul.promotion_id = a.id')
->joined('LEFT OUTER JOIN proyecto_tipo_unidad ptu3 ON ptu3.id = put.unit_line_id')
->where('bc.contract_id = :contract_id OR pu.unit_id = :unit_id OR ptu1.unidad = :unit_id OR ptu2.unidad = :unit_id OR ptu3.unidad = :unit_id')
->group('a.id');
return $this->fetchMany($query, ['contract_id' => $contract_id, 'unit_id' => $unit_id]);
}
/**
@ -220,22 +255,93 @@ class Promotion extends Common\Ideal\Repository
->values([':promotion_id', ':project_id']);
$this->connection->execute($query, ['promotion_id' => $promotion->id, 'project_id' => $project_id]);
}
public function removeProjectForPromotion(Model\Venta\Promotion $promotion, int $project_id): void
{
$query = $this->connection->getQueryBuilder()
->delete()
->from('promotion_projects')
->where('promotion_id = :promotion_id AND project_id = :project_id');
$this->connection->execute($query, ['promotion_id' => $promotion->id, 'project_id' => $project_id]);
}
/**
* @param Model\Venta\Promotion $promotion
* @param int $contract_id
* @param int $broker_rut
* @return void
* @throws PDOException
*/
public function insertContractForPromotion(Model\Venta\Promotion $promotion, int $contract_id): void
public function insertBrokerForPromotion(Model\Venta\Promotion $promotion, int $broker_rut): void
{
$query = $this->connection->getQueryBuilder()
->insert()
->into('promotion_contracts')
->columns(['promotion_id', 'contract_id'])
->values([':promotion_id', ':contract_id']);
$this->connection->execute($query, ['promotion_id' => $promotion->id, 'contract_id' => $contract_id]);
->into('promotion_brokers')
->columns(['promotion_id', 'broker_rut'])
->values([':promotion_id', ':broker_rut']);
$this->connection->execute($query, ['promotion_id' => $promotion->id, 'broker_rut' => $broker_rut]);
}
public function removeBrokerForPromotion(Model\Venta\Promotion $promotion, int $broker_rut): void
{
$query = $this->connection->getQueryBuilder()
->delete()
->from('promotion_brokers')
->where('promotion_id = :promotion_id AND broker_rut = :broker_rut');
$this->connection->execute($query, ['promotion_id' => $promotion->id, 'broker_rut' => $broker_rut]);
}
/**
* @param Model\Venta\Promotion $promotion
* @param int $project_id
* @param int $unit_type_id
* @return void
*/
public function insertUnitTypeForPromotion(Model\Venta\Promotion $promotion, int $project_id, int $unit_type_id): void
{
$query = $this->connection->getQueryBuilder()
->insert()
->into('promotion_unit_types')
->columns(['promotion_id', 'project_id', 'unit_type_id'])
->values([':promotion_id', ':project_id', ':unit_type_id']);
$this->connection->execute($query,
['promotion_id' => $promotion->id, 'project_id' => $project_id, 'unit_type_id' => $unit_type_id]);
}
public function removeUnitTypeForPromotion(Model\Venta\Promotion $promotion, int $project_id, int $unit_type_id): void
{
$query = $this->connection->getQueryBuilder()
->delete()
->from('promotion_unit_types')
->where('promotion_id = :promotion_id AND project_id = :project_id AND unit_type_id = :unit_type_id');
$this->connection->execute($query,
['promotion_id' => $promotion->id, 'project_id' => $project_id, 'unit_type_id' => $unit_type_id]);
}
/**
* @param Model\Venta\Promotion $promotion
* @param int $unit_line_id
* @return void
*/
public function insertUnitLineForPromotion(Model\Venta\Promotion $promotion, int $unit_line_id): void
{
$query = $this->connection->getQueryBuilder()
->insert()
->into('promotion_unit_lines')
->columns(['promotion_id', 'unit_line_id'])
->values([':promotion_id', ':unit_line_id']);
$this->connection->execute($query, ['promotion_id' => $promotion->id, 'unit_line_id' => $unit_line_id]);
}
public function removeUnitLineForPromotion(Model\Venta\Promotion $promotion, int $unit_line_id): void
{
$query = $this->connection->getQueryBuilder()
->delete()
->from('promotion_unit_lines')
->where('promotion_id = :promotion_id AND unit_line_id = :unit_line_id');
$this->connection->execute($query, ['promotion_id' => $promotion->id, 'unit_line_id' => $unit_line_id]);
}
/**
* @param Model\Venta\Promotion $promotion
* @param int $unit_id
* @return void
*/
public function insertUnitForPromotion(Model\Venta\Promotion $promotion, int $unit_id): void
{
$query = $this->connection->getQueryBuilder()
@ -245,4 +351,12 @@ class Promotion extends Common\Ideal\Repository
->values([':promotion_id', ':unit_id']);
$this->connection->execute($query, ['promotion_id' => $promotion->id, 'unit_id' => $unit_id]);
}
public function removeUnitForPromotion(Model\Venta\Promotion $promotion, int $unit_id): void
{
$query = $this->connection->getQueryBuilder()
->delete()
->from('promotion_units')
->where('promotion_id = :promotion_id AND unit_id = :unit_id');
$this->connection->execute($query, ['promotion_id' => $promotion->id, 'unit_id' => $unit_id]);
}
}

View File

@ -17,6 +17,7 @@ class Promotion extends Ideal\Service
protected Repository\Venta\Promotion $promotionRepository,
protected Repository\Proyecto $projectRepository,
protected Repository\Proyecto\Broker\Contract $contractRepository,
protected Repository\Proyecto\Broker $brokerRepository,
protected Repository\Proyecto\TipoUnidad $tipoUnidadRepository,
protected Repository\Proyecto\ProyectoTipoUnidad $proyectoTipoUnidadRepository,
protected Repository\Venta\Unidad $unidadRepository)
@ -56,12 +57,7 @@ class Promotion extends Ideal\Service
try {
return array_map([$this, 'process'], $this->promotionRepository->fetchByContract($contract_id));
} catch (Implement\Exception\EmptyResult) {
try {
$contract = $this->contractRepository->fetchById($contract_id);
return array_map([$this, 'process'], $this->promotionRepository->fetchByProject($contract->project->id));
} catch (Implement\Exception\EmptyResult) {
return [];
}
return [];
}
}
@ -74,12 +70,7 @@ class Promotion extends Ideal\Service
try {
return array_map([$this, 'process'], $this->promotionRepository->fetchActiveByContract($contract_id));
} catch (Implement\Exception\EmptyResult) {
try {
$contract = $this->contractRepository->fetchById($contract_id);
return array_map([$this, 'process'], $this->promotionRepository->fetchActiveByProject($contract->project->id));
} catch (Implement\Exception\EmptyResult) {
return [];
}
return [];
}
}
@ -92,11 +83,8 @@ class Promotion extends Ideal\Service
{
try {
$filteredData = $this->promotionRepository->filterData($data);
#throw new \Exception(var_export($filteredData, true));
$promotion = $this->promotionRepository->create($filteredData);
#throw new \Exception(var_export($promotion, true));
$promotion = $this->promotionRepository->save($promotion);
return $this->process($promotion);
return $this->process($this->promotionRepository->save($promotion));
} catch (PDOException $exception) {
throw new Exception\ServiceAction\Create(__CLASS__, $exception);
}
@ -166,11 +154,11 @@ class Promotion extends Ideal\Service
/**
* @param int $promotion_id
* @param int $contract_id
* @param int $broker_rut
* @return Model\Venta\Promotion
* @throws Exception\ServiceAction\Create
*/
public function addContract(int $promotion_id, int $contract_id): Model\Venta\Promotion
public function addBroker(int $promotion_id, int $broker_rut): Model\Venta\Promotion
{
try {
$promotion = $this->promotionRepository->fetchById($promotion_id);
@ -178,15 +166,15 @@ class Promotion extends Ideal\Service
throw new Exception\ServiceAction\Create(__CLASS__, $exception);
}
try {
$contract = $this->contractRepository->fetchById($contract_id);
$broker = $this->brokerRepository->fetchById($broker_rut);
} catch (Implement\Exception\EmptyResult $exception) {
throw new Exception\ServiceAction\Create(__CLASS__, $exception);
}
if (in_array($contract, $promotion->contracts())) {
if (in_array($broker, $promotion->brokers())) {
return $this->process($promotion);
}
try {
$this->promotionRepository->insertContractForPromotion($promotion, $contract->id);
$this->promotionRepository->insertBrokerForPromotion($promotion, $broker->rut);
return $this->process($promotion);
} catch (PDOException $exception) {
throw new Exception\ServiceAction\Create(__CLASS__, $exception);
@ -221,11 +209,11 @@ class Promotion extends Ideal\Service
return $this->process($promotion);
}
try {
$units = $this->unidadRepository->fetchByProyectoAndTipo($project->id, $unitType->id);
} catch (Implement\Exception\EmptyResult $exception) {
$this->promotionRepository->insertUnitTypeForPromotion($promotion, $project->id, $unitType->id);
return $this->process($promotion);
} catch (PDOException $exception) {
throw new Exception\ServiceAction\Create(__CLASS__, $exception);
}
return $this->insertUnits($promotion, $units);
}
/**
@ -250,11 +238,11 @@ class Promotion extends Ideal\Service
return $this->process($promotion);
}
try {
$units = $this->unidadRepository->fetchByProyectoTipoUnidad($unitLine->id);
} catch (Implement\Exception\EmptyResult $exception) {
$this->promotionRepository->insertUnitLineForPromotion($promotion, $unitLine->id);
return $this->process($promotion);
} catch (PDOException $exception) {
throw new Exception\ServiceAction\Create(__CLASS__, $exception);
}
return $this->insertUnits($promotion, $units);
}
/**
@ -286,7 +274,13 @@ class Promotion extends Ideal\Service
}
}
public function removeProject(int $promotion_id, int $project_id): array
/**
* @param int $promotion_id
* @param int $project_id
* @return void
* @throws Exception\ServiceAction\Delete
*/
public function removeProject(int $promotion_id, int $project_id): void
{
try {
$promotion = $this->promotionRepository->fetchById($promotion_id);
@ -300,39 +294,115 @@ class Promotion extends Ideal\Service
}
try {
$this->promotionRepository->removeProjectForPromotion($promotion, $project->id);
return [
'id' => '',
'promotion_id' => $promotion_id,
'project_id' => $project_id,
];
} catch (PDOException $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
}
/**
* @param Model\Venta\Promotion $promotion
* @param array $units
* @return Model\Venta\Promotion
* @throws Exception\ServiceAction\Create
* @param int $promotion_id
* @param int $broker_rut
* @return void
* @throws Exception\ServiceAction\Delete
*/
protected function insertUnits(Model\Venta\Promotion $promotion, array $units): Model\Venta\Promotion
public function removeBroker(int $promotion_id, int $broker_rut): void
{
$errors = [];
foreach ($units as $unit) {
try {
$this->promotionRepository->insertUnitForPromotion($promotion, $unit->id);
} catch (PDOException | \Throwable $exception) {
$this->logger->debug($exception);
$errors []= $exception;
}
try {
$promotion = $this->promotionRepository->fetchById($promotion_id);
} catch (Implement\Exception\EmptyResult $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
if (count($errors) > 0) {
$exception = new Exception\AggregateException($errors);
throw new Exception\ServiceAction\Create(__CLASS__, $exception);
try {
$broker = $this->brokerRepository->fetchById($broker_rut);
} catch (Implement\Exception\EmptyResult $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
try {
$this->promotionRepository->removeBrokerForPromotion($promotion, $broker->rut);
} catch (PDOException $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
}
/**
* @param int $promotion_id
* @param int $project_id
* @param int $unitType_id
* @return void
* @throws Exception\ServiceAction\Delete
*/
public function removeUnitType(int $promotion_id, int $project_id, int $unitType_id): void
{
try {
$promotion = $this->promotionRepository->fetchById($promotion_id);
} catch (Implement\Exception\EmptyResult $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
try {
$project = $this->projectRepository->fetchById($project_id);
} catch (Implement\Exception\EmptyResult $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
try {
$unitType = $this->tipoUnidadRepository->fetchById($unitType_id);
} catch (Implement\Exception\EmptyResult $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
try {
$this->promotionRepository->removeUnitTypeForPromotion($promotion, $project->id, $unitType->id);
} catch (PDOException $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
}
/**
* @param int $promotion_id
* @param int $unit_line_id
* @return void
* @throws Exception\ServiceAction\Delete
*/
public function removeUnitLine(int $promotion_id, int $unit_line_id): void
{
try {
$promotion = $this->promotionRepository->fetchById($promotion_id);
} catch (Implement\Exception\EmptyResult $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
try {
$unitLine = $this->proyectoTipoUnidadRepository->fetchById($unit_line_id);
} catch (Implement\Exception\EmptyResult $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
try {
$this->promotionRepository->removeUnitLineForPromotion($promotion, $unitLine->id);
} catch (PDOException $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
}
/**
* @param int $promotion_id
* @param int $unit_id
* @return void
* @throws Exception\ServiceAction\Delete
*/
public function removeUnit(int $promotion_id, int $unit_id): void
{
try {
$promotion = $this->promotionRepository->fetchById($promotion_id);
} catch (Implement\Exception\EmptyResult $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
try {
$unit = $this->unidadRepository->fetchById($unit_id);
} catch (Implement\Exception\EmptyResult $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
try {
$this->promotionRepository->removeUnitForPromotion($promotion, $unit->id);
} catch (PDOException $exception) {
throw new Exception\ServiceAction\Delete(__CLASS__, $exception);
}
return $this->process($promotion);
}
protected function process(Model\Venta\Promotion $model): Model\Venta\Promotion
@ -346,10 +416,10 @@ class Promotion extends Ideal\Service
}
})
->setArgs(['promotion_id' => $model->id]));
$model->addFactory('contracts', (new Implement\Repository\Factory())
$model->addFactory('brokers', (new Implement\Repository\Factory())
->setCallable(function($promotion_id) {
try {
return $this->contractRepository->fetchByPromotion($promotion_id);
return $this->brokerRepository->fetchByPromotion($promotion_id);
} catch (Implement\Exception\EmptyResult) {
return [];
}
@ -389,24 +459,6 @@ class Promotion extends Ideal\Service
}
})
->setArgs(['promotion_id' => $model->id]));
$model->addFactory('contractUnits', (new Implement\Repository\Factory())
->setCallable(function($promotion_id) {
try {
$ids = $this->promotionRepository->fetchContractUnitsByPromotion($promotion_id);
$contractUnits = [];
foreach ($ids as $id) {
try {
$contract = $this->contractRepository->fetchById($id['contract_id']);
$unidad = $this->unidadRepository->fetchById($id['unidad_id']);
$contractUnits[]= (object) ['contract' => $contract, 'unit' => $unidad];
} catch (Implement\Exception\EmptyResult) {}
}
return $contractUnits;
} catch (Implement\Exception\EmptyResult) {
return [];
}
})
->setArgs(['promotion_id' => $model->id]));
return $model;
}
}