D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
var
/
www
/
html
/
crsys_ant
/
adm
/
vendor_Ant
/
api
/
Filename :
gravaCabecalho_3.php
back
Copy
<?php header('Content-Type: application/json'); include_once "ConectaPdo.php"; ini_set('display_errors', 0); ini_set('log_errors', 1); error_reporting(E_ALL); /* =============================== FUNÇÕES AUXILIARES ================================ */ function limparMascara($campo, $valor) { $camposMoeda = ['vlr_semdesc', 'vlr_frete', 'vlr_desc', 'vlr_total', 'rt', 'vlr_ns']; $camposNumericos = ['telefone_obra', 'tel_vend', 'cep_obra']; if (in_array($campo, $camposMoeda)) { $valor = str_replace(['R$', ' ', "\xc2\xa0"], '', $valor); if (strpos($valor, ',') !== false) { $valor = str_replace('.', '', $valor); $valor = str_replace(',', '.', $valor); } return $valor; } if (in_array($campo, $camposNumericos)) { return preg_replace('/\D/', '', $valor); } return $valor; } /* =============================== FLAGS ================================ */ $duplica = filter_var($_POST['duplica'] ?? false, FILTER_VALIDATE_BOOLEAN); $novoorcamento = filter_var($_POST['novoorcamento'] ?? false, FILTER_VALIDATE_BOOLEAN); $novarevisao = filter_var($_POST['novarevisao'] ?? false, FILTER_VALIDATE_BOOLEAN); $orca_ant = isset($_POST['orca_id']) ? (int)$_POST['orca_id'] : 0; $revisaoAnt = isset($_POST['revisaoant']) ? (int)$_POST['revisaoant'] : 0; $usu_id = isset($_POST['usu_id']) ? (int)$_POST['usu_id'] : 0; /* =============================== LIMPA FLAGS DO POST ================================ */ foreach (['duplica','novoorcamento','novarevisao','regravar','revisaoant','data','data_ult_rev', 'usu_id'] as $f) { unset($_POST[$f]); } /* =============================== TRATA DADOS ================================ */ $camposMoeda = ['vlr_semdesc','vlr_frete','vlr_desc','vlr_total','rt', 'vlr_ns']; $camposNumericos = ['telefone_obra','tel_vend','cep_obra']; $dados = []; foreach ($_POST as $k => $v) { $v = trim($v); if (in_array($k, $camposMoeda) || in_array($k, $camposNumericos)) { $v = limparMascara($k, $v); } $dados[$k] = ($v === '') ? null : $v; } // Pega o id_obra do array dados $id_obra = $dados['id_obra']; // Busca os campos da obra $readObra = new \App\adms\Models\helper\AdmsRead(); $readObra->fullRead("SELECT o.cep_cobra, o.endereco_cobra, o.numero_cobra, o.bairro_cobra, o.complemento_cobra, m.nome municipio_cobra, municipio_id_cobra, m.uf uf_cobra FROM gre_obras o inner join adms_municipios m on m.id = o.municipio_id_cobra WHERE id = :id_obra", "id_obra={$id_obra}" ); $obraDados = $readObra->getResultado(); $logFile = __DIR__ . 'debug_le_obra/log.txt'; $log = "=============================\n"; $log .= "DATA: " . date('d/m/Y H:i:s') . "\n"; $log .= "RESULTADO getResultado():\n"; $log .= print_r($obraDados, true); $log .= "\n=============================\n\n"; file_put_contents($logFile, $log, FILE_APPEND); // Acrescenta os campos no array dados if (!empty($obraDados)) { $dados = array_merge($dados, [ 'cep_cobra' => $obraDados[0]['cep_cobra'], 'endereco_cobra' => $obraDados[0]['endereco_cobra'], 'numero_cobra' => $obraDados[0]['numero_cobra'], 'bairro_cobra' => $obraDados[0]['bairro_cobra'], 'complemento_cobra' => $obraDados[0]['complemento_cobra'], 'municipio_cobra' => $obraDados[0]['municipio_cobra'], 'municipio_id_cobra'=> $obraDados[0]['municipio_id_cobra'], 'uf_cobra' => $obraDados[0]['uf_cobra'], ]); } else { // Caso não encontre, define como null $dados = array_merge($dados, [ 'cep_cobra' => null, 'endereco_cobra' => null, 'numero_cobra' => null, 'bairro_cobra' => null, 'complemento_cobra' => null, 'municipio_cobra' => null, 'municipio_id_cobra'=> null, 'uf_cobra' => null, ]); } date_default_timezone_set("America/Sao_Paulo"); if(!$novarevisao) { $dados['created'] = date("Y-m-d H:i:s"); $dados['usu_created'] = $usu_id; }else{ $dados['modified'] = date("Y-m-d H:i:s"); $dados['usu_modified'] = $usu_id; } $orca_id = (int)($dados['orca_id'] ?? 0); $num_revisao = (int)($dados['num_revisao'] ?? 0); try { $pdo->beginTransaction(); /* =============================== CABEÇALHO ================================ */ if (!$novoorcamento) { // UPDATE $dados['modified'] = date("Y-m-d H:i:s"); $set = []; $params = []; foreach ($dados as $c => $v) { if (in_array($c, ['orca_id','num_revisao'])) continue; $set[] = "$c = :$c"; $params[$c] = $v; } $params['orca_id'] = $orca_id; $params['num_revisao'] = $num_revisao; // Monta a SQL $sql = "UPDATE gre_cab_orcamento SET " . implode(', ', $set) . " WHERE orca_id = :orca_id AND num_revisao = :num_revisao"; // ========================= // MONTA LOG DETALHADO // ========================= $logFile = __DIR__ . '/debug_regravar_cab_log.txt'; $log = "=============================\n"; $log .= "DATA: " . date('d/m/Y H:i:s') . "\n"; $log .= "SQL:\n$sql\n\n"; $log .= "CAMPOS (SET):\n"; foreach ($set as $campo) { $log .= " - $campo\n"; } $log .= "\nPARAMETROS:\n"; foreach ($params as $chave => $valor) { $log .= " $chave => " . print_r($valor, true) . "\n"; } $log .= "=============================\n\n"; file_put_contents($logFile, $log, FILE_APPEND); $pdo->prepare($sql)->execute($params); } else { // NOVO ORÇAMENTO $dados['status_id'] = 0; if (!$novarevisao) { $stmt = $pdo->prepare(" SELECT MAX(orca_id)+1 AS novo FROM gre_cab_orcamento WHERE empr_id = :empr_id "); $stmt->execute([':empr_id'=>$dados['empr_id']]); $dados['orca_id'] = $stmt->fetchColumn() ?: 1; } if ($novarevisao) { $stmt = $pdo->prepare(" SELECT SUM(base_total) FROM gre_item_orcamento WHERE empr_id = :empr_id AND orca_id = :orca_id AND num_revisao = :rev_ant "); $stmt->execute([ ':empr_id'=>$dados['empr_id'], ':orca_id'=>$dados['orca_id'], ':rev_ant'=>$revisaoAnt ]); $dados['vlr_base_total'] = (float)$stmt->fetchColumn(); $dados['vlr_frete'] = 0; $dados['vlr_desc'] = 0; $dados['vlr_total'] = $dados['vlr_semdesc']; $dados['data_ult_rev'] = date("Y-m-d"); } $cols = array_keys($dados); $ph = array_map(function ($c) { return ':' . $c; }, $cols); $sql = "INSERT INTO gre_cab_orcamento (".implode(',',$cols).") VALUES (".implode(',',$ph).")"; $pdo->prepare($sql)->execute($dados); $orca_id = $dados['orca_id']; } /* =============================== DUPLICAÇÃO DE ITENS (CORRIGIDO) ================================ */ if ($duplica || $novarevisao) { /* =============================== SELECT PARA LOG (ANTES DO INSERT) ================================ */ $sqlLog = " SELECT empr_id, item, :orca_id AS orca_id, :num_revisao AS num_revisao, larg, prof, m2, qtde_pecas, material_id, material, benef_id, vlr_unit_mat, vlr_total_mat, base_total, vlr_total, NOW() AS created, NOW() AS modified, NOW() AS data_ult_rev FROM gre_item_orcamento WHERE orca_id = :orca_ant AND num_revisao = :rev_ant ORDER BY id "; $stmtLog = $pdo->prepare($sqlLog); $stmtLog->execute([ ':orca_id' => $orca_id, ':num_revisao' => $num_revisao, ':orca_ant' => $orca_ant, ':rev_ant' => $revisaoAnt ]); $rows = $stmtLog->fetchAll(PDO::FETCH_ASSOC); /* =============================== GRAVA LOG COMPLETO ================================ */ /* $logFile = __DIR__ . '/debug_insert_gre_item_orcamento.txt'; $log = "\n========================================\n"; $log .= "INSERT gre_item_orcamento (PREVIEW)\n"; $log .= "Data/Hora: " . date('Y-m-d H:i:s') . "\n"; $log .= "Orçamento id: {$orca_id}\n"; $log .= "Revisão nova: {$num_revisao}\n"; $log .= "Orçamento ant: {$orca_ant}\n"; $log .= "Revisão origem: {$revisaoAnt}\n"; $log .= "Qtd registros: " . count($rows) . "\n"; $log .= "----------------------------------------\n"; foreach ($rows as $i => $row) { $log .= "REGISTRO " . ($i + 1) . ":\n"; foreach ($row as $campo => $valor) { $log .= " {$campo} => " . var_export($valor, true) . "\n"; } $log .= "----------------------------------------\n"; } file_put_contents($logFile, $log, FILE_APPEND); */ /* =============================== INSERT REAL ================================ */ $sql = "INSERT INTO gre_item_orcamento ( empr_id, item, orca_id, num_revisao, larg, prof, alt_fron_esq, larg_fron_esq, alt_fron_dir, larg_fron_dir, alt_fron_fun, larg_fron_fun, alt_fron_fren, larg_fron_fren, alt_saia_esq, larg_saia_esq, alt_saia_dir, larg_saia_dir, alt_saia_fun, larg_saia_fun, alt_saia_fren, larg_saia_fren, tpo_duplo, em_curva, polir_duplo, acabDir, acabEsq, acabFren, acabFun, fronDir, fronEsq, fronFren, fronFun, saiaDir, saiaEsq, saiaFren, saiaFun, acab_topo_frontao, esqua, acabamento, servico, qtde_serv, material_id, material, benef_id, vlr_unit_acab, vlr_unit_mat, vlr_unit_prod, vlr_unit_serv, ambiente_id, descricao, id_tabela, descricao_tabela, qtde_pecas, unid_prod, base_mo, base_mat, vlr_total_mo, vlr_total_mat, vlr_total_col, vlr_total_acab_fron, vlr_total_serv, vlr_total_acab, vlr_total, base_total, m2, ml, produto, obra_id, obra, ajuste, fornecedor_id, data_pedido, data_medicao, data_desenho, data_aprovacao, data_os, data_entrega, data_inicio, data_fim, colocadorId, num_os, observacao, created, usu_created, modified, usu_modified, num_pedido, percentual, larg_aa, prof_aa, data_ult_rev ) SELECT empr_id, item, :orca_id orca_id, :novo_num_revisao, larg, prof, alt_fron_esq, larg_fron_esq, alt_fron_dir, larg_fron_dir, alt_fron_fun, larg_fron_fun, alt_fron_fren, larg_fron_fren, alt_saia_esq, larg_saia_esq, alt_saia_dir, larg_saia_dir, alt_saia_fun, larg_saia_fun, alt_saia_fren, larg_saia_fren, tpo_duplo, em_curva, polir_duplo, acabDir, acabEsq, acabFren, acabFun, fronDir, fronEsq, fronFren, fronFun, saiaDir, saiaEsq, saiaFren, saiaFun, acab_topo_frontao, esqua, acabamento, servico, qtde_serv, material_id, material, benef_id, vlr_unit_acab, vlr_unit_mat, vlr_unit_prod, vlr_unit_serv, ambiente_id, descricao, id_tabela, descricao_tabela, qtde_pecas, unid_prod, base_mo, base_mat, vlr_total_mo, vlr_total_mat, vlr_total_col, vlr_total_acab_fron, vlr_total_serv, vlr_total_acab, vlr_total, base_total, m2, ml, produto, obra_id, obra, ajuste, fornecedor_id, data_pedido, data_medicao, data_desenho, data_aprovacao, data_os, data_entrega, data_inicio, data_fim, colocadorId, num_os, observacao, NOW(), usu_created, NOW(), usu_modified, num_pedido, percentual, larg_aa, prof_aa, NOW() FROM gre_item_orcamento WHERE orca_id = :orca_ant AND num_revisao = :revisao_anterior order by id;"; $stmt = $pdo->prepare($sql); $stmt->execute([ 'orca_id' => $orca_id, 'orca_ant' => $orca_ant, 'revisao_anterior' => $revisaoAnt, 'novo_num_revisao' => $dados['num_revisao'] ]); } $pdo->commit(); $vlr_frete = calcula_frete($pdo, $dados['orca_id'], $dados['num_revisao'], $dados['empr_id']); // Retorna o JSON incluindo o frete echo json_encode([ 'status' => 'success', 'mensagem' => 'Processo concluído com sucesso', 'orca_id' => $orca_id, 'num_revisao' => $num_revisao, 'vlr_frete' => $vlr_frete ]); } catch (Exception $e) { $pdo->rollBack(); echo json_encode([ 'status'=>'error', 'mensagem'=>$e->getMessage() ]); } function calcula_frete($pdo,$orcamento_id, $num_revisao, $empr_id) { $sqlparam = "SELECT metro2_maximo, raio_frete, vlr_frete vlr_unit_frete FROM gre_parametros WHERE empr_id = :empr_id"; $stmtParam = $pdo->prepare($sqlparam ); $stmtParam->execute([ ':empr_id' => $empr_id, ]); $param = $stmtParam->fetch(PDO::FETCH_ASSOC); $m2_maximo = $param['metro2_maximo']; $raio_frete = $param['raio_frete']; $vlr_unit_frete = $param['vlr_unit_frete']; // ===================== SOMA DOS TOTAIS ===================== $sqlTotais = " SELECT COALESCE(SUM(m2), 0) AS soma_m2, COALESCE(SUM(vlr_total) , 0) AS soma_vlr_semdesc, COALESCE(SUM(vlr_total) , 0) AS soma_vlr_total, COALESCE(SUM(base_total), 0) AS soma_base_total, COALESCE(SUM(vlr_insumo), 0) AS soma_vlr_insumo FROM gre_item_orcamento WHERE orca_id = :orca_id AND num_revisao = :num_revisao "; $stmtTotais = $pdo->prepare($sqlTotais); $stmtTotais->execute([ ':orca_id' => $orcamento_id, ':num_revisao'=> $num_revisao ]); $totais = $stmtTotais->fetch(PDO::FETCH_ASSOC); $soma_vlr_total = $totais['soma_vlr_total']; $soma_base_total = $totais['soma_base_total']; $soma_vlr_insumo = $totais['soma_vlr_insumo']; $soma_vlr_semdesc = $totais['soma_vlr_semdesc']; $sqlCab = " SELECT distancia, vlr_frete, vlr_desc FROM gre_cab_orcamento WHERE orca_id = :orca_id AND num_revisao = :num_revisao LIMIT 1 "; $stmtCab = $pdo->prepare($sqlCab); $stmtCab->execute([ ':orca_id' => $orcamento_id, ':num_revisao' => $num_revisao ]); $cab = $stmtCab->fetch(PDO::FETCH_ASSOC); $vlr_frete = $cab['vlr_frete'] ?? 0; $vlr_desc = $cab['vlr_desc'] ?? 0; $distancia = $cab['distancia'] ?? 0; if ($soma_m2 > $raio_frete) { $mult_m2 = ceil($soma_m2 / $raio_frete); }else{ $mult_m2 = 1; } $soma_m2 = $totais['soma_m2']; if ($soma_m2 > $raio_frete) { $mult_m2 = ceil($soma_m2 / $raio_frete); }else{ $mult_m2 = 1; } $vlr_frete = $cab['vlr_frete'] ?? 0; $vlr_desc = $cab['vlr_desc'] ?? 0; $distancia = $cab['distancia'] ?? 0; if($distancia > $raio_frete) { $vlr_frete = round(($distancia * $vlr_unit_frete * $mult_m2),2); }else{ $vlr_frete = 0; } $vlr_total = $soma_vlr_total + $vlr_frete - $vlr_desc; $modified = date("Y-m-d H:i:s"); $usu_modified= $usu_id; // Atualiza gre_cab_orcamento $sqlUpdateCab = " UPDATE gre_cab_orcamento SET vlr_semdesc = :vlr_semdesc, vlr_base_total = :vlr_base_total, vlr_total = :vlr_total, vlr_frete = :vlr_frete, vlr_insumo = :vlr_insumo WHERE orca_id = :orca_id AND num_revisao = :num_revisao "; $stmtUpdateCab = $pdo->prepare($sqlUpdateCab); $stmtUpdateCab->execute([ ':vlr_semdesc' => $soma_vlr_semdesc, ':vlr_base_total' => $soma_base_total, ':vlr_total' => $vlr_total, ':vlr_frete' => $vlr_frete, ':vlr_insumo' => $soma_vlr_insumo, ':orca_id' => $orcamento_id, ':num_revisao' => $num_revisao ]); // Retorna o valor calculado return $vlr_frete; }