<?php
namespace App\Controller;
use App\Service\SupplierDocumentsStatusChecker;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\DBAL\Connection;
class DashboardController extends AbstractController
{
public function __construct(
private readonly SupplierDocumentsStatusChecker $documentsStatusChecker
) {
}
#[Route('/', name: 'dashboard')]
public function index(EntityManagerInterface $manager): Response
{
/** @var Connection $conn */
$conn = $manager->getConnection();
$qb = $conn->createQueryBuilder();
$qb->select("
wp.id,
wp.uuid,
wp.workflow,
u.code AS office_code,
u.name AS office_name,
wa2.value AS estimado_monto,
wa3.value AS estimado_moneda,
wa4.value AS total_adjudicado,
wa6.value AS factura_monto,
wa7.value AS factura_monto_neto,
DATE_FORMAT(STR_TO_DATE(ws1.started_at,'%Y-%m-%d %H:%i:%s'),'%d-%m-%Y %H:%i') AS fecha_creacion,
DATE_FORMAT(STR_TO_DATE(wa5.value,'%d/%m/%Y'),'%d-%m-%Y') AS fecha_adjudicacion,
'' AS SLA,
ws2.state AS estado,
ws2.started_at AS fecha_estado,
was2.user_id AS selected_supplier
")
->distinct()
->from('workflow_processes', 'wp')
->leftJoin('wp', 'workflow_attributes', 'wa1', 'wp.id = wa1.process_id AND wa1.path = :path1')
->leftJoin('wa1', 'unit', 'u', 'u.id = wa1.value')
->leftJoin('wp', 'workflow_attributes', 'wa2', 'wp.id = wa2.process_id AND wa2.path = :path2')
->leftJoin('wp', 'workflow_attributes', 'wa3', 'wp.id = wa3.process_id AND wa3.path = :path3')
->leftJoin('wp', 'workflow_attributes', 'wa4', 'wp.id = wa4.process_id AND wa4.path = :path4')
->leftJoin('wp', 'workflow_attributes', 'wa6', 'wp.id = wa6.process_id AND wa6.path = :path6')
->leftJoin('wp', 'workflow_attributes', 'wa7', 'wp.id = wa7.process_id AND wa7.path = :path7')
->innerJoin('wp', 'workflow_states', 'ws1', 'wp.id = ws1.process_id AND ws1.state = :state_start')
->leftJoin('wp', 'workflow_attributes', 'wa5', 'wp.id = wa5.process_id AND wa5.path = :path5')
->innerJoin('wp', 'workflow_states', 'ws2', 'wp.id = ws2.process_id AND ws2.current = :true')
->innerJoin('ws2', 'workflow_assignee', 'was1', 'ws2.id = was1.state_id AND was1.user_id = :user_id')
->leftJoin('ws2', 'workflow_assignee', 'was2', 'ws2.id = was2.state_id AND was2.name = :selected_supplier')
->setParameter('path1', 'info_compra.sucursal')
->setParameter('path2', 'info_compra.valor_estimado.monto')
->setParameter('path3', 'info_compra.valor_estimado.moneda')
->setParameter('path4', 'total_adjudicado')
->setParameter('path5', 'cronograma.fecha_adjudicacion')
->setParameter('path6', 'info_compra.factura_monto')
->setParameter('path7', 'info_compra.factura_monto_neto')
->setParameter('state_start', '_process_start')
->setParameter('true', 1)
->setParameter('user_id', $this->getUser()->getId())
->setParameter('selected_supplier','adjudicado')
->orderBy('wp.uuid', 'DESC')
;
$roles = ['solicitante','apoderado_1','apoderado_2','adquisiciones','jefe_adquisiciones','apoderado_3','apoderado_4','ejecutivo_area_compras'];
if($this->isGranted('ROLE_SUPPLIER')){
$roles = ['proveedor'];
}elseif ($this->isGranted('ROLE_FINANCES')){
$roles[] = 'finanzas';
}
$qbProcess = [];
$qbProcess['active'] = $qbProcess['process'] = [];
foreach ($roles as $role) {
foreach (['active', 'process'] as $table) {
$qbCurrent = clone $qb;
$j = 0;
foreach ($this->getStatesBy($table, $role) as $workflow => $dataStates) {
$states = [];
$i = 0;
$dataStates = array_filter($dataStates);
foreach ($dataStates as $state) {
$current = 'state_' . $role . '_' . $j . '_' . $i;
$qbCurrent->setParameter($current, $state);
$states[] = ':' . $current;
$i++;
}
if ($dataStates) {
$qbCurrent->orWhere(
$qbCurrent->expr()->andX(
$qbCurrent->expr()->in('ws2.state', $states),
'was1.name = :role_' . $role,
"wp.workflow = :workflow_{$table}_$j"
)
)
->setParameter('role_' . $role, $role)
->setParameter("workflow_{$table}_$j", $workflow);
}
$j++;
}
$currentProcess = $qbCurrent->execute()->fetchAll();
$qbProcess[$table] = array_merge($qbProcess[$table], $currentProcess);
unset($qbCurrent);
}
}
$qbActive = $qbProcess['active'];
$qbInProcess = $qbProcess['process'];
$states = [];
$i = 0;
$qbHistory = $conn->createQueryBuilder();
$qbHistory->select('count(wp.id) as total_rows')
->distinct()
->from('workflow_processes', 'wp')
->innerJoin('wp', 'workflow_states', 'ws2', 'wp.id = ws2.process_id AND ws2.current = :true')
->innerJoin('ws2', 'workflow_assignee', 'was1', 'ws2.id = was1.state_id AND was1.user_id = :user_id')
->leftJoin('ws2', 'workflow_assignee', 'was2', 'ws2.id = was2.state_id AND was2.name = :selected_supplier')
->setParameter('true', 1)
->setParameter('user_id', $this->getUser()->getId())
->setParameter('selected_supplier','adjudicado')
->orderBy('wp.uuid', 'DESC')
->setMaxResults(1)
;
// Exlude workflows cancelled for suppliers
if($this->isGranted('ROLE_SUPPLIER')){
$qbHistory->andWhere(
$qbHistory->expr()->orX(
$qbHistory->expr()->notIn('ws2.state', ':states_anuladas'),
'EXISTS (
SELECT 1 FROM workflow_states ws_inv
INNER JOIN workflow_assignee wa_inv ON ws_inv.id = wa_inv.state_id
WHERE ws_inv.process_id = wp.id
AND wa_inv.user_id = :user_id
AND wa_inv.name = :proveedor_role
AND ws_inv.state NOT IN (:states_anuladas_check)
)'
)
)
->setParameter('states_anuladas', ['orden_trabajo_anulada', 'solicitud_anulada'], \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
->setParameter('states_anuladas_check', ['orden_trabajo_anulada', 'solicitud_anulada'], \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
->setParameter('proveedor_role', 'proveedor');
}
foreach ($this->getStatesBy('history') as $state) {
$current = 'state_' . $i;
$qbHistory->setParameter($current, $state);
$states[] = ':' . $current;
$i++;
}
$qbHistory->andWhere(
$qbHistory->expr()->in('ws2.state', $states)
);
$countHistory = (int) $qbHistory->execute()->fetchOne() ?? 0;
$showPasswordAlert = !$this->getUser()->isPasswordUpdatedForNewPolicy();
$documentsStatus = null;
if ($this->isGranted('ROLE_SUPPLIER')) {
$supplier = $this->getUser()?->getSupplier();
if ($supplier) {
$documentsStatus = $this->documentsStatusChecker->check($supplier);
}
}
return $this->render('Dashboard/index.html.twig', [
'active' => $qbActive,
'process' => $qbInProcess,
'countHistory' => $countHistory,
'documentsStatus' => $documentsStatus,
'showPasswordAlert' => $showPasswordAlert,
]);
}
#[Route('/workflow/compras-se', name: 'dashboard_legacy', methods: ['GET','POST'])]
public function legacy()
{
return $this->redirectToRoute('dashboard');
}
#[Route('/historico', name: 'history', methods: ['GET','POST'])]
public function history(EntityManagerInterface $manager)
{
/** @var Connection $conn */
$conn = $manager->getConnection();
$qb = $conn->createQueryBuilder();
$qb->select("
wp.id,
wp.uuid,
wp.workflow,
u.code AS office_code,
u.name AS office_name,
wa2.value AS estimado_monto,
wa3.value AS estimado_moneda,
wa4.value AS total_adjudicado,
wa6.value AS factura_monto,
DATE_FORMAT(STR_TO_DATE(ws1.started_at,'%Y-%m-%d %H:%i:%s'),'%d-%m-%Y %H:%i') AS fecha_creacion,
DATE_FORMAT(STR_TO_DATE(wa5.value,'%d/%m/%Y'),'%d-%m-%Y') AS fecha_adjudicacion,
'' AS SLA,
ws2.state AS estado,
ws2.started_at AS fecha_estado,
was2.user_id AS selected_supplier
")
->distinct()
->from('workflow_processes', 'wp')
->leftJoin('wp', 'workflow_attributes', 'wa1', 'wp.id = wa1.process_id AND wa1.path = :path1')
->leftJoin('wa1', 'unit', 'u', 'u.id = wa1.value')
->leftJoin('wp', 'workflow_attributes', 'wa2', 'wp.id = wa2.process_id AND wa2.path = :path2')
->leftJoin('wp', 'workflow_attributes', 'wa3', 'wp.id = wa3.process_id AND wa3.path = :path3')
->leftJoin('wp', 'workflow_attributes', 'wa4', 'wp.id = wa4.process_id AND wa4.path = :path4')
->leftJoin('wp', 'workflow_attributes', 'wa6', 'wp.id = wa6.process_id AND wa6.path = :path6')
->innerJoin('wp', 'workflow_states', 'ws1', 'wp.id = ws1.process_id AND ws1.state = :state_start')
->leftJoin('wp', 'workflow_attributes', 'wa5', 'wp.id = wa5.process_id AND wa5.path = :path5')
->innerJoin('wp', 'workflow_states', 'ws2', 'wp.id = ws2.process_id AND ws2.current = :true')
->leftJoin('ws2', 'workflow_assignee', 'was2', 'ws2.id = was2.state_id AND was2.name = :selected_supplier')
->setParameter('path1', 'info_compra.sucursal')
->setParameter('path2', 'info_compra.valor_estimado.monto')
->setParameter('path3', 'info_compra.valor_estimado.moneda')
->setParameter('path4', 'total_adjudicado')
->setParameter('path5', 'cronograma.fecha_adjudicacion')
->setParameter('path6', 'info_compra.factura_monto')
->setParameter('state_start', '_process_start')
->setParameter('true', 1)
->setParameter('selected_supplier','adjudicado')
->orderBy('wp.uuid', 'DESC')
;
if(!$this->isGranted('ROLE_VIEWER')){
$qb
->innerJoin('ws2', 'workflow_assignee', 'was1', 'ws2.id = was1.state_id AND was1.user_id = :user_id')
->setParameter('user_id', $this->getUser()->getId())
;
// Exlude workflows cancelled for suppliers
if($this->isGranted('ROLE_SUPPLIER')){
$qb->andWhere(
$qb->expr()->orX(
$qb->expr()->notIn('ws2.state', ':states_anuladas'),
'EXISTS (
SELECT 1 FROM workflow_states ws_inv
INNER JOIN workflow_assignee wa_inv ON ws_inv.id = wa_inv.state_id
WHERE ws_inv.process_id = wp.id
AND wa_inv.user_id = :user_id
AND wa_inv.name = :proveedor_role
AND ws_inv.state NOT IN (:states_anuladas_check)
)'
)
)
->setParameter('states_anuladas', ['orden_trabajo_anulada', 'solicitud_anulada'], \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
->setParameter('states_anuladas_check', ['orden_trabajo_anulada', 'solicitud_anulada'], \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
->setParameter('proveedor_role', 'proveedor');
}
}
$qbHistory = clone $qb;
$states = [];
$i = 0;
foreach ($this->getStatesBy('history') as $state) {
$current = 'state_' . $i;
$qbHistory->setParameter($current, $state);
$states[] = ':' . $current;
$i++;
}
$qbHistory->andWhere(
$qbHistory->expr()->in('ws2.state', $states)
);
return $this->render('Dashboard/history.html.twig', [
'history' => $qbHistory->fetchAllAssociative() ,
]);
}
/**
* @param $type
* @param $role
* @return array
*/
private function getStatesBy($type, $role = null)
{
if ($type == 'historico') $type = 'history';
/** @var User $user */
$user = $this->getUser();
switch ($type) {
case 'history':
return [
'orden_trabajo_completa',
'orden_trabajo_anulada',
'solicitud_cerrada',
'solicitud_anulada',
];
case 'active':
if ($role == 'solicitante') {
return [
'regularizacion-factura' => [
'validacion_solicitante',
'rechazado_apoderado_1',
'rechazado_apoderado_2',
'rechazada_adquisiciones',
'rechazada_jefatura_adquisiciones',
'rechazada_apoderado_3',
'rechazada_apoderado_4'
],
'compras-se' => [
'rechazado_apoderado_1',
'rechazado_apoderado_2',
'orden_trabajo_certificada',
'rechazada_adquisiciones',
],
'compras-bex' => [
'rechazada_adquisiciones',
'validacion_solicitante',
'rechazado_apoderado_1',
'rechazado_apoderado_2',
'evaluacion_tecnica',
'orden_trabajo_certificada',
]
];
} elseif ($role == 'apoderado_1') {
return [
'regularizacion-factura' => [
'evaluacion_apoderado_1'
],
'compras-se' => [
'evaluacion_apoderado_1',
],
'compras-bex' => [
'evaluacion_apoderado_1',
]
];
} elseif ($role == 'apoderado_2') {
return [
'regularizacion-factura' => [
'evaluacion_apoderado_2'
],
'compras-se' => [
'evaluacion_apoderado_2',
],
'compras-bex' => [
'evaluacion_apoderado_2',
]
];
} elseif ($role == 'adquisiciones') {
return [
'regularizacion-factura' => [
'evaluacion_adquisiciones'
],
'compras-se' => [
'evaluacion_adquisiciones',
'revision_ofertas',
],
'compras-bex' => [
'evaluacion_adquisiciones',
'rechazada_jefatura_adquisiciones',
'validacion_adquisiciones',
'revision_ofertas',
'validacion_ofertas'
]
];
} elseif ($role == 'jefe_adquisiciones') {
return [
'regularizacion-factura' => [
'evaluacion_jefatura_adquisiciones'
],
'compras-se' => [
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
],
'compras-bex' => [
'evaluacion_jefatura_adquisiciones',
]
];
} elseif ($role == 'apoderado_3') {
return [
'regularizacion-factura' => [
'evaluacion_apoderado_3'
],
'compras-se' => [
'evaluacion_apoderado_3',
],
'compras-bex' => [
'evaluacion_apoderado_3',
]
];
} elseif ($role == 'apoderado_4') {
return [
'regularizacion-factura' => [
'evaluacion_apoderado_4'
],
'compras-se' => [
'evaluacion_apoderado_4',
],
'compras-bex' => [
'evaluacion_apoderado_4',
]
];
} elseif ($role == 'finanzas') {
return [
'regularizacion-factura' => [
'rechazado_solicitante',
'rechazado_fondo_apoderado_1',
'rechazado_fondo_apoderado_2',
'rechazada_fondo_adquisiciones',
'rechazada_fondo_jefatura_adquisiciones',
'rechazada_fondo_apoderado_3',
'rechazada_fondo_apoderado_4'
],
];
} elseif ($role == 'ejecutivo_area_compras') {
return [
'compras-bex' => [
'evaluacion_ejecutivo_area_compras',
],
];
}
break;
case 'process':
if ($role == 'solicitante') {
return [
'regularizacion-factura' => [
'rechazado_solicitante',
'evaluacion_apoderado_1',
'evaluacion_apoderado_2',
'evaluacion_adquisiciones',
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_3',
'evaluacion_apoderado_4',
'rechazado_fondo_apoderado_1',
'rechazado_fondo_apoderado_2',
'rechazada_fondo_adquisiciones',
'rechazada_fondo_jefatura_adquisiciones',
'rechazada_fondo_apoderado_3',
'rechazada_fondo_apoderado_4'
],
'compras-se' => [
'evaluacion_apoderado_1',
'evaluacion_apoderado_2',
'evaluacion_adquisiciones',
'compra_aprobada',
'recepcion_ofertas',
'recibiendo_preguntas',
'respondiendo_preguntas',
'compra_activada',
'evaluacion_tecnica',
'revision_ofertas',
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
],
'compras-bex' => [
'evaluacion_adquisiciones',
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_1',
'evaluacion_apoderado_2',
'validacion_adquisiciones',
'recibiendo_preguntas',
'respondiendo_preguntas',
'recepcion_ofertas',
'validacion_ofertas',
'revision_ofertas',
'evaluacion_ejecutivo_area_compras',
'compra_aprobada',
'compra_activada',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
]
];
} elseif ($role == 'apoderado_1') {
return [
'regularizacion-factura' => [
'rechazado_apoderado_1',
'evaluacion_apoderado_2',
'rechazado_apoderado_2',
'evaluacion_adquisiciones',
'rechazada_adquisiciones',
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'rechazado_fondo_apoderado_1',
'rechazado_fondo_apoderado_2',
'rechazada_fondo_adquisiciones',
'rechazada_fondo_jefatura_adquisiciones',
'rechazada_fondo_apoderado_3',
'rechazada_fondo_apoderado_4'
],
'compras-se' => [
'rechazado_apoderado_1',
'evaluacion_apoderado_2',
'rechazado_apoderado_2',
'evaluacion_adquisiciones',
'compra_aprobada',
'recepcion_ofertas',
'recibiendo_preguntas',
'respondiendo_preguntas',
'compra_activada',
'evaluacion_tecnica',
'revision_ofertas',
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
'rechazada_adquisiciones',
],
'compras-bex' => [
'rechazado_apoderado_1',
'evaluacion_apoderado_2',
'rechazado_apoderado_2',
'validacion_adquisiciones',
'recibiendo_preguntas',
'respondiendo_preguntas',
'recepcion_ofertas',
'validacion_ofertas',
'evaluacion_tecnica',
'revision_ofertas',
'evaluacion_ejecutivo_area_compras',
'compra_aprobada',
'compra_activada',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
]
];
} elseif ($role == 'apoderado_2') {
return [
'regularizacion-factura' => [
'rechazado_apoderado_2',
'evaluacion_adquisiciones',
'rechazada_adquisiciones',
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'rechazado_fondo_apoderado_2',
'rechazada_fondo_adquisiciones',
'rechazada_fondo_jefatura_adquisiciones',
'rechazada_fondo_apoderado_3',
'rechazada_fondo_apoderado_4'
],
'compras-se' => [
'rechazado_apoderado_2',
'evaluacion_adquisiciones',
'compra_aprobada',
'recepcion_ofertas',
'recibiendo_preguntas',
'respondiendo_preguntas',
'compra_activada',
'evaluacion_tecnica',
'revision_ofertas',
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
'rechazada_adquisiciones',
],
'compras-bex' => [
'rechazado_apoderado_2',
'validacion_adquisiciones',
'recibiendo_preguntas',
'respondiendo_preguntas',
'recepcion_ofertas',
'validacion_ofertas',
'evaluacion_tecnica',
'revision_ofertas',
'evaluacion_ejecutivo_area_compras',
'compra_aprobada',
'compra_activada',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
]
];
} elseif ($role == 'adquisiciones') {
return [
'regularizacion-factura' => [
'rechazada_adquisiciones',
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'rechazada_fondo_adquisiciones',
'rechazada_fondo_jefatura_adquisiciones',
'rechazada_fondo_apoderado_3',
'rechazada_fondo_apoderado_4'
],
'compras-se' => [
'compra_aprobada',
'recepcion_ofertas',
'recibiendo_preguntas',
'respondiendo_preguntas',
'compra_activada',
'evaluacion_tecnica',
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
'rechazada_adquisiciones',
],
'compras-bex' => [
'rechazada_adquisiciones',
'evaluacion_jefatura_adquisiciones',
'validacion_solicitante',
'evaluacion_apoderado_1',
'rechazado_apoderado_1',
'evaluacion_apoderado_2',
'rechazado_apoderado_2',
'recibiendo_preguntas',
'respondiendo_preguntas',
'recepcion_ofertas',
'validacion_ofertas',
'evaluacion_tecnica',
'revision_ofertas',
'evaluacion_ejecutivo_area_compras',
'compra_aprobada',
'compra_activada',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
]
];
} elseif ($role == 'jefe_adquisiciones') {
return [
'regularizacion-factura' => [
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'rechazada_fondo_jefatura_adquisiciones',
'rechazada_fondo_apoderado_3',
'rechazada_fondo_apoderado_4'
],
'compras-se' => [
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
],
'compras-bex' => [
'rechazada_jefatura_adquisiciones',
'validacion_solicitante',
'evaluacion_apoderado_1',
'rechazado_apoderado_1',
'evaluacion_apoderado_2',
'rechazado_apoderado_2',
'validacion_solicitante',
'evaluacion_apoderado_1',
'rechazado_apoderado_1',
'evaluacion_apoderado_2',
'rechazado_apoderado_2',
'validacion_adquisiciones',
'recibiendo_preguntas',
'respondiendo_preguntas',
'recepcion_ofertas',
'evaluacion_tecnica',
'revision_ofertas',
'validacion_ofertas',
'evaluacion_ejecutivo_area_compras',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
]
];
} elseif ($role == 'apoderado_3') {
return [
'regularizacion-factura' => [
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'rechazada_fondo_apoderado_3',
'rechazada_fondo_apoderado_4'
],
'compras-se' => [
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
'rechazada_adquisiciones',
],
'compras-bex' => [
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
'rechazada_adquisiciones',
]
];
} elseif ($role == 'apoderado_4') {
return [
'regularizacion-factura' => [
'rechazada_apoderado_4',
'rechazada_fondo_apoderado_4'
],
'compras-se' => [
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
'rechazada_adquisiciones',
],
'compras-bex' => [
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
'rechazada_adquisiciones',
]
];
}
if ($role == 'proveedor') {
return [
'regularizacion-factura' => [
'null'
],
'compras-se' => [
'recepcion_ofertas',
'recibiendo_preguntas',
'respondiendo_preguntas',
'compra_activada',
'evaluacion_tecnica',
'revision_ofertas',
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
'rechazada_adquisiciones',
],
'compras-bex' => [
'recibiendo_preguntas',
'respondiendo_preguntas',
'recepcion_ofertas',
'compra_activada',
'evaluacion_tecnica',
'revision_ofertas',
'validacion_ofertas',
'evaluacion_ejecutivo_area_compras',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
]
];
} elseif ($role == 'finanzas') {
return [
'regularizacion-factura' => [
'validacion_solicitante',
'evaluacion_apoderado_1',
'rechazado_apoderado_1',
'evaluacion_apoderado_2',
'rechazado_apoderado_2',
'evaluacion_adquisiciones',
'rechazada_adquisiciones',
'evaluacion_jefatura_adquisiciones',
'rechazada_jefatura_adquisiciones',
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4'
],
'compras-se' => [
'facturacion',
'aprobacion_pago',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_evaluada',
'orden_trabajo_rechazada'
],
'compras-bex' => [
'facturacion',
'aprobacion_pago',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_evaluada',
'orden_trabajo_rechazada'
]
];
} elseif ($role == 'ejecutivo_area_compras') {
return [
'compras-bex' => [
'evaluacion_apoderado_3',
'rechazada_apoderado_3',
'evaluacion_apoderado_4',
'rechazada_apoderado_4',
'compra_adjudicada',
'orden_trabajo_aceptada',
'orden_trabajo_certificada',
'orden_trabajo_rechazada',
'orden_trabajo_evaluada',
'facturacion',
'aprobacion_pago',
'solicitud_rechazada',
],
];
}
break;
default:
return [
'regularizacion-factura' => [
'null'
],
'compras-se' => [
'null'
],
'compras-bex' => [
'null'
]
];
}
return [
'regularizacion-factura' => [
'null'
],
'compras-se' => [
'null'
],
'compras-bex' => [
'null'
]
];
}
#[Route('/dashboard/viewer', name: 'dashboard_viewer', methods: ['GET','POST'])]
public function dashboardViewer()
{
/** @var Connection $conn */
$conn = $this->getDoctrine()->getConnection();
$qb = $conn->createQueryBuilder();
$qb->select("
wp.id,
wp.uuid,
wp.workflow,
u.code AS office_code,
u.name AS office_name,
wa2.value AS estimado_monto,
wa3.value AS estimado_moneda,
wa4.value AS total_adjudicado,
wa6.value AS factura_monto,
DATE_FORMAT(STR_TO_DATE(ws1.started_at,'%Y-%m-%d %H:%i:%s'),'%d-%m-%Y %H:%i') AS fecha_creacion,
DATE_FORMAT(STR_TO_DATE(wa5.value,'%d/%m/%Y'),'%d-%m-%Y') AS fecha_adjudicacion,
'' AS SLA,
ws2.state AS estado,
ws2.started_at AS fecha_estado,
was2.user_id AS selected_supplier
")
->distinct()
->from('workflow_processes', 'wp')
->leftJoin('wp', 'workflow_attributes', 'wa1', 'wp.id = wa1.process_id AND wa1.path = :path1')
->leftJoin('wa1', 'unit', 'u', 'u.id = wa1.value')
->leftJoin('wp', 'workflow_attributes', 'wa2', 'wp.id = wa2.process_id AND wa2.path = :path2')
->leftJoin('wp', 'workflow_attributes', 'wa3', 'wp.id = wa3.process_id AND wa3.path = :path3')
->leftJoin('wp', 'workflow_attributes', 'wa4', 'wp.id = wa4.process_id AND wa4.path = :path4')
->leftJoin('wp', 'workflow_attributes', 'wa6', 'wp.id = wa6.process_id AND wa6.path = :path6')
->innerJoin('wp', 'workflow_states', 'ws1', 'wp.id = ws1.process_id AND ws1.state = :state_start')
->leftJoin('wp', 'workflow_attributes', 'wa5', 'wp.id = wa5.process_id AND wa5.path = :path5')
->innerJoin('wp', 'workflow_states', 'ws2', 'wp.id = ws2.process_id AND ws2.current = :true')
->leftJoin('ws2', 'workflow_assignee', 'was2', 'ws2.id = was2.state_id AND was2.name = :selected_supplier')
->setParameter('path1', 'info_compra.sucursal')
->setParameter('path2', 'info_compra.valor_estimado.monto')
->setParameter('path3', 'info_compra.valor_estimado.moneda')
->setParameter('path4', 'total_adjudicado')
->setParameter('path5', 'cronograma.fecha_adjudicacion')
->setParameter('path6', 'info_compra.factura_monto')
->setParameter('state_start', '_process_start')
->setParameter('true', 1)
->setParameter('selected_supplier','adjudicado')
->orderBy('wp.uuid', 'DESC')
;
if(!$this->isGranted('ROLE_VIEWER')){
$qb
->innerJoin('ws2', 'workflow_assignee', 'was1', 'ws2.id = was1.state_id AND was1.user_id = :user_id')
->setParameter('user_id', $this->getUser()->getId())
;
// Exlude workflows cancelled for suppliers
if($this->isGranted('ROLE_SUPPLIER')){
$qb->andWhere(
$qb->expr()->orX(
$qb->expr()->notIn('ws2.state', ':states_anuladas'),
'EXISTS (
SELECT 1 FROM workflow_states ws_inv
INNER JOIN workflow_assignee wa_inv ON ws_inv.id = wa_inv.state_id
WHERE ws_inv.process_id = wp.id
AND wa_inv.user_id = :user_id
AND wa_inv.name = :proveedor_role
AND ws_inv.state NOT IN (:states_anuladas_check)
)'
)
)
->setParameter('states_anuladas', ['orden_trabajo_anulada', 'solicitud_anulada'], \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
->setParameter('states_anuladas_check', ['orden_trabajo_anulada', 'solicitud_anulada'], \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
->setParameter('proveedor_role', 'proveedor');
}
}
$roles = ['solicitante','apoderado_1','apoderado_2','adquisiciones','jefe_adquisiciones','apoderado_3','apoderado_4'];
if($this->isGranted('ROLE_SUPPLIER')){
$roles = ['proveedor'];
}elseif ($this->isGranted('ROLE_FINANCES')){
$roles = ['finanzas'];
}
$qbProcess = [];
$qbHistory = clone $qb;
$qbProcess['active'] = $qbProcess['process'] = [];
if(!$this->isGranted('ROLE_VIEWER')) {
foreach ($roles as $role) {
foreach (['active', 'process'] as $table) {
$qbCurrent = clone $qb;
$j = 0;
foreach ($this->getStatesBy($table, $role) as $workflow => $dataStates) {
$states = [];
$i = 0;
$dataStates = array_filter($dataStates);
foreach ($dataStates as $state) {
$current = 'state_' . $role . '_' . $j . '_' . $i;
$qbCurrent->setParameter($current, $state);
$states[] = ':' . $current;
$i++;
}
if ($dataStates) {
$qbCurrent->orWhere(
$qbCurrent->expr()->andX(
$qbCurrent->expr()->in('ws2.state', $states),
'was1.name = :role_' . $role,
"wp.workflow = :workflow_{$table}_$j"
)
)
->setParameter('role_' . $role, $role)
->setParameter("workflow_{$table}_$j", $workflow);
}
$j++;
}
$currentProcess = $qbCurrent->execute()->fetchAll();
$qbProcess[$table] = array_merge($qbProcess[$table], $currentProcess);
unset($qbCurrent);
}
}
} else {
$qbCurrent = clone $qb;
$currentProcess = $qbCurrent->execute()->fetchAll();
$qbProcess['process'] = array_merge($qbProcess['process'], $currentProcess);
unset($qbCurrent);
}
$qbActive = $qbProcess['active'];
$qbInProcess = $qbProcess['process'];
$states = [];
$i = 0;
foreach ($this->getStatesBy('history') as $state) {
$current = 'state_' . $i;
$qbHistory->setParameter($current, $state);
$states[] = ':' . $current;
$i++;
}
$qbHistory->andWhere(
$qbHistory->expr()->in('ws2.state', $states)
);
$showPasswordAlert = !$this->getUser()->isPasswordUpdatedForNewPolicy();
return $this->render('Dashboard/index.html.twig', [
'active' => $qbActive,
'process' => $qbInProcess,
'history' => $qbHistory->execute()->fetchAll(),
'showPasswordAlert' => $showPasswordAlert,
]);
}
}