ghkkghkhgkhgkgh
ASAsjJjjjjjjJghkghkghkghkghkghkkhgkghkghgkhkghkghkghkghkgh ASAsjJjjjjjjJJjJhkgyjghjghghkghkg iopiopoiiopiopiopiopiopiopiopiopiopiopiopiopiopiopiopiop op[op[op[op[ J J J JJ po[op[op[op[op[op[po[op[op[ JJ J
bypass
/
home
/
onlyfibr
/
public_html
/
assinar
/
Upload FileeE
HOME
<?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'; ?>