· 8 years ago · Jun 26, 2018, 01:58 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
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 getCalculoCamposCruzetas(array $linha, $normas, array $campos)
112 {
113 $campos['CRUZETA_REL'] = $normas->getQuantidade('REL', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['RELIGADOR'];
114 $campos['CRUZETA_REG'] = $normas->getQuantidade('REG', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['REGULADOR'];
115 $campos['CRUZETA_BC'] = $normas->getQuantidade('BC' , 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['BANCO_CAPACITORES'];
116
117 $aux = $normas->getQuantidade('PR', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']);
118 $campos['CRUZETA_PR'] = $aux * ($linha['PARA_RAIO_COM'] + $linha['PARA_RAIO_UAR']);
119
120 $campos['CRUZETA_CHSECC'] = $normas->getQuantidade('CHSECC', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['CHSECC'];
121 $campos['CRUZETA_SECCIONALIZADOR'] = $normas->getQuantidade('SECCIONALIZADOR', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']) * $linha['SECCIONALIZADOR'];
122
123 $aux = $normas->getQuantidade('CHFUS', 'CRUZETA', $linha['TIPOLOGIA_ANEEL']);
124 $campos['CRUZETA_CHFUS'] = ($aux * ($linha['CHFUS_COM'] + $linha['CHFUS_UAR'])) / $linha['FASES'];
125
126 $campos['TOTAL_CRUZETA_EPTO'] = $campos['CRUZETA_REL'] + $campos['CRUZETA_REG'] + $campos['CRUZETA_BC'] + $campos['CRUZETA_PR'] + $campos['CRUZETA_CHSECC'] + $campos['CRUZETA_SECCIONALIZADOR'] + $campos['CRUZETA_CHFUS'];
127
128 $campos['CRUZETA_MENOS_EPTO'] = max(0, $linha['CRUZETA'] - $campos['TOTAL_CRUZETA_EPTO']);
129
130 if($linha['FASES'] == 1){
131 $campos['CRUZETA_POSTE'] = 0;
132 } else{
133 $campos['CRUZETA_POSTE'] = $normas->getQuantidade('POSTE', 'CRUZETA', $linha['TIPOLOGIA_ANEEL'])* $linha['POSTE'];
134 }
135
136 $campos['CRUZETA_AJUSTADA_TOTAL'] = min(($campos['TOTAL_CRUZETA_EPTO'] + $campos['CRUZETA_POSTE']),$linha['CRUZETA']);
137
138 $campos['GLOSA_CRUZETA'] = max(0, $linha['CRUZETA'] - $campos['CRUZETA_AJUSTADA_TOTAL']);
139
140 return $campos;
141 }
142
143 private function getCalculoCamposIsoladorPinos(array $linha, $normas, array $campos)
144 {
145 $campos['ISOLADOR_PINO_AJUSTADO_TOTAL'] = min($normas->getQuantidade('CRUZETA', 'ISOP', $linha['TIPOLOGIA_ANEEL']), (empty($campos['CRUZETA_AJUSTADA_TOTAL']) ? 0 : $linha['ISOLADOR_PINO'] / $campos['CRUZETA_AJUSTADA_TOTAL'])) * $campos['CRUZETA_AJUSTADA_TOTAL'];
146
147 $campos['GLOSA_ISOLADOR_PINO'] = max(0, $linha['ISOLADOR_PINO'] - $campos['ISOLADOR_PINO_AJUSTADO_TOTAL']);
148
149 return $campos;
150 }
151
152 private function getCalculoCamposIsoladorDiscos(array $linha, $normas, array $campos)
153 {
154 $campos['ISOLADOR_DISCO_AJUSTADO_TOTAL'] = min($normas->getQuantidade('POSTE', 'ISOD', $linha['TIPOLOGIA_ANEEL']), (empty($linha['POSTE']) ? 0 : $linha['ISOLADOR_DISCO'] / $linha['POSTE'])) * $linha['POSTE'];
155
156 $campos['GLOSA_ISOLADOR_DISCO'] = max(0, $linha['ISOLADOR_DISCO'] - $campos['ISOLADOR_DISCO_AJUSTADO_TOTAL']);
157
158 return $campos;
159 }
160
161 private function getCalculoCamposPinos(array $linha, array $campos)
162 {
163 $campos['PINOS_AJUSTADO_TOTAL'] = min($linha['PINO'], $campos['ISOLADOR_PINO_AJUSTADO_TOTAL']);
164
165 $campos['GLOSA_PINO'] = max(0, $linha['PINO']-$campos['PINOS_AJUSTADO_TOTAL']);
166
167 return $campos;
168 }
169
170 private function getCalculoCamposParaRaios(array $linha, $normas, array $campos)
171 {
172 $aux = $normas->getQuantidade('EXT_RD', 'PR', $linha['TIPOLOGIA_ANEEL']);
173 $campos['PARA_RAIO_NORMATIVO_TOTAL'] =
174 $normas->getQuantidade('REL' , 'PR', $linha['TIPOLOGIA_ANEEL']) * $linha['RELIGADOR'] +
175 $normas->getQuantidade('BC' , 'PR', $linha['TIPOLOGIA_ANEEL']) * $linha['BANCO_CAPACITORES'] +
176 ($normas->getQuantidade('REG' , 'PR', $linha['TIPOLOGIA_ANEEL']) / 3) * $linha['REGULADOR'] +
177 $normas->getQuantidade('CHSECC' , 'PR', $linha['TIPOLOGIA_ANEEL']) * $linha['CHSECC'] +
178 $normas->getQuantidade('SECCIONALIZADOR', 'PR', $linha['TIPOLOGIA_ANEEL']) * $linha['SECCIONALIZADOR'] +
179 $linha['TRAFO_MONO'] +
180 $linha['TRAFO_BI'] * 2 +
181 $linha['TRAFO_TRI'] * 3 +
182 floor((empty($linha['FASES'])) ? 0 : (($linha['CABO_ISO'] + $linha['CABO_NU']) / $linha['FASES']) * $aux);
183
184 $campos['PARA_RAIO_AJUSTADOS'] = min(max(0,$campos['PARA_RAIO_NORMATIVO_TOTAL'] - $linha['PARA_RAIO_UAR']), $linha['PARA_RAIO_COM']);
185
186 $campos['GLOSA_PARA_RAIO'] = max(0, $linha['PARA_RAIO_COM'] - $campos['PARA_RAIO_AJUSTADOS']);
187
188 return $campos;
189 }
190
191 private function getCalculoCamposHastes(array $linha, $normas, array $campos)
192 {
193 $campos['HASTE_NORMATIVO'] = floor(
194 ($normas->getQuantidade('PR', 'HASTE', $linha['TIPOLOGIA_ANEEL']) * (empty($linha['FASES']) ? 0 : $campos['PARA_RAIO_AJUSTADOS'] / $linha['FASES'])) +
195 (empty($linha['FASES']) ? 0 : (($linha['CABO_ISO'] + $linha['CABO_NU']) / $linha['FASES']) * $normas->getQuantidade('EXT_RD', 'HASTE', $linha['TIPOLOGIA_ANEEL']))
196 );
197
198 $campos['HASTE_AJUSTADO'] = min($campos['HASTE_NORMATIVO'], $linha['HASTE']);
199
200 $campos['GLOSA_HASTE'] = max(0, $linha['HASTE'] - $campos['HASTE_AJUSTADO']);
201
202 return $campos;
203 }
204
205 private function getCalculoChavesFusivel(array $linha, $normas, array $campos)
206 {
207 $campos['CHFUS_NORMATIVO'] =
208 ($normas->getQuantidade('REG' , 'CHFUS', $linha['TIPOLOGIA_ANEEL']) * ($linha['REGULADOR'] / 3)) +
209 ($normas->getQuantidade('REL' , 'CHFUS', $linha['TIPOLOGIA_ANEEL']) * $linha['RELIGADOR']) +
210 ($normas->getQuantidade('BC' , 'CHFUS', $linha['TIPOLOGIA_ANEEL']) * $linha['BANCO_CAPACITORES']) +
211 ($normas->getQuantidade('CHSECC' , 'CHFUS', $linha['TIPOLOGIA_ANEEL']) * $linha['CHSECC']) +
212 ($normas->getQuantidade('SECCIONALIZADOR', 'CHFUS', $linha['TIPOLOGIA_ANEEL']) * $linha['SECCIONALIZADOR']) +
213 $linha['TRAFO_MONO'] +
214 ($linha['TRAFO_BI'] * 2) +
215 ($linha['TRAFO_TRI'] * 3) +
216 (empty($linha['FASES']) ? 0 : (($linha['CABO_ISO'] + $linha['CABO_NU']) / $linha['FASES']) * $normas->getQuantidade('EXT_RD', 'CHFUS', $linha['TIPOLOGIA_ANEEL']));
217
218 $campos['CHFUS_AJUSTADO'] = min(max(0, $campos['CHFUS_NORMATIVO'] - $linha['CHFUS_UAR']), $linha['CHFUS_COM']);
219
220 $campos['GLOSA_CHFUS'] = max(0, $linha['CHFUS_COM'] - $campos['CHFUS_AJUSTADO']);
221
222 return $campos;
223 }
224
225 private function getCalculoGlosasCOM(array $linha, array $campos)
226 {
227 $campos['VALOR_GLOSA_CRUZETA'] = $campos['GLOSA_CRUZETA'] * $linha['VALOR_UNITARIO_CRUZETA'];
228 $campos['VALOR_GLOSA_ISOLADOR_PINO'] = $campos['GLOSA_ISOLADOR_PINO'] * $linha['VALOR_UNITARIO_ISOLADOR_PINO'];
229 $campos['VALOR_GLOSA_ISOLADOR_DISCO'] = $campos['GLOSA_ISOLADOR_DISCO'] * $linha['VALOR_UNITARIO_ISOLADOR_DISCO'];
230 $campos['VALOR_GLOSA_PINO'] = $campos['GLOSA_PINO'] * $linha['VALOR_UNITARIO_PINO'];
231 $campos['VALOR_GLOSA_PARA_RAIO_COM'] = $campos['GLOSA_PARA_RAIO'] * $linha['VALOR_UNITARIO_PARA_RAIO_COM'];
232 $campos['VALOR_GLOSA_HASTE'] = $campos['GLOSA_HASTE'] * $linha['VALOR_UNITARIO_HASTE'];
233 $campos['VALOR_GLOSA_CHFUS_COM'] = $campos['GLOSA_CHFUS'] * $linha['VALOR_UNITARIO_CHFUS_COM'];
234
235 $campos['VALOR_TOTAL_GLOSA_COM'] =
236 $campos['VALOR_GLOSA_CRUZETA'] +
237 $campos['VALOR_GLOSA_ISOLADOR_PINO'] +
238 $campos['VALOR_GLOSA_ISOLADOR_DISCO'] +
239 $campos['VALOR_GLOSA_PINO'] +
240 $campos['VALOR_GLOSA_PARA_RAIO_COM'] +
241 $campos['VALOR_GLOSA_HASTE'] +
242 $campos['VALOR_GLOSA_CHFUS_COM'];
243
244 return $campos;
245 }
246
247 private function getCalculoGlosasCA(array $linha, array $campos, $valores)
248 {
249 $campos['VALOR_GLOSA_CA_CRUZETA'] = 0;
250 $campos['VALOR_GLOSA_CA_CHFUS'] = 0;
251 $campos['VALOR_GLOSA_CA_ISOLADOR_PINO'] = 0;
252 $campos['VALOR_GLOSA_CA_ISOLADOR_DISCO'] = 0;
253 $campos['VALOR_GLOSA_CA_PINO'] = 0;
254 $campos['VALOR_GLOSA_CA_PARA_RAIO'] = 0;
255 $campos['VALOR_GLOSA_CA_HASTE'] = 0;
256
257 if ($linha['DATA_INICIO_OBRA']) {
258
259 list($ano) = explode('-', $linha['DATA_INICIO_OBRA']);
260 $campos['VALOR_GLOSA_CA_CRUZETA'] = $campos['GLOSA_CRUZETA'] * $valores->getValorUnitarioServicoInstalacao('CRUZETA', $ano);
261 $campos['VALOR_GLOSA_CA_CHFUS'] = $campos['GLOSA_CHFUS'] * $valores->getValorUnitarioServicoInstalacao('CHFUS' , $ano);
262 $campos['VALOR_GLOSA_CA_ISOLADOR_PINO'] = $campos['GLOSA_ISOLADOR_PINO'] * $valores->getValorUnitarioServicoInstalacao('ISOP' , $ano);
263 $campos['VALOR_GLOSA_CA_ISOLADOR_DISCO'] = $campos['GLOSA_ISOLADOR_DISCO'] * $valores->getValorUnitarioServicoInstalacao('ISOD' , $ano);
264 $campos['VALOR_GLOSA_CA_PINO'] = $campos['GLOSA_PINO'] * $valores->getValorUnitarioServicoInstalacao('PINO' , $ano);
265 $campos['VALOR_GLOSA_CA_PARA_RAIO'] = $campos['GLOSA_PARA_RAIO'] * $valores->getValorUnitarioServicoInstalacao('PR' , $ano);
266 $campos['VALOR_GLOSA_CA_HASTE'] = $campos['GLOSA_HASTE'] * $valores->getValorUnitarioServicoInstalacao('HASTE' , $ano);
267 }
268
269 $campos['VALOR_TOTAL_GLOSA_CA'] =
270 $campos['VALOR_GLOSA_CA_CRUZETA'] +
271 $campos['VALOR_GLOSA_CA_CHFUS'] +
272 $campos['VALOR_GLOSA_CA_ISOLADOR_PINO'] +
273 $campos['VALOR_GLOSA_CA_ISOLADOR_DISCO'] +
274 $campos['VALOR_GLOSA_CA_PINO'] +
275 $campos['VALOR_GLOSA_CA_PARA_RAIO'] +
276 $campos['VALOR_GLOSA_CA_HASTE'];
277
278 return $campos;
279 }
280
281 public function getSelectDadosParaProcessamento() : string
282 {
283 $calculosTable = TableRegistry::get($this->calculo->source());
284 $select = "SELECT * FROM {$calculosTable->getViewRacionalizacaoCOM()} ";
285 $select .= "WHERE {$this->calculo->getWhereDadosParaProcessamento()}";
286 return $select;
287 }
288
289 public function excluiTabelaTemporaria()
290 {
291 $conexao = ConnectionManager::get('default');
292 $conexao->execute($this->getSqlDropTable());
293 return $this;
294 }
295
296 private function getSqlDropTable()
297 {
298 return "DROP TABLE IF EXISTS {$this->calculo->getNomeTabelaTemporariaCOM()};";
299 }
300}