One Hat Cyber Team
Your IP :
216.73.216.36
Server IP :
162.240.179.46
Server :
Linux vps-14493116.nutrivittasaude.com.br 5.14.0-611.49.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Apr 21 16:39:08 EDT 2026 x86_64
Server Software :
Apache
PHP Version :
8.2.31
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
home
/
lifeprimeti
/
meta.lifeprimeti.com.br
/
public
/
View File Name :
contas_receber.php
<?php require_once __DIR__ . '/../config/database.php'; requireAdmin(); if (!hasPermissao('financeiro')) { $_SESSION['error_msg'] = 'Acesso negado. Permissao financeiro necessaria.'; header('Location: dashboard.php'); exit; } try { $pdo->exec("ALTER TABLE contas_receber ADD COLUMN IF NOT EXISTS frequencia_id INT DEFAULT NULL, ADD COLUMN IF NOT EXISTS recorrente TINYINT(1) DEFAULT 0, ADD COLUMN IF NOT EXISTS total_vezes INT DEFAULT 1, ADD COLUMN IF NOT EXISTS parcela_atual INT DEFAULT 1, ADD COLUMN IF NOT EXISTS observacoes TEXT DEFAULT NULL, ADD COLUMN IF NOT EXISTS valor_juros DECIMAL(10,2) DEFAULT 0.00, ADD COLUMN IF NOT EXISTS valor_mora DECIMAL(10,2) DEFAULT 0.00"); } catch (PDOException $e) {} $titulo = 'Contas a Receber'; require_once __DIR__ . '/../includes/header.php'; $empresaId = getEmpresaId(); if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['acao'])) { $acao = $_POST['acao']; if ($acao === 'cadastrar') { $descricao = trim($_POST['descricao']); $valor = (float)str_replace(['R$', ' ', '.'], ['', '', ''], str_replace(',', '.', $_POST['valor'])); $cliente_id = !empty($_POST['cliente_id']) ? (int)$_POST['cliente_id'] : null; $forma_pagamento_id = !empty($_POST['forma_pagamento_id']) ? (int)$_POST['forma_pagamento_id'] : null; if (!$forma_pagamento_id) { $_SESSION['error_msg'] = 'Selecione a forma de pagamento.'; redirect('contas_receber.php'); } $data_vencimento = $_POST['data_vencimento']; $data_pagamento = !empty($_POST['data_pagamento']) ? $_POST['data_pagamento'] : null; $frequencia_id = !empty($_POST['frequencia_id']) ? (int)$_POST['frequencia_id'] : null; $recorrente = isset($_POST['recorrente']) ? 1 : 0; $total_vezes = $recorrente ? (int)($_POST['total_vezes'] ?? 1) : 1; $observacoes = trim($_POST['observacoes'] ?? ''); if ($recorrente && $frequencia_id) { $freqStmt = $pdo->prepare("SELECT dias FROM frequencias WHERE id = ? AND empresa_id = ?"); $freqStmt->execute([$frequencia_id, $empresaId]); $freq = $freqStmt->fetch(); $intervaloDias = $freq ? (int)$freq['dias'] : 30; for ($i = 0; $i < $total_vezes; $i++) { $vencimento = date('Y-m-d', strtotime($data_vencimento . " + " . ($i * $intervaloDias) . " days")); $stmt = $pdo->prepare("INSERT INTO contas_receber (empresa_id, descricao, valor_total, cliente_id, forma_pagamento_id, data_vencimento, data_pagamento, frequencia_id, recorrente, total_vezes, parcela_atual, observacoes) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"); $stmt->execute([$empresaId, $descricao, $valor, $cliente_id, $forma_pagamento_id, $vencimento, $data_pagamento, $frequencia_id, $recorrente, $total_vezes, ($i + 1), $observacoes]); } $_SESSION['success_msg'] = $total_vezes . ' parcelas cadastradas!'; } else { $stmt = $pdo->prepare("INSERT INTO contas_receber (empresa_id, descricao, valor_total, cliente_id, forma_pagamento_id, data_vencimento, data_pagamento, frequencia_id, recorrente, total_vezes, parcela_atual, observacoes) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"); $stmt->execute([$empresaId, $descricao, $valor, $cliente_id, $forma_pagamento_id, $data_vencimento, $data_pagamento, $frequencia_id, 0, 1, 1, $observacoes]); $_SESSION['success_msg'] = 'Conta cadastrada!'; } if (!empty($_FILES['anexo']['name']) && $_FILES['anexo']['error'] === UPLOAD_ERR_OK) { $contaId = $pdo->lastInsertId(); if (!$recorrente) { $ext = strtolower(pathinfo($_FILES['anexo']['name'], PATHINFO_EXTENSION)); $nomeArquivo = uniqid('conta_') . '.' . $ext; $destino = __DIR__ . '/../assets/uploads/' . $nomeArquivo; if (move_uploaded_file($_FILES['anexo']['tmp_name'], $destino)) { $pdo->prepare("INSERT INTO anexos (empresa_id, modelo, modelo_id, nome_original, arquivo) VALUES (?, 'contas_receber', ?, ?, ?)")->execute([$empresaId, $contaId, $_FILES['anexo']['name'], 'assets/uploads/' . $nomeArquivo]); } } } redirect('contas_receber.php'); } if ($acao === 'editar') { $id = (int)$_POST['id']; $descricao = trim($_POST['descricao']); $valor = (float)str_replace(['R$', ' ', '.'], ['', '', ''], str_replace(',', '.', $_POST['valor'])); $cliente_id = !empty($_POST['cliente_id']) ? (int)$_POST['cliente_id'] : null; $forma_pagamento_id = !empty($_POST['forma_pagamento_id']) ? (int)$_POST['forma_pagamento_id'] : null; if (!$forma_pagamento_id) { $_SESSION['error_msg'] = 'Selecione a forma de pagamento.'; redirect('contas_receber.php'); } $data_vencimento = $_POST['data_vencimento']; $data_pagamento = !empty($_POST['data_pagamento']) ? $_POST['data_pagamento'] : null; $frequencia_id = !empty($_POST['frequencia_id']) ? (int)$_POST['frequencia_id'] : null; $observacoes = trim($_POST['observacoes'] ?? ''); $pdo->prepare("UPDATE contas_receber SET descricao=?, valor_total=?, cliente_id=?, forma_pagamento_id=?, data_vencimento=?, data_pagamento=?, frequencia_id=?, observacoes=? WHERE id=? AND empresa_id=?")->execute([$descricao, $valor, $cliente_id, $forma_pagamento_id, $data_vencimento, $data_pagamento, $frequencia_id, $observacoes, $id, $empresaId]); if (!empty($_FILES['anexo_edit']['name']) && $_FILES['anexo_edit']['error'] === UPLOAD_ERR_OK) { $ext = strtolower(pathinfo($_FILES['anexo_edit']['name'], PATHINFO_EXTENSION)); $nomeArquivo = uniqid('conta_') . '.' . $ext; $destino = __DIR__ . '/../assets/uploads/' . $nomeArquivo; if (move_uploaded_file($_FILES['anexo_edit']['tmp_name'], $destino)) { $pdo->prepare("INSERT INTO anexos (empresa_id, modelo, modelo_id, nome_original, arquivo) VALUES (?, 'contas_receber', ?, ?, ?)")->execute([$empresaId, $id, $_FILES['anexo_edit']['name'], 'assets/uploads/' . $nomeArquivo]); } } $_SESSION['success_msg'] = 'Conta atualizada!'; redirect('contas_receber.php'); } if ($acao === 'baixar') { $id = (int)$_POST['id']; $data_pagamento = $_POST['data_pagamento'] ?? date('Y-m-d'); $valor_juros = (float)str_replace(['R$', ' ', '.'], ['', '', ''], str_replace(',', '.', $_POST['valor_juros'] ?? '0')); $valor_mora = (float)str_replace(['R$', ' ', '.'], ['', '', ''], str_replace(',', '.', $_POST['valor_mora'] ?? '0')); $conta = $pdo->prepare("SELECT valor_total FROM contas_receber WHERE id=? AND empresa_id=?"); $conta->execute([$id, $empresaId]); $c = $conta->fetch(); $valor_recebido = $c['valor_total'] + $valor_juros + $valor_mora; $pdo->prepare("UPDATE contas_receber SET status='pago', data_pagamento=?, valor_juros=?, valor_mora=?, valor_recebido=? WHERE id=? AND empresa_id=?")->execute([$data_pagamento, $valor_juros, $valor_mora, $valor_recebido, $id, $empresaId]); $_SESSION['success_msg'] = 'Conta baixada como paga!'; redirect('contas_receber.php'); } if ($acao === 'excluir') { $id = (int)$_POST['id']; $anexos = $pdo->prepare("SELECT arquivo FROM anexos WHERE modelo='contas_receber' AND modelo_id=? AND empresa_id=?"); $anexos->execute([$id, $empresaId]); foreach ($anexos as $a) { $arquivo = __DIR__ . '/../' . $a['arquivo']; if (file_exists($arquivo)) unlink($arquivo); } $pdo->prepare("DELETE FROM anexos WHERE modelo='contas_receber' AND modelo_id=? AND empresa_id=?")->execute([$id, $empresaId]); $pdo->prepare("DELETE FROM contas_receber WHERE id=? AND empresa_id=?")->execute([$id, $empresaId]); $_SESSION['success_msg'] = 'Conta excluida!'; redirect('contas_receber.php'); } if ($acao === 'excluir_anexo') { $anexoId = (int)$_POST['anexo_id']; $anexo = $pdo->prepare("SELECT arquivo FROM anexos WHERE id=? AND empresa_id=?"); $anexo->execute([$anexoId, $empresaId]); $a = $anexo->fetch(); if ($a) { $arquivo = __DIR__ . '/../' . $a['arquivo']; if (file_exists($arquivo)) unlink($arquivo); $pdo->prepare("DELETE FROM anexos WHERE id=? AND empresa_id=?")->execute([$anexoId, $empresaId]); } $_SESSION['success_msg'] = 'Anexo excluido!'; redirect('contas_receber.php'); } } $formasPagamento = $pdo->prepare("SELECT * FROM formas_pagamento WHERE empresa_id=? AND ativo=1 ORDER BY nome"); $formasPagamento->execute([$empresaId]); $formasPagamento = $formasPagamento->fetchAll(); $frequencias = $pdo->prepare("SELECT * FROM frequencias WHERE empresa_id=? AND ativo=1 ORDER BY nome"); $frequencias->execute([$empresaId]); $frequencias = $frequencias->fetchAll(); $statusFiltro = $_GET['status'] ?? ''; $sql = "SELECT cr.*, u.nome as cliente_nome, u.email as cliente_email, u.telefone as cliente_telefone, fp.nome as forma_pagamento_nome, f.nome as frequencia_nome FROM contas_receber cr LEFT JOIN usuarios u ON cr.cliente_id = u.id LEFT JOIN formas_pagamento fp ON cr.forma_pagamento_id = fp.id LEFT JOIN frequencias f ON cr.frequencia_id = f.id WHERE cr.empresa_id=?"; $params = [$empresaId]; if ($statusFiltro) { $sql .= " AND cr.status=?"; $params[] = $statusFiltro; } $sql .= " ORDER BY cr.data_vencimento ASC"; $contas = $pdo->prepare($sql); $contas->execute($params); $lista = $contas->fetchAll(); $totalPendente = 0; $totalPago = 0; $totalParcial = 0; foreach ($lista as $c) { if ($c['status'] === 'pago') $totalPago += $c['valor_recebido'] ?? $c['valor_total']; elseif ($c['status'] === 'parcial') $totalParcial += $c['valor_recebido'] ?? $c['valor_total']; else $totalPendente += $c['valor_total']; } ?> <div class="card animate-fadeIn mb-4"> <div class="card-header d-flex align-items-center justify-content-between flex-wrap gap-2"> <h3 class="card-title mb-0"><i class="bi bi-arrow-down-circle me-2 text-success"></i>Contas a Receber</h3> <div class="d-flex align-items-center gap-2"> <span class="text-secondary small">Pendente: <span class="fw-bold text-warning"><?= formatarMoeda($totalPendente) ?></span></span> <span class="text-secondary small">| Parcial: <span class="fw-bold text-info"><?= formatarMoeda($totalParcial) ?></span></span> <span class="text-secondary small">| Pago: <span class="fw-bold text-success"><?= formatarMoeda($totalPago) ?></span></span> <button class="btn btn-primary btn-sm" onclick="abrirModal('modalCadastrar')"><i class="bi bi-plus"></i> Nova Conta</button> </div> </div> <div class="card-body border-bottom"> <form method="GET" class="row g-2 align-items-end"> <div class="col-auto"> <label class="form-label small mb-1">Status</label> <select name="status" class="form-select form-select-sm" onchange="this.form.submit()"> <option value="">Todas</option> <option value="pendente" <?= $statusFiltro === 'pendente' ? 'selected' : '' ?>>Pendente</option> <option value="parcial" <?= $statusFiltro === 'parcial' ? 'selected' : '' ?>>Parcial</option> <option value="pago" <?= $statusFiltro === 'pago' ? 'selected' : '' ?>>Pago</option> <option value="cancelado" <?= $statusFiltro === 'cancelado' ? 'selected' : '' ?>>Cancelado</option> </select> </div> </form> </div> <div class="card-body p-0"> <div class="table-responsive"> <table class="table"> <thead><tr><th>Descricao</th><th>Cliente</th><th>Valor</th><th>Forma Pagamento</th><th>Vencimento</th><th>Status</th><th>Acoes</th></tr></thead> <tbody> <?php if (empty($lista)): ?> <tr><td colspan="7" class="text-center py-4 text-secondary">Nenhuma conta encontrada</td></tr> <?php endif; ?> <?php foreach ($lista as $c): ?> <tr> <td class="fw-semibold"><?= sanitize($c['descricao']) ?></td> <td><?= sanitize($c['cliente_nome'] ?? '-') ?></td> <td class="fw-semibold"><?= formatarMoeda($c['valor_total']) ?></td> <td><?= sanitize($c['forma_pagamento_nome'] ?? '-') ?></td> <td><?= formatarData($c['data_vencimento']) ?></td> <td><?php $stCores = ['pendente' => 'warning', 'parcial' => 'info', 'pago' => 'success', 'cancelado' => 'danger']; ?><span class="badge bg-<?= $stCores[$c['status']] ?> bg-opacity-10 text-<?= $stCores[$c['status']] ?> border border-<?= $stCores[$c['status']] ?> border-opacity-25"><?= ucfirst($c['status']) ?></span></td> <td> <div class="btn-group btn-group-sm"> <button class="btn btn-info" onclick="abrirModal('modalMostrar<?= $c['id'] ?>')" title="Mostrar"><i class="bi bi-eye"></i></button> <button class="btn btn-warning" onclick="abrirModal('modalEditar<?= $c['id'] ?>')" title="Editar"><i class="bi bi-pencil"></i></button> <?php if ($c['status'] === 'pendente' || $c['status'] === 'parcial'): ?> <button class="btn btn-success" onclick="abrirModal('modalBaixar<?= $c['id'] ?>')" title="Dar Baixa"><i class="bi bi-check-lg"></i></button> <?php endif; ?> <button class="btn btn-secondary" onclick="abrirModal('modalAnexos<?= $c['id'] ?>')" title="Anexos"><i class="bi bi-paperclip"></i></button> <form method="POST" style="display:inline" onsubmit="return confirm('Excluir esta conta?')"> <input type="hidden" name="acao" value="excluir"><input type="hidden" name="id" value="<?= $c['id'] ?>"> <button class="btn btn-danger" title="Excluir"><i class="bi bi-trash"></i></button> </form> </div> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> </div> <div class="modal fade" id="modalCadastrar" tabindex="-1"><div class="modal-dialog modal-lg modal-dialog-centered"> <form method="POST" enctype="multipart/form-data" class="modal-content"> <div class="modal-header"><h5 class="modal-title"><i class="bi bi-plus-circle me-2 text-success"></i>Nova Conta a Receber</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div> <div class="modal-body"> <input type="hidden" name="acao" value="cadastrar"> <div class="mb-3"><label class="form-label">Descricao</label><input type="text" name="descricao" class="form-control" required placeholder="Ex: Servico, Venda, Mensalidade..."></div> <div class="mb-3"> <label class="form-label">Buscar Cliente</label> <input type="text" class="form-control busca-cliente" data-target="cliente_id_cad" data-container="resultadosClienteCad" placeholder="Digite 3+ caracteres para buscar..."> <input type="hidden" name="cliente_id" id="cliente_id_cad" value=""> <div id="resultadosClienteCad" class="list-group mt-1" style="max-height:200px;overflow-y:auto;display:none;position:absolute;z-index:1050;width:90%"></div> </div> <div class="row g-3 mb-3"> <div class="col-md-6"> <label class="form-label">Valor R$</label> <input type="text" name="valor" class="form-control mascara-valor" required placeholder="R$ 0,00"> </div> <div class="col-md-6"> <label class="form-label">Forma de Pagamento</label> <select name="forma_pagamento_id" class="form-select" required> <option value="">Selecione</option> <?php foreach ($formasPagamento as $fp): ?> <option value="<?= $fp['id'] ?>"><?= sanitize($fp['nome']) ?></option> <?php endforeach; ?> </select> </div> </div> <div class="row g-3 mb-3"> <div class="col-md-6"> <label class="form-label">Data Vencimento</label> <input type="date" name="data_vencimento" class="form-control" required> </div> <div class="col-md-6"> <label class="form-label">Pago em</label> <input type="date" name="data_pagamento" class="form-control"> </div> </div> <div class="row g-3 mb-3"> <div class="col-md-6"> <label class="form-label">Frequencia</label> <select name="frequencia_id" class="form-select"> <option value="">Nao se aplica</option> <?php foreach ($frequencias as $f): ?> <option value="<?= $f['id'] ?>"><?= sanitize($f['nome']) ?> (<?= $f['dias'] ?> dias)</option> <?php endforeach; ?> </select> </div> <div class="col-md-6 d-flex align-items-end"> <div class="form-check mb-2"> <input type="checkbox" name="recorrente" class="form-check-input" id="recorrenteCad" onchange="toggleRecorrenteCad()"> <label class="form-check-label" for="recorrenteCad">Recorrente</label> </div> </div> </div> <div id="totalVezesGroupCad" style="display:none" class="mb-3"> <label class="form-label">Total de Vezes (parcelas)</label> <input type="number" name="total_vezes" class="form-control" min="1" value="1"> </div> <div class="mb-3"> <label class="form-label">Observacoes</label> <textarea name="observacoes" class="form-control" rows="2"></textarea> </div> <div class="mb-3"> <label class="form-label">Anexar arquivo</label> <input type="file" name="anexo" class="form-control"> </div> </div> <div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button><button type="submit" class="btn btn-primary">Salvar</button></div> </form> </div></div> <?php foreach ($lista as $c): ?> <div class="modal fade" id="modalMostrar<?= $c['id'] ?>" tabindex="-1"><div class="modal-dialog modal-lg modal-dialog-centered"> <div class="modal-content"><div class="modal-header"><h5 class="modal-title"><i class="bi bi-eye me-2 text-info"></i><?= sanitize($c['descricao']) ?></h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div> <div class="modal-body"> <dl class="row mb-0"> <dt class="col-sm-4">Descricao</dt> <dd class="col-sm-8"><?= sanitize($c['descricao']) ?></dd> <dt class="col-sm-4">Cliente</dt> <dd class="col-sm-8"><?= sanitize($c['cliente_nome'] ?? '-') ?></dd> <dt class="col-sm-4">Valor</dt> <dd class="col-sm-8 fw-bold"><?= formatarMoeda($c['valor_total']) ?></dd> <dt class="col-sm-4">Forma Pagamento</dt> <dd class="col-sm-8"><?= sanitize($c['forma_pagamento_nome'] ?? '-') ?></dd> <dt class="col-sm-4">Data Vencimento</dt> <dd class="col-sm-8"><?= formatarData($c['data_vencimento']) ?></dd> <dt class="col-sm-4">Data Pagamento</dt> <dd class="col-sm-8"><?= $c['data_pagamento'] ? formatarData($c['data_pagamento']) : '-' ?></dd> <dt class="col-sm-4">Frequencia</dt> <dd class="col-sm-8"><?= sanitize($c['frequencia_nome'] ?? '-') ?></dd> <?php if ($c['recorrente']): ?> <dt class="col-sm-4">Parcelas</dt> <dd class="col-sm-8"><?= $c['parcela_atual'] ?> de <?= $c['total_vezes'] ?></dd> <?php endif; ?> <dt class="col-sm-4">Status</dt> <dd class="col-sm-8"><?php $stCores = ['pendente' => 'warning', 'parcial' => 'info', 'pago' => 'success', 'cancelado' => 'danger']; ?><span class="badge bg-<?= $stCores[$c['status']] ?> bg-opacity-10 text-<?= $stCores[$c['status']] ?>"><?= ucfirst($c['status']) ?></span></dd> <?php if ($c['valor_juros'] > 0): ?> <dt class="col-sm-4">Juros</dt> <dd class="col-sm-8"><?= formatarMoeda($c['valor_juros']) ?></dd> <?php endif; ?> <?php if ($c['valor_mora'] > 0): ?> <dt class="col-sm-4">Mora</dt> <dd class="col-sm-8"><?= formatarMoeda($c['valor_mora']) ?></dd> <?php endif; ?> <?php if ($c['valor_recebido'] > 0): ?> <dt class="col-sm-4">Valor Recebido</dt> <dd class="col-sm-8 fw-bold"><?= formatarMoeda($c['valor_recebido']) ?></dd> <?php endif; ?> <?php if ($c['observacoes']): ?> <dt class="col-sm-4">Observacoes</dt> <dd class="col-sm-8"><?= nl2br(sanitize($c['observacoes'])) ?></dd> <?php endif; ?> </dl> </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="modalEditar<?= $c['id'] ?>" tabindex="-1"><div class="modal-dialog modal-lg modal-dialog-centered"> <form method="POST" enctype="multipart/form-data" class="modal-content"> <div class="modal-header"><h5 class="modal-title"><i class="bi bi-pencil-square me-2 text-warning"></i>Editar <?= sanitize($c['descricao']) ?></h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div> <div class="modal-body"> <input type="hidden" name="acao" value="editar"><input type="hidden" name="id" value="<?= $c['id'] ?>"> <div class="mb-3"><label class="form-label">Descricao</label><input type="text" name="descricao" class="form-control" required value="<?= sanitize($c['descricao']) ?>"></div> <div class="mb-3"> <label class="form-label">Buscar Cliente</label> <input type="text" class="form-control busca-cliente" data-target="cliente_id_edit_<?= $c['id'] ?>" data-container="resultadosClienteEdit<?= $c['id'] ?>" placeholder="Digite 3+ caracteres..." value="<?= sanitize($c['cliente_nome'] ?? '') ?>"> <input type="hidden" name="cliente_id" id="cliente_id_edit_<?= $c['id'] ?>" value="<?= $c['cliente_id'] ?>"> <div id="resultadosClienteEdit<?= $c['id'] ?>" class="list-group mt-1" style="max-height:200px;overflow-y:auto;display:none;position:absolute;z-index:1050;width:90%"></div> </div> <div class="row g-3 mb-3"> <div class="col-md-6"> <label class="form-label">Valor R$</label> <input type="text" name="valor" class="form-control mascara-valor" required value="<?= number_format($c['valor_total'], 2, ',', '.') ?>"> </div> <div class="col-md-6"> <label class="form-label">Forma de Pagamento</label> <select name="forma_pagamento_id" class="form-select" required> <option value="">Selecione</option> <?php foreach ($formasPagamento as $fp): ?> <option value="<?= $fp['id'] ?>" <?= $c['forma_pagamento_id'] == $fp['id'] ? 'selected' : '' ?>><?= sanitize($fp['nome']) ?></option> <?php endforeach; ?> </select> </div> </div> <div class="row g-3 mb-3"> <div class="col-md-6"> <label class="form-label">Data Vencimento</label> <input type="date" name="data_vencimento" class="form-control" required value="<?= $c['data_vencimento'] ?>"> </div> <div class="col-md-6"> <label class="form-label">Pago em</label> <input type="date" name="data_pagamento" class="form-control" value="<?= $c['data_pagamento'] ?? '' ?>"> </div> </div> <div class="row g-3 mb-3"> <div class="col-md-6"> <label class="form-label">Frequencia</label> <select name="frequencia_id" class="form-select"> <option value="">Nao se aplica</option> <?php foreach ($frequencias as $f): ?> <option value="<?= $f['id'] ?>" <?= $c['frequencia_id'] == $f['id'] ? 'selected' : '' ?>><?= sanitize($f['nome']) ?> (<?= $f['dias'] ?> dias)</option> <?php endforeach; ?> </select> </div> </div> <div class="mb-3"> <label class="form-label">Observacoes</label> <textarea name="observacoes" class="form-control" rows="2"><?= sanitize($c['observacoes']) ?></textarea> </div> <div class="mb-3"> <label class="form-label">Anexar arquivo (adicional)</label> <input type="file" name="anexo_edit" class="form-control"> </div> </div> <div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button><button type="submit" class="btn btn-primary">Atualizar</button></div> </form> </div></div> <div class="modal fade" id="modalBaixar<?= $c['id'] ?>" tabindex="-1"><div class="modal-dialog modal-dialog-centered"> <form method="POST" class="modal-content" onsubmit="return calcularValorFinalBaixa(<?= $c['id'] ?>)"> <div class="modal-header"><h5 class="modal-title"><i class="bi bi-check-circle me-2 text-success"></i>Dar Baixa</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div> <div class="modal-body"> <input type="hidden" name="acao" value="baixar"><input type="hidden" name="id" value="<?= $c['id'] ?>"> <p class="mb-1">Conta: <strong><?= sanitize($c['descricao']) ?></strong></p> <p class="mb-1">Valor Original: <strong class="glow-text"><?= formatarMoeda($c['valor_total']) ?></strong></p> <div class="mb-3"><label class="form-label">Data do Pagamento</label><input type="date" name="data_pagamento" class="form-control" value="<?= date('Y-m-d') ?>" required></div> <div class="row g-3 mb-3"> <div class="col-md-6"> <label class="form-label">Valor Juros</label> <input type="text" name="valor_juros" class="form-control mascara-valor" value="R$ 0,00" oninput="atualizarValorFinalBaixa(<?= $c['id'] ?>, <?= $c['valor_total'] ?>)"> </div> <div class="col-md-6"> <label class="form-label">Valor Mora</label> <input type="text" name="valor_mora" class="form-control mascara-valor" value="R$ 0,00" oninput="atualizarValorFinalBaixa(<?= $c['id'] ?>, <?= $c['valor_total'] ?>)"> </div> </div> <div class="alert alert-info mb-0 py-2"> <strong>Valor Final: <span id="valorFinalBaixa<?= $c['id'] ?>"><?= formatarMoeda($c['valor_total']) ?></span></strong> </div> </div> <div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button><button type="submit" class="btn btn-success"><i class="bi bi-check-lg me-1"></i>Confirmar Baixa</button></div> </form> </div></div> <div class="modal fade" id="modalAnexos<?= $c['id'] ?>" tabindex="-1"><div class="modal-dialog modal-dialog-centered"> <div class="modal-content"><div class="modal-header"><h5 class="modal-title"><i class="bi bi-paperclip me-2 text-secondary"></i>Anexos - <?= sanitize($c['descricao']) ?></h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div> <div class="modal-body"> <?php $anexosStmt = $pdo->prepare("SELECT * FROM anexos WHERE modelo='contas_receber' AND modelo_id=? AND empresa_id=? ORDER BY created_at DESC"); $anexosStmt->execute([$c['id'], $empresaId]); $anexosLista = $anexosStmt->fetchAll(); ?> <?php if (empty($anexosLista)): ?> <p class="text-secondary text-center py-3 mb-0">Nenhum anexo para esta conta.</p> <?php else: ?> <ul class="list-group mb-3"> <?php foreach ($anexosLista as $anx): ?> <li class="list-group-item d-flex justify-content-between align-items-center"> <a href="<?= URL_BASE . $anx['arquivo'] ?>" target="_blank" class="text-decoration-none"> <i class="bi bi-file-earmark me-2"></i><?= sanitize($anx['nome_original']) ?> </a> <form method="POST" style="display:inline" onsubmit="return confirm('Excluir anexo?')"> <input type="hidden" name="acao" value="excluir_anexo"><input type="hidden" name="anexo_id" value="<?= $anx['id'] ?>"> <button class="btn btn-danger btn-sm"><i class="bi bi-trash"></i></button> </form> </li> <?php endforeach; ?> </ul> <?php endif; ?> <form method="POST" enctype="multipart/form-data"> <input type="hidden" name="acao" value="editar"><input type="hidden" name="id" value="<?= $c['id'] ?>"> <div class="input-group"> <input type="file" name="anexo_edit" class="form-control"> <button class="btn btn-primary" type="submit"><i class="bi bi-upload me-1"></i>Upload</button> </div> </form> </div> <div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fechar</button></div> </div> </div></div> <?php endforeach; ?> <?php $extraJs = <<<'JS' <script> function toggleRecorrenteCad() { document.getElementById('totalVezesGroupCad').style.display = document.getElementById('recorrenteCad').checked ? 'block' : 'none'; } function mascaraValor(input) { var v = input.value.replace(/\D/g, ''); if (v === '') { input.value = ''; return; } var inteiro = v.slice(0, -2); var decimal = v.slice(-2); if (inteiro === '') inteiro = '0'; inteiro = parseInt(inteiro).toString(); inteiro = inteiro.replace(/\B(?=(\d{3})+(?!\d))/g, '.'); input.value = 'R$ ' + inteiro + ',' + decimal; } function parseValor(str) { var cleaned = str.replace(/[R$\s.]/g, '').replace(',', '.'); return parseFloat(cleaned) || 0; } function atualizarValorFinalBaixa(id, valorOriginal) { var juros = parseValor(document.querySelector('#modalBaixar' + id + ' input[name="valor_juros"]').value); var mora = parseValor(document.querySelector('#modalBaixar' + id + ' input[name="valor_mora"]').value); var total = valorOriginal + juros + mora; document.getElementById('valorFinalBaixa' + id).textContent = 'R$ ' + total.toFixed(2).replace('.', ','); } function calcularValorFinalBaixa(id) { return true; } document.addEventListener('DOMContentLoaded', function() { document.querySelectorAll('.mascara-valor').forEach(function(el) { el.addEventListener('input', function(e) { mascaraValor(e.target); }); el.addEventListener('focus', function(e) { if (!e.target.value) e.target.value = 'R$ 0,00'; e.target.select(); }); }); function setupBuscaClientes() { var timers = {}; document.querySelectorAll('.busca-cliente').forEach(function(input) { var container = document.getElementById(input.getAttribute('data-container')); var target = document.getElementById(input.getAttribute('data-target')); if (!container || !target) return; input.addEventListener('input', function() { var q = this.value; var containerId = this.getAttribute('data-container'); if (timers[containerId]) clearTimeout(timers[containerId]); if (q.length < 3) { container.style.display = 'none'; container.innerHTML = ''; target.value = ''; return; } timers[containerId] = setTimeout(function() { fetch('../api/busca_clientes.php?q=' + encodeURIComponent(q) + '&empresa_id=<?= $empresaId ?>') .then(function(r) { return r.json(); }) .then(function(data) { container.innerHTML = ''; if (data.length === 0) { container.style.display = 'none'; return; } data.forEach(function(item) { var a = document.createElement('a'); a.className = 'list-group-item list-group-item-action py-1 small'; a.textContent = item.nome + (item.email ? ' (' + item.email + ')' : ''); a.href = '#'; a.addEventListener('click', function(e) { e.preventDefault(); input.value = item.nome + (item.email ? ' (' + item.email + ')' : ''); target.value = item.id; container.style.display = 'none'; container.innerHTML = ''; }); container.appendChild(a); }); container.style.display = 'block'; }); }, 300); }); document.addEventListener('click', function(e) { if (!container.contains(e.target) && e.target !== input) { container.style.display = 'none'; } }); }); } setupBuscaClientes(); }); </script> JS; require_once __DIR__ . '/../includes/footer.php'; ?>