SHARE
TWEET

Untitled

a guest Oct 10th, 2019 70 in 3 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2.  
  3. namespace App\Model\Entity;
  4.  
  5. use Cake\ORM\TableRegistry;
  6.  
  7. class CampoTUCA1Corrigido extends CampoConformidadesObrasAbstract
  8. {
  9.     // TUC para identificar valores que serão rateados para todas as TUCs (padrão SAP)
  10.     const TUC_GENERICA = '999.00';
  11.    
  12.     /* Este atributo será um array chave valor, com o seguinte formato:
  13.      * [[$CodMaterial => ['TUC' => $TUC, 'A1' => $A1]], ...]
  14.      * Os dados serão carregados a partir da tabela material
  15.      */
  16.     protected $classificacoesDeTucs;
  17.    
  18.     /* Este atributo será um array chave valor, com o seguinte formato:
  19.      * [[$CodObra => [$CodMaterial => [$SOMATORIO_VALOR]], ...]
  20.      * Os dados serão carregados a partir da tabela temporaria
  21.      */
  22.     protected $obraMaterialValor;
  23.    
  24.     /* Este atributo será um array chave valor, com o seguinte formato:
  25.      * [[$CodObra => [$TucCorrigido => [$SOMATORIO_VALOR]], ...]
  26.      * Os dados serão carregados a partir da tabela temporaria
  27.      */
  28.     protected $obraTucCorrigidoValor;
  29.    
  30.     public function processar() : bool
  31.     {
  32.         // Correção do TUC.A1, linha a linha
  33.         $this->correcaoTucA1();
  34.        
  35.         // Reclassificação de COM e CA sem valor de UC, linha a linha, mas só ocorre após o final do processo correcaoTucA1()
  36.         $this->reclassificacaoCOMeCASemValorDeUC();
  37.        
  38.         return true;
  39.     }
  40.    
  41.     private function correcaoTucA1()
  42.     {
  43.         // Carrega alguns dados necessários em cache, para evitar execução de querys dentro de loops
  44.         $this->configCache();
  45.        
  46.         $dados = $this->conexao->newQuery()
  47.         ->select([
  48.             'id',
  49.             'OBRA',
  50.             'MATERIAL',
  51.             'UC_COM_CA',
  52.             'TUC',
  53.             'A1',
  54.             'TUC_RAZAO',
  55.             'A1_RAZAO',
  56.             'TUC_A1_ORIGINAL',
  57.             'TIPO_DOCUMENTO',
  58.             'ATRIBUICAO_CREDITO',
  59.             'ATRIBUICAO_DEBITO',
  60.             'VALOR'
  61.         ])
  62.         ->from($this->tabelaTemporaria);
  63.         foreach ($dados as $linha) {
  64.             list($tucA1Corrigido, $regra) = $this->getTucA1Corrigido($linha);
  65.             $this->atualizaCampoTucA1Corrigido($tucA1Corrigido, $regra, $linha['id']);
  66.         }
  67.     }
  68.    
  69.     private function reclassificacaoCOMeCASemValorDeUC()
  70.     {
  71.         $this->configObraTucA1CorrigidoValor();
  72.         $dados = $this->conexao->newQuery()
  73.         ->select([
  74.             'id',
  75.             'OBRA',
  76.             'TUC_CORRIGIDO' => 'SUBSTRING(TUC_A1_CORRIGIDO, 1, 3)',
  77.             'TUC_A1_CORRIGIDO',
  78.             'REGRA_TUC_A1_CORRIGIDO',
  79.             'UC_COM_CA'
  80.         ])
  81.         ->from($this->tabelaTemporaria);
  82.         foreach ($dados as $linha) {
  83.             if ($linha['UC_COM_CA'] !== 'UC' && $linha['TUC_A1_CORRIGIDO'] !== self::TUC_GENERICA) { // Regra "Não tem valor de TUC"
  84.                 $valor = $this->getSomatorioValorByObraTucCorrigido($linha['OBRA'], $linha['TUC_CORRIGIDO']);
  85.                 if ($valor <= 0) {
  86.                     $tucA1Corrigido = self::TUC_GENERICA;
  87.                     $regra = "{$linha['REGRA_TUC_A1_CORRIGIDO']} -> Não tem valor de TUC {$linha['TUC_A1_CORRIGIDO']}";
  88.                     $this->atualizaCampoTucA1Corrigido($tucA1Corrigido, $regra, $linha['id']);
  89.                 }
  90.             }  
  91.         }
  92.     }
  93.  
  94.     private function atualizaCampoTucA1Corrigido(string $tucA1Corrigido, string $regra, int $id)
  95.     {
  96.         $campos = [];
  97.         $campos[] = 'TUC_A1_CORRIGIDO = ' . ($tucA1Corrigido == 'NULL' ? 'NULL' : "'{$tucA1Corrigido}'");
  98.         $campos[] = 'REGRA_TUC_A1_CORRIGIDO = ' . ($regra == 'NULL' ? 'NULL' : "'{$regra}'");
  99.         $update = "UPDATE {$this->tabelaTemporaria} SET " . implode(', ', $campos) . " WHERE id = {$id}";
  100.         return $this->conexao->execute($update);
  101.     }
  102.    
  103.     private function getTucA1Corrigido(array $linha) : array
  104.     {
  105.         $tucA1Corrigido = $regra = 'NULL';
  106.         $classificacao  = $this->getClassificacaoDeTuc($linha['MATERIAL']);
  107.         $somatorioValor = $this->getSomatorioValorByObraMaterial($linha['OBRA'], $linha['MATERIAL']);
  108.        
  109.         // Regra "Itens com valor zerado"
  110.         if ($linha['MATERIAL'] && $somatorioValor == 0) {
  111.             $tucA1Corrigido = self::TUC_GENERICA;
  112.             $regra = 'Itens com valor zerado';
  113.         } elseif ($linha['TUC']) { // Regra da "UAR"
  114.            
  115.             $regra = 'Regra da UAR';
  116.             if ($linha['UC_COM_CA'] === 'UC') {
  117.                 $tuc = $linha['TUC'];
  118.                 $a1  = (int) $linha['A1'];
  119.                 $tucA1Corrigido = "{$tuc}." . ($a1 <= 9 ? "0{$a1}" : $a1);
  120.             } else {
  121.                 $tucA1Corrigido = self::TUC_GENERICA;
  122.             }
  123.            
  124.         } elseif ($classificacao !== 'NULL') { // Regra "Tabela do Jorge (empresa EM)"
  125.             $regra = 'Tabela do Jorge';
  126.             $tucA1Corrigido = $classificacao;
  127.         } elseif ($linha['TIPO_DOCUMENTO'] == 'TC') { // Regra do "TC"
  128.        
  129.             /* De acordo com os dados vistos nos arquivos do cliente (empresa EM),
  130.              * os dados dos campos "ATRIBUICAO_*" vem no seguinte formato: "TUC XXX.XX" */                    
  131.             $atribuicao = $linha['VALOR'] < 0 ? $linha['ATRIBUICAO_CREDITO'] : $linha['ATRIBUICAO_DEBITO'];
  132.            
  133.             // Trata o dado para pegar somente o TUC.A1
  134.             list($tuc, $a1) = explode('.', preg_replace('/[^0-9\.]/', '', $atribuicao));
  135.             if (is_numeric($tuc) && is_numeric($a1)) {
  136.                 $tuc = (int) $tuc;
  137.                 $a1  = (int) $a1;
  138.                 $tucA1Corrigido = "{$tuc}." . ($a1 <= 9 ? "0{$a1}" : $a1);
  139.             }
  140.             $regra = 'Regra do TC';
  141.            
  142.         } elseif ($linha['TUC_A1_ORIGINAL']) { // Regra TUC_CORRIGIDO = TUC_ORIGINAL
  143.             $regra = 'Regra TUC_CORRIGIDO = TUC_ORIGINAL';
  144.             $tucA1Corrigido = $linha['TUC_A1_ORIGINAL'];
  145.         } else {
  146.             $regra = 'Nenhuma das outras regras';
  147.             $tucA1Corrigido = self::TUC_GENERICA;
  148.         }
  149.        
  150.         return [$tucA1Corrigido, $regra];
  151.     }
  152.    
  153.     private function getClassificacaoDeTuc(string $material = null) : string
  154.     {
  155.         $tucA1Corrigido = 'NULL';
  156.         // Extrai TUC e A1 da tabela material, através do CodMaterial passado ...
  157.         $arrTucA1 = key_exists($material, $this->classificacoesDeTucs) ? $this->classificacoesDeTucs[$material] : false;
  158.         if ($arrTucA1) {
  159.             $tucCorrigido = $arrTucA1['TUC'];
  160.             $a1Corrigido  = $arrTucA1['A1'];
  161.             $tucA1Corrigido = "{$tucCorrigido}.{$a1Corrigido}";
  162.         }
  163.         return $tucA1Corrigido;
  164.     }
  165.    
  166.     private function getSomatorioValorByObraMaterial(string $obra = null, string $material = null)
  167.     {
  168.         $valor = null;
  169.         if (isset($this->obraMaterialValor[$obra]) && isset($this->obraMaterialValor[$obra][$material])) {
  170.             $valor = $this->obraMaterialValor[$obra][$material];
  171.         }
  172.         return $valor;
  173.     }
  174.    
  175.     private function getSomatorioValorByObraTucCorrigido(string $obra = null, string $tucCorrigido = null)
  176.     {
  177.         $valor = null;
  178.         if (isset($this->obraTucCorrigidoValor[$obra]) && isset($this->obraTucCorrigidoValor[$obra][$tucCorrigido])) {
  179.             $valor = $this->obraTucCorrigidoValor[$obra][$tucCorrigido];
  180.         }
  181.         return $valor;
  182.     }
  183.    
  184.     private function configCache()
  185.     {
  186.         $this->configObraMaterialValor();
  187.         $this->configClassificacoesDeTucs();
  188.     }
  189.    
  190.     private function configObraMaterialValor()
  191.     {
  192.         $query = $this->conexao->newQuery()
  193.         ->select([
  194.             'OBRA',
  195.             'MATERIAL',
  196.             'VALOR' => 'SUM(VALOR)'
  197.         ])
  198.         ->from($this->tabelaTemporaria)
  199.         ->where([
  200.             'MATERIAL IS NOT' => null
  201.         ])
  202.         ->group([
  203.             'OBRA',
  204.             'MATERIAL'
  205.         ]);
  206.        
  207.         $this->obraMaterialValor = [];
  208.         foreach ($query as $dados) {
  209.             $this->obraMaterialValor[$dados['OBRA']][$dados['MATERIAL']] = $dados['VALOR'];
  210.         }
  211.        
  212.         return $this->obraMaterialValor;
  213.     }
  214.    
  215.     private function configClassificacoesDeTucs()
  216.     {
  217.         $materiaisTable = TableRegistry::get('Materiais');
  218.        
  219.         // Cada CodMaterial tem um ConformidadesObrasTucA1 relacionado
  220.         $query = $materiaisTable->find()->select([
  221.             'CodMaterial',
  222.             'ConformidadesObrasTucA1'
  223.         ])
  224.         ->where([
  225.             'ConformidadesObrasTucA1 IS NOT' => null
  226.         ]);
  227.        
  228.         $this->classificacoesDeTucs = [];
  229.         foreach ($query as $dados) {
  230.            
  231.             // Espera-se que o campo ConformidadesObrasTucA1 tenha os dados no seguinte formato: TUC.A1, exemplo, 255.00
  232.             $arr = explode('.', trim($dados->ConformidadesObrasTucA1));
  233.             $tuc = isset($arr[0]) ? (int) $arr[0] : 0;
  234.             $a1  = isset($arr[1]) ? (int) $arr[1] : 0;
  235.            
  236.             // Formato: [[$CodMaterial => ['TUC' => $TUC, 'A1' => $A1]], ...]
  237.             $this->classificacoesDeTucs[$dados->CodMaterial] = [
  238.                 'TUC' => $tuc,
  239.                 'A1'  => (int) $a1 <= 9 ? "0{$a1}" : $a1
  240.             ];
  241.         }
  242.        
  243.         return $this->classificacoesDeTucs;
  244.     }
  245.    
  246.     private function configObraTucA1CorrigidoValor()
  247.     {
  248.         $query = $this->conexao->newQuery()
  249.         ->select([
  250.             'OBRA',
  251.             'TUC_CORRIGIDO' => 'SUBSTRING(TUC_A1_CORRIGIDO, 1, 3)',
  252.             'TUC_A1_CORRIGIDO',
  253.             'VALOR' => 'SUM(VALOR)'
  254.         ])
  255.         ->from($this->tabelaTemporaria)
  256.         ->where([
  257.             'UC_COM_CA' => 'UC',
  258.             'TUC_A1_CORRIGIDO IS NOT' => null
  259.         ])
  260.         ->group([
  261.             'OBRA',
  262.             'SUBSTRING(TUC_A1_CORRIGIDO, 1, 3)'
  263.         ]);
  264.        
  265.         $this->obraTucCorrigidoValor = [];
  266.         foreach ($query as $dados) {
  267.             $this->obraTucCorrigidoValor[$dados['OBRA']][$dados['TUC_CORRIGIDO']] = $dados['VALOR'];
  268.         }
  269.        
  270.         return $this->obraTucCorrigidoValor;
  271.     }
  272. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top