Skip to content

Commit

Permalink
Merge pull request #7 from guivaloz:guivaloz/exhortos
Browse files Browse the repository at this point in the history
Guivaloz/exhortos
  • Loading branch information
guivaloz authored Apr 29, 2024
2 parents 46bb7aa + ee3bf18 commit 247e911
Show file tree
Hide file tree
Showing 23 changed files with 575 additions and 26 deletions.
9 changes: 9 additions & 0 deletions carina/app.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
PJECZ Carina API Key
"""

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi_pagination import add_pagination
Expand All @@ -11,8 +12,12 @@
from .v4.bitacoras.paths import bitacoras
from .v4.distritos.paths import distritos
from .v4.entradas_salidas.paths import entradas_salidas
from .v4.exh_exhortos.paths import exh_exhortos
from .v4.exh_exhortos_archivos.paths import exh_exhortos_archivos
from .v4.exh_exhortos_partes.paths import exh_exhortos_partes
from .v4.materias.paths import materias
from .v4.modulos.paths import modulos
from .v4.municipios.paths import municipios
from .v4.permisos.paths import permisos
from .v4.roles.paths import roles
from .v4.tareas.paths import tareas
Expand Down Expand Up @@ -46,8 +51,12 @@ def create_app() -> FastAPI:
app.include_router(bitacoras, include_in_schema=False)
app.include_router(distritos)
app.include_router(entradas_salidas, include_in_schema=False)
app.include_router(exh_exhortos)
app.include_router(exh_exhortos_archivos)
app.include_router(exh_exhortos_partes)
app.include_router(materias)
app.include_router(modulos, include_in_schema=False)
app.include_router(municipios)
app.include_router(permisos, include_in_schema=False)
app.include_router(roles, include_in_schema=False)
app.include_router(tareas, include_in_schema=False)
Expand Down
59 changes: 38 additions & 21 deletions carina/core/exh_exhortos/models.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
"""
Exhortos, modelos
Exh Exhortos, modelos
"""

from sqlalchemy import Boolean, Column, Date, Enum, ForeignKey, Integer, String
from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, func
from sqlalchemy.orm import relationship

from lib.database import Base
from lib.universal_mixin import UniversalMixin


class Exhorto(Base, UniversalMixin):
"""Exhorto"""
class ExhExhorto(Base, UniversalMixin):
"""ExhExhorto"""

# Nombre de la tabla
__tablename__ = "exhortos"
__tablename__ = "exh_exhortos"

# Clave primaria
id = Column(Integer, primary_key=True)
Expand All @@ -22,20 +22,19 @@ class Exhorto(Base, UniversalMixin):
exhorto_origen_id = Column(String(64), nullable=False, unique=True)

# Identificador INEGI del Municipio del Estado del PJ exhortado al que se quiere enviar el Exhorto
municipio_destino_id = Column(Integer, ForeignKey("municipios.id"), index=True, nullable=False)
municipio_destino = relationship("Municipio", back_populates="exhortos_destinos")
municipio_destino_id = Column(Integer, nullable=False)

# Clave de la materia (el que se obtuvo en la consulta de materias del PJ exhortado) al que el Exhorto hace referencia
materia_id = Column(Integer, ForeignKey("materias.id"), index=True, nullable=False)
materia = relationship("Materia", back_populates="exhortos")
materia = relationship("Materia", back_populates="exh_exhortos")

# Identificador INEGI del Estado de origen del Municipio donde se ubica el Juzgado del PJ exhortante
# estado_origen_id = Column(Integer, ForeignKey("estados.id"), index=True, nullable=False)
# estado_origen = relationship("Estado", back_populates="exhortos")

# Identificador INEGI del Municipio donde está localizado el Juzgado del PJ exhortante
municipio_origen_id = Column(Integer, ForeignKey("municipios.id"), index=True, nullable=False)
municipio_origen = relationship("Municipio", back_populates="exhortos_origenes")
municipio_origen = relationship("Municipio", back_populates="exh_exhortos_origenes")

# Identificador propio del Juzgado/Área que envía el Exhorto
juzgado_origen_id = Column(String(64))
Expand All @@ -44,19 +43,37 @@ class Exhorto(Base, UniversalMixin):
juzgado_origen_nombre = Column(String(256), nullable=False)

# El número de expediente (o carpeta procesal, carpeta...) que tiene el asunto en el Juzgado de Origen
# numeroExpedienteOrigen string SI
numero_expediente_origen = Column(String(256), nullable=False)

# numeroOficioOrigen string NO
# tipoJuicioAsuntoDelitos string SI
# juezExhortante string NO
# partes PersonaParte[] NO
# fojas int SI
# diasResponder int SI
# tipoDiligenciacionNombre string NO
# fechaOrigen datetime NO
# observaciones string NO
# archivos ArchivoARecibir[] SI
# El número del oficio con el que se envía el exhorto, el que corresponde al control interno del Juzgado de origen
numero_oficio_origen = Column(String(256))

# Nombre del tipo de Juicio, o asunto, listado de los delitos (para materia Penal) que corresponde al Expediente del cual el Juzgado envía el Exhorto
tipo_juicio_asunto_delitos = Column(String(256), nullable=False)

# Nombre completo del Juez del Juzgado o titular del Área que envía el Exhorto
juez_exhortante = Column(String(256))

# Número de fojas que contiene el exhorto. El valor 0 significa "No Especificado"
fojas = Column(Integer, nullable=False)

# Cantidad de dias a partir del día que se recibió en el Poder Judicial exhortado que se tiene para responder el Exhorto. El valor de 0 significa "No Especificado"
dias_responder = Column(Integer, nullable=False)

# Nombre del tipo de diligenciación que le corresponde al exhorto enviado. Este puede contener valores como "Oficio", "Petición de Parte"
tipo_diligenciacion_nombre = Column(String(256))

# Fecha y hora en que el Poder Judicial exhortante registró que se envió el exhorto en su hora local. En caso de no enviar este dato, el Poder Judicial exhortado puede tomar su fecha hora local.
fecha_origen = Column(DateTime, server_default=func.now())

# Texto simple que contenga información extra o relevante sobre el exhorto.
observaciones = Column(String(1024))

# Hijos
# PersonaParte[] NO Contiene la definición de las partes del Expediente
exh_exhortos_partes = relationship("ExhExhortoParte", back_populates="exh_exhorto", lazy="noload")
# ArchivoARecibir[] SI Colección de los datos referentes a los archivos que se van a recibir el Poder Judicial exhortado en el envío del Exhorto.
exh_exhortos_archivos = relationship("ExhExhortoArchivo", back_populates="exh_exhorto", lazy="noload")

@property
def estadoOrigenId(self):
Expand All @@ -75,4 +92,4 @@ def municipioOrigenId(self):

def __repr__(self):
"""Representación"""
return f"<Exhorto {self.id}>"
return f"<ExhExhorto {self.exhorto_origen_id}>"
45 changes: 45 additions & 0 deletions carina/core/exh_exhortos_archivos/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
"""
Exh Exhortos Archivos, modelos
"""

from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship

from lib.database import Base
from lib.universal_mixin import UniversalMixin


class ExhExhortoArchivo(Base, UniversalMixin):
"""ExhExhortoArchivo"""

# Nombre de la tabla
__tablename__ = "exh_exhortos_archivos"

# Clave primaria
id = Column(Integer, primary_key=True)

# Clave foránea
exh_exhorto_id = Column(Integer, ForeignKey("exh_exhortos.id"), index=True, nullable=False)
exh_exhorto = relationship("ExhExhorto", back_populates="exh_exhortos_archivos")

# Nombre del archivo, como se enviará. Este debe incluir el la extensión del archivo.
nombre_archivo = Column(String(256), nullable=False)

# Hash SHA1 en hexadecimal que corresponde al archivo a recibir. Esto para comprobar la integridad del archivo.
hash_sha1 = Column(String(256))

# Hash SHA256 en hexadecimal que corresponde al archivo a recibir. Esto apra comprobar la integridad del archivo.
hash_sha256 = Column(String(256))

# Identificador del tipo de documento que representa el archivo:
# 1 = Oficio
# 2 = Acuerdo
# 3 = Anexo
tipo_documento = Column(Integer, nullable=False)

# URL del archivo en Google Storage
url = Column(String(512), nullable=False, default="", server_default="")

def __repr__(self):
"""Representación"""
return f"<ExhExhortoArchivo {self.id}>"
58 changes: 58 additions & 0 deletions carina/core/exh_exhortos_partes/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
"""
Exh Exhortos Partes, modelos
"""

from sqlalchemy import Boolean, Column, Enum, ForeignKey, Integer, String
from sqlalchemy.orm import relationship

from lib.database import Base
from lib.universal_mixin import UniversalMixin


class ExhExhortoParte(Base, UniversalMixin):
"""ExhExhortoParte"""

GENEROS = {
"M": "MASCULINO",
"F": "FEMENINO",
}

# Nombre de la tabla
__tablename__ = "exh_exhortos_partes"

# Clave primaria
id = Column(Integer, primary_key=True)

# Clave foránea
exh_exhorto_id = Column(Integer, ForeignKey("exh_exhortos.id"), index=True, nullable=False)
exh_exhorto = relationship("ExhExhorto", back_populates="exh_exhortos_partes")

# Nombre de la parte, en el caso de persona moral, solo en nombre de la empresa o razón social.
nombre = Column(String(256), nullable=False)

# Apellido paterno de la parte. Solo cuando no sea persona moral.
apellido_paterno = Column(String(256))

# Apellido materno de la parte, si es que aplica para la persona. Solo cuando no sea persona moral.
apellido_materno = Column(String(256))

# 'M' = Masculino,
# 'F' = Femenino.
# Solo cuando aplique y se quiera especificar (que se tenga el dato). NO aplica para persona moral.
genero = Column(Enum(*GENEROS, name="tipos_generos", native_enum=False), nullable=True)

# Valor que indica si la parte es una persona moral.
es_persona_moral = Column(Boolean, nullable=False)

# Indica el tipo de parte:
# 1 = Actor, Promovente, Ofendido;
# 2 = Demandado, Inculpado, Imputado;
# 0 = No definido o se especifica en tipoParteNombre
tipo_parte = Column(Integer, nullable=False, default=0)

# Aquí se puede especificar el nombre del tipo de parte.
tipo_parte_nombre = Column(String(256))

def __repr__(self):
"""Representación"""
return f"<ExhExhortoParte {self.id}>"
2 changes: 1 addition & 1 deletion carina/core/materias/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class Materia(Base, UniversalMixin):
descripcion = Column(String(1024), nullable=False)

# Hijos
exhortos = relationship("Exhorto", back_populates="materia")
exh_exhortos = relationship("ExhExhorto", back_populates="materia")

def __repr__(self):
"""Representación"""
Expand Down
7 changes: 3 additions & 4 deletions carina/core/municipios/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,15 @@ class Municipio(Base, UniversalMixin):
id = Column(Integer, primary_key=True)

# Clave foránea
estado_id = Column(Integer, ForeignKey("estados.id"), index=True, nullable=False)
estado = relationship("Estado", back_populates="municipios")
# estado_id = Column(Integer, ForeignKey("estados.id"), index=True, nullable=False)
# estado = relationship("Estado", back_populates="municipios")

# Columnas
clave = Column(String(3), nullable=False)
nombre = Column(String(256), nullable=False)

# Hijos
exhortos_destinos = relationship("Exhorto", back_populates="municipio_destino")
exhortos_origenes = relationship("Exhorto", back_populates="municipio_origen")
exh_exhortos_origenes = relationship("ExhExhorto", back_populates="municipio_origen")

def __repr__(self):
"""Representación"""
Expand Down
Empty file added carina/v4/estados/__init__.py
Empty file.
Empty file.
27 changes: 27 additions & 0 deletions carina/v4/exh_exhortos/crud.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""
Exh Exhortos v4, CRUD (create, read, update, and delete)
"""

