diff --git a/functions/database.py b/functions/database.py index 8564a46..f3f4c6d 100644 --- a/functions/database.py +++ b/functions/database.py @@ -1,6 +1,6 @@ from datetime import datetime, timedelta from werkzeug.security import generate_password_hash, check_password_hash -from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, Text, Numeric, Date, Enum, create_engine, text +from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, Text, Numeric, Date, Enum, create_engine, text, Float from sqlalchemy.orm import sessionmaker, relationship, backref import os import pyotp @@ -187,10 +187,11 @@ class Militante(Base): cotas_mensais = relationship("CotaMensal", back_populates="militante") pagamentos = relationship("Pagamento", back_populates="militante") materiais_vendidos = relationship("MaterialVendido", back_populates="militante") - vendas_jornais = relationship("VendaJornalAvulso", back_populates="militante") - assinaturas = relationship("AssinaturaAnual", back_populates="militante") + vendas_jornais = relationship("VendaJornal", back_populates="militante") + assinaturas = relationship("AssinaturaJornal", back_populates="militante") celula = relationship("Celula", back_populates="militantes", foreign_keys=[celula_id]) comprovantes = relationship("Comprovante", back_populates="militante") + vendas_jornais_avulsos = relationship("VendaJornalAvulso", back_populates="militante") # Constantes para responsabilidades SECRETARIO = 1 @@ -362,7 +363,7 @@ class VendaJornalAvulso(Base): valor_total = Column(Numeric(10, 2), nullable=False) data_venda = Column(Date, nullable=False) - militante = relationship("Militante", back_populates="vendas_jornais") + militante = relationship("Militante", back_populates="vendas_jornais_avulsos") class AssinaturaAnual(Base): __tablename__ = 'assinaturas_anuais' @@ -624,8 +625,10 @@ class TransacaoPIX(Base): status = Column(String(20)) # Pendente, Pago, Expirado qr_code = Column(Text) pagamento_id = Column(Integer, ForeignKey('pagamentos.id')) + comprovante_id = Column(Integer, ForeignKey('comprovantes.id')) pagamento = relationship("Pagamento", back_populates="transacoes_pix") + comprovante = relationship("Comprovante", back_populates="transacoes_pix") class TipoComprovante(Base): __tablename__ = 'tipos_comprovante' @@ -643,6 +646,31 @@ class Comprovante(Base): militante = relationship("Militante", back_populates="comprovantes") transacoes_pix = relationship("TransacaoPIX", back_populates="comprovante") +class VendaJornal(Base): + __tablename__ = 'vendas_jornais' + + id = Column(Integer, primary_key=True, autoincrement=True) + militante_id = Column(Integer, ForeignKey('militantes.id')) + quantidade = Column(Integer, nullable=False) + valor_total = Column(Numeric(10, 2), nullable=False) + data_venda = Column(Date, nullable=False) + + militante = relationship("Militante", back_populates="vendas_jornais") + +class AssinaturaJornal(Base): + __tablename__ = 'assinaturas_jornais' + + id = Column(Integer, primary_key=True, autoincrement=True) + militante_id = Column(Integer, ForeignKey('militantes.id')) + tipo_material_id = Column(Integer, ForeignKey('tipos_materiais.id')) + quantidade = Column(Integer, nullable=False) + valor_total = Column(Numeric(10, 2), nullable=False) + data_inicio = Column(Date, nullable=False) + data_fim = Column(Date, nullable=False) + + militante = relationship("Militante", back_populates="assinaturas") + tipo_material = relationship("TipoMaterial", back_populates="assinaturas") + def init_database(): """Inicializa o banco de dados com dados básicos""" print("Inicializando banco de dados...") diff --git a/models/entities/assinatura_jornal.py b/models/entities/assinatura_jornal.py new file mode 100644 index 0000000..b7165a0 --- /dev/null +++ b/models/entities/assinatura_jornal.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, Integer, String, ForeignKey, Numeric, Date +from sqlalchemy.orm import relationship + +from models.entities.base import Base + +class AssinaturaJornal(Base): + __tablename__ = 'assinaturas_jornais' + + id = Column(Integer, primary_key=True, autoincrement=True) + militante_id = Column(Integer, ForeignKey('militantes.id')) + tipo_material_id = Column(Integer, ForeignKey('tipos_materiais.id')) + quantidade = Column(Integer, nullable=False) + valor_total = Column(Numeric(10, 2), nullable=False) + data_inicio = Column(Date, nullable=False) + data_fim = Column(Date, nullable=False) + + militante = relationship("Militante", back_populates="assinaturas", foreign_keys=[militante_id]) + tipo_material = relationship("TipoMaterial", back_populates="assinaturas") \ No newline at end of file diff --git a/models/entities/comprovante.py b/models/entities/comprovante.py new file mode 100644 index 0000000..dea2def --- /dev/null +++ b/models/entities/comprovante.py @@ -0,0 +1,15 @@ +from sqlalchemy import Column, Integer, String, ForeignKey, Numeric, Date +from sqlalchemy.orm import relationship + +from models.entities.base import Base + +class Comprovante(Base): + __tablename__ = 'comprovantes' + + id = Column(Integer, primary_key=True, autoincrement=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") \ No newline at end of file diff --git a/models/entities/cota_mensal.py b/models/entities/cota_mensal.py new file mode 100644 index 0000000..6f92281 --- /dev/null +++ b/models/entities/cota_mensal.py @@ -0,0 +1,17 @@ +from sqlalchemy import Column, Integer, String, ForeignKey, Numeric, Date, Boolean +from sqlalchemy.orm import relationship + +from models.entities.base import Base + +class CotaMensal(Base): + __tablename__ = 'cotas_mensais' + + id = Column(Integer, primary_key=True, autoincrement=True) + militante_id = Column(Integer, ForeignKey('militantes.id')) + valor_antigo = Column(Numeric(10, 2), nullable=False) + valor_novo = Column(Numeric(10, 2), nullable=False) + data_alteracao = Column(Date, nullable=False) + data_vencimento = Column(Date, nullable=False) + pago = Column(Boolean, default=False) + + militante = relationship("Militante", back_populates="cotas_mensais") \ No newline at end of file diff --git a/models/entities/material_vendido.py b/models/entities/material_vendido.py new file mode 100644 index 0000000..d9375a7 --- /dev/null +++ b/models/entities/material_vendido.py @@ -0,0 +1,17 @@ +from sqlalchemy import Column, Integer, String, ForeignKey, Numeric, Date +from sqlalchemy.orm import relationship + +from models.entities.base import Base + +class MaterialVendido(Base): + __tablename__ = 'materiais_vendidos' + + id = Column(Integer, primary_key=True, autoincrement=True) + militante_id = Column(Integer, ForeignKey('militantes.id')) + tipo_material_id = Column(Integer, ForeignKey('tipos_materiais.id')) + descricao = Column(String(255), nullable=False) + valor = Column(Numeric(10, 2), nullable=False) + data_venda = Column(Date, nullable=False) + + militante = relationship("Militante", back_populates="materiais_vendidos") + tipo_material = relationship("TipoMaterial", back_populates="materiais_vendidos") \ No newline at end of file diff --git a/models/entities/militante.py b/models/entities/militante.py index a53064f..000b588 100644 --- a/models/entities/militante.py +++ b/models/entities/militante.py @@ -71,9 +71,11 @@ class Militante(Base): cotas_mensais = relationship("CotaMensal", back_populates="militante") pagamentos = relationship("Pagamento", back_populates="militante") materiais_vendidos = relationship("MaterialVendido", back_populates="militante") - vendas_jornais = relationship("VendaJornalAvulso", back_populates="militante") - assinaturas = relationship("AssinaturaAnual", back_populates="militante") + vendas_jornais_avulsos = relationship("VendaJornalAvulso", back_populates="militante") + vendas_jornais = relationship("VendaJornal", back_populates="militante", foreign_keys="[VendaJornal.militante_id]") + assinaturas = relationship("AssinaturaJornal", back_populates="militante", foreign_keys="[AssinaturaJornal.militante_id]") celula = relationship("Celula", back_populates="militantes", foreign_keys=[celula_id]) + comprovantes = relationship("Comprovante", back_populates="militante") # Constantes para responsabilidades SECRETARIO = 1 diff --git a/models/entities/pagamento.py b/models/entities/pagamento.py new file mode 100644 index 0000000..4e127da --- /dev/null +++ b/models/entities/pagamento.py @@ -0,0 +1,21 @@ +from sqlalchemy import Column, Integer, String, ForeignKey, Numeric, Date +from sqlalchemy.orm import relationship + +from models.entities.base import Base + +class Pagamento(Base): + __tablename__ = 'pagamentos' + + id = Column(Integer, primary_key=True, autoincrement=True) + militante_id = Column(Integer, ForeignKey('militantes.id')) + tipo_pagamento = Column(String(50)) # Cota, Jornal, Assinatura, etc. + mes_referencia = Column(Date) + numero_jornal = Column(String(20)) + numero_inicial_assinatura = Column(String(20)) + numero_final_assinatura = Column(String(20)) + campanha_financeira = Column(String(50)) + valor = Column(Numeric(10, 2), nullable=False) + data_pagamento = Column(Date, nullable=False) + + militante = relationship("Militante", back_populates="pagamentos") + transacoes_pix = relationship("TransacaoPIX", back_populates="pagamento") \ No newline at end of file diff --git a/models/entities/tipo_material.py b/models/entities/tipo_material.py new file mode 100644 index 0000000..44dee0b --- /dev/null +++ b/models/entities/tipo_material.py @@ -0,0 +1,13 @@ +from sqlalchemy import Column, Integer, String +from sqlalchemy.orm import relationship + +from models.entities.base import Base + +class TipoMaterial(Base): + __tablename__ = 'tipos_materiais' + + id = Column(Integer, primary_key=True, autoincrement=True) + descricao = Column(String(100), nullable=False) + + materiais_vendidos = relationship("MaterialVendido", back_populates="tipo_material") + assinaturas = relationship("AssinaturaJornal", back_populates="tipo_material") \ No newline at end of file diff --git a/models/entities/venda_jornal.py b/models/entities/venda_jornal.py new file mode 100644 index 0000000..4f014cb --- /dev/null +++ b/models/entities/venda_jornal.py @@ -0,0 +1,15 @@ +from sqlalchemy import Column, Integer, String, ForeignKey, Numeric, Date +from sqlalchemy.orm import relationship + +from models.entities.base import Base + +class VendaJornal(Base): + __tablename__ = 'vendas_jornais' + + id = Column(Integer, primary_key=True, autoincrement=True) + militante_id = Column(Integer, ForeignKey('militantes.id')) + quantidade = Column(Integer, nullable=False) + valor_total = Column(Numeric(10, 2), nullable=False) + data_venda = Column(Date, nullable=False) + + militante = relationship("Militante", back_populates="vendas_jornais", foreign_keys=[militante_id]) \ No newline at end of file diff --git a/models/entities/venda_jornal_avulso.py b/models/entities/venda_jornal_avulso.py new file mode 100644 index 0000000..78315b3 --- /dev/null +++ b/models/entities/venda_jornal_avulso.py @@ -0,0 +1,15 @@ +from sqlalchemy import Column, Integer, String, ForeignKey, Numeric, Date +from sqlalchemy.orm import relationship + +from models.entities.base import Base + +class VendaJornalAvulso(Base): + __tablename__ = 'vendas_jornais_avulsos' + + id = Column(Integer, primary_key=True, autoincrement=True) + militante_id = Column(Integer, ForeignKey('militantes.id')) + quantidade = Column(Integer, nullable=False) + valor_total = Column(Numeric(10, 2), nullable=False) + data_venda = Column(Date, nullable=False) + + militante = relationship("Militante", back_populates="vendas_jornais_avulsos") \ No newline at end of file diff --git a/scripts/prepare_mvc.sh b/scripts/prepare_mvc.sh old mode 100644 new mode 100755 index c4f2bf4..8e0c93b --- a/scripts/prepare_mvc.sh +++ b/scripts/prepare_mvc.sh @@ -19,6 +19,24 @@ touch models/entities/__init__.py touch controllers/__init__.py touch services/__init__.py +# Criar arquivo __init__.py com importações para models/entities +cat > models/entities/__init__.py << EOF +from models.entities.base import Base +from models.entities.usuario import Usuario, TipoUsuario +from models.entities.militante import Militante, EstadoMilitante +from models.entities.endereco import Endereco +from models.entities.email_militante import EmailMilitante +from models.entities.rede_social import RedeSocial +from models.entities.cota_mensal import CotaMensal +from models.entities.pagamento import Pagamento +from models.entities.tipo_material import TipoMaterial +from models.entities.material_vendido import MaterialVendido +from models.entities.venda_jornal import VendaJornal +from models.entities.venda_jornal_avulso import VendaJornalAvulso +from models.entities.assinatura_jornal import AssinaturaJornal +from models.entities.comprovante import Comprovante +EOF + echo "Todos os arquivos criados com sucesso!" echo "Para usar a nova estrutura MVC, execute:" echo "1. chmod +x scripts/prepare_mvc.sh"