src/Controller/DashboardController.php line 21

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Service\SupplierDocumentsStatusChecker;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. use Doctrine\DBAL\Connection;
  10. class DashboardController extends AbstractController
  11. {
  12. public function __construct(
  13. private readonly SupplierDocumentsStatusChecker $documentsStatusChecker
  14. ) {
  15. }
  16. #[Route('/', name: 'dashboard')]
  17. public function index(EntityManagerInterface $manager): Response
  18. {
  19. /** @var Connection $conn */
  20. $conn = $manager->getConnection();
  21. $qb = $conn->createQueryBuilder();
  22. $qb->select("
  23. wp.id,
  24. wp.uuid,
  25. wp.workflow,
  26. u.code AS office_code,
  27. u.name AS office_name,
  28. wa2.value AS estimado_monto,
  29. wa3.value AS estimado_moneda,
  30. wa4.value AS total_adjudicado,
  31. wa6.value AS factura_monto,
  32. wa7.value AS factura_monto_neto,
  33. DATE_FORMAT(STR_TO_DATE(ws1.started_at,'%Y-%m-%d %H:%i:%s'),'%d-%m-%Y %H:%i') AS fecha_creacion,
  34. DATE_FORMAT(STR_TO_DATE(wa5.value,'%d/%m/%Y'),'%d-%m-%Y') AS fecha_adjudicacion,
  35. '' AS SLA,
  36. ws2.state AS estado,
  37. ws2.started_at AS fecha_estado,
  38. was2.user_id AS selected_supplier
  39. ")
  40. ->distinct()
  41. ->from('workflow_processes', 'wp')
  42. ->leftJoin('wp', 'workflow_attributes', 'wa1', 'wp.id = wa1.process_id AND wa1.path = :path1')
  43. ->leftJoin('wa1', 'unit', 'u', 'u.id = wa1.value')
  44. ->leftJoin('wp', 'workflow_attributes', 'wa2', 'wp.id = wa2.process_id AND wa2.path = :path2')
  45. ->leftJoin('wp', 'workflow_attributes', 'wa3', 'wp.id = wa3.process_id AND wa3.path = :path3')
  46. ->leftJoin('wp', 'workflow_attributes', 'wa4', 'wp.id = wa4.process_id AND wa4.path = :path4')
  47. ->leftJoin('wp', 'workflow_attributes', 'wa6', 'wp.id = wa6.process_id AND wa6.path = :path6')
  48. ->leftJoin('wp', 'workflow_attributes', 'wa7', 'wp.id = wa7.process_id AND wa7.path = :path7')
  49. ->innerJoin('wp', 'workflow_states', 'ws1', 'wp.id = ws1.process_id AND ws1.state = :state_start')
  50. ->leftJoin('wp', 'workflow_attributes', 'wa5', 'wp.id = wa5.process_id AND wa5.path = :path5')
  51. ->innerJoin('wp', 'workflow_states', 'ws2', 'wp.id = ws2.process_id AND ws2.current = :true')
  52. ->innerJoin('ws2', 'workflow_assignee', 'was1', 'ws2.id = was1.state_id AND was1.user_id = :user_id')
  53. ->leftJoin('ws2', 'workflow_assignee', 'was2', 'ws2.id = was2.state_id AND was2.name = :selected_supplier')
  54. ->setParameter('path1', 'info_compra.sucursal')
  55. ->setParameter('path2', 'info_compra.valor_estimado.monto')
  56. ->setParameter('path3', 'info_compra.valor_estimado.moneda')
  57. ->setParameter('path4', 'total_adjudicado')
  58. ->setParameter('path5', 'cronograma.fecha_adjudicacion')
  59. ->setParameter('path6', 'info_compra.factura_monto')
  60. ->setParameter('path7', 'info_compra.factura_monto_neto')
  61. ->setParameter('state_start', '_process_start')
  62. ->setParameter('true', 1)
  63. ->setParameter('user_id', $this->getUser()->getId())
  64. ->setParameter('selected_supplier','adjudicado')
  65. ->orderBy('wp.uuid', 'DESC')
  66. ;
  67. $roles = ['solicitante','apoderado_1','apoderado_2','adquisiciones','jefe_adquisiciones','apoderado_3','apoderado_4','ejecutivo_area_compras'];
  68. if($this->isGranted('ROLE_SUPPLIER')){
  69. $roles = ['proveedor'];
  70. }elseif ($this->isGranted('ROLE_FINANCES')){
  71. $roles[] = 'finanzas';
  72. }
  73. $qbProcess = [];
  74. $qbProcess['active'] = $qbProcess['process'] = [];
  75. foreach ($roles as $role) {
  76. foreach (['active', 'process'] as $table) {
  77. $qbCurrent = clone $qb;
  78. $j = 0;
  79. foreach ($this->getStatesBy($table, $role) as $workflow => $dataStates) {
  80. $states = [];
  81. $i = 0;
  82. $dataStates = array_filter($dataStates);
  83. foreach ($dataStates as $state) {
  84. $current = 'state_' . $role . '_' . $j . '_' . $i;
  85. $qbCurrent->setParameter($current, $state);
  86. $states[] = ':' . $current;
  87. $i++;
  88. }
  89. if ($dataStates) {
  90. $qbCurrent->orWhere(
  91. $qbCurrent->expr()->andX(
  92. $qbCurrent->expr()->in('ws2.state', $states),
  93. 'was1.name = :role_' . $role,
  94. "wp.workflow = :workflow_{$table}_$j"
  95. )
  96. )
  97. ->setParameter('role_' . $role, $role)
  98. ->setParameter("workflow_{$table}_$j", $workflow);
  99. }
  100. $j++;
  101. }
  102. $currentProcess = $qbCurrent->execute()->fetchAll();
  103. $qbProcess[$table] = array_merge($qbProcess[$table], $currentProcess);
  104. unset($qbCurrent);
  105. }
  106. }
  107. $qbActive = $qbProcess['active'];
  108. $qbInProcess = $qbProcess['process'];
  109. $states = [];
  110. $i = 0;
  111. $qbHistory = $conn->createQueryBuilder();
  112. $qbHistory->select('count(wp.id) as total_rows')
  113. ->distinct()
  114. ->from('workflow_processes', 'wp')
  115. ->innerJoin('wp', 'workflow_states', 'ws2', 'wp.id = ws2.process_id AND ws2.current = :true')
  116. ->innerJoin('ws2', 'workflow_assignee', 'was1', 'ws2.id = was1.state_id AND was1.user_id = :user_id')
  117. ->leftJoin('ws2', 'workflow_assignee', 'was2', 'ws2.id = was2.state_id AND was2.name = :selected_supplier')
  118. ->setParameter('true', 1)
  119. ->setParameter('user_id', $this->getUser()->getId())
  120. ->setParameter('selected_supplier','adjudicado')
  121. ->orderBy('wp.uuid', 'DESC')
  122. ->setMaxResults(1)
  123. ;
  124. // Exlude workflows cancelled for suppliers
  125. if($this->isGranted('ROLE_SUPPLIER')){
  126. $qbHistory->andWhere(
  127. $qbHistory->expr()->orX(
  128. $qbHistory->expr()->notIn('ws2.state', ':states_anuladas'),
  129. 'EXISTS (
  130. SELECT 1 FROM workflow_states ws_inv
  131. INNER JOIN workflow_assignee wa_inv ON ws_inv.id = wa_inv.state_id
  132. WHERE ws_inv.process_id = wp.id
  133. AND wa_inv.user_id = :user_id
  134. AND wa_inv.name = :proveedor_role
  135. AND ws_inv.state NOT IN (:states_anuladas_check)
  136. )'
  137. )
  138. )
  139. ->setParameter('states_anuladas', ['orden_trabajo_anulada', 'solicitud_anulada'], \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
  140. ->setParameter('states_anuladas_check', ['orden_trabajo_anulada', 'solicitud_anulada'], \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
  141. ->setParameter('proveedor_role', 'proveedor');
  142. }
  143. foreach ($this->getStatesBy('history') as $state) {
  144. $current = 'state_' . $i;
  145. $qbHistory->setParameter($current, $state);
  146. $states[] = ':' . $current;
  147. $i++;
  148. }
  149. $qbHistory->andWhere(
  150. $qbHistory->expr()->in('ws2.state', $states)
  151. );
  152. $countHistory = (int) $qbHistory->execute()->fetchOne() ?? 0;
  153. $showPasswordAlert = !$this->getUser()->isPasswordUpdatedForNewPolicy();
  154. $documentsStatus = null;
  155. if ($this->isGranted('ROLE_SUPPLIER')) {
  156. $supplier = $this->getUser()?->getSupplier();
  157. if ($supplier) {
  158. $documentsStatus = $this->documentsStatusChecker->check($supplier);
  159. }
  160. }
  161. return $this->render('Dashboard/index.html.twig', [
  162. 'active' => $qbActive,
  163. 'process' => $qbInProcess,
  164. 'countHistory' => $countHistory,
  165. 'documentsStatus' => $documentsStatus,
  166. 'showPasswordAlert' => $showPasswordAlert,
  167. ]);
  168. }
  169. #[Route('/workflow/compras-se', name: 'dashboard_legacy', methods: ['GET','POST'])]
  170. public function legacy()
  171. {
  172. return $this->redirectToRoute('dashboard');
  173. }
  174. #[Route('/historico', name: 'history', methods: ['GET','POST'])]
  175. public function history(EntityManagerInterface $manager)
  176. {
  177. /** @var Connection $conn */
  178. $conn = $manager->getConnection();
  179. $qb = $conn->createQueryBuilder();
  180. $qb->select("
  181. wp.id,
  182. wp.uuid,
  183. wp.workflow,
  184. u.code AS office_code,
  185. u.name AS office_name,
  186. wa2.value AS estimado_monto,
  187. wa3.value AS estimado_moneda,
  188. wa4.value AS total_adjudicado,
  189. wa6.value AS factura_monto,
  190. DATE_FORMAT(STR_TO_DATE(ws1.started_at,'%Y-%m-%d %H:%i:%s'),'%d-%m-%Y %H:%i') AS fecha_creacion,
  191. DATE_FORMAT(STR_TO_DATE(wa5.value,'%d/%m/%Y'),'%d-%m-%Y') AS fecha_adjudicacion,
  192. '' AS SLA,
  193. ws2.state AS estado,
  194. ws2.started_at AS fecha_estado,
  195. was2.user_id AS selected_supplier
  196. ")
  197. ->distinct()
  198. ->from('workflow_processes', 'wp')
  199. ->leftJoin('wp', 'workflow_attributes', 'wa1', 'wp.id = wa1.process_id AND wa1.path = :path1')
  200. ->leftJoin('wa1', 'unit', 'u', 'u.id = wa1.value')
  201. ->leftJoin('wp', 'workflow_attributes', 'wa2', 'wp.id = wa2.process_id AND wa2.path = :path2')
  202. ->leftJoin('wp', 'workflow_attributes', 'wa3', 'wp.id = wa3.process_id AND wa3.path = :path3')
  203. ->leftJoin('wp', 'workflow_attributes', 'wa4', 'wp.id = wa4.process_id AND wa4.path = :path4')
  204. ->leftJoin('wp', 'workflow_attributes', 'wa6', 'wp.id = wa6.process_id AND wa6.path = :path6')
  205. ->innerJoin('wp', 'workflow_states', 'ws1', 'wp.id = ws1.process_id AND ws1.state = :state_start')
  206. ->leftJoin('wp', 'workflow_attributes', 'wa5', 'wp.id = wa5.process_id AND wa5.path = :path5')
  207. ->innerJoin('wp', 'workflow_states', 'ws2', 'wp.id = ws2.process_id AND ws2.current = :true')
  208. ->leftJoin('ws2', 'workflow_assignee', 'was2', 'ws2.id = was2.state_id AND was2.name = :selected_supplier')
  209. ->setParameter('path1', 'info_compra.sucursal')
  210. ->setParameter('path2', 'info_compra.valor_estimado.monto')
  211. ->setParameter('path3', 'info_compra.valor_estimado.moneda')
  212. ->setParameter('path4', 'total_adjudicado')
  213. ->setParameter('path5', 'cronograma.fecha_adjudicacion')
  214. ->setParameter('path6', 'info_compra.factura_monto')
  215. ->setParameter('state_start', '_process_start')
  216. ->setParameter('true', 1)
  217. ->setParameter('selected_supplier','adjudicado')
  218. ->orderBy('wp.uuid', 'DESC')
  219. ;
  220. if(!$this->isGranted('ROLE_VIEWER')){
  221. $qb
  222. ->innerJoin('ws2', 'workflow_assignee', 'was1', 'ws2.id = was1.state_id AND was1.user_id = :user_id')
  223. ->setParameter('user_id', $this->getUser()->getId())
  224. ;
  225. // Exlude workflows cancelled for suppliers
  226. if($this->isGranted('ROLE_SUPPLIER')){
  227. $qb->andWhere(
  228. $qb->expr()->orX(
  229. $qb->expr()->notIn('ws2.state', ':states_anuladas'),
  230. 'EXISTS (
  231. SELECT 1 FROM workflow_states ws_inv
  232. INNER JOIN workflow_assignee wa_inv ON ws_inv.id = wa_inv.state_id
  233. WHERE ws_inv.process_id = wp.id
  234. AND wa_inv.user_id = :user_id
  235. AND wa_inv.name = :proveedor_role
  236. AND ws_inv.state NOT IN (:states_anuladas_check)
  237. )'
  238. )
  239. )
  240. ->setParameter('states_anuladas', ['orden_trabajo_anulada', 'solicitud_anulada'], \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
  241. ->setParameter('states_anuladas_check', ['orden_trabajo_anulada', 'solicitud_anulada'], \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
  242. ->setParameter('proveedor_role', 'proveedor');
  243. }
  244. }
  245. $qbHistory = clone $qb;
  246. $states = [];
  247. $i = 0;
  248. foreach ($this->getStatesBy('history') as $state) {
  249. $current = 'state_' . $i;
  250. $qbHistory->setParameter($current, $state);
  251. $states[] = ':' . $current;
  252. $i++;
  253. }
  254. $qbHistory->andWhere(
  255. $qbHistory->expr()->in('ws2.state', $states)
  256. );
  257. return $this->render('Dashboard/history.html.twig', [
  258. 'history' => $qbHistory->fetchAllAssociative() ,
  259. ]);
  260. }
  261. /**
  262. * @param $type
  263. * @param $role
  264. * @return array
  265. */
  266. private function getStatesBy($type, $role = null)
  267. {
  268. if ($type == 'historico') $type = 'history';
  269. switch ($type) {
  270. case 'history':
  271. return [
  272. 'orden_trabajo_completa',
  273. 'orden_trabajo_anulada',
  274. 'solicitud_cerrada',
  275. 'solicitud_anulada',
  276. ];
  277. case 'active':
  278. if ($role == 'solicitante') {
  279. return [
  280. 'regularizacion-factura' => [
  281. 'validacion_solicitante',
  282. 'rechazado_apoderado_1',
  283. 'rechazado_apoderado_2',
  284. 'rechazada_adquisiciones',
  285. 'rechazada_jefatura_adquisiciones',
  286. 'rechazada_apoderado_3',
  287. 'rechazada_apoderado_4'
  288. ],
  289. 'compras-se' => [
  290. 'rechazado_apoderado_1',
  291. 'rechazado_apoderado_2',
  292. 'orden_trabajo_certificada',
  293. 'rechazada_adquisiciones',
  294. ],
  295. 'compras-bex' => [
  296. 'rechazada_adquisiciones',
  297. 'validacion_solicitante',
  298. 'rechazado_apoderado_1',
  299. 'rechazado_apoderado_2',
  300. 'evaluacion_tecnica',
  301. 'orden_trabajo_certificada',
  302. ]
  303. ];
  304. } elseif ($role == 'apoderado_1') {
  305. return [
  306. 'regularizacion-factura' => [
  307. 'evaluacion_apoderado_1'
  308. ],
  309. 'compras-se' => [
  310. 'evaluacion_apoderado_1',
  311. ],
  312. 'compras-bex' => [
  313. 'evaluacion_apoderado_1',
  314. ]
  315. ];
  316. } elseif ($role == 'apoderado_2') {
  317. return [
  318. 'regularizacion-factura' => [
  319. 'evaluacion_apoderado_2'
  320. ],
  321. 'compras-se' => [
  322. 'evaluacion_apoderado_2',
  323. ],
  324. 'compras-bex' => [
  325. 'evaluacion_apoderado_2',
  326. ]
  327. ];
  328. } elseif ($role == 'adquisiciones') {
  329. return [
  330. 'regularizacion-factura' => [
  331. 'evaluacion_adquisiciones'
  332. ],
  333. 'compras-se' => [
  334. 'evaluacion_adquisiciones',
  335. 'revision_ofertas',
  336. ],
  337. 'compras-bex' => [
  338. 'evaluacion_adquisiciones',
  339. 'rechazada_jefatura_adquisiciones',
  340. 'validacion_adquisiciones',
  341. 'revision_ofertas',
  342. 'validacion_ofertas'
  343. ]
  344. ];
  345. } elseif ($role == 'jefe_adquisiciones') {
  346. return [
  347. 'regularizacion-factura' => [
  348. 'evaluacion_jefatura_adquisiciones'
  349. ],
  350. 'compras-se' => [
  351. 'evaluacion_jefatura_adquisiciones',
  352. 'rechazada_jefatura_adquisiciones',
  353. ],
  354. 'compras-bex' => [
  355. 'evaluacion_jefatura_adquisiciones',
  356. ]
  357. ];
  358. } elseif ($role == 'apoderado_3') {
  359. return [
  360. 'regularizacion-factura' => [
  361. 'evaluacion_apoderado_3'
  362. ],
  363. 'compras-se' => [
  364. 'evaluacion_apoderado_3',
  365. ],
  366. 'compras-bex' => [
  367. 'evaluacion_apoderado_3',
  368. ]
  369. ];
  370. } elseif ($role == 'apoderado_4') {
  371. return [
  372. 'regularizacion-factura' => [
  373. 'evaluacion_apoderado_4'
  374. ],
  375. 'compras-se' => [
  376. 'evaluacion_apoderado_4',
  377. ],
  378. 'compras-bex' => [
  379. 'evaluacion_apoderado_4',
  380. ]
  381. ];
  382. } elseif ($role == 'finanzas') {
  383. return [
  384. 'regularizacion-factura' => [
  385. 'rechazado_solicitante',
  386. 'rechazado_fondo_apoderado_1',
  387. 'rechazado_fondo_apoderado_2',
  388. 'rechazada_fondo_adquisiciones',
  389. 'rechazada_fondo_jefatura_adquisiciones',
  390. 'rechazada_fondo_apoderado_3',
  391. 'rechazada_fondo_apoderado_4'
  392. ],
  393. ];
  394. } elseif ($role == 'ejecutivo_area_compras') {
  395. return [
  396. 'compras-bex' => [
  397. 'evaluacion_ejecutivo_area_compras',
  398. ],
  399. ];
  400. }
  401. break;
  402. case 'process':
  403. if ($role == 'solicitante') {
  404. return [
  405. 'regularizacion-factura' => [
  406. 'rechazado_solicitante',
  407. 'evaluacion_apoderado_1',
  408. 'evaluacion_apoderado_2',
  409. 'evaluacion_adquisiciones',
  410. 'evaluacion_jefatura_adquisiciones',
  411. 'rechazada_jefatura_adquisiciones',
  412. 'evaluacion_apoderado_3',
  413. 'evaluacion_apoderado_4',
  414. 'rechazado_fondo_apoderado_1',
  415. 'rechazado_fondo_apoderado_2',
  416. 'rechazada_fondo_adquisiciones',
  417. 'rechazada_fondo_jefatura_adquisiciones',
  418. 'rechazada_fondo_apoderado_3',
  419. 'rechazada_fondo_apoderado_4'
  420. ],
  421. 'compras-se' => [
  422. 'evaluacion_apoderado_1',
  423. 'evaluacion_apoderado_2',
  424. 'evaluacion_adquisiciones',
  425. 'compra_aprobada',
  426. 'recepcion_ofertas',
  427. 'recibiendo_preguntas',
  428. 'respondiendo_preguntas',
  429. 'compra_activada',
  430. 'evaluacion_tecnica',
  431. 'revision_ofertas',
  432. 'evaluacion_jefatura_adquisiciones',
  433. 'rechazada_jefatura_adquisiciones',
  434. 'evaluacion_apoderado_3',
  435. 'rechazada_apoderado_3',
  436. 'evaluacion_apoderado_4',
  437. 'rechazada_apoderado_4',
  438. 'compra_adjudicada',
  439. 'orden_trabajo_aceptada',
  440. 'orden_trabajo_rechazada',
  441. 'orden_trabajo_evaluada',
  442. 'facturacion',
  443. 'aprobacion_pago',
  444. 'solicitud_rechazada',
  445. ],
  446. 'compras-bex' => [
  447. 'evaluacion_adquisiciones',
  448. 'evaluacion_jefatura_adquisiciones',
  449. 'rechazada_jefatura_adquisiciones',
  450. 'evaluacion_apoderado_1',
  451. 'evaluacion_apoderado_2',
  452. 'validacion_adquisiciones',
  453. 'recibiendo_preguntas',
  454. 'respondiendo_preguntas',
  455. 'recepcion_ofertas',
  456. 'validacion_ofertas',
  457. 'revision_ofertas',
  458. 'evaluacion_ejecutivo_area_compras',
  459. 'compra_aprobada',
  460. 'compra_activada',
  461. 'evaluacion_apoderado_3',
  462. 'rechazada_apoderado_3',
  463. 'evaluacion_apoderado_4',
  464. 'rechazada_apoderado_4',
  465. 'compra_adjudicada',
  466. 'orden_trabajo_aceptada',
  467. 'orden_trabajo_rechazada',
  468. 'orden_trabajo_evaluada',
  469. 'facturacion',
  470. 'aprobacion_pago',
  471. 'solicitud_rechazada',
  472. ]
  473. ];
  474. } elseif ($role == 'apoderado_1') {
  475. return [
  476. 'regularizacion-factura' => [
  477. 'rechazado_apoderado_1',
  478. 'evaluacion_apoderado_2',
  479. 'rechazado_apoderado_2',
  480. 'evaluacion_adquisiciones',
  481. 'rechazada_adquisiciones',
  482. 'evaluacion_jefatura_adquisiciones',
  483. 'rechazada_jefatura_adquisiciones',
  484. 'evaluacion_apoderado_3',
  485. 'rechazada_apoderado_3',
  486. 'evaluacion_apoderado_4',
  487. 'rechazada_apoderado_4',
  488. 'rechazado_fondo_apoderado_1',
  489. 'rechazado_fondo_apoderado_2',
  490. 'rechazada_fondo_adquisiciones',
  491. 'rechazada_fondo_jefatura_adquisiciones',
  492. 'rechazada_fondo_apoderado_3',
  493. 'rechazada_fondo_apoderado_4'
  494. ],
  495. 'compras-se' => [
  496. 'rechazado_apoderado_1',
  497. 'evaluacion_apoderado_2',
  498. 'rechazado_apoderado_2',
  499. 'evaluacion_adquisiciones',
  500. 'compra_aprobada',
  501. 'recepcion_ofertas',
  502. 'recibiendo_preguntas',
  503. 'respondiendo_preguntas',
  504. 'compra_activada',
  505. 'evaluacion_tecnica',
  506. 'revision_ofertas',
  507. 'evaluacion_jefatura_adquisiciones',
  508. 'rechazada_jefatura_adquisiciones',
  509. 'evaluacion_apoderado_3',
  510. 'rechazada_apoderado_3',
  511. 'evaluacion_apoderado_4',
  512. 'rechazada_apoderado_4',
  513. 'compra_adjudicada',
  514. 'orden_trabajo_aceptada',
  515. 'orden_trabajo_certificada',
  516. 'orden_trabajo_rechazada',
  517. 'orden_trabajo_evaluada',
  518. 'facturacion',
  519. 'aprobacion_pago',
  520. 'solicitud_rechazada',
  521. 'rechazada_adquisiciones',
  522. ],
  523. 'compras-bex' => [
  524. 'rechazado_apoderado_1',
  525. 'evaluacion_apoderado_2',
  526. 'rechazado_apoderado_2',
  527. 'validacion_adquisiciones',
  528. 'recibiendo_preguntas',
  529. 'respondiendo_preguntas',
  530. 'recepcion_ofertas',
  531. 'validacion_ofertas',
  532. 'evaluacion_tecnica',
  533. 'revision_ofertas',
  534. 'evaluacion_ejecutivo_area_compras',
  535. 'compra_aprobada',
  536. 'compra_activada',
  537. 'evaluacion_apoderado_3',
  538. 'rechazada_apoderado_3',
  539. 'evaluacion_apoderado_4',
  540. 'rechazada_apoderado_4',
  541. 'compra_adjudicada',
  542. 'orden_trabajo_aceptada',
  543. 'orden_trabajo_certificada',
  544. 'orden_trabajo_rechazada',
  545. 'orden_trabajo_evaluada',
  546. 'facturacion',
  547. 'aprobacion_pago',
  548. 'solicitud_rechazada',
  549. ]
  550. ];
  551. } elseif ($role == 'apoderado_2') {
  552. return [
  553. 'regularizacion-factura' => [
  554. 'rechazado_apoderado_2',
  555. 'evaluacion_adquisiciones',
  556. 'rechazada_adquisiciones',
  557. 'evaluacion_jefatura_adquisiciones',
  558. 'rechazada_jefatura_adquisiciones',
  559. 'evaluacion_apoderado_3',
  560. 'rechazada_apoderado_3',
  561. 'evaluacion_apoderado_4',
  562. 'rechazada_apoderado_4',
  563. 'rechazado_fondo_apoderado_2',
  564. 'rechazada_fondo_adquisiciones',
  565. 'rechazada_fondo_jefatura_adquisiciones',
  566. 'rechazada_fondo_apoderado_3',
  567. 'rechazada_fondo_apoderado_4'
  568. ],
  569. 'compras-se' => [
  570. 'rechazado_apoderado_2',
  571. 'evaluacion_adquisiciones',
  572. 'compra_aprobada',
  573. 'recepcion_ofertas',
  574. 'recibiendo_preguntas',
  575. 'respondiendo_preguntas',
  576. 'compra_activada',
  577. 'evaluacion_tecnica',
  578. 'revision_ofertas',
  579. 'evaluacion_jefatura_adquisiciones',
  580. 'rechazada_jefatura_adquisiciones',
  581. 'evaluacion_apoderado_3',
  582. 'rechazada_apoderado_3',
  583. 'evaluacion_apoderado_4',
  584. 'rechazada_apoderado_4',
  585. 'compra_adjudicada',
  586. 'orden_trabajo_aceptada',
  587. 'orden_trabajo_certificada',
  588. 'orden_trabajo_rechazada',
  589. 'orden_trabajo_evaluada',
  590. 'facturacion',
  591. 'aprobacion_pago',
  592. 'solicitud_rechazada',
  593. 'rechazada_adquisiciones',
  594. ],
  595. 'compras-bex' => [
  596. 'rechazado_apoderado_2',
  597. 'validacion_adquisiciones',
  598. 'recibiendo_preguntas',
  599. 'respondiendo_preguntas',
  600. 'recepcion_ofertas',
  601. 'validacion_ofertas',
  602. 'evaluacion_tecnica',
  603. 'revision_ofertas',
  604. 'evaluacion_ejecutivo_area_compras',
  605. 'compra_aprobada',
  606. 'compra_activada',
  607. 'evaluacion_apoderado_3',
  608. 'rechazada_apoderado_3',
  609. 'evaluacion_apoderado_4',
  610. 'rechazada_apoderado_4',
  611. 'compra_adjudicada',
  612. 'orden_trabajo_aceptada',
  613. 'orden_trabajo_certificada',
  614. 'orden_trabajo_rechazada',
  615. 'orden_trabajo_evaluada',
  616. 'facturacion',
  617. 'aprobacion_pago',
  618. 'solicitud_rechazada',
  619. ]
  620. ];
  621. } elseif ($role == 'adquisiciones') {
  622. return [
  623. 'regularizacion-factura' => [
  624. 'rechazada_adquisiciones',
  625. 'evaluacion_jefatura_adquisiciones',
  626. 'rechazada_jefatura_adquisiciones',
  627. 'evaluacion_apoderado_3',
  628. 'rechazada_apoderado_3',
  629. 'evaluacion_apoderado_4',
  630. 'rechazada_apoderado_4',
  631. 'rechazada_fondo_adquisiciones',
  632. 'rechazada_fondo_jefatura_adquisiciones',
  633. 'rechazada_fondo_apoderado_3',
  634. 'rechazada_fondo_apoderado_4'
  635. ],
  636. 'compras-se' => [
  637. 'compra_aprobada',
  638. 'recepcion_ofertas',
  639. 'recibiendo_preguntas',
  640. 'respondiendo_preguntas',
  641. 'compra_activada',
  642. 'evaluacion_tecnica',
  643. 'evaluacion_jefatura_adquisiciones',
  644. 'rechazada_jefatura_adquisiciones',
  645. 'evaluacion_apoderado_3',
  646. 'rechazada_apoderado_3',
  647. 'evaluacion_apoderado_4',
  648. 'rechazada_apoderado_4',
  649. 'compra_adjudicada',
  650. 'orden_trabajo_aceptada',
  651. 'orden_trabajo_certificada',
  652. 'orden_trabajo_rechazada',
  653. 'orden_trabajo_evaluada',
  654. 'facturacion',
  655. 'aprobacion_pago',
  656. 'solicitud_rechazada',
  657. 'rechazada_adquisiciones',
  658. ],
  659. 'compras-bex' => [
  660. 'rechazada_adquisiciones',
  661. 'evaluacion_jefatura_adquisiciones',
  662. 'validacion_solicitante',
  663. 'evaluacion_apoderado_1',
  664. 'rechazado_apoderado_1',
  665. 'evaluacion_apoderado_2',
  666. 'rechazado_apoderado_2',
  667. 'recibiendo_preguntas',
  668. 'respondiendo_preguntas',
  669. 'recepcion_ofertas',
  670. 'validacion_ofertas',
  671. 'evaluacion_tecnica',
  672. 'revision_ofertas',
  673. 'evaluacion_ejecutivo_area_compras',
  674. 'compra_aprobada',
  675. 'compra_activada',
  676. 'evaluacion_apoderado_3',
  677. 'rechazada_apoderado_3',
  678. 'evaluacion_apoderado_4',
  679. 'rechazada_apoderado_4',
  680. 'compra_adjudicada',
  681. 'orden_trabajo_aceptada',
  682. 'orden_trabajo_certificada',
  683. 'orden_trabajo_rechazada',
  684. 'orden_trabajo_evaluada',
  685. 'facturacion',
  686. 'aprobacion_pago',
  687. 'solicitud_rechazada',
  688. ]
  689. ];
  690. } elseif ($role == 'jefe_adquisiciones') {
  691. return [
  692. 'regularizacion-factura' => [
  693. 'rechazada_jefatura_adquisiciones',
  694. 'evaluacion_apoderado_3',
  695. 'rechazada_apoderado_3',
  696. 'evaluacion_apoderado_4',
  697. 'rechazada_apoderado_4',
  698. 'rechazada_fondo_jefatura_adquisiciones',
  699. 'rechazada_fondo_apoderado_3',
  700. 'rechazada_fondo_apoderado_4'
  701. ],
  702. 'compras-se' => [
  703. 'evaluacion_apoderado_3',
  704. 'rechazada_apoderado_3',
  705. 'evaluacion_apoderado_4',
  706. 'rechazada_apoderado_4',
  707. 'compra_adjudicada',
  708. 'orden_trabajo_aceptada',
  709. 'orden_trabajo_certificada',
  710. 'orden_trabajo_rechazada',
  711. 'orden_trabajo_evaluada',
  712. 'facturacion',
  713. 'aprobacion_pago',
  714. ],
  715. 'compras-bex' => [
  716. 'rechazada_jefatura_adquisiciones',
  717. 'validacion_solicitante',
  718. 'evaluacion_apoderado_1',
  719. 'rechazado_apoderado_1',
  720. 'evaluacion_apoderado_2',
  721. 'rechazado_apoderado_2',
  722. 'validacion_solicitante',
  723. 'evaluacion_apoderado_1',
  724. 'rechazado_apoderado_1',
  725. 'evaluacion_apoderado_2',
  726. 'rechazado_apoderado_2',
  727. 'validacion_adquisiciones',
  728. 'recibiendo_preguntas',
  729. 'respondiendo_preguntas',
  730. 'recepcion_ofertas',
  731. 'evaluacion_tecnica',
  732. 'revision_ofertas',
  733. 'validacion_ofertas',
  734. 'evaluacion_ejecutivo_area_compras',
  735. 'evaluacion_apoderado_3',
  736. 'rechazada_apoderado_3',
  737. 'evaluacion_apoderado_4',
  738. 'rechazada_apoderado_4',
  739. 'compra_adjudicada',
  740. 'orden_trabajo_aceptada',
  741. 'orden_trabajo_certificada',
  742. 'orden_trabajo_rechazada',
  743. 'orden_trabajo_evaluada',
  744. 'facturacion',
  745. 'aprobacion_pago',
  746. ]
  747. ];
  748. } elseif ($role == 'apoderado_3') {
  749. return [
  750. 'regularizacion-factura' => [
  751. 'rechazada_apoderado_3',
  752. 'evaluacion_apoderado_4',
  753. 'rechazada_apoderado_4',
  754. 'rechazada_fondo_apoderado_3',
  755. 'rechazada_fondo_apoderado_4'
  756. ],
  757. 'compras-se' => [
  758. 'rechazada_apoderado_3',
  759. 'evaluacion_apoderado_4',
  760. 'rechazada_apoderado_4',
  761. 'compra_adjudicada',
  762. 'orden_trabajo_aceptada',
  763. 'orden_trabajo_certificada',
  764. 'orden_trabajo_rechazada',
  765. 'orden_trabajo_evaluada',
  766. 'facturacion',
  767. 'aprobacion_pago',
  768. 'solicitud_rechazada',
  769. 'rechazada_adquisiciones',
  770. ],
  771. 'compras-bex' => [
  772. 'rechazada_apoderado_3',
  773. 'evaluacion_apoderado_4',
  774. 'rechazada_apoderado_4',
  775. 'compra_adjudicada',
  776. 'orden_trabajo_aceptada',
  777. 'orden_trabajo_certificada',
  778. 'orden_trabajo_rechazada',
  779. 'orden_trabajo_evaluada',
  780. 'facturacion',
  781. 'aprobacion_pago',
  782. 'solicitud_rechazada',
  783. 'rechazada_adquisiciones',
  784. ]
  785. ];
  786. } elseif ($role == 'apoderado_4') {
  787. return [
  788. 'regularizacion-factura' => [
  789. 'rechazada_apoderado_4',
  790. 'rechazada_fondo_apoderado_4'
  791. ],
  792. 'compras-se' => [
  793. 'rechazada_apoderado_4',
  794. 'compra_adjudicada',
  795. 'orden_trabajo_aceptada',
  796. 'orden_trabajo_certificada',
  797. 'orden_trabajo_rechazada',
  798. 'orden_trabajo_evaluada',
  799. 'facturacion',
  800. 'aprobacion_pago',
  801. 'solicitud_rechazada',
  802. 'rechazada_adquisiciones',
  803. ],
  804. 'compras-bex' => [
  805. 'rechazada_apoderado_4',
  806. 'compra_adjudicada',
  807. 'orden_trabajo_aceptada',
  808. 'orden_trabajo_certificada',
  809. 'orden_trabajo_rechazada',
  810. 'orden_trabajo_evaluada',
  811. 'facturacion',
  812. 'aprobacion_pago',
  813. 'solicitud_rechazada',
  814. 'rechazada_adquisiciones',
  815. ]
  816. ];
  817. }
  818. if ($role == 'proveedor') {
  819. return [
  820. 'regularizacion-factura' => [
  821. 'null'
  822. ],
  823. 'compras-se' => [
  824. 'recepcion_ofertas',
  825. 'recibiendo_preguntas',
  826. 'respondiendo_preguntas',
  827. 'compra_activada',
  828. 'evaluacion_tecnica',
  829. 'revision_ofertas',
  830. 'evaluacion_jefatura_adquisiciones',
  831. 'rechazada_jefatura_adquisiciones',
  832. 'evaluacion_apoderado_3',
  833. 'rechazada_apoderado_3',
  834. 'evaluacion_apoderado_4',
  835. 'rechazada_apoderado_4',
  836. 'compra_adjudicada',
  837. 'orden_trabajo_aceptada',
  838. 'orden_trabajo_certificada',
  839. 'orden_trabajo_rechazada',
  840. 'orden_trabajo_evaluada',
  841. 'facturacion',
  842. 'aprobacion_pago',
  843. 'solicitud_rechazada',
  844. 'rechazada_adquisiciones',
  845. ],
  846. 'compras-bex' => [
  847. 'recibiendo_preguntas',
  848. 'respondiendo_preguntas',
  849. 'recepcion_ofertas',
  850. 'compra_activada',
  851. 'evaluacion_tecnica',
  852. 'revision_ofertas',
  853. 'validacion_ofertas',
  854. 'evaluacion_ejecutivo_area_compras',
  855. 'evaluacion_apoderado_3',
  856. 'rechazada_apoderado_3',
  857. 'evaluacion_apoderado_4',
  858. 'rechazada_apoderado_4',
  859. 'compra_adjudicada',
  860. 'orden_trabajo_aceptada',
  861. 'orden_trabajo_certificada',
  862. 'orden_trabajo_rechazada',
  863. 'orden_trabajo_evaluada',
  864. 'facturacion',
  865. 'aprobacion_pago',
  866. 'solicitud_rechazada',
  867. ]
  868. ];
  869. } elseif ($role == 'finanzas') {
  870. return [
  871. 'regularizacion-factura' => [
  872. 'validacion_solicitante',
  873. 'evaluacion_apoderado_1',
  874. 'rechazado_apoderado_1',
  875. 'evaluacion_apoderado_2',
  876. 'rechazado_apoderado_2',
  877. 'evaluacion_adquisiciones',
  878. 'rechazada_adquisiciones',
  879. 'evaluacion_jefatura_adquisiciones',
  880. 'rechazada_jefatura_adquisiciones',
  881. 'evaluacion_apoderado_3',
  882. 'rechazada_apoderado_3',
  883. 'evaluacion_apoderado_4',
  884. 'rechazada_apoderado_4'
  885. ],
  886. 'compras-se' => [
  887. 'facturacion',
  888. 'aprobacion_pago',
  889. 'orden_trabajo_aceptada',
  890. 'orden_trabajo_certificada',
  891. 'orden_trabajo_evaluada',
  892. 'orden_trabajo_rechazada'
  893. ],
  894. 'compras-bex' => [
  895. 'facturacion',
  896. 'aprobacion_pago',
  897. 'orden_trabajo_aceptada',
  898. 'orden_trabajo_certificada',
  899. 'orden_trabajo_evaluada',
  900. 'orden_trabajo_rechazada'
  901. ]
  902. ];
  903. } elseif ($role == 'ejecutivo_area_compras') {
  904. return [
  905. 'compras-bex' => [
  906. 'evaluacion_apoderado_3',
  907. 'rechazada_apoderado_3',
  908. 'evaluacion_apoderado_4',
  909. 'rechazada_apoderado_4',
  910. 'compra_adjudicada',
  911. 'orden_trabajo_aceptada',
  912. 'orden_trabajo_certificada',
  913. 'orden_trabajo_rechazada',
  914. 'orden_trabajo_evaluada',
  915. 'facturacion',
  916. 'aprobacion_pago',
  917. 'solicitud_rechazada',
  918. ],
  919. ];
  920. }
  921. break;
  922. default:
  923. return [
  924. 'regularizacion-factura' => [
  925. 'null'
  926. ],
  927. 'compras-se' => [
  928. 'null'
  929. ],
  930. 'compras-bex' => [
  931. 'null'
  932. ]
  933. ];
  934. }
  935. return [
  936. 'regularizacion-factura' => [
  937. 'null'
  938. ],
  939. 'compras-se' => [
  940. 'null'
  941. ],
  942. 'compras-bex' => [
  943. 'null'
  944. ]
  945. ];
  946. }
  947. #[Route('/dashboard/viewer', name: 'dashboard_viewer', methods: ['GET','POST'])]
  948. public function dashboardViewer()
  949. {
  950. /** @var Connection $conn */
  951. $conn = $this->getDoctrine()->getConnection();
  952. $qb = $conn->createQueryBuilder();
  953. $qb->select("
  954. wp.id,
  955. wp.uuid,
  956. wp.workflow,
  957. u.code AS office_code,
  958. u.name AS office_name,
  959. wa2.value AS estimado_monto,
  960. wa3.value AS estimado_moneda,
  961. wa4.value AS total_adjudicado,
  962. wa6.value AS factura_monto,
  963. DATE_FORMAT(STR_TO_DATE(ws1.started_at,'%Y-%m-%d %H:%i:%s'),'%d-%m-%Y %H:%i') AS fecha_creacion,
  964. DATE_FORMAT(STR_TO_DATE(wa5.value,'%d/%m/%Y'),'%d-%m-%Y') AS fecha_adjudicacion,
  965. '' AS SLA,
  966. ws2.state AS estado,
  967. ws2.started_at AS fecha_estado,
  968. was2.user_id AS selected_supplier
  969. ")
  970. ->distinct()
  971. ->from('workflow_processes', 'wp')
  972. ->leftJoin('wp', 'workflow_attributes', 'wa1', 'wp.id = wa1.process_id AND wa1.path = :path1')
  973. ->leftJoin('wa1', 'unit', 'u', 'u.id = wa1.value')
  974. ->leftJoin('wp', 'workflow_attributes', 'wa2', 'wp.id = wa2.process_id AND wa2.path = :path2')
  975. ->leftJoin('wp', 'workflow_attributes', 'wa3', 'wp.id = wa3.process_id AND wa3.path = :path3')
  976. ->leftJoin('wp', 'workflow_attributes', 'wa4', 'wp.id = wa4.process_id AND wa4.path = :path4')
  977. ->leftJoin('wp', 'workflow_attributes', 'wa6', 'wp.id = wa6.process_id AND wa6.path = :path6')
  978. ->innerJoin('wp', 'workflow_states', 'ws1', 'wp.id = ws1.process_id AND ws1.state = :state_start')
  979. ->leftJoin('wp', 'workflow_attributes', 'wa5', 'wp.id = wa5.process_id AND wa5.path = :path5')
  980. ->innerJoin('wp', 'workflow_states', 'ws2', 'wp.id = ws2.process_id AND ws2.current = :true')
  981. ->leftJoin('ws2', 'workflow_assignee', 'was2', 'ws2.id = was2.state_id AND was2.name = :selected_supplier')
  982. ->setParameter('path1', 'info_compra.sucursal')
  983. ->setParameter('path2', 'info_compra.valor_estimado.monto')
  984. ->setParameter('path3', 'info_compra.valor_estimado.moneda')
  985. ->setParameter('path4', 'total_adjudicado')
  986. ->setParameter('path5', 'cronograma.fecha_adjudicacion')
  987. ->setParameter('path6', 'info_compra.factura_monto')
  988. ->setParameter('state_start', '_process_start')
  989. ->setParameter('true', 1)
  990. ->setParameter('selected_supplier','adjudicado')
  991. ->orderBy('wp.uuid', 'DESC')
  992. ;
  993. $qbProcess = [];
  994. $qbHistory = clone $qb;
  995. $qbProcess['active'] = $qbProcess['process'] = [];
  996. $qbCurrent = clone $qb;
  997. $currentProcess = $qbCurrent->execute()->fetchAll();
  998. $qbProcess['process'] = array_merge($qbProcess['process'], $currentProcess);
  999. unset($qbCurrent);
  1000. $qbActive = $qbProcess['active'];
  1001. $qbInProcess = $qbProcess['process'];
  1002. $states = [];
  1003. $i = 0;
  1004. foreach ($this->getStatesBy('history') as $state) {
  1005. $current = 'state_' . $i;
  1006. $qbHistory->setParameter($current, $state);
  1007. $states[] = ':' . $current;
  1008. $i++;
  1009. }
  1010. $qbHistory->andWhere(
  1011. $qbHistory->expr()->in('ws2.state', $states)
  1012. );
  1013. $countHistory = (int) $qbHistory->execute()->fetchOne() ?? 0;
  1014. $showPasswordAlert = !$this->getUser()->isPasswordUpdatedForNewPolicy();
  1015. return $this->render('Dashboard/index.html.twig', [
  1016. 'active' => $qbActive,
  1017. 'countHistory' => $countHistory,
  1018. 'process' => $qbInProcess,
  1019. 'showPasswordAlert' => $showPasswordAlert,
  1020. ]);
  1021. }
  1022. }