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

@ -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;
}
}