src/Controller/Componentes/PeriodoController.php line 87

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Componentes;
  3. use App\Controller\Customs\Custom2IMController;
  4. use App\Helper\DateHelper;
  5. use App\Repository\Cliente\Periodo\PeriodoRepository;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. /**
  11.  * @Route("/periodo")
  12.  */
  13. class PeriodoController extends Custom2IMController
  14. {
  15.     /**
  16.      * @var PeriodoRepository
  17.      */
  18.     public $periodo;
  19.     /**
  20.      * @var array
  21.      */
  22.     public $periodosExtenso = [
  23.         'Mensal' => [
  24.              '01' => 'Jan''02' => 'Fev''03' => 'Mar'
  25.             ,'04' => 'Abr''05' => 'Mai''06' => 'Jun'
  26.             ,'07' => 'Jul''08' => 'Ago''09' => 'Set'
  27.             ,'10' => 'Out''11' => 'Nov''12' => 'Dez'
  28.         ],
  29.         'Ciclos' => ['01' => '1º ciclo''02' => '2º ciclo'],
  30.         'Marco'  => []
  31.     ];
  32.     /**
  33.      * @var array
  34.      */
  35.     public $periodos = [
  36.          'Marco' => 'marco'
  37.         ,'Anual' => 'ano'
  38.         ,'Mensal' => 'mes'
  39.         ,'Trimestral' => 'trimestre'
  40.         ,'Bimestral' => 'bimestre'
  41.         ,'Ciclos' => 'semestre'
  42.     ];
  43.     /**
  44.      * @param PeriodoRepository $periodoRepository
  45.      */
  46.     public function __construct(PeriodoRepository $periodoRepository)
  47.     {
  48.         $this->periodo $periodoRepository;
  49.     }
  50.     /**
  51.      * @Route("/", name="periodo_componente")
  52.      *
  53.      * @param boolean $select_multiple
  54.      * @param boolean $modelagem
  55.      * @param string $request_referer
  56.      * @param string $modelo
  57.      * @return Response
  58.      */
  59.     public function index(bool $select_multiple FALSEbool $modelagem TRUEstring $request_referer '') :Response
  60.     {
  61.         $modelo $this->getModelagem()->getPrograma()->getEvs() ? 'evs' 'gps';
  62.         // comportamento padrao
  63.         $periodoAtual $this->getSession()->get('periodo');
  64.         $atual $periodoAtual['from']['titulo'] ?? '';
  65.         $lastMesVisaoGestor FALSE;
  66.         // quando solicita visualizacao do dashboard do avaliado pelo gestor
  67.         if ( FALSE === $select_multiple AND $this->hasAvaliado() AND array_key_exists('http_referer'$this->getAvaliado()) ) {
  68.             $periodoAtual['from']['periodo'] = $periodoAtual['to']['periodo'];
  69.             $atual $periodoAtual['to']['titulo'];
  70.             $lastMesVisaoGestor TRUE;
  71.             $select_multiple false;
  72.         }
  73.         
  74.         if ($request_referer == 'homologacao' || $request_referer == 'dados') {
  75.             $periodos $this->periodo->listaPeriodosSemModelagem(''true'variavel');
  76.         } else {
  77.             $periodos = ( $this->hasModelagem() && $modelagem && $this->getSession()->get('visao') != 'gps_visao_gestor_rede_dashboard')
  78.                 ? $this->periodo->listaPeriodos($this->getModelagem()->getWhere(), $this->verificaAvaliado($modelagem), ($request_referer === 'gestor'), $modelo)
  79.                 : $this->periodo->listaPeriodosSemModelagem($this->verificaAvaliado($modelagem), ($request_referer === 'gestor'), $modelo);
  80.         }
  81.         if ( isset($periodoAtual['to']) AND ($periodoAtual['from']['periodo'] != $periodoAtual['to']['periodo']) ) {
  82.             $atual $atual.' à '.$periodoAtual['to']['titulo'];
  83.         }
  84.         $periodosReturn = [];
  85.         foreach ( $periodos as $periodo ) {
  86.             $periodosReturn[$periodo['tipo']][] = $periodo;
  87.         }
  88.         
  89.         return $this->render('componentes/periodo/componente.html.twig', [
  90.             'multiplo' => $select_multiple,
  91.             'periodos' => $periodosReturn,
  92.             'atual' => $atual,
  93.             'lastMesVisaoGestor' => $lastMesVisaoGestor
  94.             ,'referer' => $request_referer
  95.         ]);
  96.     }
  97.     /**
  98.      * @Route("/processa", name="periodo_processa")
  99.      *
  100.      * @param null|mixed $periodoBruto
  101.      * @return JsonResponse
  102.      */
  103.     public function processa(Request $request$periodoBruto null)
  104.     {
  105.         $periodoBruto $periodoBruto ?? $request->query->all();
  106.         $referer = ( isset($periodoBruto['referer']) ) ? $periodoBruto['referer'] : NULL;
  107.         $periodoBruto array_intersect_key($periodoBruto,['from' => NULL,'to' => NULL]);
  108.         foreach ( $periodoBruto as $key => $query ) {
  109.             $explode explode('|'$query);
  110.             $selectedPeriodo 'Anual' == $explode[0] ? $explode[2] : substr($explode[2], -2);
  111.             $periodo[$key] = [
  112.                 'tipo' => $explode[0],
  113.                 'tipo_alias' => $this->__getTipo($explode[0]),
  114.                 'ano' => $explode[1],
  115.                 'periodo' => $selectedPeriodo,
  116.                 'titulo' => array_key_exists($selectedPeriodo$this->periodosExtenso[$explode[0]]) ? $this->periodosExtenso[$explode[0]][$selectedPeriodo].' de '.$explode[1] : $selectedPeriodo.' de '.$explode[1],
  117.             ];
  118.         }
  119.         $periodo['select'] = $this->__processaSelect($periodo);
  120.         $periodo['where'] = $this->__processaWhere($periodo);
  121.         $periodo['whereAnterior'] = $this->__processaWhereAnterior($periodo);
  122.         $periodo['whereSemRange'] = $this->__processaWhereSemRange($periodo);
  123.         $periodo['selectPeriodo'] = $this->__processaSelectPeriodo($periodo);
  124.         $periodo['tipoFiltro'] = $this->__getTipo($periodo['to']['tipo']);
  125.         $periodo['selectAnterior'] = $this->__getSelectAnterior($periodo);
  126.         $periodo['whereAvaliacao'] = $this->__processaWhereAvaliacao($periodo);
  127.         $this->getSession()->set('periodo'$periodo);
  128.         // quando avaliado
  129.         // refaz o a chave de periodo
  130.         if ( $this->hasAvaliado() AND count($this->getAvaliado()) > AND ('avaliado' === $referer) ) {
  131.             $ano $periodo['to']['ano'];
  132.             $mes $periodo['to']['periodo'];
  133.             $sessAvaliado $this->getAvaliado();
  134.             $sessAvaliado['periodo'] = ($ano 100) + $mes;
  135.             $this->getSession()->set('avaliado'$sessAvaliado);
  136.             $this->getSession()->set('periodo_multiplo'FALSE);
  137.             unset($sessAvaliado);
  138.         } elseif ( 'gestor' === $referer ) {
  139.             $this->getSession()->set('visao_gestor_periodo'$periodo);
  140.             $this->getSession()->set('periodo_multiplo'TRUE);
  141.         } elseif ('gestor_rede' === $referer) {
  142.             $this->getSession()->set('visao_gestor_rede_periodo'$periodo);
  143.             $this->getSession()->set('periodo_multiplo'TRUE);
  144.         }
  145.         unset($periodo);
  146.         return new JsonResponse(['sucesso' => true'mensagem' => 'Período Configurado!']);
  147.     }
  148.     /**
  149.      * @param string $tipo
  150.      * @return string
  151.      */
  152.     private function __getTipo($tipo)
  153.     {
  154.         return $this->periodos[$tipo];
  155.     }
  156.     /**
  157.      * @param array $periodos
  158.      * @return string
  159.      */
  160.     private function __processaSelect(array $periodos): string
  161.     {
  162.         if ( 'Anual' === $periodos['from']['tipo'] ) {
  163.             return " (periodo->>'ano')::int AS periodo ";
  164.         }
  165.         if ( 'Marco' === $periodos['from']['tipo'] ){
  166.             return " (periodo->>'ano')::int AS periodo ";
  167.         }
  168.         
  169.         return " CONCAT(periodo->>'ano', LPAD(periodo->>'periodo', 2, '0'))::int AS periodo ";
  170.     }
  171.     /**
  172.      * @param array $periodos
  173.      * @return string
  174.      */
  175.     private function __processaWhere($periodos)
  176.     {
  177.         $whereReturn " AND periodo->>'tipo' = '".$this->__getTipo($periodos['from']['tipo'])."'";
  178.         $whereData '';
  179.         if ( 'Anual' === $periodos['from']['tipo'] ) {
  180.             $whereData .= $this->_whereAnual($periodos);
  181.         } elseif ( 'Marco' === $periodos['from']['tipo'] ) {
  182.             //@todo adicionar o periodo do marco
  183.             $whereData .= " AND (periodo->>'periodo')::text = '{$periodos['from']['periodo']}'";
  184.         } else {//quando for periodo com mes(es) e ano(s)
  185.             if ( $periodos['from']['ano'] == $periodos['to']['ano'] ) {//mesmo ano
  186.                 $whereData .= " AND (periodo->>'ano')::int = {$periodos['from']['ano']}";
  187.                 if ( $periodos['from']['periodo'] == $periodos['to']['periodo'] ) {
  188.                     $whereData .= " AND (periodo->>'periodo')::int = {$periodos['from']['periodo']}";
  189.                 } else {
  190.                     $whereData .= " AND (periodo->>'periodo')::int BETWEEN {$periodos['from']['periodo']} AND {$periodos['to']['periodo']}";
  191.                 }
  192.             } else {//anos diferentes
  193.                 $a strlen($periodos['from']['periodo']);
  194.                 $b strlen($periodos['to']['periodo']);
  195.                 $perFrom $a <= '0'.$periodos['from']['periodo'] : $periodos['from']['periodo'];
  196.                 $perTo $b <= '0'.$periodos['to']['periodo'] : $periodos['to']['periodo'];
  197.                 $periodoFrom $periodos['from']['ano'].$perFrom;
  198.                 $periodoTo $periodos['to']['ano'].$perTo;
  199.                 $whereData .= " AND ((periodo->>'ano') || (periodo->>'periodo'))::int BETWEEN {$periodoFrom} AND {$periodoTo}";
  200.             }
  201.         }
  202.         return $whereReturn.$whereData;
  203.     }
  204.     /**
  205.      * @param array $periodos
  206.      * @return string
  207.      */
  208.     private function __processaWhereAnterior($periodos)
  209.     {
  210.         $whereReturn " AND periodo->>'tipo' = '".$this->__getTipo($periodos['from']['tipo'])."'";
  211.         $whereData '';
  212.         if ( 'Anual' === $periodos['from']['tipo'] ) {
  213.             $whereData .= $this->_whereAnual($periodos);
  214.         } elseif ( 'Marco' === $periodos['from']['tipo'] ) {
  215.             //@todo adicionar o periodo do marco
  216.             " AND (periodo->>'ano')::int = {$periodos['from']['ano']}";
  217.         } else {//quando for periodo com mes(es) e ano(s)
  218.          if ($periodos['from']['ano'] == $periodos['to']['ano']) {//mesmo ano
  219.              //$whereData .= " AND (periodo->>'ano')::int = {$periodos['from']['ano']}";
  220.              if ( $periodos['from']['periodo'] == $periodos['to']['periodo'] ) {
  221.                  //HELPER DATA
  222.                  $p_atual $periodos['from']['ano'].$periodos['from']['periodo'];
  223.                  $p DateHelper::geraSequenciaPeriodo(DateHelper::anterior($p_atual), $p_atual);
  224.                  $whereData .= " AND ((periodo->>'ano') || (periodo->>'periodo'))::int IN({$p})";
  225.              } else {
  226.                  $whereData .= " AND (periodo->>'periodo')::int BETWEEN {$periodos['from']['periodo']} AND {$periodos['to']['periodo']}";
  227.              }
  228.          } else {//anos diferentes
  229.              $a strlen($periodos['from']['periodo']);
  230.              $b strlen($periodos['to']['periodo']);
  231.              $perFrom $a <= '0'.$periodos['from']['periodo'] : $periodos['from']['periodo'];
  232.              $perTo $b <= '0'.$periodos['to']['periodo'] : $periodos['to']['periodo'];
  233.              $periodoFrom $periodos['from']['ano'].$perFrom;
  234.              $periodoTo $periodos['to']['ano'].$perTo;
  235.              $whereData .= " AND ((periodo->>'ano') || (periodo->>'periodo'))::int BETWEEN {$periodoFrom} AND {$periodoTo}";
  236.          }
  237.         }
  238.         return $whereReturn.$whereData;
  239.     }
  240.     /**
  241.      * @param array $periodos
  242.      * @return string
  243.      */
  244.     private function __processaWhereSemRange($periodos)
  245.     {
  246.         return " AND periodo->>'tipo' = '".$this->__getTipo($periodos['from']['tipo'])."'";
  247.     }
  248.     /**
  249.      * @param array $periodos
  250.      * @return string
  251.      */
  252.     private function __processaSelectPeriodo($periodos)
  253.     {
  254.         $tipo $periodos['to']['tipo'];
  255.         switch ($tipo) {
  256.             case 'Anual':
  257.                 $periodo $periodos['to']['periodo'].'-01-01'// formatação do periodo selecionado
  258.                 $subitrair '11 year'// unidade a subtrair da data selecionada
  259.                 $intervalo '1 year'// unidade a subtrair da data selecionada
  260.                 $exibir 'YYYY'// forma a ser exibido o retorno
  261.                 return sprintf("
  262.                     To_Char(Generate_Series(
  263.                          To_Char((('%s')::date - interval '%s'), 'YYYY-MM-DD')::timestamp
  264.                         ,timestamp '%s'
  265.                         ,interval '%s')::date
  266.                     , '%s')::integer AS periodo",
  267.                     $periodo,$subitrair,$periodo,$intervalo,$exibir
  268.                 );
  269.                 break;
  270.             case 'Mensal':
  271.                 $periodo $periodos['to']['ano'].'-'.substr($periodos['to']['periodo'], -2).'-01'// formatação do periodo selecionado
  272.                 $subitrair '11 month'// unidade a subtrair da data selecionada
  273.                 $intervalo '1 month'// unidade a subtrair da data selecionada
  274.                 $exibir 'YYYYMM'// forma a ser exibido o retorno
  275.                 return sprintf("
  276.                     To_Char(Generate_series(
  277.                          To_Char((('%s')::date - interval '%s')
  278.                         ,'YYYY-MM-DD')::timestamp
  279.                         ,timestamp '%s'
  280.                         , interval '%s')::date
  281.                     ,'%s')::integer AS periodo",
  282.                     $periodo,
  283.                     $subitrair,
  284.                     $periodo,
  285.                     $intervalo,
  286.                     $exibir
  287.                 );
  288.                 break;
  289.             case 'Ciclos':
  290.                 $periodo $periodos['to']['ano'].'-'.('01' == substr($periodos['to']['periodo'], -2) ? '06' '12').'-01'// formatação do periodo selecionado
  291.                 $subitrair '71 month'// unidade a subtrair da data selecionada
  292.                 $intervalo '6 month'// unidade a subtrair da data selecionada
  293.                 return sprintf(
  294.                     "(CONCAT(ano, case when periodo between 1 and 6 then '01' else '02' end))::int as periodo FROM (
  295.                         SELECT
  296.                         To_Char(Generate_Series(
  297.                                                             To_Char((('%s')::date - interval '%s'), 'YYYY-MM-DD')::timestamp
  298.                                                         , timestamp '%s'
  299.                                                         , interval '%s')::date, 'YYYY')::integer AS ano,
  300.                         To_Char(Generate_Series(
  301.                                                             To_Char((('%s')::date - interval '%s'), 'YYYY-MM-DD')::timestamp
  302.                                                         , timestamp '%s'
  303.                                                         , interval '%s')::date, 'MM')::integer AS periodo
  304.                                                         ) a",
  305.                     $periodo,
  306.                     $subitrair,
  307.                     $periodo,
  308.                     $intervalo,
  309.                     $periodo,
  310.                     $subitrair,
  311.                     $periodo,
  312.                     $intervalo
  313.                 );
  314.                 break;
  315.             case 'Marco':
  316.                 $periodo $periodos['to']['ano'].'-01-01'// formatação do periodo selecionado
  317.                 $subitrair '11 year'// unidade a subtrair da data selecionada
  318.                 $intervalo '1 year'// unidade a subtrair da data selecionada
  319.                 $exibir 'YYYYMM'// forma a ser exibido o retorno
  320.                 return sprintf(
  321.                     "to_char(Generate_Series(
  322.                                                             to_char((('%s')::date - interval '%s'), 'YYYY-MM-DD')::timestamp
  323.                                                         , timestamp '%s'
  324.                                                         , interval '%s')::date, '%s')::integer AS periodo",
  325.                     $periodo,
  326.                     $subitrair,
  327.                     $periodo,
  328.                     $intervalo,
  329.                     $exibir
  330.                 );
  331.                 break;
  332.             default:
  333.                 // code...
  334.                 break;
  335.         }
  336.     }
  337.     /**
  338.      * @param array $periodos
  339.      * @return string
  340.      */
  341.     private function __getSelectAnterior($periodos)
  342.     {
  343.         $tipo $periodos['to']['tipo'];
  344.         switch ($tipo) {
  345.             case 'Anual':
  346.                 $periodo date_create($periodos['to']['periodo'].'-01-01'); // formatação do periodo selecionado
  347.                 $subitrair '1 year'// unidade a subtrair da data selecionada
  348.                 $exibir 'Y'// forma a ser exibido o retorno
  349.                 break;
  350.             case 'Mensal':
  351.                 $periodo date_create($periodos['to']['ano'].'-'.substr($periodos['to']['periodo'], -2).'-01'); // formatação do periodo selecionado
  352.                 $subitrair '1 month'// unidade a subtrair da data selecionada
  353.                 $exibir 'm'// forma a ser exibido o retorno
  354.                 break;
  355.             case 'Ciclos':
  356.                 $periodo date_create($periodos['to']['ano'].'-'.('01' == substr($periodos['to']['periodo'], -2) ? '06' '12').'-01'); // formatação do periodo selecionado
  357.                 $subitrair '11 month'// unidade a subtrair da data selecionada
  358.                 $exibir 'm'// forma a ser exibido o retorno
  359.                 break;
  360.             case 'Marco':
  361.                 $periodo date_create($periodos['to']['ano'].'-01-01'); // formatação do periodo selecionado
  362.                 $subitrair '1 year'// unidade a subtrair da data selecionada
  363.                 $exibir 'Y'// forma a ser exibido o retorno
  364.                 break;
  365.             default:
  366.                 // code...
  367.                 break;
  368.         }
  369.         return sprintf(
  370.             "AND (periodo->>'%s')::numeric IN (%s, %s)",
  371.             $periodos['tipoFiltro'],
  372.             $periodos['to']['periodo'],
  373.             date_format(date_sub($periododate_interval_create_from_date_string($subitrair)), $exibir)
  374.         );
  375.     }
  376.     /**
  377.      * @param bool $modelagem
  378.      * @return string
  379.      */
  380.     public function verificaAvaliado($modelagem)
  381.     {
  382.         if ( $this->hasAvaliado() ) {
  383.             if ( $this->hasModelagem() AND $modelagem ) {
  384.                 return sprintf(' AND id_avaliado = %d '$this->getIdAvaliado());
  385.             }
  386.             return sprintf(' WHERE id_avaliado = %d'$this->getIdAvaliado());
  387.         }
  388.         return '';
  389.     }
  390.     /**
  391.      * @param array $periodos
  392.      * @return void
  393.      */
  394.     private function _whereAnual(array $periodos)
  395.     {
  396.         if ( $periodos['from']['periodo'] == $periodos['to']['periodo'] ) {
  397.             return " AND (periodo->>'ano')::int = {$periodos['from']['periodo']}";
  398.         }
  399.         
  400.         return " AND (periodo->>'ano')::int BETWEEN {$periodos['from']['periodo']} AND {$periodos['to']['periodo']}";
  401.     }
  402.     /**
  403.      * @param array $periodos
  404.      * @return string
  405.      */
  406.     private function __processaWhereAvaliacao($periodos)
  407.     {
  408.         $whereReturn 
  409.             " AND avaliacao_inicio  <= " $periodos['from']['ano'].$periodos['from']['periodo'] . " AND avaliacao_fim >= " $periodos['to']['ano'].$periodos['to']['periodo']
  410.             . " AND scorecard_inicio  <= " $periodos['from']['ano'].$periodos['from']['periodo'] . " AND scorecard_fim >= " $periodos['to']['ano'].$periodos['to']['periodo']
  411.         ;
  412.         return $whereReturn;
  413.     }
  414. }