fix: atualiza versão do Pillow para 9.5.0 para resolver problemas de compatibilidade
This commit is contained in:
26
docs/rbac.md
26
docs/rbac.md
@@ -109,22 +109,26 @@ CREATE TABLE user_roles (
|
|||||||
- `manage_cell_members`: Gerenciar membros da célula
|
- `manage_cell_members`: Gerenciar membros da célula
|
||||||
- `create_cell_member`: Criar novos membros na célula
|
- `create_cell_member`: Criar novos membros na célula
|
||||||
- `view_cell_reports`: Visualizar relatórios da célula
|
- `view_cell_reports`: Visualizar relatórios da célula
|
||||||
|
- `REGISTER_CELL_RECEIPT`: Registrar comprovantes da célula
|
||||||
|
|
||||||
### Permissões de Setor
|
### Permissões de Setor
|
||||||
- `manage_sector_cells`: Gerenciar células do setor
|
- `manage_sector_cells`: Gerenciar células do setor
|
||||||
- `create_sector_cell`: Criar novas células no setor
|
- `create_sector_cell`: Criar novas células no setor
|
||||||
- `view_sector_reports`: Visualizar relatórios do setor
|
- `view_sector_reports`: Visualizar relatórios do setor
|
||||||
|
- `REGISTER_SECTOR_RECEIPT`: Registrar comprovantes do setor
|
||||||
|
|
||||||
### Permissões de CR
|
### Permissões de CR
|
||||||
- `manage_cr_sectors`: Gerenciar setores do CR
|
- `manage_cr_sectors`: Gerenciar setores do CR
|
||||||
- `create_cr_sector`: Criar novos setores no CR
|
- `create_cr_sector`: Criar novos setores no CR
|
||||||
- `view_cr_reports`: Visualizar relatórios do CR
|
- `view_cr_reports`: Visualizar relatórios do CR
|
||||||
|
- `REGISTER_CR_RECEIPT`: Registrar comprovantes do CR
|
||||||
|
|
||||||
### Permissões de CC
|
### Permissões de CC
|
||||||
- `manage_cc_crs`: Gerenciar CRs
|
- `manage_cc_crs`: Gerenciar CRs
|
||||||
- `create_cc_cr`: Criar novos CRs
|
- `create_cc_cr`: Criar novos CRs
|
||||||
- `view_cc_reports`: Visualizar relatórios nacionais
|
- `view_cc_reports`: Visualizar relatórios nacionais
|
||||||
- `system_config`: Configurar o sistema
|
- `system_config`: Configurar o sistema
|
||||||
|
- `REGISTER_CC_RECEIPT`: Registrar comprovantes do CC
|
||||||
|
|
||||||
## Uso no Código
|
## Uso no Código
|
||||||
|
|
||||||
@@ -166,12 +170,12 @@ O sistema possui uma estrutura hierárquica com os seguintes níveis:
|
|||||||
- `MANAGE_CELL_MEMBERS`: Gerenciar membros da célula
|
- `MANAGE_CELL_MEMBERS`: Gerenciar membros da célula
|
||||||
- `VIEW_CELL_DATA`: Visualizar dados da célula
|
- `VIEW_CELL_DATA`: Visualizar dados da célula
|
||||||
- `VIEW_CELL_REPORTS`: Visualizar relatórios da célula
|
- `VIEW_CELL_REPORTS`: Visualizar relatórios da célula
|
||||||
- `REGISTER_CELL_PAYMENT`: Registrar pagamentos da célula
|
- `REGISTER_CELL_RECEIPT`: Registrar comprovantes da célula
|
||||||
|
|
||||||
- **Tesoureiro(a)**:
|
- **Tesoureiro(a)**:
|
||||||
- `VIEW_CELL_DATA`: Visualizar dados da célula
|
- `VIEW_CELL_DATA`: Visualizar dados da célula
|
||||||
- `VIEW_CELL_REPORTS`: Visualizar relatórios da célula
|
- `VIEW_CELL_REPORTS`: Visualizar relatórios da célula
|
||||||
- `REGISTER_CELL_PAYMENT`: Registrar pagamentos da célula
|
- `REGISTER_CELL_RECEIPT`: Registrar comprovantes da célula
|
||||||
|
|
||||||
- **Militante**:
|
- **Militante**:
|
||||||
- `VIEW_OWN_DATA`: Visualizar apenas seus próprios dados
|
- `VIEW_OWN_DATA`: Visualizar apenas seus próprios dados
|
||||||
@@ -180,32 +184,32 @@ O sistema possui uma estrutura hierárquica com os seguintes níveis:
|
|||||||
- **Secretário(a)**:
|
- **Secretário(a)**:
|
||||||
- `MANAGE_SECTOR_CELLS`: Gerenciar células do setor
|
- `MANAGE_SECTOR_CELLS`: Gerenciar células do setor
|
||||||
- `VIEW_SECTOR_REPORTS`: Visualizar relatórios do setor
|
- `VIEW_SECTOR_REPORTS`: Visualizar relatórios do setor
|
||||||
- `REGISTER_SECTOR_PAYMENT`: Registrar pagamentos do setor
|
- `REGISTER_SECTOR_RECEIPT`: Registrar comprovantes do setor
|
||||||
|
|
||||||
- **Tesoureiro(a)**:
|
- **Tesoureiro(a)**:
|
||||||
- `VIEW_SECTOR_REPORTS`: Visualizar relatórios do setor
|
- `VIEW_SECTOR_REPORTS`: Visualizar relatórios do setor
|
||||||
- `REGISTER_SECTOR_PAYMENT`: Registrar pagamentos do setor
|
- `REGISTER_SECTOR_RECEIPT`: Registrar comprovantes do setor
|
||||||
|
|
||||||
### CR
|
### CR
|
||||||
- **Secretário(a)**:
|
- **Secretário(a)**:
|
||||||
- `MANAGE_CR_SECTORS`: Gerenciar setores do CR
|
- `MANAGE_CR_SECTORS`: Gerenciar setores do CR
|
||||||
- `VIEW_CR_REPORTS`: Visualizar relatórios do CR
|
- `VIEW_CR_REPORTS`: Visualizar relatórios do CR
|
||||||
- `REGISTER_CR_PAYMENT`: Registrar pagamentos do CR
|
- `REGISTER_CR_RECEIPT`: Registrar comprovantes do CR
|
||||||
|
|
||||||
- **Tesoureiro(a)**:
|
- **Tesoureiro(a)**:
|
||||||
- `VIEW_CR_REPORTS`: Visualizar relatórios do CR
|
- `VIEW_CR_REPORTS`: Visualizar relatórios do CR
|
||||||
- `REGISTER_CR_PAYMENT`: Registrar pagamentos do CR
|
- `REGISTER_CR_RECEIPT`: Registrar comprovantes do CR
|
||||||
|
|
||||||
### CC
|
### CC
|
||||||
- **Secretário(a)**:
|
- **Secretário(a)**:
|
||||||
- `MANAGE_CC_CRS`: Gerenciar CRs
|
- `MANAGE_CC_CRS`: Gerenciar CRs
|
||||||
- `VIEW_CC_REPORTS`: Visualizar relatórios do CC
|
- `VIEW_CC_REPORTS`: Visualizar relatórios do CC
|
||||||
- `REGISTER_CC_PAYMENT`: Registrar pagamentos do CC
|
- `REGISTER_CC_RECEIPT`: Registrar comprovantes do CC
|
||||||
- `SYSTEM_CONFIG`: Configurar o sistema
|
- `SYSTEM_CONFIG`: Configurar o sistema
|
||||||
|
|
||||||
- **Tesoureiro(a)**:
|
- **Tesoureiro(a)**:
|
||||||
- `VIEW_CC_REPORTS`: Visualizar relatórios do CC
|
- `VIEW_CC_REPORTS`: Visualizar relatórios do CC
|
||||||
- `REGISTER_CC_PAYMENT`: Registrar pagamentos do CC
|
- `REGISTER_CC_RECEIPT`: Registrar comprovantes do CC
|
||||||
|
|
||||||
## Regras de Acesso a Dados
|
## Regras de Acesso a Dados
|
||||||
|
|
||||||
@@ -214,10 +218,10 @@ O sistema possui uma estrutura hierárquica com os seguintes níveis:
|
|||||||
- Secretários e tesoureiros podem ver dados de sua instância
|
- Secretários e tesoureiros podem ver dados de sua instância
|
||||||
- O CC tem acesso a todos os dados
|
- O CC tem acesso a todos os dados
|
||||||
|
|
||||||
2. **Registro de Pagamentos**:
|
2. **Registro de Comprovantes**:
|
||||||
- Apenas tesoureiros e secretários podem registrar pagamentos
|
- Apenas tesoureiros e secretários podem registrar comprovantes
|
||||||
- O registro é restrito à instância do usuário
|
- O registro é restrito à instância do usuário
|
||||||
- O CC pode registrar pagamentos em qualquer nível
|
- O CC pode registrar comprovantes em qualquer nível
|
||||||
|
|
||||||
## Implementação Técnica
|
## Implementação Técnica
|
||||||
|
|
||||||
|
|||||||
@@ -190,6 +190,7 @@ class Militante(Base):
|
|||||||
vendas_jornais = relationship("VendaJornalAvulso", back_populates="militante")
|
vendas_jornais = relationship("VendaJornalAvulso", back_populates="militante")
|
||||||
assinaturas = relationship("AssinaturaAnual", back_populates="militante")
|
assinaturas = relationship("AssinaturaAnual", back_populates="militante")
|
||||||
celula = relationship("Celula", back_populates="militantes", foreign_keys=[celula_id])
|
celula = relationship("Celula", back_populates="militantes", foreign_keys=[celula_id])
|
||||||
|
comprovantes = relationship("Comprovante", back_populates="militante")
|
||||||
|
|
||||||
# Constantes para responsabilidades
|
# Constantes para responsabilidades
|
||||||
SECRETARIO = 1
|
SECRETARIO = 1
|
||||||
@@ -621,6 +622,22 @@ class TransacaoPIX(Base):
|
|||||||
|
|
||||||
pagamento = relationship("Pagamento", back_populates="transacoes_pix")
|
pagamento = relationship("Pagamento", back_populates="transacoes_pix")
|
||||||
|
|
||||||
|
class TipoComprovante(Base):
|
||||||
|
__tablename__ = 'tipos_comprovante'
|
||||||
|
id = Column(Integer, primary_key=True)
|
||||||
|
descricao = Column(String(50), nullable=False)
|
||||||
|
valor = Column(Float, nullable=False)
|
||||||
|
|
||||||
|
class Comprovante(Base):
|
||||||
|
__tablename__ = 'comprovantes'
|
||||||
|
id = Column(Integer, primary_key=True)
|
||||||
|
militante_id = Column(Integer, ForeignKey('militantes.id'), nullable=False)
|
||||||
|
tipo_comprovante = Column(String(50)) # Cota, Jornal, Assinatura, etc.
|
||||||
|
data_comprovante = Column(Date, nullable=False)
|
||||||
|
|
||||||
|
militante = relationship("Militante", back_populates="comprovantes")
|
||||||
|
transacoes_pix = relationship("TransacaoPIX", back_populates="comprovante")
|
||||||
|
|
||||||
def init_database():
|
def init_database():
|
||||||
"""Inicializa o banco de dados com dados básicos"""
|
"""Inicializa o banco de dados com dados básicos"""
|
||||||
print("Inicializando banco de dados...")
|
print("Inicializando banco de dados...")
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Werkzeug==3.0.1
|
|||||||
python-dotenv==1.0.1
|
python-dotenv==1.0.1
|
||||||
pyotp==2.9.0
|
pyotp==2.9.0
|
||||||
qrcode==7.4.2
|
qrcode==7.4.2
|
||||||
Pillow==10.2.0
|
Pillow==9.5.0
|
||||||
email-validator==2.1.0.post1
|
email-validator==2.1.0.post1
|
||||||
cryptography==42.0.2
|
cryptography==42.0.2
|
||||||
bcrypt==4.1.2
|
bcrypt==4.1.2
|
||||||
|
|||||||
65
seed_data.py
65
seed_data.py
@@ -1,10 +1,11 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from functions.database import (
|
from functions.database import (
|
||||||
Base, Militante, CotaMensal, TipoPagamento, Pagamento,
|
Base, Militante, CotaMensal, TipoComprovante, Comprovante,
|
||||||
MaterialVendido, TipoMaterial, VendaJornalAvulso, AssinaturaAnual,
|
MaterialVendido, TipoMaterial, VendaJornalAvulso, AssinaturaAnual,
|
||||||
RelatorioCotasMensais, RelatorioVendasMateriais, engine, SessionLocal,
|
RelatorioCotasMensais, RelatorioVendasMateriais, engine, SessionLocal,
|
||||||
Setor, ComiteCentral, Usuario, Role, EmailMilitante, Endereco,
|
Setor, ComiteCentral, Usuario, Role, EmailMilitante, Endereco,
|
||||||
ComiteRegional, Celula, EstadoMilitante
|
ComiteRegional, Celula, EstadoMilitante, get_db_connection,
|
||||||
|
init_database
|
||||||
)
|
)
|
||||||
import random
|
import random
|
||||||
from faker import Faker
|
from faker import Faker
|
||||||
@@ -54,20 +55,28 @@ def criar_estrutura_organizacional(session):
|
|||||||
session.commit()
|
session.commit()
|
||||||
return crs, setores
|
return crs, setores
|
||||||
|
|
||||||
def criar_tipos_pagamento(session):
|
def criar_tipos_comprovante(session):
|
||||||
"""Cria tipos de pagamento padrão"""
|
"""Cria tipos de comprovante padrão"""
|
||||||
print("\nCriando tipos de pagamento...")
|
print("\nCriando tipos de comprovante...")
|
||||||
tipos = [
|
tipos = [
|
||||||
"Dinheiro",
|
"Comprovante Padrão",
|
||||||
"PIX",
|
"Comprovante Especial",
|
||||||
"Cartão de Crédito",
|
"Comprovante Extraordinário",
|
||||||
"Cartão de Débito",
|
"Jornal Avulso",
|
||||||
"Transferência Bancária"
|
"Assinatura de Jornal",
|
||||||
|
"Campanha Financeira"
|
||||||
]
|
]
|
||||||
|
|
||||||
for tipo in tipos:
|
for tipo in tipos:
|
||||||
if not session.query(TipoPagamento).filter_by(descricao=tipo).first():
|
if not session.query(TipoComprovante).filter_by(descricao=tipo).first():
|
||||||
session.add(TipoPagamento(descricao=tipo))
|
session.add(TipoComprovante(descricao=tipo))
|
||||||
session.commit()
|
|
||||||
|
try:
|
||||||
|
session.commit()
|
||||||
|
print("Tipos de comprovante criados com sucesso!")
|
||||||
|
except Exception as e:
|
||||||
|
session.rollback()
|
||||||
|
print(f"Erro ao criar tipos de comprovante: {e}")
|
||||||
|
|
||||||
def criar_tipos_material(session):
|
def criar_tipos_material(session):
|
||||||
"""Cria tipos de material padrão"""
|
"""Cria tipos de material padrão"""
|
||||||
@@ -211,27 +220,27 @@ def criar_cotas(session, militantes):
|
|||||||
print(f"Erro ao criar cotas para militante {militante.nome}: {e}")
|
print(f"Erro ao criar cotas para militante {militante.nome}: {e}")
|
||||||
session.rollback()
|
session.rollback()
|
||||||
|
|
||||||
def criar_pagamentos(session, militantes):
|
def criar_comprovantes(session, militantes):
|
||||||
"""Cria pagamentos para os militantes"""
|
"""Cria comprovantes para os militantes"""
|
||||||
print("\nCriando pagamentos...")
|
print("\nCriando comprovantes...")
|
||||||
tipos_pagamento = session.query(TipoPagamento).all()
|
tipos_comprovante = session.query(TipoComprovante).all()
|
||||||
|
|
||||||
for militante in militantes:
|
for militante in militantes:
|
||||||
try:
|
try:
|
||||||
# Criar entre 3 e 8 pagamentos por militante
|
# Criar entre 3 e 8 comprovantes por militante
|
||||||
for _ in range(random.randint(3, 8)):
|
for _ in range(random.randint(3, 8)):
|
||||||
tipo = random.choice(tipos_pagamento)
|
tipo = random.choice(tipos_comprovante)
|
||||||
pagamento = Pagamento(
|
comprovante = Comprovante(
|
||||||
militante_id=militante.id,
|
militante_id=militante.id,
|
||||||
tipo_pagamento=tipo.descricao, # Usando a descrição do tipo
|
tipo_comprovante=tipo.descricao, # Usando a descrição do tipo
|
||||||
valor=random.uniform(50, 500),
|
valor=random.uniform(10, 1000),
|
||||||
data_pagamento=fake.date_between(start_date='-1y', end_date='today')
|
data_comprovante=fake.date_between(start_date='-1y', end_date='today')
|
||||||
)
|
)
|
||||||
session.add(pagamento)
|
session.add(comprovante)
|
||||||
session.commit()
|
session.commit()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Erro ao criar pagamentos para militante {militante.nome}: {e}")
|
|
||||||
session.rollback()
|
session.rollback()
|
||||||
|
print(f"Erro ao criar comprovantes para militante {militante.nome}: {e}")
|
||||||
|
|
||||||
def criar_materiais_vendidos(session, militantes):
|
def criar_materiais_vendidos(session, militantes):
|
||||||
"""Cria registros de materiais vendidos"""
|
"""Cria registros de materiais vendidos"""
|
||||||
@@ -302,7 +311,7 @@ def criar_assinaturas(session, militantes):
|
|||||||
|
|
||||||
def seed_database():
|
def seed_database():
|
||||||
"""Função principal para popular o banco de dados"""
|
"""Função principal para popular o banco de dados"""
|
||||||
session = SessionLocal()
|
session = get_db_connection()
|
||||||
try:
|
try:
|
||||||
print("Iniciando população do banco de dados...")
|
print("Iniciando população do banco de dados...")
|
||||||
|
|
||||||
@@ -310,7 +319,7 @@ def seed_database():
|
|||||||
crs, setores = criar_estrutura_organizacional(session)
|
crs, setores = criar_estrutura_organizacional(session)
|
||||||
|
|
||||||
# Criar tipos básicos
|
# Criar tipos básicos
|
||||||
criar_tipos_pagamento(session)
|
criar_tipos_comprovante(session)
|
||||||
criar_tipos_material(session)
|
criar_tipos_material(session)
|
||||||
|
|
||||||
# Criar militantes (30 militantes para teste)
|
# Criar militantes (30 militantes para teste)
|
||||||
@@ -318,7 +327,7 @@ def seed_database():
|
|||||||
|
|
||||||
# Criar dados financeiros e materiais
|
# Criar dados financeiros e materiais
|
||||||
criar_cotas(session, militantes)
|
criar_cotas(session, militantes)
|
||||||
criar_pagamentos(session, militantes)
|
criar_comprovantes(session, militantes)
|
||||||
criar_materiais_vendidos(session, militantes)
|
criar_materiais_vendidos(session, militantes)
|
||||||
criar_vendas_jornal(session, militantes)
|
criar_vendas_jornal(session, militantes)
|
||||||
criar_assinaturas(session, militantes)
|
criar_assinaturas(session, militantes)
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
// Configurar clique nos itens da lista de pagamentos
|
// Configurar clique nos itens da lista de comprovantes
|
||||||
document.querySelectorAll('.list-group-item[onclick*="carregarDadosPagamento"]').forEach(item => {
|
document.querySelectorAll('.list-group-item[onclick*="carregarDadosComprovante"]').forEach(item => {
|
||||||
item.addEventListener('click', function(e) {
|
item.addEventListener('click', function(e) {
|
||||||
const pagamentoId = this.getAttribute('data-pagamento-id');
|
const comprovanteId = this.getAttribute('data-comprovante-id');
|
||||||
if (pagamentoId) {
|
if (comprovanteId) {
|
||||||
carregarDadosPagamento(pagamentoId);
|
carregarDadosComprovante(comprovanteId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ function configurarOrdenacaoTabela(tabelaId) {
|
|||||||
if (column === 'data' ||
|
if (column === 'data' ||
|
||||||
column === 'data_vencimento' ||
|
column === 'data_vencimento' ||
|
||||||
column === 'data_alteracao' ||
|
column === 'data_alteracao' ||
|
||||||
column === 'data_pagamento' ||
|
column === 'data_comprovante' ||
|
||||||
column === 'data_venda' ||
|
column === 'data_venda' ||
|
||||||
column === 'data_relatorio') {
|
column === 'data_relatorio') {
|
||||||
const aDate = converterDataParaComparacao(aValue);
|
const aDate = converterDataParaComparacao(aValue);
|
||||||
@@ -112,7 +112,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
'materiaisTable',
|
'materiaisTable',
|
||||||
'vendasTable',
|
'vendasTable',
|
||||||
'cotasTable',
|
'cotasTable',
|
||||||
'pagamentosTable'
|
'comprovantesTable'
|
||||||
];
|
];
|
||||||
|
|
||||||
tabelas.forEach(tabelaId => {
|
tabelas.forEach(tabelaId => {
|
||||||
@@ -197,4 +197,12 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function sortTable(table, column, type = 'text') {
|
||||||
|
// ... existing code ...
|
||||||
|
if (column === 'data_comprovante') {
|
||||||
|
// ... existing code ...
|
||||||
|
}
|
||||||
|
// ... existing code ...
|
||||||
|
}
|
||||||
@@ -29,8 +29,8 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="data_pagamento" class="form-label">Data do Comprovante:</label>
|
<label for="data_comprovante" class="form-label">Data do Comprovante:</label>
|
||||||
<input type="date" class="form-control" id="data_pagamento" name="data_pagamento"
|
<input type="date" class="form-control" id="data_comprovante" name="data_comprovante"
|
||||||
required max="{{ hoje }}">
|
required max="{{ hoje }}">
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="btn btn-primary">Salvar</button>
|
<button type="submit" class="btn btn-primary">Salvar</button>
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
{% extends 'base.html' %}
|
|
||||||
|
|
||||||
{% block title %}Editar Comprovante{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-8 offset-md-2">
|
|
||||||
<div class="card shadow-sm">
|
|
||||||
<div class="card-header bg-light">
|
|
||||||
<h4 class="card-title mb-0">
|
|
||||||
<i class="fas fa-money-bill-wave me-2"></i>Editar Comprovante
|
|
||||||
</h4>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<form method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="tipo_pagamento_id" class="form-label">Tipo de Comprovante:</label>
|
|
||||||
<select class="form-select" id="tipo_pagamento_id" name="tipo_pagamento_id" required>
|
|
||||||
<option value="">Selecione o tipo de comprovante</option>
|
|
||||||
<!-- Add your options here -->
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="data_pagamento" class="form-label">Data do Comprovante:</label>
|
|
||||||
<input type="date" class="form-control" id="data_pagamento" name="data_pagamento"
|
|
||||||
required max="{{ hoje }}">
|
|
||||||
</div>
|
|
||||||
<button type="submit" class="btn btn-primary">Salvar</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% block title %}Editar Relatório de Pagamentos{% endblock %}
|
{% block title %}Editar Relatório de Comprovantes{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h1 class="mb-4">Editar Relatório de Pagamentos</h1>
|
<h1 class="mb-4">Editar Relatório de Comprovantes</h1>
|
||||||
|
|
||||||
{% with messages = get_flashed_messages(with_categories=true) %}
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
||||||
{% if messages %}
|
{% if messages %}
|
||||||
@@ -44,10 +44,10 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="total_pagamentos" class="form-label">Total de Pagamentos</label>
|
<label for="total_comprovantes" class="form-label">Total de Comprovantes</label>
|
||||||
<input type="number" class="form-control" id="total_pagamentos" name="total_pagamentos" step="0.01" value="{{ relatorio.total_pagamentos }}" required>
|
<input type="number" class="form-control" id="total_comprovantes" name="total_comprovantes" step="0.01" value="{{ relatorio.total_comprovantes }}" required>
|
||||||
<div class="invalid-feedback">
|
<div class="invalid-feedback">
|
||||||
Por favor, insira o total de pagamentos.
|
Por favor, insira o total de comprovantes.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
|
|
||||||
<div class="d-flex justify-content-between">
|
<div class="d-flex justify-content-between">
|
||||||
<button type="submit" class="btn btn-success">Salvar</button>
|
<button type="submit" class="btn btn-success">Salvar</button>
|
||||||
<a href="{{ url_for('listar_relatorios_pagamentos') }}" class="btn btn-outline-secondary">Voltar</a>
|
<a href="{{ url_for('listar_relatorios_comprovantes') }}" class="btn btn-outline-secondary">Voltar</a>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
{% extends 'base.html' %}
|
|
||||||
|
|
||||||
{% block title %}Lista de Comprovantes{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="card shadow-sm">
|
|
||||||
<div class="card-header bg-light">
|
|
||||||
<h4 class="card-title mb-0">
|
|
||||||
<i class="fas fa-list me-2"></i>Lista de Comprovantes
|
|
||||||
</h4>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<table class="table table-striped">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Tipo de Comprovante</th>
|
|
||||||
<th>Data do Comprovante</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for comprovante in comprovantes %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ comprovante.tipo }}</td>
|
|
||||||
<td>{{ comprovante.data }}</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,203 +0,0 @@
|
|||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block title %}Comprovantes{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="container-fluid mt-3">
|
|
||||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
||||||
<h2><i class="fas fa-money-bill-wave"></i> Comprovantes</h2>
|
|
||||||
<div>
|
|
||||||
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#modalNovoPagamento">
|
|
||||||
<i class="fas fa-plus"></i> Novo Comprovante
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-outline-primary" id="btnExportar">
|
|
||||||
<i class="fas fa-file-export"></i> Exportar
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="table-responsive">
|
|
||||||
<table class="table table-striped table-hover" id="tabelaPagamentos">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Militante</th>
|
|
||||||
<th>Tipo de Comprovante</th>
|
|
||||||
<th>Valor</th>
|
|
||||||
<th>Data do Comprovante</th>
|
|
||||||
<th>Ações</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for pagamento in pagamentos %}
|
|
||||||
<tr>
|
|
||||||
<td data-militante="{{ pagamento.militante_id }}">{{ pagamento.militante.nome if pagamento.militante else 'N/A' }}</td>
|
|
||||||
<td data-tipo="{{ pagamento.tipo_pagamento }}">
|
|
||||||
{% if pagamento.tipo_pagamento == 1 %}
|
|
||||||
Cota
|
|
||||||
{% elif pagamento.tipo_pagamento == 2 %}
|
|
||||||
Contribuição Extra
|
|
||||||
{% elif pagamento.tipo_pagamento == 3 %}
|
|
||||||
Doação
|
|
||||||
{% elif pagamento.tipo_pagamento == 4 %}
|
|
||||||
Taxa de Evento
|
|
||||||
{% elif pagamento.tipo_pagamento == 5 %}
|
|
||||||
Outros
|
|
||||||
{% else %}
|
|
||||||
Não Definido
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td data-valor="{{ pagamento.valor }}">R$ {{ "%.2f"|format(pagamento.valor) }}</td>
|
|
||||||
<td data-data="{{ pagamento.data_pagamento }}">{{ pagamento.data_pagamento.strftime('%d/%m/%Y') }}</td>
|
|
||||||
<td>
|
|
||||||
<button type="button"
|
|
||||||
class="btn btn-sm btn-outline-primary"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#modalEditarPagamento"
|
|
||||||
data-pagamento-id="{{ pagamento.id }}"
|
|
||||||
data-militante-id="{{ pagamento.militante_id }}"
|
|
||||||
data-tipo-pagamento="{{ pagamento.tipo_pagamento }}"
|
|
||||||
data-valor="{{ pagamento.valor }}"
|
|
||||||
data-data-pagamento="{{ pagamento.data_pagamento.strftime('%Y-%m-%d') }}"
|
|
||||||
title="Editar">
|
|
||||||
<i class="fas fa-edit"></i>
|
|
||||||
</button>
|
|
||||||
<button type="button"
|
|
||||||
class="btn btn-sm btn-outline-danger"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#modalExcluirPagamento"
|
|
||||||
data-pagamento-id="{{ pagamento.id }}"
|
|
||||||
data-pagamento-info="Comprovante de {{ pagamento.militante.nome if pagamento.militante else 'N/A' }} - R$ {{ "%.2f"|format(pagamento.valor) }}"
|
|
||||||
title="Excluir">
|
|
||||||
<i class="fas fa-trash"></i>
|
|
||||||
</button>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Modal Novo Pagamento -->
|
|
||||||
<div class="modal fade" id="modalNovoPagamento" tabindex="-1">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h5 class="modal-title"><i class="fas fa-plus"></i> Novo Comprovante</h5>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<form id="formNovoPagamento" method="post" action="{{ url_for('adicionar_pagamento') }}">
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="militante" class="form-label">Militante:</label>
|
|
||||||
<select class="form-select" id="militante" name="militante_id" required>
|
|
||||||
<option value="">Selecione um militante</option>
|
|
||||||
{% for militante in militantes %}
|
|
||||||
<option value="{{ militante.id }}">{{ militante.nome }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="tipoPagamento" class="form-label">Tipo de Comprovante:</label>
|
|
||||||
<select class="form-select" id="tipoPagamento" name="tipo_pagamento" required>
|
|
||||||
<option value="">Selecione o tipo</option>
|
|
||||||
<option value="1">Cota</option>
|
|
||||||
<option value="2">Contribuição Extra</option>
|
|
||||||
<option value="3">Doação</option>
|
|
||||||
<option value="4">Taxa de Evento</option>
|
|
||||||
<option value="5">Outros</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="valor" class="form-label">Valor:</label>
|
|
||||||
<input type="number" step="0.01" class="form-control" id="valor" name="valor" required>
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="dataPagamento" class="form-label">Data do Comprovante:</label>
|
|
||||||
<input type="date" class="form-control" id="dataPagamento" name="data_pagamento" required>
|
|
||||||
</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>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Modal Editar Pagamento -->
|
|
||||||
<div class="modal fade" id="modalEditarPagamento" tabindex="-1">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h5 class="modal-title"><i class="fas fa-edit"></i> Editar Comprovante</h5>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<form id="formEditarPagamento" method="post">
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="editMilitante" class="form-label">Militante:</label>
|
|
||||||
<input type="text" class="form-control bg-light" id="editMilitanteNome" readonly>
|
|
||||||
<input type="hidden" id="editMilitante" name="militante_id">
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="editTipoPagamento" class="form-label">Tipo de Comprovante:</label>
|
|
||||||
<select class="form-select" id="editTipoPagamento" name="tipo_pagamento" required>
|
|
||||||
<option value="">Selecione o tipo</option>
|
|
||||||
<option value="1">Cota</option>
|
|
||||||
<option value="2">Contribuição Extra</option>
|
|
||||||
<option value="3">Doação</option>
|
|
||||||
<option value="4">Taxa de Evento</option>
|
|
||||||
<option value="5">Outros</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="editValor" class="form-label">Valor:</label>
|
|
||||||
<input type="number" step="0.01" class="form-control" id="editValor" name="valor" required>
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="editDataPagamento" class="form-label">Data do Comprovante:</label>
|
|
||||||
<input type="date" class="form-control" id="editDataPagamento" name="data_pagamento" required>
|
|
||||||
</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>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Modal Excluir Pagamento -->
|
|
||||||
<div class="modal fade" id="modalExcluirPagamento" tabindex="-1">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h5 class="modal-title"><i class="fas fa-trash"></i> Excluir Comprovante</h5>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<p>Tem certeza que deseja excluir este comprovante?</p>
|
|
||||||
<p id="pagamentoInfo" class="text-muted"></p>
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<form id="formExcluirPagamento" method="post">
|
|
||||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
|
|
||||||
<button type="submit" class="btn btn-danger">Excluir</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block scripts %}
|
|
||||||
<script src="{{ url_for('static', filename='js/pagamentos.js') }}"></script>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% block title %}Listar Relatórios de Pagamentos{% endblock %}
|
{% block title %}Listar Relatórios de Comprovantes{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h1 class="mb-4">Lista de Relatórios de Pagamentos</h1>
|
<h1 class="mb-4">Lista de Relatórios de Comprovantes</h1>
|
||||||
|
|
||||||
{% with messages = get_flashed_messages(with_categories=true) %}
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
||||||
{% if messages %}
|
{% if messages %}
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
{% endwith %}
|
{% endwith %}
|
||||||
|
|
||||||
<div class="d-flex justify-content-between mb-4">
|
<div class="d-flex justify-content-between mb-4">
|
||||||
<a href="{{ url_for('novo_relatorio_pagamentos') }}" class="btn btn-success">Novo Relatório</a>
|
<a href="{{ url_for('novo_relatorio_comprovantes') }}" class="btn btn-success">Novo Relatório</a>
|
||||||
<a href="{{ url_for('home') }}" class="btn btn-outline-primary">Início</a>
|
<a href="{{ url_for('home') }}" class="btn btn-outline-primary">Início</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
<th>ID</th>
|
<th>ID</th>
|
||||||
<th>Setor</th>
|
<th>Setor</th>
|
||||||
<th>Comitê Central</th>
|
<th>Comitê Central</th>
|
||||||
<th>Total de Pagamentos</th>
|
<th>Total de Comprovantes</th>
|
||||||
<th>Data do Relatório</th>
|
<th>Data do Relatório</th>
|
||||||
<th>Ações</th>
|
<th>Ações</th>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -39,11 +39,11 @@
|
|||||||
<td>{{ relatorio.id }}</td>
|
<td>{{ relatorio.id }}</td>
|
||||||
<td>{{ relatorio.setor.nome }}</td>
|
<td>{{ relatorio.setor.nome }}</td>
|
||||||
<td>{{ relatorio.comite.nome }}</td>
|
<td>{{ relatorio.comite.nome }}</td>
|
||||||
<td>R$ {{ "%.2f"|format(relatorio.total_pagamentos) }}</td>
|
<td>R$ {{ "%.2f"|format(relatorio.total_comprovantes) }}</td>
|
||||||
<td>{{ relatorio.data_relatorio.strftime('%d/%m/%Y') }}</td>
|
<td>{{ relatorio.data_relatorio.strftime('%d/%m/%Y') }}</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ url_for('editar_relatorio_pagamentos', id=relatorio.id) }}" class="btn btn-primary btn-sm">Editar</a>
|
<a href="{{ url_for('editar_relatorio_comprovantes', id=relatorio.id) }}" class="btn btn-primary btn-sm">Editar</a>
|
||||||
<a href="{{ url_for('deletar_relatorio_pagamentos', id=relatorio.id) }}" class="btn btn-danger btn-sm" onclick="return confirm('Tem certeza que deseja excluir este relatório?')">Excluir</a>
|
<a href="{{ url_for('deletar_relatorio_comprovantes', id=relatorio.id) }}" class="btn btn-danger btn-sm" onclick="return confirm('Tem certeza que deseja excluir este relatório?')">Excluir</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
{% extends 'base.html' %}
|
|
||||||
|
|
||||||
{% block title %}Novo Comprovante{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-8 offset-md-2">
|
|
||||||
<div class="card shadow-sm">
|
|
||||||
<div class="card-header bg-light">
|
|
||||||
<h4 class="card-title mb-0">
|
|
||||||
<i class="fas fa-money-bill-wave me-2"></i>Registrar Novo Comprovante
|
|
||||||
</h4>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<form method="post" class="needs-validation" novalidate>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="militante_id" class="form-label">Militante:</label>
|
|
||||||
<select class="form-select" id="militante_id" name="militante_id" required>
|
|
||||||
<option value="">Selecione um militante</option>
|
|
||||||
{% for militante in militantes %}
|
|
||||||
<option value="{{ militante.id }}">{{ militante.nome }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
<div class="invalid-feedback">
|
|
||||||
Por favor, selecione um militante.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="tipo_pagamento_id" class="form-label">Tipo de Comprovante:</label>
|
|
||||||
<select class="form-select" id="tipo_pagamento_id" name="tipo_pagamento_id" required>
|
|
||||||
<option value="">Selecione o tipo de comprovante</option>
|
|
||||||
{% for tipo in tipos_pagamento %}
|
|
||||||
<option value="{{ tipo.id }}">{{ tipo.descricao }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
<div class="invalid-feedback">
|
|
||||||
Por favor, selecione o tipo de comprovante.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="valor" class="form-label">Valor:</label>
|
|
||||||
<div class="input-group">
|
|
||||||
<span class="input-group-text">R$</span>
|
|
||||||
<input type="text" class="form-control money" id="valor" name="valor" required>
|
|
||||||
</div>
|
|
||||||
<div class="invalid-feedback">
|
|
||||||
Por favor, informe um valor válido.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="data_pagamento" class="form-label">Data do Comprovante:</label>
|
|
||||||
<input type="date" class="form-control" id="data_pagamento" name="data_pagamento"
|
|
||||||
required max="{{ hoje }}">
|
|
||||||
<div class="invalid-feedback">
|
|
||||||
Por favor, informe uma data válida.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="d-flex gap-2">
|
|
||||||
<button type="submit" class="btn btn-primary">
|
|
||||||
<i class="fas fa-save me-1"></i>Registrar
|
|
||||||
</button>
|
|
||||||
<a href="{{ url_for('listar_pagamentos') }}" class="btn btn-secondary">
|
|
||||||
<i class="fas fa-arrow-left me-1"></i>Voltar
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block extra_js %}
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.16/jquery.mask.min.js"></script>
|
|
||||||
<script>
|
|
||||||
$(document).ready(function(){
|
|
||||||
$('.money').mask('000.000.000.000.000,00', {reverse: true});
|
|
||||||
|
|
||||||
// Converter valor para formato aceito pelo backend
|
|
||||||
$('form').on('submit', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
const valor = $('#valor').val().replace(/\./g, '').replace(',', '.');
|
|
||||||
$('#valor').val(valor);
|
|
||||||
this.submit();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% block title %}Novo Relatório de Cotas{% endblock %}
|
{% block title %}Novo Relatório de Comprovantes{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h1 class="mb-4">Novo Relatório de Cotas</h1>
|
<h1 class="mb-4">Novo Relatório de Comprovantes</h1>
|
||||||
|
|
||||||
{% with messages = get_flashed_messages(with_categories=true) %}
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
||||||
{% if messages %}
|
{% if messages %}
|
||||||
@@ -44,10 +44,10 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="total_pagamentos" class="form-label">Total de Pagamentos</label>
|
<label for="total_comprovantes" class="form-label">Total de Comprovantes</label>
|
||||||
<input type="number" class="form-control" id="total_pagamentos" name="total_pagamentos" step="0.01" required>
|
<input type="number" class="form-control" id="total_comprovantes" name="total_comprovantes" step="0.01" required>
|
||||||
<div class="invalid-feedback">
|
<div class="invalid-feedback">
|
||||||
Por favor, insira o total de pagamentos.
|
Por favor, insira o total de comprovantes.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
|
|
||||||
<div class="d-flex justify-content-between">
|
<div class="d-flex justify-content-between">
|
||||||
<button type="submit" class="btn btn-success">Registrar</button>
|
<button type="submit" class="btn btn-success">Registrar</button>
|
||||||
<a href="{{ url_for('listar_relatorios_pagamentos') }}" class="btn btn-outline-secondary">Voltar</a>
|
<a href="{{ url_for('listar_relatorios_comprovantes') }}" class="btn btn-outline-secondary">Voltar</a>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
Reference in New Issue
Block a user