File: /home/onlyfibr/.trash/assinar.php.5
<?php
// HABILITAR ERROS PARA DEBUG ------------//
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// -------------------------------------- //
$pageTitle = 'Pré-Cadastro de Novo Assinante';
session_start();
require_once 'includes/config/config.php';
require_once 'includes/functions/functions.php';
$salvar_no_banco_de_dados = true; // Defina true para salvar no DB, false para apenas API
$mensagem_erro = $mensagem_erro_db ?? '';
$mensagem_sucesso = '';
$form_data = ($_SERVER['REQUEST_METHOD'] === 'POST' && ! empty($_SESSION['precadastro_error'])) ? $_POST : [];
$lista_planos_disponiveis = [];
$lista_vencimentos_disponiveis = [];
unset($_SESSION['precadastro_error']);
if (! $pdo && $salvar_no_banco_de_dados) {
$mensagem_erro = "Erro crítico: Serviço indisponível (DB Connection).";
}
$enviar_para_api_sgp = true;
if ($pdo) {
try {
$stmt_cfg_api = $pdo->query("SELECT enviar_dados_api_sgp FROM configuracoes WHERE id = 1 LIMIT 1");
$config_api = $stmt_cfg_api->fetch(PDO::FETCH_ASSOC);
if ($config_api !== false && isset($config_api['enviar_dados_api_sgp'])) {
$enviar_para_api_sgp = filter_var($config_api['enviar_dados_api_sgp'], FILTER_VALIDATE_BOOLEAN);
}
} catch (\PDOException $e) {
error_log("Erro ao buscar config de envio API no assinar2.php (PGSQL): " . $e->getMessage());
}
} else {
error_log("PDO indisponível no assinar2.php ao buscar config de envio API (PGSQL).");
}
$opcoes_moradia = [
'' => '-- Selecione (Obrigatório) --',
'Casa Própria' => 'Casa Própria',
'Casa Alugada' => 'Casa Alugada',
'Casa dos Pais' => 'Casa dos Pais',
'Imóvel de Terceiros' => 'Imóvel de Terceiros',
'Prefiro não responder' => 'Prefiro não responder',
];
if (! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
$action = $_REQUEST['action'] ?? null;
// ... (Lógica AJAX como na versão anterior, não modificada aqui para brevidade) ...
// Se a lógica AJAX precisar de $pdo, certifique-se de que está disponível.
// Por exemplo, ação 'verificar_indicador':
if ($action === 'verificar_indicador') {
$indicador_cpfcnpj_input = $_REQUEST['indicador_cpfcnpj'] ?? '';
$indicador_cpfcnpj_limpo = cleanCpfCnpj($indicador_cpfcnpj_input);
$response_data = ['success' => false, 'message' => 'CPF/CNPJ do indicador inválido.'];
if (! empty($indicador_cpfcnpj_limpo) && (strlen($indicador_cpfcnpj_limpo) == 11 || strlen($indicador_cpfcnpj_limpo) == 14)) {
try {
$endpointConsulta = '/api/ura/consultacliente/';
$dadosConsulta = ['cpfcnpj' => $indicador_cpfcnpj_limpo];
$responseIndicador = getAPI(BASE_URL, $endpointConsulta, APP_TOKEN, APP_NAME, $dadosConsulta);
$dadosApiIndicador = json_decode($responseIndicador, true);
if (json_last_error() === JSON_ERROR_NONE && isset($dadosApiIndicador['contratos']) && ! empty($dadosApiIndicador['contratos'])) {
$primeiro_contrato_ind = $dadosApiIndicador['contratos'][0];
$indicador_nome = $primeiro_contrato_ind['razaoSocial'] ?? 'Nome não encontrado';
$indicador_id = $primeiro_contrato_ind['clienteId'] ?? null;
$response_data = [
'success' => true,
'message' => 'Que legal! Você foi indicado por seu amigo: ' . htmlspecialchars($indicador_nome),
'indicador_id' => $indicador_id,
'indicador_nome' => $indicador_nome,
];
} else {
$response_data['message'] = 'Cliente/Indicador não localizado em nossa base.';
}
} catch (\Exception $e) {
error_log("Exceção ao verificar indicador $indicador_cpfcnpj_limpo (PGSQL): " . $e->getMessage());
$response_data['message'] = 'Erro ao verificar indicador.';
}
}
header('Content-Type: application/json');
echo json_encode($response_data);
exit;
}
// Ação 'get_vendedores'
elseif ($action === 'get_vendedores') {
$response_data = ['success' => false, 'vendedores' => [], 'message' => ''];
try {
$endpointVendedores = '/api/precadastro/vendedor/list';
$payloadVendedores = ['token' => APP_TOKEN, 'app' => APP_NAME];
$responseVendedores = postApiJson(BASE_URL, $endpointVendedores, $payloadVendedores);
$dadosApiVendedores = json_decode($responseVendedores, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($dadosApiVendedores) && empty($dadosApiVendedores['error'])) {
foreach ($dadosApiVendedores as $vendedor) {
if (isset($vendedor['id']) && isset($vendedor['nome'])) {
$response_data['vendedores'][] = ['id' => $vendedor['id'], 'nome' => $vendedor['nome']];
}
}
if (! empty($response_data['vendedores'])) {
$response_data['success'] = true;
} else {
$response_data['message'] = 'Nenhum vendedor encontrado.';
}
} else {
$response_data['message'] = 'Erro ao carregar vendedores da API.';
error_log("Ajax get_vendedores error (PGSQL): " . $responseVendedores);
}
} catch (\Exception $e) {
$response_data['message'] = 'Erro no servidor ao buscar vendedores.';
error_log("Exceção Ajax get_vendedores (PGSQL): " . $e->getMessage());
}
header('Content-Type: application/json');
echo json_encode($response_data);
exit;
}
// Se ação Ajax não reconhecida
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Ação desconhecida.']);
exit;
}
if (empty($mensagem_erro)) {
// ... (Lógica para buscar planos e vencimentos da API como na versão anterior) ...
$erro_busca_api = false;
try {
// 1. Buscar Planos
$endpointPlanos = '/api/precadastro/plano/list';
$payloadPlanos = ['token' => APP_TOKEN, 'app' => APP_NAME];
$responsePlanos = postApiJson(BASE_URL, $endpointPlanos, $payloadPlanos);
$dadosApiPlanos = json_decode($responsePlanos, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($dadosApiPlanos) && empty($dadosApiPlanos['error'])) {
foreach ($dadosApiPlanos as $plano) {
if (isset($plano['id']) && isset($plano['descricao']) && (! isset($plano['tipo']) || strtolower($plano['tipo']) === 'internet')) {
$lista_planos_disponiveis[] = $plano;
}
}
} else { $erro_busca_api = true;
error_log("Erro API Planos Precadastro (PGSQL): " . $responsePlanos);}
// 2. Buscar Vencimentos
$endpointVenc = '/api/precadastro/vencimento/list';
$payloadVenc = ['token' => APP_TOKEN, 'app' => APP_NAME];
$responseVenc = postApiJson(BASE_URL, $endpointVenc, $payloadVenc);
$dadosApiVenc = json_decode($responseVenc, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($dadosApiVenc) && empty($dadosApiVenc['error'])) {
foreach ($dadosApiVenc as $venc) {
if (isset($venc['id']) && isset($venc['dia'])) {
$lista_vencimentos_disponiveis[] = $venc;
}
}
usort($lista_vencimentos_disponiveis, function ($a, $b) {return ($a['dia'] ?? 99) <=> ($b['dia'] ?? 99);});
} else { $erro_busca_api = true;
error_log("Erro API Vencimentos Precadastro (PGSQL): " . $responseVenc);}
if ($erro_busca_api && empty($mensagem_erro)) {$mensagem_erro .= ($mensagem_erro ? "<br>" : "") . "Aviso: Não foi possível carregar opções de plano/vencimento.";}
} catch (\Exception $e) {
$mensagem_erro .= ($mensagem_erro ? "<br>" : "") . "Erro inesperado ao carregar opções.";
error_log("Exceção ao buscar planos/venc (PGSQL): " . $e->getMessage());
}
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['enviar_precadastro'])) {
// Coleta de Dados (como na versão anterior)
$precisa_Processar = false;
$tipo_pessoa = $_POST['tipo_pessoa'] ?? null;
$nome = trim($_POST['nome'] ?? '');
// ... (restante da coleta de dados)
$cpf_cnpj_input = trim($_POST['cpfcnpj'] ?? '');
$cpf_cnpj = cleanCpfCnpj($cpf_cnpj_input);
$email = filter_var(trim($_POST['email'] ?? ''), FILTER_SANITIZE_EMAIL);
$celular_input = trim($_POST['celular'] ?? '');
$celular = cleanCpfCnpj($celular_input);
$cep_input = trim($_POST['cep'] ?? '');
$cep = cleanCpfCnpj($cep_input);
$logradouro = trim($_POST['logradouro'] ?? '');
$numero = trim($_POST['numero'] ?? '');
$complemento = trim($_POST['complemento'] ?? '');
$bairro = trim($_POST['bairro'] ?? '');
$cidade = trim($_POST['cidade'] ?? '');
$uf = $_POST['uf'] ?? '';
$pontoreferencia = trim($_POST['pontoreferencia'] ?? '');
$tipo_moradia = trim($_POST['tipo_moradia'] ?? '');
$plano_id_selecionado = filter_input(INPUT_POST, 'plano_id', FILTER_VALIDATE_INT);
$vencimento_id_selecionado = filter_input(INPUT_POST, 'vencimento_id', FILTER_VALIDATE_INT);
$vendedor_id_input = $_POST['vendedor_id'] ?? null;
$vendedor_id = (is_numeric($vendedor_id_input)) ? filter_var($vendedor_id_input, FILTER_VALIDATE_INT) : null;
$observacao = trim($_POST['observacao'] ?? '');
$lgpd_aceite = isset($_POST['lgpd_accept']) && $_POST['lgpd_accept'] === 'on';
$ip_origem = $_SERVER['REMOTE_ADDR'] ?? $_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['HTTP_X_FORWARDED'] ?? $_SERVER['HTTP_FORWARDED_FOR'] ?? $_SERVER['HTTP_FORWARDED'] ?? 'N/A';
$rg = ($tipo_pessoa === 'PF') ? trim($_POST['rg'] ?? '') : null;
$rg_emissor = ($tipo_pessoa === 'PF') ? trim($_POST['rg_emissor'] ?? '') : null;
$datanasc = ($tipo_pessoa === 'PF') ? trim($_POST['datanasc'] ?? '') : null;
$nome_fantasia = ($tipo_pessoa === 'PJ') ? trim($_POST['nomefantasia'] ?? '') : null;
$insc_estadual = ($tipo_pessoa === 'PJ') ? trim($_POST['insc_estadual'] ?? '') : null;
$foi_indicado = isset($_POST['foi_indicado']) && $_POST['foi_indicado'] === 'sim';
$indicador_cpfcnpj_input = ($foi_indicado) ? trim($_POST['indicador_cpfcnpj'] ?? '') : null;
$indicador_cpfcnpj = cleanCpfCnpj($indicador_cpfcnpj_input);
// Validação Server-Side (como na versão anterior)
$erros_validacao = [];
// ... (toda a lógica de validação original)
if (empty($tipo_pessoa) || ! in_array($tipo_pessoa, ['PF', 'PJ'])) {$erros_validacao['tipo_pessoa'] = "Tipo Pessoa inválido.";}
if (empty($nome)) {$erros_validacao['nome'] = "Nome/Razão Social obrigatório.";}
if (empty($cpf_cnpj)) {$erros_validacao['cpfcnpj'] = "CPF/CNPJ obrigatório.";} elseif (($tipo_pessoa === 'PF' && strlen($cpf_cnpj) !== 11) || ($tipo_pessoa === 'PJ' && strlen($cpf_cnpj) !== 14)) {$erros_validacao['cpfcnpj'] = "Formato CPF/CNPJ inválido.";}
if (empty($email) || ! filter_var($email, FILTER_VALIDATE_EMAIL)) {$erros_validacao['email'] = "E-mail inválido.";}
if (empty($celular) || strlen($celular) < 10 || strlen($celular) > 11) {$erros_validacao['celular'] = "Celular inválido (10 ou 11 números).";}
if (isset($_POST['cep'])) {
$cep_sanitizado = preg_replace('/[^0-9]/', '', $_POST['cep']);
$_POST['cep'] = $cep_sanitizado;
$form_data['cep'] = $cep_sanitizado;
if (empty($cep_sanitizado) || strlen($cep_sanitizado) != 8) {$erros_validacao['cep'] = 'CEP inválido. Deve conter 8 números.';}
} else { $erros_validacao['cep'] = 'CEP obrigatório.';}
if (empty($logradouro)) {$erros_validacao['logradouro'] = "Logradouro obrigatório.";}
if (empty($numero)) {$erros_validacao['numero'] = "Número obrigatório.";}
if (empty($bairro)) {$erros_validacao['bairro'] = "Bairro obrigatório.";}
if (empty($cidade)) {$erros_validacao['cidade'] = "Cidade obrigatória.";}
if (empty($uf) || strlen($uf) !== 2) {$erros_validacao['uf'] = "UF inválida (2 letras).";}
$opcoes_moradia_validas = array_keys($opcoes_moradia);
if (empty($tipo_moradia) || ! in_array($tipo_moradia, $opcoes_moradia_validas) || $tipo_moradia === '') {$erros_validacao['tipo_moradia'] = "Por favor, selecione uma opção válida para tipo de moradia.";}
if (empty($plano_id_selecionado)) {$erros_validacao['plano_id'] = "Selecione um Plano.";}
if (empty($vencimento_id_selecionado)) {$erros_validacao['vencimento_id'] = "Selecione um Vencimento.";}
$vendedor_selecionado_sim = isset($_POST['vendedor_opcao']) && $_POST['vendedor_opcao'] === 'sim';
if ($vendedor_selecionado_sim && empty($vendedor_id)) {$erros_validacao['vendedor_id'] = "Selecione um vendedor ou marque 'Não'.";}
if (! $lgpd_aceite) {$erros_validacao['lgpd_accept'] = "Aceite os Termos.";}
if ($tipo_pessoa === 'PF') {
if (empty($datanasc)) {$erros_validacao['datanasc'] = "Data Nascimento obrigatória (PF).";} elseif (($dt_obj = DateTime::createFromFormat('Y-m-d', $datanasc)) === false || $dt_obj->format('Y-m-d') !== $datanasc) {$erros_validacao['datanasc'] = "Data Nascimento inválida (AAAA-MM-DD).";}
}
if ($foi_indicado && empty($indicador_cpfcnpj)) {$erros_validacao['indicador_cpfcnpj'] = "Digite o CPF/CNPJ do indicador ou marque 'Não'.";}
if (empty($erros_validacao)) {
$db_insert_id = null;
$api_success = false;
$api_response_msg = '';
$indicador_id_sgp_db = null;
$indicador_nome_db = null;
if ($foi_indicado && ! empty($indicador_cpfcnpj)) {
// ... (Lógica de revalidar indicador como na versão anterior) ...
try {
$endpointConsulta = '/api/ura/consultacliente/';
$dadosConsulta = ['cpfcnpj' => $indicador_cpfcnpj];
$responseIndicador = getAPI(BASE_URL, $endpointConsulta, APP_TOKEN, APP_NAME, $dadosConsulta);
$dadosApiIndicador = json_decode($responseIndicador, true);
if (json_last_error() === JSON_ERROR_NONE && isset($dadosApiIndicador['contratos']) && ! empty($dadosApiIndicador['contratos'])) {
$primeiro_contrato_ind = $dadosApiIndicador['contratos'][0];
$indicador_id_sgp_db = $primeiro_contrato_ind['clienteId'] ?? null;
$indicador_nome_db = $primeiro_contrato_ind['razaoSocial'] ?? null;
} else {error_log("Pré-cadastro (PGSQL): Indicador $indicador_cpfcnpj não encontrado na re-validação SGP.");}
} catch (\Exception $e) {error_log("Erro ao re-validar indicador $indicador_cpfcnpj (PGSQL): " . $e->getMessage());}
}
if ($salvar_no_banco_de_dados) {
if (! $pdo) {
$mensagem_erro = "Erro crítico: Não foi possível conectar ao banco de dados para salvar o pré-cadastro.";
} else {
try {
// ... (Lógica de INSERT no DB como na versão anterior) ...
if (! in_array($tipo_pessoa, ['PF', 'PJ'])) {throw new Exception("Tipo de pessoa inválido");}
$tipo_db = 'precadastro';
$status_proc_db = 'em_analise';
$rg_value = ($tipo_pessoa === 'PF') ? $rg : null;
$rg_em_value = ($tipo_pessoa === 'PF') ? $rg_emissor : null;
$datanasc_value = ($tipo_pessoa === 'PF' && ! empty($datanasc)) ? $datanasc : null;
$nome_fantasia_value = ($tipo_pessoa === 'PJ') ? $nome_fantasia : null;
$insc_estadual_value = ($tipo_pessoa === 'PJ') ? $insc_estadual : null;
$sqlInsert = "INSERT INTO precadastros (tipo, tipo_pessoa, nome, email, celular, cpf_cnpj, cidade, estado, observacao, rg, rg_emissor, data_nascimento, nome_fantasia, insc_estadual, cep, logradouro, numero, complemento, bairro, ponto_referencia, tipo_moradia, status_processamento, ip_origem, plano_id_selecionado, vencimento_id_selecionado, lgpd_aceite, foi_indicado, indicador_cpfcnpj, indicador_id_sgp, indicador_nome, vendedor_id, p_processar) VALUES (:tipo, :t_pes, :nome, :email, :cel, :cpfcnpj, :cid, :estado, :obs, :rg, :rg_em, :dn, :nf, :ie, :cep, :logr, :num, :comp, :bai, :pref, :moradia, :status_proc, :ip, :pid, :vid, :lgpd, :foi_ind, :ind_cpf, :ind_id, :ind_nome, :vend_id, :pprocess)";
$stmtInsert = $pdo->prepare($sqlInsert);
$stmtInsert->bindValue(':tipo', $tipo_db);
$stmtInsert->bindValue(':t_pes', $tipo_pessoa);
$stmtInsert->bindValue(':nome', $nome);
$stmtInsert->bindValue(':email', $email);
$stmtInsert->bindValue(':cel', $celular);
$stmtInsert->bindValue(':cpfcnpj', $cpf_cnpj);
$stmtInsert->bindValue(':cid', $cidade);
$stmtInsert->bindValue(':estado', $uf);
$stmtInsert->bindValue(':obs', $observacao ?: null);
$stmtInsert->bindValue(':rg', $rg_value);
$stmtInsert->bindValue(':rg_em', $rg_em_value);
$stmtInsert->bindValue(':dn', $datanasc_value, PDO::PARAM_STR);
$stmtInsert->bindValue(':nf', $nome_fantasia_value);
$stmtInsert->bindValue(':ie', $insc_estadual_value);
$stmtInsert->bindValue(':cep', $cep);
$stmtInsert->bindValue(':logr', $logradouro);
$stmtInsert->bindValue(':num', $numero);
$stmtInsert->bindValue(':comp', $complemento ?: null);
$stmtInsert->bindValue(':bai', $bairro);
$stmtInsert->bindValue(':pref', $pontoreferencia ?: null);
$stmtInsert->bindValue(':moradia', $tipo_moradia);
$stmtInsert->bindValue(':status_proc', $status_proc_db);
$stmtInsert->bindValue(':ip', $ip_origem);
$stmtInsert->bindValue(':pid', $plano_id_selecionado, PDO::PARAM_INT);
$stmtInsert->bindValue(':vid', $vencimento_id_selecionado, PDO::PARAM_INT);
$stmtInsert->bindValue(':lgpd', $lgpd_aceite, PDO::PARAM_BOOL);
$stmtInsert->bindValue(':foi_ind', $foi_indicado, PDO::PARAM_BOOL);
$stmtInsert->bindValue(':ind_cpf', $indicador_cpfcnpj ?: null);
$stmtInsert->bindValue(':ind_id', $indicador_id_sgp_db, $indicador_id_sgp_db ? PDO::PARAM_INT : PDO::PARAM_NULL);
$stmtInsert->bindValue(':ind_nome', $indicador_nome_db);
$stmtInsert->bindValue(':vend_id', $vendedor_id, $vendedor_id ? PDO::PARAM_INT : PDO::PARAM_NULL);
$stmtInsert->bindValue(':pprocess', false, PDO::PARAM_BOOL);
$stmtInsert->execute();
$db_insert_id = $pdo->lastInsertId('precadastros_id_seq');
} catch (\PDOException $e) {
error_log("Erro DB INSERT pré-cadastro $cpf_cnpj (PGSQL): " . $e->getMessage() . " | SQLState: " . $e->getCode() . " | Query: " . $sqlInsert);
$mensagem_erro = "Erro técnico interno [DBI-" . $e->getCode() . "]. Não foi possível registrar seu pré-cadastro.";
$db_insert_id = null;
}
}
}
$prosseguir_para_api = false;
if ($salvar_no_banco_de_dados) {
if ($db_insert_id !== null && $db_insert_id !== false) {$prosseguir_para_api = true;}
} else { $prosseguir_para_api = true;}
if ($prosseguir_para_api && empty($mensagem_erro)) {
$api_success = false;
$api_response_msg = '';
$precisa_Processar = false;
if ($enviar_para_api_sgp) {
// ... (Lógica de montagem $payloadApi e chamada API como na versão anterior) ...
$endpointApi = ($tipo_pessoa === 'PF') ? '/api/precadastro/F' : '/api/precadastro/J';
$observacao_para_api = "Tipo de Moradia: " . $tipo_moradia . "\n";
$observacao_para_api .= "Indicador CPF/CNPJ: " . ($foi_indicado ? $indicador_cpfcnpj : 'Não informado');
if (! empty($observacao)) {$observacao_para_api .= "\n\nObservações do usuário:\n" . $observacao;}
$payloadApi = ['app' => APP_NAME, /* ... outros campos ... */'observacao' => $observacao_para_api/* ... */];
// Preencher $payloadApi completo como na versão anterior
$payloadApi = ['app' => APP_NAME, 'token' => APP_TOKEN, 'nome' => $nome, 'cpfcnpj' => $cpf_cnpj, 'email' => $email, 'celular' => $celular, 'logradouro' => $logradouro, 'numero' => (int) $numero, 'complemento' => $complemento ?: null, 'bairro' => $bairro, 'cidade' => $cidade, 'cep' => $cep, 'uf' => $uf, 'pais' => 'BR', 'pontoreferencia' => $pontoreferencia ?: null, 'observacao' => $observacao_para_api, 'plano_id' => $plano_id_selecionado, 'vencimento_id' => $vencimento_id_selecionado, 'vendedor_id' => $vendedor_id];
if ($tipo_pessoa === 'PF') {$payloadApi['rg'] = $rg;
$payloadApi['rg_emissor'] = $rg_emissor ?: null;
$payloadApi['datanasc'] = $datanasc ?: null;}
if ($tipo_pessoa === 'PJ') {$payloadApi['nomefantasia'] = $nome_fantasia ?: null;
$payloadApi['insc_estadual'] = $insc_estadual ?: null;}
$payloadApi = array_filter($payloadApi, function ($value) {return $value !== null;});
try {
$responseApi = postApiJson(BASE_URL, $endpointApi, $payloadApi);
$resultadoApi = json_decode($responseApi, true);
$api_response_msg = $responseApi;
if (json_last_error() === JSON_ERROR_NONE && isset($resultadoApi['message']) && stripos($resultadoApi['message'], 'criado com sucesso') !== false) {
$api_success = true;
if ($salvar_no_banco_de_dados && is_numeric($db_insert_id)) {
$precisa_Processar = false;
try {
// ... (Lógica de UPDATE status no DB como na versão anterior) ...
$status_final_db = 'aprovado_api';
$sqlUpdateStatus = "UPDATE precadastros SET status_processamento = :status, resposta_api = :resp, p_processar = :pprocess WHERE id = :id";
$stmtUpdateStatus = $pdo->prepare($sqlUpdateStatus);
$stmtUpdateStatus->bindValue(':status', $status_final_db);
$stmtUpdateStatus->bindValue(':resp', $api_response_msg);
$stmtUpdateStatus->bindValue(':pprocess', $precisa_Processar, PDO::PARAM_BOOL);
$stmtUpdateStatus->bindValue(':id', $db_insert_id, PDO::PARAM_INT);
$stmtUpdateStatus->execute();
} catch (\PDOException $e) {error_log("Erro DB UPDATE status API OK pré-cadastro ID $db_insert_id (PGSQL): " . $e->getMessage());}
}
// MODIFICAÇÃO: Define a mensagem de sucesso na sessão mas NÃO redireciona aqui
$_SESSION['precadastro_success'] = "Pré-cadastro enviado com sucesso! Você será redirecionado em alguns instantes.";
// header("Location: assinar.php"); // REMOVIDO
// exit; // REMOVIDO
// A página irá recarregar e mostrar a mensagem. O JS cuidará do redirect.
} else { // Falha na API SGP
$erro_api_msg = $resultadoApi['message'] ?? ($resultadoApi['msg'] ?? 'Erro desconhecido retornado pela API SGP.');
$mensagem_erro = "Erro ao enviar pré-cadastro ao sistema principal: " . htmlspecialchars($erro_api_msg);
if ($salvar_no_banco_de_dados && is_numeric($db_insert_id)) {$mensagem_erro = "Pré-cadastro salvo localmente, mas " . lcfirst($mensagem_erro);
$precisa_Processar = true;}
error_log("Erro API pré-cadastro $cpf_cnpj ($endpointApi) (PGSQL). Payload: " . json_encode($payloadApi) . ". Resp: " . $responseApi);
}
} catch (\Exception $e) { // Exceção na chamada da API
$mensagem_erro = "Falha na comunicação com o sistema principal.";
if ($salvar_no_banco_de_dados && is_numeric($db_insert_id)) {$mensagem_erro = "Pré-cadastro salvo localmente, mas " . lcfirst($mensagem_erro);
$precisa_Processar = true;}
$api_response_msg = "Erro PHP/cURL: " . $e->getMessage();
error_log("Erro GERAL API pré-cadastro $cpf_cnpj (PGSQL): " . $e->getMessage());
}
} else { // Envio para API SGP DESATIVADO
$api_success = true;
$api_response_msg = "Envio para API SGP desativado nas configurações.";
if ($salvar_no_banco_de_dados && is_numeric($db_insert_id)) {$precisa_Processar = true;}
// MODIFICAÇÃO: Define a mensagem de sucesso na sessão mas NÃO redireciona aqui
$_SESSION['precadastro_success'] = "Pré-cadastro processado (" . ($salvar_no_banco_de_dados && is_numeric($db_insert_id) ? "salvo localmente" : "dados não salvos localmente") . ", envio API SGP desativado). Você será redirecionado em alguns instantes.";
if ($salvar_no_banco_de_dados && is_numeric($db_insert_id)) {
try {
// ... (Lógica de UPDATE status no DB como na versão anterior) ...
$status_final_db = 'pendente_api_desativada';
$sqlUpdateStatus = "UPDATE precadastros SET status_processamento = :status, resposta_api = :resp, p_processar = :pprocess WHERE id = :id";
$stmtUpdateStatus = $pdo->prepare($sqlUpdateStatus);
$stmtUpdateStatus->bindValue(':status', $status_final_db);
$stmtUpdateStatus->bindValue(':resp', $api_response_msg);
$stmtUpdateStatus->bindValue(':pprocess', $precisa_Processar, PDO::PARAM_BOOL);
$stmtUpdateStatus->bindValue(':id', $db_insert_id, PDO::PARAM_INT);
$stmtUpdateStatus->execute();
} catch (\PDOException $e) {error_log("Erro DB UPDATE API desativada pré-cadastro ID $db_insert_id (PGSQL): " . $e->getMessage());}
}
// header("Location: assinar.php"); // REMOVIDO
// exit; // REMOVIDO
}
// Se houve erro na API SGP (e $enviar_para_api_sgp era true), atualiza o DB
if ($salvar_no_banco_de_dados && is_numeric($db_insert_id) && ! $api_success && $enviar_para_api_sgp) {
$precisa_Processar = true;
try {
// ... (Lógica de UPDATE status no DB como na versão anterior) ...
$status_final_db = 'erro_api';
$sqlUpdateStatus = "UPDATE precadastros SET status_processamento = :status, resposta_api = :resp, p_processar = :pprocess WHERE id = :id";
$stmtUpdateStatus = $pdo->prepare($sqlUpdateStatus);
$stmtUpdateStatus->bindValue(':status', $status_final_db);
$stmtUpdateStatus->bindValue(':resp', $api_response_msg);
$stmtUpdateStatus->bindValue(':pprocess', $precisa_Processar, PDO::PARAM_BOOL);
$stmtUpdateStatus->bindValue(':id', $db_insert_id, PDO::PARAM_INT);
$stmtUpdateStatus->execute();
} catch (\PDOException $e) {error_log("Erro DB UPDATE status API ERRO pré-cadastro ID $db_insert_id (PGSQL): " . $e->getMessage());}
}
} elseif ($salvar_no_banco_de_dados && $db_insert_id === null && empty($mensagem_erro)) {
$mensagem_erro = "Falha ao registrar o pré-cadastro no banco de dados.";
}
if (! empty($mensagem_erro)) {
$_SESSION['precadastro_error'] = true; // Se houve algum erro não tratado por redirecionamento de sucesso
} elseif (empty($mensagem_erro) && isset($_SESSION['precadastro_success'])) {
// Se não houve erro E uma mensagem de sucesso foi setada na sessão,
// precisamos recarregar a página para exibir a mensagem de sucesso
// e o script JS cuidar do redirecionamento final.
// O simples fato de não ter header() aqui fará com que o script continue e
// a página seja renderizada com $mensagem_sucesso populada.
}
} else { // Houve erros de validação do formulário
$mensagem_erro_validacao = "Por favor, corrija os campos indicados: " . implode(', ', array_keys($erros_validacao));
$mensagem_erro = ! empty($mensagem_erro) ? $mensagem_erro . "<br>" . $mensagem_erro_validacao : $mensagem_erro_validacao;
$_SESSION['precadastro_error'] = true;
}
} // Fim if POST
// Lê a mensagem de sucesso da sessão (se existir) para exibir na página atual
if (isset($_SESSION['precadastro_success'])) {
$mensagem_sucesso = $_SESSION['precadastro_success'];
unset($_SESSION['precadastro_success']);
$form_data = []; // Limpa dados do formulário para não repopular após sucesso
}
require_once 'includes/header_public.php';
?>
<div class="header-wrapper">
<div class="container">
<h1><i class="fas fa-rocket me-2"></i>Pré-Cadastro</h1>
<p>Preencha o formulário abaixo para solicitar nossos serviços de internet</p>
</div>
</div>
<div class="container">
<div class="form-wrapper animate-fade-in">
<?php if (! empty($mensagem_erro)): ?>
<div class="alert alert-danger">
<i class="fas fa-exclamation-triangle me-2"></i>
<?php echo nl2br(htmlspecialchars($mensagem_erro)); ?>
</div>
<?php endif; ?>
<?php if (! empty($mensagem_sucesso)): ?>
<div class="alert alert-success">
<i class="fas fa-check-circle me-2"></i>
<?php echo htmlspecialchars($mensagem_sucesso); ?>
</div>
<div class="form-section-card text-center">
<h4 class="mb-4">Obrigado pelo seu interesse!</h4>
<p>Seu pré-cadastro foi recebido. Nossa equipe analisará suas informações e entrará em contato em breve.</p>
<div class="final-buttons mt-4">
<a href="assinar2.php" class="btn btn-secondary">
<i class="fas fa-plus-circle me-1"></i> Novo Pré-Cadastro
</a>
<a href="index.php" class="btn btn-primary">
<i class="fas fa-home me-1"></i> Voltar ao Portal
</a>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
setTimeout(function() {
window.location.href = 'assinar.php'; // Redireciona para assinar.php
}, 5000); // Redireciona após 5000 milissegundos = 5 segundos
});
</script>
<?php endif; ?>
<?php if (empty($mensagem_sucesso)): // Só mostra o formulário se não houve mensagem de sucesso ?>
<form id="form-precadastro" method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" novalidate>
<input type="hidden" name="enviar_precadastro" value="1">
<div class="form-section-card">
<legend><i class="fas fa-user-tag me-2"></i>1. Tipo de Cadastro</legend>
<div class="mb-3 <?php echo(! empty($erros_validacao['tipo_pessoa'])) ? 'is-invalid' : ''; ?>">
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="tipo_pessoa" id="tipoPF" value="PF" required <?php echo(isset($form_data['tipo_pessoa']) && $form_data['tipo_pessoa'] == 'PF') ? 'checked' : ''; ?>>
<label class="form-check-label" for="tipoPF">Pessoa Física</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="tipo_pessoa" id="tipoPJ" value="PJ" required <?php echo(isset($form_data['tipo_pessoa']) && $form_data['tipo_pessoa'] == 'PJ') ? 'checked' : ''; ?>>
<label class="form-check-label" for="tipoPJ">Pessoa Jurídica</label>
</div>
<div class="invalid-feedback d-block"><?php echo htmlspecialchars($erros_validacao['tipo_pessoa'] ?? ''); ?></div>
</div>
</div>
<div class="form-section-card">
<legend><i class="fas fa-id-card me-2"></i>2. Dados Pessoais / Empresariais</legend>
<div class="mb-3">
<label for="nome" class="form-label" id="label_nome">Nome Completo / Razão Social <span class="text-danger">*</span></label>
<input type="text" class="form-control <?php echo(! empty($erros_validacao['nome'])) ? 'is-invalid' : ''; ?>" id="nome" name="nome" value="<?php echo htmlspecialchars($form_data['nome'] ?? ''); ?>" required>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['nome'] ?? ''); ?></div>
</div>
<div class="mb-3">
<label for="cpfcnpj" class="form-label" id="label_cpfcnpj">CPF / CNPJ <span class="text-danger">*</span></label>
<input type="text" class="form-control <?php echo(! empty($erros_validacao['cpfcnpj'])) ? 'is-invalid' : ''; ?>" id="cpfcnpj" name="cpfcnpj" value="<?php echo htmlspecialchars($form_data['cpfcnpj'] ?? ''); ?>" required placeholder="Digite apenas números">
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['cpfcnpj'] ?? ''); ?></div>
</div>
<div id="camposPF" class="field-hidden <?php echo(isset($form_data['tipo_pessoa']) && $form_data['tipo_pessoa'] == 'PF') ? 'visible' : ''; ?>">
<div class="row g-3">
<div class="col-md-4 mb-3">
<label for="rg" class="form-label">RG</label>
<input type="text" class="form-control" id="rg" name="rg" value="<?php echo htmlspecialchars($form_data['rg'] ?? ''); ?>">
</div>
<div class="col-md-4 mb-3">
<label for="rg_emissor" class="form-label">Órgão Emissor</label>
<input type="text" class="form-control" id="rg_emissor" name="rg_emissor" placeholder="Ex: SSP/BA" value="<?php echo htmlspecialchars($form_data['rg_emissor'] ?? ''); ?>">
</div>
<div class="col-md-4 mb-3">
<label for="datanasc" class="form-label">Data Nascimento <span class="text-danger">*</span></label>
<input type="date" class="form-control <?php echo(! empty($erros_validacao['datanasc'])) ? 'is-invalid' : ''; ?>" id="datanasc" name="datanasc" value="<?php echo htmlspecialchars($form_data['datanasc'] ?? ''); ?>">
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['datanasc'] ?? ''); ?></div>
</div>
</div>
</div>
<div id="camposPJ" class="field-hidden <?php echo(isset($form_data['tipo_pessoa']) && $form_data['tipo_pessoa'] == 'PJ') ? 'visible' : ''; ?>">
<div class="row g-3">
<div class="col-md-6 mb-3">
<label for="nomefantasia" class="form-label">Nome Fantasia</label>
<input type="text" class="form-control <?php echo(! empty($erros_validacao['nomefantasia'])) ? 'is-invalid' : ''; ?>" id="nomefantasia" name="nomefantasia" value="<?php echo htmlspecialchars($form_data['nomefantasia'] ?? ''); ?>">
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['nomefantasia'] ?? ''); ?></div>
</div>
<div class="col-md-6 mb-3">
<label for="insc_estadual" class="form-label">Inscrição Estadual</label>
<input type="text" class="form-control" id="insc_estadual" name="insc_estadual" value="<?php echo htmlspecialchars($form_data['insc_estadual'] ?? ''); ?>">
</div>
</div>
</div>
</div>
<div class="form-section-card">
<legend><i class="fas fa-phone-alt me-2"></i>3. Contato</legend>
<div class="row g-3">
<div class="col-md-6 mb-3">
<label for="email" class="form-label">E-mail <span class="text-danger">*</span></label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-envelope"></i></span>
<input type="email" class="form-control <?php echo(! empty($erros_validacao['email'])) ? 'is-invalid' : ''; ?>" id="email" name="email" value="<?php echo htmlspecialchars($form_data['email'] ?? ''); ?>" required placeholder="seu@email.com">
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['email'] ?? ''); ?></div>
</div>
</div>
<div class="col-md-6 mb-3">
<label for="celular" class="form-label">Celular/WhatsApp <span class="text-danger">*</span></label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-mobile-alt"></i></span>
<input type="tel" class="form-control <?php echo(! empty($erros_validacao['celular'])) ? 'is-invalid' : ''; ?>" id="celular" name="celular" value="<?php echo htmlspecialchars($form_data['celular'] ?? ''); ?>" required placeholder="(DDD) 9XXXX-XXXX">
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['celular'] ?? ''); ?></div>
</div>
</div>
</div>
</div>
<div class="form-section-card">
<legend><i class="fas fa-map-marker-alt me-2"></i>4. Endereço de Instalação</legend>
<div class="row g-3">
<div class="col-md-4 mb-3">
<label for="cep" class="form-label">CEP <span class="text-danger">*</span></label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-map-pin"></i></span>
<input type="text" class="form-control <?php echo(! empty($erros_validacao['cep'])) ? 'is-invalid' : ''; ?>" id="cep" name="cep" value="<?php echo htmlspecialchars($form_data['cep'] ?? ''); ?>" required placeholder="00000-000" maxlength="9" pattern="[0-9]{5}-?[0-9]{3}">
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['cep'] ?? 'CEP inválido.'); ?></div>
</div>
<div id="cep-loading" class="form-text text-muted" style="display: none; font-size: 0.8em;"><i class="fas fa-spinner fa-spin me-1"></i> Buscando...</div>
<div id="cep-error" class="form-text text-danger" style="display: none; font-size: 0.8em;"><i class="fas fa-exclamation-triangle me-1"></i> CEP não encontrado.</div>
</div>
<div class="col-md-8 mb-3">
<label for="logradouro" class="form-label">Logradouro <span class="text-danger">*</span></label>
<input type="text" class="form-control <?php echo(! empty($erros_validacao['logradouro'])) ? 'is-invalid' : ''; ?>" id="logradouro" name="logradouro" value="<?php echo htmlspecialchars($form_data['logradouro'] ?? ''); ?>" required>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['logradouro'] ?? ''); ?></div>
</div>
<div class="col-md-3 mb-3">
<label for="numero" class="form-label">Número <span class="text-danger">*</span></label>
<input type="text" class="form-control <?php echo(! empty($erros_validacao['numero'])) ? 'is-invalid' : ''; ?>" id="numero" name="numero" value="<?php echo htmlspecialchars($form_data['numero'] ?? ''); ?>" required>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['numero'] ?? ''); ?></div>
</div>
<div class="col-md-4 mb-3">
<label for="complemento" class="form-label">Complemento</label>
<input type="text" class="form-control" id="complemento" name="complemento" value="<?php echo htmlspecialchars($form_data['complemento'] ?? ''); ?>" placeholder="Apto, Bloco, etc.">
</div>
<div class="col-md-5 mb-3">
<label for="bairro" class="form-label">Bairro <span class="text-danger">*</span></label>
<input type="text" class="form-control <?php echo(! empty($erros_validacao['bairro'])) ? 'is-invalid' : ''; ?>" id="bairro" name="bairro" value="<?php echo htmlspecialchars($form_data['bairro'] ?? ''); ?>" required>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['bairro'] ?? ''); ?></div>
</div>
<div class="col-md-8 mb-3">
<label for="cidade" class="form-label">Cidade <span class="text-danger">*</span></label>
<input type="text" class="form-control <?php echo(! empty($erros_validacao['cidade'])) ? 'is-invalid' : ''; ?>" id="cidade" name="cidade" value="<?php echo htmlspecialchars($form_data['cidade'] ?? ''); ?>" required>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['cidade'] ?? ''); ?></div>
</div>
<div class="col-md-4 mb-3">
<label for="uf" class="form-label">UF <span class="text-danger">*</span></label>
<select class="form-select <?php echo(! empty($erros_validacao['uf'])) ? 'is-invalid' : ''; ?>" id="uf" name="uf" required>
<option value="">UF</option>
<?php $ufs = ['AC', 'AL', 'AP', 'AM', 'BA', 'CE', 'DF', 'ES', 'GO', 'MA', 'MT', 'MS', 'MG', 'PA', 'PB', 'PR', 'PE', 'PI', 'RJ', 'RN', 'RS', 'RO', 'RR', 'SC', 'SP', 'SE', 'TO'];
foreach ($ufs as $uf_opt) {
$selected = (isset($form_data['uf']) && $form_data['uf'] == $uf_opt) ? 'selected' : '';
echo "<option value=\"$uf_opt\" $selected>$uf_opt</option>";
}?>
</select>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['uf'] ?? ''); ?></div>
</div>
<div class="col-12 mb-3">
<label for="pontoreferencia" class="form-label">Ponto de Referência</label>
<textarea class="form-control" id="pontoreferencia" name="pontoreferencia" rows="2" placeholder="Ex: Próximo à farmácia, escola, etc."><?php echo htmlspecialchars($form_data['pontoreferencia'] ?? ''); ?></textarea>
</div>
</div>
<div class="mb-3">
<label for="tipo_moradia" class="form-label">Tipo de moradia <span class="text-danger">*</span></label>
<select class="form-select <?php echo(! empty($erros_validacao['tipo_moradia'])) ? 'is-invalid' : ''; ?>" id="tipo_moradia" name="tipo_moradia" required>
<?php
$valor_selecionado_moradia = $form_data['tipo_moradia'] ?? '';
foreach ($opcoes_moradia as $valor => $texto): ?>
<option value="<?php echo htmlspecialchars($valor); ?>"<?php echo($valor_selecionado_moradia === $valor) ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($texto); ?>
</option>
<?php endforeach; ?>
</select>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['tipo_moradia'] ?? ''); ?></div>
</div>
</div>
<div class="form-section-card">
<legend><i class="fas fa-wifi me-2"></i>5. Serviço Desejado</legend>
<div class="row g-3">
<div class="col-md-7 mb-3">
<label for="plano_id" class="form-label">Plano Desejado <span class="text-danger">*</span></label>
<select class="form-select <?php echo(! empty($erros_validacao['plano_id'])) ? 'is-invalid' : ''; ?>" id="plano_id" name="plano_id" required<?php echo empty($lista_planos_disponiveis) ? 'disabled' : ''; ?>>
<option value="">-- <?php echo empty($lista_planos_disponiveis) ? 'Erro ao carregar' : 'Selecione o Plano'; ?> --</option>
<?php foreach ($lista_planos_disponiveis as $plano):
$planoId = $plano['id'] ?? null;
$planoDesc = $plano['descricao'] ?? 'Inválido';
$planoValor = $plano['valor'] ?? null;
if ($planoId && $planoDesc != 'Inválido'):
$textoOpt = htmlspecialchars($planoDesc);
if ($planoValor) {$textoOpt .= " - R$ " . number_format($planoValor, 2, ',', '.');}?>
<option value="<?php echo htmlspecialchars($planoId); ?>"<?php echo(isset($form_data['plano_id']) && $form_data['plano_id'] == $planoId) ? 'selected' : ''; ?>>
<?php echo $textoOpt; ?>
</option>
<?php endif;endforeach; ?>
</select>
<?php if (empty($lista_planos_disponiveis) && empty($mensagem_erro)): ?>
<div class="form-text-custom text-danger"><i class="fas fa-exclamation-circle me-1"></i> Erro ao carregar planos.</div>
<?php endif; ?>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['plano_id'] ?? 'Selecione.'); ?></div>
</div>
<div class="col-md-5 mb-3">
<label for="vencimento_id" class="form-label">Vencimento <span class="text-danger">*</span></label>
<select class="form-select <?php echo(! empty($erros_validacao['vencimento_id'])) ? 'is-invalid' : ''; ?>" id="vencimento_id" name="vencimento_id" required<?php echo empty($lista_vencimentos_disponiveis) ? 'disabled' : ''; ?>>
<option value="">-- <?php echo empty($lista_vencimentos_disponiveis) ? 'Erro ao carregar' : 'Selecione o Dia'; ?> --</option>
<?php foreach ($lista_vencimentos_disponiveis as $venc):
$vencId = $venc['id'] ?? null;
$vencDia = $venc['dia'] ?? '?';
if ($vencId !== null): ?>
<option value="<?php echo htmlspecialchars($vencId); ?>"<?php echo(isset($form_data['vencimento_id']) && $form_data['vencimento_id'] == $vencId) ? 'selected' : ''; ?>>
Dia <?php echo htmlspecialchars($vencDia); ?>
</option>
<?php endif;endforeach; ?>
</select>
<?php if (empty($lista_vencimentos_disponiveis) && empty($mensagem_erro)): ?>
<div class="form-text-custom text-danger"><i class="fas fa-exclamation-circle me-1"></i> Erro ao carregar vencimentos.</div>
<?php endif; ?>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['vencimento_id'] ?? 'Selecione.'); ?></div>
</div>
</div>
</div>
<div class="form-section-card">
<legend><i class="fas fa-user-tie me-2"></i>Vendedor <?php echo htmlspecialchars(defined('NOME_EMPRESA') ? NOME_EMPRESA : 'Empresa'); ?> (Opcional)</legend>
<div class="mb-3">
<label class="form-label">Este cadastro foi auxiliado por um vendedor?</label>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="vendedor_opcao" id="vendedor_sim" value="sim" <?php echo(isset($form_data['vendedor_opcao']) && $form_data['vendedor_opcao'] == 'sim') ? 'checked' : (isset($form_data['vendedor_id']) && is_numeric($form_data['vendedor_id']) ? 'checked' : ''); ?>>
<label class="form-check-label" for="vendedor_sim">Sim</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="vendedor_opcao" id="vendedor_nao" value="nao" <?php echo(! isset($form_data['vendedor_opcao']) || $form_data['vendedor_opcao'] == 'nao' || (isset($form_data['vendedor_opcao']) && $form_data['vendedor_opcao'] == 'sim' && empty($form_data['vendedor_id']))) ? 'checked' : ''; ?>>
<label class="form-check-label" for="vendedor_nao">Não</label>
</div>
</div>
<div id="vendedor-select-div" class="field-hidden <?php echo(isset($form_data['vendedor_opcao']) && $form_data['vendedor_opcao'] == 'sim' && ! empty($form_data['vendedor_id'])) ? 'visible' : ''; ?>">
<div class="mb-3">
<label for="vendedor_id" class="form-label">Selecione o Vendedor: <span class="text-danger">*</span></label>
<select class="form-select <?php echo(! empty($erros_validacao['vendedor_id'])) ? 'is-invalid' : ''; ?>" id="vendedor_id" name="vendedor_id" disabled>
<option value="">-- Carregando Vendedores --</option>
<?php if (isset($form_data['vendedor_id']) && is_numeric($form_data['vendedor_id']) && isset($form_data['vendedor_nome_repopulate'])): ?>
<option value="<?php echo htmlspecialchars($form_data['vendedor_id']); ?>" selected><?php echo htmlspecialchars($form_data['vendedor_nome_repopulate']); ?></option>
<?php endif; ?>
</select>
<div id="vendedor-loading" class="form-text text-muted" style="display: none;"><i class="fas fa-spinner fa-spin me-1"></i> Carregando...</div>
<div id="vendedor-error" class="form-text text-danger" style="display: none;"><i class="fas fa-exclamation-triangle me-1"></i> Erro ao carregar.</div>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['vendedor_id'] ?? 'Selecione o vendedor.'); ?></div>
</div>
</div>
</div>
<div class="form-section-card">
<legend><i class="fas fa-users me-2"></i>Programa de Indicação (Opcional)</legend>
<div class="mb-3">
<label class="form-label">Você foi indicado por algum amigo?</label>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="foi_indicado" id="indicado_sim" value="sim" <?php echo(isset($form_data['foi_indicado']) && $form_data['foi_indicado'] == 'sim') ? 'checked' : ''; ?>>
<label class="form-check-label" for="indicado_sim">Sim</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="foi_indicado" id="indicado_nao" value="nao" <?php echo(! isset($form_data['foi_indicado']) || $form_data['foi_indicado'] == 'nao') ? 'checked' : ''; ?>>
<label class="form-check-label" for="indicado_nao">Não</label>
</div>
</div>
<div id="indicacao-detalhes" class="field-hidden <?php echo(isset($form_data['foi_indicado']) && $form_data['foi_indicado'] == 'sim') ? 'visible' : ''; ?>">
<div class="mb-3">
<label for="indicador_cpfcnpj" class="form-label">Digite o CPF ou CNPJ do amigo que te indicou: <span class="text-danger">*</span></label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-user-friends"></i></span>
<input type="text" class="form-control <?php echo(! empty($erros_validacao['indicador_cpfcnpj'])) ? 'is-invalid' : ''; ?>" id="indicador_cpfcnpj" name="indicador_cpfcnpj" value="<?php echo htmlspecialchars($form_data['indicador_cpfcnpj'] ?? ''); ?>" placeholder="Apenas números do CPF/CNPJ">
<button class="btn btn-outline-secondary" type="button" id="verificar-indicador">Verificar</button>
<div class="invalid-feedback w-100"><?php echo htmlspecialchars($erros_validacao['indicador_cpfcnpj'] ?? ''); ?></div>
</div>
<div id="indicador-feedback" class="form-text mt-1"></div>
</div>
</div>
</div>
<div class="form-section-card">
<legend><i class="fas fa-sticky-note me-2"></i>6. Observações</legend>
<div class="mb-3">
<label for="observacao" class="form-label">Observações Adicionais</label>
<textarea class="form-control <?php echo(! empty($erros_validacao['observacao'])) ? 'is-invalid' : ''; ?>" id="observacao" name="observacao" rows="4" placeholder="Informações sobre a instalação, melhor horário para contato, etc."><?php echo htmlspecialchars($form_data['observacao'] ?? ''); ?></textarea>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['observacao'] ?? ''); ?></div>
</div>
</div>
<div class="form-section-card">
<legend><i class="fas fa-check-circle me-2"></i>7. Finalização</legend>
<div class="form-check mb-3">
<input class="form-check-input <?php echo(! empty($erros_validacao['lgpd_accept'])) ? 'is-invalid' : ''; ?>" type="checkbox" value="on" id="lgpd_accept" name="lgpd_accept" required>
<label class="form-check-label" for="lgpd_accept">
Li e concordo com os
<a href="#" data-bs-toggle="modal" data-bs-target="#modalTermos">Termos de Uso</a>
e a
<a href="#" data-bs-toggle="modal" data-bs-target="#modalPolitica">Política de Privacidade</a>.
<span class="text-danger">*</span>
</label>
<div class="invalid-feedback"><?php echo htmlspecialchars($erros_validacao['lgpd_accept'] ?? 'Aceite obrigatório.'); ?></div>
</div>
<div class="form-group btn-submit-wrapper">
<button type="submit" class="btn btn-primary btn-lg w-100 btn-submit">
<i class="fas fa-paper-plane me-2"></i> Enviar Pré-Cadastro
</button>
</div>
</div>
</form>
<?php endif; ?>
</div>
</div>
<div class="modal fade" id="modalTermos" tabindex="-1" aria-labelledby="modalTermosLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header"><h5 class="modal-title" id="modalTermosLabel">Termos de Uso</h5><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fechar"></button></div>
<div class="modal-body modal-body-legal"><p><strong>TERMOS E CONDIÇÕES GERAIS...</strong></p></div>
<div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fechar</button></div>
</div>
</div>
</div>
<div class="modal fade" id="modalPolitica" tabindex="-1" aria-labelledby="modalPoliticaLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header"><h5 class="modal-title" id="modalPoliticaLabel">Política de Privacidade</h5><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fechar"></button></div>
<div class="modal-body modal-body-legal"><p><strong>POLÍTICA DE PRIVACIDADE...</strong></p></div>
<div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fechar</button></div>
</div>
</div>
</div>
<?php
$pageScripts = <<<'EOT'
<script>
// ... (Todo o JavaScript como na versão anterior) ...
$(document).ready(function() {
// Tipo Pessoa Toggle
$('input[name="tipo_pessoa"]').on('change', function() {
const isPF = $('#tipoPF').is(':checked');
$('#camposPF').toggleClass('visible', isPF).slideToggle(isPF);
$('#camposPJ').toggleClass('visible', !isPF).slideToggle(!isPF);
$('#label_nome').text((isPF ? 'Nome Completo' : 'Razão Social') + ' ' + $('#label_nome').find('span').prop('outerHTML'));
$('#label_cpfcnpj').text((isPF ? 'CPF' : 'CNPJ') + ' ' + $('#label_cpfcnpj').find('span').prop('outerHTML'));
$('#nomefantasia').prop('required', !isPF);
$('#datanasc').prop('required', isPF);
}).trigger('change');
// Vendedor Toggle
const radioVendedorSim = $('#vendedor_sim');
const vendedorDiv = $('#vendedor-select-div');
const vendedorSelect = $('#vendedor_id');
let vendedoresCarregados = false;
function toggleVendedorFields() {
const isSim = radioVendedorSim.is(':checked');
vendedorDiv.toggleClass('visible', isSim).slideToggle(isSim);
vendedorSelect.prop('required', isSim);
if (isSim && !vendedoresCarregados) {
loadVendedores();
} else {
vendedorSelect.prop('disabled', !isSim);
}
if (!isSim) {
vendedorSelect.val('').removeClass('is-invalid');
}
}
function loadVendedores() {
$('#vendedor-loading').show();
$('#vendedor-error').hide();
vendedorSelect.prop('disabled', true).html('<option value="">Carregando...</option>');
$.ajax({
url: $('form').attr('action'), type: 'GET', dataType: 'json', data: { action: 'get_vendedores' },
success: function(response) {
vendedorSelect.empty().append('<option value="">-- Selecione o Vendedor --</option>');
if (response.success && response.vendedores && response.vendedores.length > 0) {
$.each(response.vendedores, function(index, vendedor) {
if (vendedor.id && vendedor.nome) {
var option = $('<option>', { value: vendedor.id, text: vendedor.nome });
<?php if (isset($form_data['vendedor_id']) && is_numeric($form_data['vendedor_id'])) : ?>
if (vendedor.id == <?php echo json_encode($form_data['vendedor_id']); ?>) {
option.prop('selected', true);
}
<?php endif; ?>
vendedorSelect.append(option);
}
});
vendedoresCarregados = true;
} else {
vendedorSelect.html('<option value="">Erro ao carregar</option>');
$('#vendedor-error').text(response.message || 'Não foi possível carregar vendedores.').show();
}
},
error: function() {
vendedorSelect.html('<option value="">Erro de comunicação</option>');
$('#vendedor-error').text('Erro de comunicação. Tente novamente.').show();
},
complete: function() {
$('#vendedor-loading').hide();
if (radioVendedorSim.is(':checked')) {
vendedorSelect.prop('disabled', false);
}
}
});
}
$('input[name="vendedor_opcao"]').on('change', toggleVendedorFields).trigger('change');
// Indicação Toggle
$('input[name="foi_indicado"]').on('change', function() {
const isSim = $('#indicado_sim').is(':checked');
$('#indicacao-detalhes').toggleClass('visible', isSim).slideToggle(isSim);
$('#indicador_cpfcnpj').prop('required', isSim);
if (!isSim) {
$('#indicador_cpfcnpj').removeClass('is-invalid').val('');
$('#indicador-feedback').html('');
}
}).trigger('change');
// Verificar Indicador AJAX
$('#verificar-indicador').on('click', function() {
const cpfcnpj = $('#indicador_cpfcnpj').val().replace(/\D/g, '');
if (cpfcnpj.length < 11) {
$('#indicador-feedback').html('<span class="text-danger"><i class="fas fa-times-circle me-1"></i> CPF/CNPJ inválido.</span>');
return;
}
$('#indicador-feedback').html('<span class="text-muted"><i class="fas fa-spinner fa-spin me-1"></i> Verificando...</span>');
$.ajax({
url: $('form').attr('action'), type: 'GET', dataType: 'json', data: { action: 'verificar_indicador', indicador_cpfcnpj: cpfcnpj },
success: function(response) {
const feedbackClass = response.success ? 'text-success' : 'text-danger';
const iconClass = response.success ? 'fa-check-circle' : 'fa-times-circle';
$('#indicador-feedback').html('<span class="' + feedbackClass + '"><i class="fas ' + iconClass + ' me-1"></i> ' + response.message + '</span>');
},
error: function() {
$('#indicador-feedback').html('<span class="text-danger"><i class="fas fa-exclamation-triangle me-1"></i> Erro. Tente novamente.</span>');
}
});
});
// CEP e Endereço
$('#cep').on('input', function() {
let value = this.value.replace(/\D/g, '');
this.value = value.length > 5 ? value.substring(0, 5) + '-' + value.substring(5, 8) : value;
if (value.length === 8) buscarCep(value);
});
function buscarCep(cep) {
$('#cep-loading').show(); $('#cep-error').hide();
$.getJSON('https://viacep.com.br/ws/' + cep + '/json/', function(data) {
if (!data.erro) {
$('#logradouro').val(data.logradouro); $('#bairro').val(data.bairro);
$('#cidade').val(data.localidade); $('#uf').val(data.uf); $('#numero').focus();
} else { $('#cep-error').show(); }
}).fail(function() { $('#cep-error').show(); }).always(function() { $('#cep-loading').hide(); });
}
// Formatação de Inputs (Celular, CPF/CNPJ)
$('#celular').on('input', function() {
let v = this.value.replace(/\D/g, '');
v = v.substring(0, 11);
if (v.length > 10) v = v.replace(/^(\d{2})(\d{5})(\d{4}).*/, '($1) $2-$3');
else if (v.length > 6) v = v.replace(/^(\d{2})(\d{4})(\d{0,4}).*/, '($1) $2-$3');
else if (v.length > 2) v = v.replace(/^(\d{2})(\d{0,5}).*/, '($1) $2');
this.value = v;
});
$('#cpfcnpj').on('input', function() {
let v = this.value.replace(/\D/g, '');
if ($('#tipoPF').is(':checked')) {
v = v.substring(0, 11);
if (v.length > 9) v = v.replace(/^(\d{3})(\d{3})(\d{3})(\d{2}).*/, '$1.$2.$3-$4');
else if (v.length > 6) v = v.replace(/^(\d{3})(\d{3})(\d{0,3}).*/, '$1.$2.$3');
else if (v.length > 3) v = v.replace(/^(\d{3})(\d{0,3}).*/, '$1.$2');
} else if ($('#tipoPJ').is(':checked')) {
v = v.substring(0, 14);
if (v.length > 12) v = v.replace(/^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2}).*/, '$1.$2.$3/$4-$5');
else if (v.length > 8) v = v.replace(/^(\d{2})(\d{3})(\d{3})(\d{0,4}).*/, '$1.$2.$3/$4');
else if (v.length > 5) v = v.replace(/^(\d{2})(\d{3})(\d{0,3}).*/, '$1.$2.$3');
else if (v.length > 2) v = v.replace(/^(\d{2})(\d{0,3}).*/, '$1.$2');
}
this.value = v;
});
$('form#form-precadastro').on('submit', function() {
$('#cpfcnpj').val($('#cpfcnpj').val().replace(/\D/g, ''));
$('#celular').val($('#celular').val().replace(/\D/g, ''));
$('#cep').val($('#cep').val().replace(/\D/g, ''));
});
});
</script>
EOT;
require_once 'includes/footer_public.php';
?>