from typing import Any

from sqlalchemy.orm import Session

from lib.exceptions import MyIsDeletedError, MyNotExistsError

from ...core.exh_exhortos.models import ExhExhorto


def get_exh_exhortos(database: Session) -> Any:
"""Consultar los exhortos activos"""
consulta = database.query(ExhExhorto)
return consulta.filter_by(estatus="A").order_by(ExhExhorto.id)


def get_exh_exhorto(database: Session, exh_exhorto_id: int) -> ExhExhorto:
"""Consultar un exhorto por su id"""
exh_exhorto = database.query(ExhExhorto).get(exh_exhorto_id)
if exh_exhorto is None:
raise MyNotExistsError("No existe ese exhorto")
if exh_exhorto.estatus != "A":
raise MyIsDeletedError("No es activo ese exhorto, está eliminado")
return exh_exhorto
50 changes: 50 additions & 0 deletions carina/v4/exh_exhortos/paths.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
"""
Exh Exhortos v4, rutas (paths)
"""

from typing import Annotated

from fastapi import APIRouter, Depends, HTTPException, status
from fastapi_pagination.ext.sqlalchemy import paginate

from lib.database import Session, get_db
from lib.exceptions import MyAnyError
from lib.fastapi_pagination_custom_page import CustomPage

from ...core.permisos.models import Permiso
from ..usuarios.authentications import UsuarioInDB, get_current_active_user
from .crud import get_exh_exhortos, get_exh_exhorto
from .schemas import ExhExhortoOut, OneExhExhortoOut

