· 8 years ago · Jul 03, 2018, 02:22 PM
1<?php
2
3
4namespace App\Model\Entity;
5
6use App\Model\Entity\CalculoComCaAneel;
7use Cake\ORM\TableRegistry;
8use Cake\Datasource\ConnectionManager;
9use Cake\Database\Connection;
10use Cake\I18n\Number;
11
12class RacionalizacaoComAneel
13{
14 protected $calculo;
15
16 public function __construct(CalculoComCaAneel $calculo)
17 {
18 $this->calculo = $calculo;
19 }
20
21 public function geraTabelaTemporaria()
22 {
23 $nomeTabela = $this->calculo->getNomeTabelaTemporariaCOM();
24
25 $querys = [];
26 $querys[] = "CREATE TABLE {$nomeTabela} {$this->getSelectDadosParaProcessamento()}";
27 $querys[] = "ALTER TABLE {$nomeTabela} ADD COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id)";
28
29 $calculosTable = TableRegistry::get($this->calculo->source());
30 foreach ($calculosTable->getCamposRacionalizacaoCOM() as $campo) {
31 $querys[] = "ALTER TABLE {$nomeTabela} ADD COLUMN {$campo} DECIMAL(16, 2) NULL DEFAULT 0.00";
32 }
33
34 $this->excluiTabelaTemporaria();
35
36 $conexao = ConnectionManager::get('default');
37
38 foreach ($querys as $query) {
39 $conexao->execute($query);
40 }
41
42 return true;
43 }
44
45 public function processaCalculo()
46 {
47 $nomeTabela = $this->calculo->getNomeTabelaTemporariaCOM();
48
49 $conexao = ConnectionManager::get('default');
50 $queryLinhasTabelaTemporaria = $conexao->newQuery()->select('*')->from($nomeTabela);
51 $totalLinhas = $queryLinhasTabelaTemporaria->execute()->count();
52
53 $log = "Iniciando o processamento ... ";
54 $log .= Number::format($totalLinhas) . " linha(s) para processar.";
55 $this->calculo->log($log);
56
57 if ($totalLinhas) {
58
59 $this->calculo->log("Processando os campos de cada obra ...");
60 $this->processaRacionalizacao($conexao, $nomeTabela);
61 }
62
63 $this->calculo->log("Fim do processamento.");
64
65 return true;
66 }
67
68 private function processaRacionalizacao(Connection $conexao, string $nomeTabela)
69 {
70 $normas = TableRegistry::get('NormasQuantidadesCom');
71 $valores = TableRegistry::get('SiglasAneelValores');
72
73 // Por padrão, o sistema carrega as normas da tabela normas_quantidades_com,
74 // mas para o cálculo, deve ser carregado as normas configuradas pelo
75 // usuário na tela de cadastro de uma nova racionalização do COM
76 $normas->setNormas($this->calculo->arr_parametros['normas_quantidades_com']);
77
78 $linhas = $conexao->newQuery()->select('*')->from($nomeTabela);
79 $n = 1;
80 foreach ($linhas as $linha) {
81 $this->calculo->log("Obra {$n} ... processando os campos da obra de codigo {$linha['CODIGO_OBRA']} ...");
82 $update = $this->getQueryCalculoRacionalizacao($linha, $nomeTabela, $normas, $valores);
83 $conexao->execute($update);
84 $n++;
85 }
86 }
87
88 private function getQueryCalculoRacionalizacao(array $linha, string $nomeTabela, $normas, $valores) : string
89 {
90 $campos = [];
91 $campos = $this->getCalculoQuantidadeVaos($linha, $normas, $campos);
92 $campos = $this->getCalculoCamposCruzetas($linha, $normas, $campos);
93 $campos = $this->getCalculoCamposIsoladorPinos($linha, $normas, $campos);
94 $campos = $this->getCalculoCamposIsoladorDiscos($linha, $normas, $campos);
95 $campos = $this->getCalculoCamposPinos($linha, $campos);
96 $campos = $this->getCalculoCamposParaRaios($linha, $normas, $campos);
97 $campos = $this->getCalculoCamposHastes($linha, $normas, $campos);
98 $campos = $this->getCalculoChavesFusivel($linha, $normas, $campos);
99 $campos = $this->getCalculoGlosasCOM($linha, $campos);
100 $campos = $this->getCalculoGlosasCA($linha, $campos, $valores);
101
102 $strCampos = "";
103 foreach($campos as $campo => $valor) {
104 $strCampos .= "{$campo} = {$valor}, ";
105 }
106 $strCampos = rtrim(rtrim($strCampos), ","); // remove o ", " do final
107
108 return "UPDATE {$nomeTabela} SET {$strCampos} WHERE id = {$linha['id']}";
109 }
110
111 private function getCalculoQuantidadeVaos(array $linha, $normas, array $campos)
112 {
113 $campos['QTD_VAOS'] = max($linha['POSTE'], ($linha['CABO_ISO'] + $linha['CABO_NU']) / $linha['FASES'] / $normas->getQuantidade('VAO', 'EXT_RD', $linha['TIPOLOGIA_ANEEL']));
114 return $campos;
115 }
116
117 private function getCalculoCamposCruzetas(array $linha, $normas, array $campos)
118 {
119 $campos['CRUZETA_REL'] = $normas->getQuantidade('REL', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['RELIGADOR'];
120 $campos['CRUZETA_REG'] = $normas->getQuantidade('REG', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['REGULADOR'];
121 $campos['CRUZETA_BC'] = $normas->getQuantidade('BC' , 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['BANCO_CAPACITORES'];
122 $campos['CRUZETA_TRD1'] = $normas->getQuantidade('TRD1' , 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['TRAFO_MONO'];
123 $campos['CRUZETA_TRD2'] = $normas->getQuantidade('TRD2' , 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['TRAFO_BI'];
124 $campos['CRUZETA_TRD3'] = $normas->getQuantidade('TRD3' , 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['TRAFO_TRI'];
125
126 $aux = $normas->getQuantidade('PR', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']);
127 $campos['CRUZETA_PR'] = $aux * ($linha['PARA_RAIO_COM'] + $linha['PARA_RAIO_UAR']);
128
129 $campos['CRUZETA_CHSECC'] = $normas->getQuantidade('CHSECC', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['CHSECC'] / $linha['FASES'];
130 $campos['CRUZETA_SECCIONALIZADOR'] = $normas->getQuantidade('SECCIONALIZADOR', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['SECCIONALIZADOR'];
131
132 $aux = $normas->getQuantidade('CHFUS', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']);
133 $campos['CRUZETA_CHFUS'] = ($aux * ($linha['CHFUS_COM'] + $linha['CHFUS_UAR'])) / $linha['FASES'];
134
135 $campos['TOTAL_CRUZETA_EPTO'] = round($campos['CRUZETA_REL'] + $campos['CRUZETA_REG'] + $campos['CRUZETA_BC'] + $campos['CRUZETA_PR'] + $campos['CRUZETA_CHSECC'] + $campos['CRUZETA_SECCIONALIZADOR'] + $campos['CRUZETA_CHFUS'] + $campos['CRUZETA_TRD1'] + $campos['CRUZETA_TRD2'] + $campos['CRUZETA_TRD3'],0);
136
137 $campos['CRUZETA_MENOS_EPTO'] = max(0, $linha['CRUZETA'] - $campos['TOTAL_CRUZETA_EPTO']);
138
139 if($linha['FASES'] == 1){
140 $campos['CRUZETA_POSTE'] = 0;
141 } else{
142 $campos['CRUZETA_POSTE'] = $normas->getQuantidade('POSTE', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $campos['QTD_VAOS'];
143 }
144
145 $campos['CRUZETA_AJUSTADA_TOTAL'] = min(($campos['TOTAL_CRUZETA_EPTO'] + $campos['CRUZETA_POSTE']),$linha['CRUZETA']);
146
147 $campos['GLOSA_CRUZETA'] = max(0, $linha['CRUZETA'] - $campos['CRUZETA_AJUSTADA_TOTAL']);
148
149 return $campos;
150 }
151
152 private function getCalculoCamposIsoladorPinos(array $linha, $normas, array $campos)
153 {
154 $campos['ISOLADOR_PINO_AJUSTADO_TOTAL'] = min($linha['ISOLADOR_PINO'], $campos['QTD_VAOS'] * $normas->getQuantidade('VAO', 'ISOP', $linha['TIPOLOGIA_ANEEL']) * $linha['FASES']);
155
156 $campos['GLOSA_ISOLADOR_PINO'] = max(0, $linha['ISOLADOR_PINO'] - $campos['ISOLADOR_PINO_AJUSTADO_TOTAL']);
157
158 return $campos;
159 }
160
161 private function getCalculoCamposIsoladorDiscos(array $linha, $normas, array $campos)
162 {
163 $campos['ISOLADOR_DISCO_AJUSTADO_TOTAL'] = min($linha['ISOLADOR_DISCO'], $campos['QTD_VAOS'] * $normas->getQuantidade('VAO', 'ISOP', $linha['TIPOLOGIA_ANEEL']) * $linha['FASES']);
164
165 $campos['GLOSA_ISOLADOR_DISCO'] = max(0, $linha['ISOLADOR_DISCO'] - $campos['ISOLADOR_DISCO_AJUSTADO_TOTAL']);
166
167 return $campos;
168 }
169
170 private function getCalculoCamposPinos(array $linha, array $campos)
171 {
172 $campos['PINOS_AJUSTADO_TOTAL'] = min($linha['PINO'], $campos['ISOLADOR_PINO_AJUSTADO_TOTAL']);
173
174 $campos['GLOSA_PINO'] = max(0, $linha['PINO']-$campos['PINOS_AJUSTADO_TOTAL']);
175
176 return $campos;
177 }
178
179 private function getCalculoCamposParaRaios(array $linha, $normas, array $campos)
180 {
181 $campos['PARA_RAIO_NORMATIVO_TOTAL'] =
182 $normas->getQuantidade('REL' , 'PR', $linha['TIPOLOGIA_ANEEL']) * $linha['RELIGADOR'] +
183 $normas->getQuantidade('BC' , 'PR', $linha['TIPOLOGIA_ANEEL']) * $linha['BANCO_CAPACITORES'] +
184 ($normas->getQuantidade('REG' , 'PR', $linha['TIPOLOGIA_ANEEL']) / 3) * $linha['REGULADOR'] +
185 $normas->getQuantidade('CHSECC' , 'PR', $linha['TIPOLOGIA_ANEEL']) * $linha['CHSECC'] +
186 $normas->getQuantidade('SECCIONALIZADOR', 'PR', $linha['TIPOLOGIA_ANEEL']) * $linha['SECCIONALIZADOR'] +
187 $linha['TRAFO_MONO'] +
188 $linha['TRAFO_BI'] * 2 +
189 $linha['TRAFO_TRI'] * 3;
190
191 $campos['PARA_RAIO_AJUSTADOS'] = min(max(0,$campos['PARA_RAIO_NORMATIVO_TOTAL'] - $linha['PARA_RAIO_UAR']), $linha['PARA_RAIO_COM']);
192
193 $campos['GLOSA_PARA_RAIO'] = max(0, $linha['PARA_RAIO_COM'] - $campos['PARA_RAIO_AJUSTADOS']);
194
195 return $campos;
196 }
197
198 private function getCalculoCamposHastes(array $linha, $normas, array $campos)
199 {
200 $campos['HASTE_NORMATIVO'] = floor(
201 ($normas->getQuantidade('PR', 'HASTE', $linha['TIPOLOGIA_ANEEL']) * (empty($linha['FASES']) ? 0 : $campos['PARA_RAIO_AJUSTADOS'] / $linha['FASES'])) +
202 (max(0, $campos['QTD_VAOS'] - empty($linha['FASES']) ? 0 : $campos['PARA_RAIO_AJUSTADOS']/$linha['FASES']) * $normas->getQuantidade('VAO','PR',$linha['TIPOLOGIA_ANEEL'])) +
203 $linha['SECC_CERCA'] / 3);
204
205 return $campos;
206 }
207
208 private function getCalculoChavesFusivel(array $linha, $normas, array $campos)
209 {
210 $campos['CHFUS_NORMATIVO'] =
211 ($normas->getQuantidade('REG' , 'CHFUS', $linha['TIPOLOGIA_ANEEL']) * ($linha['REGULADOR'] / 3)) +
212 ($normas->getQuantidade('REL' , 'CHFUS', $linha['TIPOLOGIA_ANEEL']) * $linha['RELIGADOR']) +
213 ($normas->getQuantidade('BC' , 'CHFUS', $linha['TIPOLOGIA_ANEEL']) * $linha['BANCO_CAPACITORES']) +
214 ($normas->getQuantidade('CHSECC' , 'CHFUS', $linha['TIPOLOGIA_ANEEL']) * $linha['CHSECC']) +
215 ($normas->getQuantidade('SECCIONALIZADOR', 'CHFUS', $linha['TIPOLOGIA_ANEEL']) * $linha['SECCIONALIZADOR']) +
216 $linha['TRAFO_MONO'] +
217 ($linha['TRAFO_BI'] * 2) +
218 ($linha['TRAFO_TRI'] * 3) ;
219
220 $campos['CHFUS_AJUSTADO'] = min(max(0, $campos['CHFUS_NORMATIVO'] - $linha['CHFUS_UAR']), $linha['CHFUS_COM']);
221
222 $campos['GLOSA_CHFUS'] = max(0, $linha['CHFUS_COM'] - $campos['CHFUS_AJUSTADO']);
223
224 return $campos;
225 }
226
227 private function getCalculoGlosasCOM(array $linha, array $campos)
228 {
229 $campos['VALOR_GLOSA_CRUZETA'] = $campos['GLOSA_CRUZETA'] * $linha['VALOR_UNITARIO_CRUZETA'];
230 $campos['VALOR_GLOSA_ISOLADOR_PINO'] = $campos['GLOSA_ISOLADOR_PINO'] * $linha['VALOR_UNITARIO_ISOLADOR_PINO'];
231 $campos['VALOR_GLOSA_ISOLADOR_DISCO'] = $campos['GLOSA_ISOLADOR_DISCO'] * $linha['VALOR_UNITARIO_ISOLADOR_DISCO'];
232 $campos['VALOR_GLOSA_PINO'] = $campos['GLOSA_PINO'] * $linha['VALOR_UNITARIO_PINO'];
233 $campos['VALOR_GLOSA_PARA_RAIO_COM'] = $campos['GLOSA_PARA_RAIO'] * $linha['VALOR_UNITARIO_PARA_RAIO_COM'];
234 $campos['VALOR_GLOSA_HASTE'] = $campos['GLOSA_HASTE'] * $linha['VALOR_UNITARIO_HASTE'];
235 $campos['VALOR_GLOSA_CHFUS_COM'] = $campos['GLOSA_CHFUS'] * $linha['VALOR_UNITARIO_CHFUS_COM'];
236
237 $campos['VALOR_TOTAL_GLOSA_COM'] =
238 $campos['VALOR_GLOSA_CRUZETA'] +
239 $campos['VALOR_GLOSA_ISOLADOR_PINO'] +
240 $campos['VALOR_GLOSA_ISOLADOR_DISCO'] +
241 $campos['VALOR_GLOSA_PINO'] +
242 $campos['VALOR_GLOSA_PARA_RAIO_COM'] +
243 $campos['VALOR_GLOSA_HASTE'] +
244 $campos['VALOR_GLOSA_CHFUS_COM'];
245
246 return $campos;
247 }
248
249 private function getCalculoGlosasCA(array $linha, array $campos, $valores)
250 {
251 $campos['VALOR_GLOSA_CA_CRUZETA'] = 0;
252 $campos['VALOR_GLOSA_CA_CHFUS'] = 0;
253 $campos['VALOR_GLOSA_CA_ISOLADOR_PINO'] = 0;
254 $campos['VALOR_GLOSA_CA_ISOLADOR_DISCO'] = 0;
255 $campos['VALOR_GLOSA_CA_PINO'] = 0;
256 $campos['VALOR_GLOSA_CA_PARA_RAIO'] = 0;
257 $campos['VALOR_GLOSA_CA_HASTE'] = 0;
258
259 if ($linha['DATA_INICIO_OBRA']) {
260
261 list($ano) = explode('-', $linha['DATA_INICIO_OBRA']);
262 $campos['VALOR_GLOSA_CA_CRUZETA'] = $campos['GLOSA_CRUZETA'] * $valores->getValorUnitarioServicoInstalacao('CRUZETA', $ano);
263 $campos['VALOR_GLOSA_CA_CHFUS'] = $campos['GLOSA_CHFUS'] * $valores->getValorUnitarioServicoInstalacao('CHFUS' , $ano);
264 $campos['VALOR_GLOSA_CA_ISOLADOR_PINO'] = $campos['GLOSA_ISOLADOR_PINO'] * $valores->getValorUnitarioServicoInstalacao('ISOP' , $ano);
265 $campos['VALOR_GLOSA_CA_ISOLADOR_DISCO'] = $campos['GLOSA_ISOLADOR_DISCO'] * $valores->getValorUnitarioServicoInstalacao('ISOD' , $ano);
266 $campos['VALOR_GLOSA_CA_PINO'] = $campos['GLOSA_PINO'] * $valores->getValorUnitarioServicoInstalacao('PINO' , $ano);
267 $campos['VALOR_GLOSA_CA_PARA_RAIO'] = $campos['GLOSA_PARA_RAIO'] * $valores->getValorUnitarioServicoInstalacao('PR' , $ano);
268 $campos['VALOR_GLOSA_CA_HASTE'] = $campos['GLOSA_HASTE'] * $valores->getValorUnitarioServicoInstalacao('HASTE' , $ano);
269 }
270
271 $campos['VALOR_TOTAL_GLOSA_CA'] =
272 $campos['VALOR_GLOSA_CA_CRUZETA'] +
273 $campos['VALOR_GLOSA_CA_CHFUS'] +
274 $campos['VALOR_GLOSA_CA_ISOLADOR_PINO'] +
275 $campos['VALOR_GLOSA_CA_ISOLADOR_DISCO'] +
276 $campos['VALOR_GLOSA_CA_PINO'] +
277 $campos['VALOR_GLOSA_CA_PARA_RAIO'] +
278 $campos['VALOR_GLOSA_CA_HASTE'];
279
280 return $campos;
281 }
282
283 public function getSelectDadosParaProcessamento() : string
284 {
285 $calculosTable = TableRegistry::get($this->calculo->source());
286 $select = "SELECT * FROM {$calculosTable->getViewRacionalizacaoCOM()} ";
287 $select .= "WHERE {$this->calculo->getWhereDadosParaProcessamento()}";
288 return $select;
289 }
290
291 public function excluiTabelaTemporaria()
292 {
293 $conexao = ConnectionManager::get('default');
294 $conexao->execute($this->getSqlDropTable());
295 return $this;
296 }
297
298 private function getSqlDropTable()
299 {
300 return "DROP TABLE IF EXISTS {$this->calculo->getNomeTabelaTemporariaCOM()};";
301 }
302}