D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
var
/
www
/
html
/
crsys
/
adm
/
vendor
/
api
/
Filename :
gravaCabecalho.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; } /* =============================== BUSCA DADOS DA OBRA ================================ */ $id_obra = $dados['obra_id'] ?? null; $obraDados = []; try { // Consulta direta usando PDO $sql = " SELECT o.cep_cobra, o.endereco_cobra, o.numero_cobra, o.bairro_cobra, o.complemento_cobra, m.nome AS municipio_cobra, o.municipio_id_cobra, m.uf AS uf_cobra FROM gre_obras o INNER JOIN adms_municipios m ON m.id = o.municipio_id_cobra WHERE o.id = :id_obra LIMIT 1 "; $stmt = $pdo->prepare($sql); $stmt->execute([':id_obra' => $id_obra]); $obraDados = $stmt->fetchAll(PDO::FETCH_ASSOC); $log .= "RESULTADO fetchAll():\n"; $log .= print_r($obraDados, true); } catch (Exception $e) { $log .= "ERRO AO BUSCAR OBRA: " . $e->getMessage() . "\n"; } // Acrescenta os campos no array $dados $dados = array_merge($dados, [ 'cep_cobra' => $obraDados[0]['cep_cobra'] ?? null, 'endereco_cobra' => $obraDados[0]['endereco_cobra'] ?? null, 'numero_cobra' => $obraDados[0]['numero_cobra'] ?? null, 'bairro_cobra' => $obraDados[0]['bairro_cobra'] ?? null, 'complemento_cobra' => $obraDados[0]['complemento_cobra'] ?? null, 'municipio_cobra' => $obraDados[0]['municipio_cobra'] ?? null, 'municipio_id_cobra' => $obraDados[0]['municipio_id_cobra'] ?? null, 'uf_cobra' => $obraDados[0]['uf_cobra'] ?? null, ]); // =============================== // DEFINE DATAS E USUÁRIO // =============================== 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) { $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; $sql = "UPDATE gre_cab_orcamento SET " . implode(', ', $set) . " WHERE orca_id = :orca_id AND num_revisao = :num_revisao"; $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); //$logFile = __DIR__ . '/debug_cabecalho_log.txt'; //foreach ($dados as $campo => $valor) { // $linha = date('Y-m-d H:i:s') . " | {$campo} => " . var_export($valor, true) . PHP_EOL; // file_put_contents($logFile, $linha, FILE_APPEND); //} //$logFile = __DIR__ . '/debug_cabecalho_log.txt'; $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 ================================ */ if ($duplica || $novarevisao) { $sql = "INSERT INTO gre_item_orcamento ( empr_id,item,orca_id,num_revisao,larg,prof,created,usu_created,modified,usu_modified ) SELECT empr_id,item,:orca_id,:novo_num_revisao,larg,prof,NOW(),usu_created,NOW(),usu_modified 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, 'novo_num_revisao' => $dados['num_revisao'], 'orca_ant' => $orca_ant, 'revisao_anterior' => $revisaoAnt ]); } $pdo->commit(); $vlr_frete = calcula_frete($pdo, $dados['orca_id'], $dados['num_revisao'], $dados['empr_id'], $usu_id); 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() ]); } /* =============================== FUNÇÃO CALCULA FRETE ================================ */ function calcula_frete($pdo, $orcamento_id, $num_revisao, $empr_id, $usu_id) { // Busca parâmetros do frete $stmtParam = $pdo->prepare("SELECT metro2_maximo, raio_frete, vlr_frete vlr_unit_frete FROM gre_parametros WHERE empr_id = :empr_id"); $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 totais $stmtTotais = $pdo->prepare(" SELECT COALESCE(SUM(m2),0) AS soma_m2, COALESCE(SUM(vlr_total + vlr_insumo),0) AS soma_vlr_total, COALESCE(SUM(vlr_total + vlr_insumo),0) AS soma_vlr_semdesc, COALESCE(SUM(base_total + vlr_insumo),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->execute([ ':orca_id'=>$orcamento_id, ':num_revisao'=>$num_revisao ]); $totais = $stmtTotais->fetch(PDO::FETCH_ASSOC); $soma_m2 = $totais['soma_m2']; $soma_vlr_total = $totais['soma_vlr_total']; $soma_vlr_semdesc = $totais['soma_vlr_semdesc']; $soma_base_total = $totais['soma_base_total']; $soma_vlr_insumo = $totais['soma_vlr_insumo']; // Busca dados do orçamento $stmtCab = $pdo->prepare("SELECT distancia, vlr_frete, vlr_desc FROM gre_cab_orcamento WHERE orca_id = :orca_id AND num_revisao = :num_revisao LIMIT 1"); $stmtCab->execute([':orca_id'=>$orcamento_id, ':num_revisao'=>$num_revisao]); $cab = $stmtCab->fetch(PDO::FETCH_ASSOC); $distancia = $cab['distancia'] ?? 0; $vlr_desc = $cab['vlr_desc'] ?? 0; $mult_m2 = ($soma_m2 > $raio_frete) ? ceil($soma_m2 / $raio_frete) : 1; $vlr_frete = ($distancia > $raio_frete) ? round(($distancia * $vlr_unit_frete * $mult_m2),2) : 0; $vlr_total = $soma_vlr_total + $vlr_frete + $soma_vlr_insumo - $vlr_desc; // Atualiza gre_cab_orcamento $stmtUpdateCab = $pdo->prepare(" 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, modified = NOW(), usu_modified = :usu_modified WHERE orca_id = :orca_id AND num_revisao = :num_revisao "); $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, ':usu_modified'=>$usu_id ]); return $vlr_frete; }