fix: Corrige relacionamentos entre modelos na estrutura MVC
- Adiciona os modelos que faltavam na arquitetura MVC - Corrige relacionamentos de referência cruzada entre modelos - Atualiza script de preparação para criar arquivos __init__.py adequados - Torna o script de preparação executável 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from werkzeug.security import generate_password_hash, check_password_hash
|
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
|
from sqlalchemy.orm import sessionmaker, relationship, backref
|
||||||
import os
|
import os
|
||||||
import pyotp
|
import pyotp
|
||||||
@@ -187,10 +187,11 @@ class Militante(Base):
|
|||||||
cotas_mensais = relationship("CotaMensal", back_populates="militante")
|
cotas_mensais = relationship("CotaMensal", back_populates="militante")
|
||||||
pagamentos = relationship("Pagamento", back_populates="militante")
|
pagamentos = relationship("Pagamento", back_populates="militante")
|
||||||
materiais_vendidos = relationship("MaterialVendido", back_populates="militante")
|
materiais_vendidos = relationship("MaterialVendido", back_populates="militante")
|
||||||
vendas_jornais = relationship("VendaJornalAvulso", back_populates="militante")
|
vendas_jornais = relationship("VendaJornal", back_populates="militante")
|
||||||
assinaturas = relationship("AssinaturaAnual", back_populates="militante")
|
assinaturas = relationship("AssinaturaJornal", 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")
|
comprovantes = relationship("Comprovante", back_populates="militante")
|
||||||
|
vendas_jornais_avulsos = relationship("VendaJornalAvulso", back_populates="militante")
|
||||||
|
|
||||||
# Constantes para responsabilidades
|
# Constantes para responsabilidades
|
||||||
SECRETARIO = 1
|
SECRETARIO = 1
|
||||||
@@ -362,7 +363,7 @@ class VendaJornalAvulso(Base):
|
|||||||
valor_total = Column(Numeric(10, 2), nullable=False)
|
valor_total = Column(Numeric(10, 2), nullable=False)
|
||||||
data_venda = Column(Date, 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):
|
class AssinaturaAnual(Base):
|
||||||
__tablename__ = 'assinaturas_anuais'
|
__tablename__ = 'assinaturas_anuais'
|
||||||
@@ -624,8 +625,10 @@ class TransacaoPIX(Base):
|
|||||||
status = Column(String(20)) # Pendente, Pago, Expirado
|
status = Column(String(20)) # Pendente, Pago, Expirado
|
||||||
qr_code = Column(Text)
|
qr_code = Column(Text)
|
||||||
pagamento_id = Column(Integer, ForeignKey('pagamentos.id'))
|
pagamento_id = Column(Integer, ForeignKey('pagamentos.id'))
|
||||||
|
comprovante_id = Column(Integer, ForeignKey('comprovantes.id'))
|
||||||
|
|
||||||
pagamento = relationship("Pagamento", back_populates="transacoes_pix")
|
pagamento = relationship("Pagamento", back_populates="transacoes_pix")
|
||||||
|
comprovante = relationship("Comprovante", back_populates="transacoes_pix")
|
||||||
|
|
||||||
class TipoComprovante(Base):
|
class TipoComprovante(Base):
|
||||||
__tablename__ = 'tipos_comprovante'
|
__tablename__ = 'tipos_comprovante'
|
||||||
@@ -643,6 +646,31 @@ class Comprovante(Base):
|
|||||||
militante = relationship("Militante", back_populates="comprovantes")
|
militante = relationship("Militante", back_populates="comprovantes")
|
||||||
transacoes_pix = relationship("TransacaoPIX", back_populates="comprovante")
|
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():
|
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...")
|
||||||
|
|||||||
18
models/entities/assinatura_jornal.py
Normal file
18
models/entities/assinatura_jornal.py
Normal file
@@ -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")
|
||||||
15
models/entities/comprovante.py
Normal file
15
models/entities/comprovante.py
Normal file
@@ -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")
|
||||||
17
models/entities/cota_mensal.py
Normal file
17
models/entities/cota_mensal.py
Normal file
@@ -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")
|
||||||
17
models/entities/material_vendido.py
Normal file
17
models/entities/material_vendido.py
Normal file
@@ -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")
|
||||||
@@ -71,9 +71,11 @@ class Militante(Base):
|
|||||||
cotas_mensais = relationship("CotaMensal", back_populates="militante")
|
cotas_mensais = relationship("CotaMensal", back_populates="militante")
|
||||||
pagamentos = relationship("Pagamento", back_populates="militante")
|
pagamentos = relationship("Pagamento", back_populates="militante")
|
||||||
materiais_vendidos = relationship("MaterialVendido", back_populates="militante")
|
materiais_vendidos = relationship("MaterialVendido", back_populates="militante")
|
||||||
vendas_jornais = relationship("VendaJornalAvulso", back_populates="militante")
|
vendas_jornais_avulsos = relationship("VendaJornalAvulso", back_populates="militante")
|
||||||
assinaturas = relationship("AssinaturaAnual", 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])
|
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
|
||||||
|
|||||||
21
models/entities/pagamento.py
Normal file
21
models/entities/pagamento.py
Normal file
@@ -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")
|
||||||
13
models/entities/tipo_material.py
Normal file
13
models/entities/tipo_material.py
Normal file
@@ -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")
|
||||||
15
models/entities/venda_jornal.py
Normal file
15
models/entities/venda_jornal.py
Normal file
@@ -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])
|
||||||
15
models/entities/venda_jornal_avulso.py
Normal file
15
models/entities/venda_jornal_avulso.py
Normal file
@@ -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")
|
||||||
18
scripts/prepare_mvc.sh
Normal file → Executable file
18
scripts/prepare_mvc.sh
Normal file → Executable file
@@ -19,6 +19,24 @@ touch models/entities/__init__.py
|
|||||||
touch controllers/__init__.py
|
touch controllers/__init__.py
|
||||||
touch services/__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 "Todos os arquivos criados com sucesso!"
|
||||||
echo "Para usar a nova estrutura MVC, execute:"
|
echo "Para usar a nova estrutura MVC, execute:"
|
||||||
echo "1. chmod +x scripts/prepare_mvc.sh"
|
echo "1. chmod +x scripts/prepare_mvc.sh"
|
||||||
|
|||||||
Reference in New Issue
Block a user