exh_exhortos = APIRouter(prefix="/v4/exh_exhortos", tags=["exhortos"])


@exh_exhortos.get("", response_model=CustomPage[ExhExhortoOut])
async def paginado_exh_exhortos(
current_user: Annotated[UsuarioInDB, Depends(get_current_active_user)],
database: Annotated[Session, Depends(get_db)],
):
"""Paginado de exhortos"""
if current_user.permissions.get("EXH EXHORTOS", 0) < Permiso.VER:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Forbidden")
try:
resultados = get_exh_exhortos(database)
except MyAnyError as error:
return CustomPage(success=False, errors=[str(error)])
return paginate(resultados)


@exh_exhortos.get("/{exh_exhorto_id}", response_model=OneExhExhortoOut)
async def detalle_exh_exhorto(
current_user: Annotated[UsuarioInDB, Depends(get_current_active_user)],
database: Annotated[Session, Depends(get_db)],
exh_exhorto_id: int,
):
"""Detalle de una exhorto a partir de su id"""
if current_user.permissions.get("EXH EXHORTOS", 0) < Permiso.VER:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Forbidden")
try:
exh_exhorto = get_exh_exhorto(database, exh_exhorto_id)
except MyAnyError as error:
return OneExhExhortoOut(success=False, errors=[str(error)])
return OneExhExhortoOut.model_validate(exh_exhorto)
27 changes: 27 additions & 0 deletions carina/v4/exh_exhortos/schemas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""
Exh Exhortos v4, esquemas de pydantic
"""

from pydantic import BaseModel, ConfigDict

from lib.schemas_base import OneBaseOut


class ExhExhortoOut(BaseModel):
"""Esquema para entregar plural"""

id: int | None = None
exhorto_origen_id: str | None = None
municipio_destino_id: int | None = None
materia_id: int | None = None
materia_nombre: str | None = None
estado_origen_id: int | None = None
municipio_origen_id: int | None = None
juzgado_origen_id: str | None = None
juzgado_origen_nombre: str | None = None
numero_expediente_origen: str | None = None
model_config = ConfigDict(from_attributes=True)


class OneExhExhortoOut(ExhExhortoOut, OneBaseOut):
"""Esquema para entregar un singular"""
Empty file.
Loading

0 comments on commit 247e911

Please sign in to comment.