eco-back 0.2.4__py3-none-any.whl → 0.2.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- eco_back/__init__.py +2 -1
- eco_back/models/__init__.py +0 -0
- eco_back/models/registro.py +256 -0
- eco_back/models/sistema.py +2503 -0
- eco_back/models/static.py +1127 -0
- eco_back/models/usuario.py +638 -0
- {eco_back-0.2.4.dist-info → eco_back-0.2.5.dist-info}/METADATA +1 -1
- {eco_back-0.2.4.dist-info → eco_back-0.2.5.dist-info}/RECORD +11 -6
- {eco_back-0.2.4.dist-info → eco_back-0.2.5.dist-info}/WHEEL +0 -0
- {eco_back-0.2.4.dist-info → eco_back-0.2.5.dist-info}/licenses/LICENSE +0 -0
- {eco_back-0.2.4.dist-info → eco_back-0.2.5.dist-info}/top_level.txt +0 -0
eco_back/__init__.py
CHANGED
|
@@ -10,5 +10,6 @@ from . import api
|
|
|
10
10
|
from . import documento
|
|
11
11
|
from . import registro
|
|
12
12
|
from . import utils
|
|
13
|
+
from . import models
|
|
13
14
|
|
|
14
|
-
__all__ = ["database", "api", "documento", "registro", "utils", "__version__"]
|
|
15
|
+
__all__ = ["database", "api", "documento", "registro", "utils", "models", "__version__"]
|
|
File without changes
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modelos de registro y trazabilidad del sistema eco-back.
|
|
3
|
+
|
|
4
|
+
Este módulo contiene los modelos de Django para gestionar registros de solicitudes,
|
|
5
|
+
radicados, estados, trazabilidad y auditoría de procesos en el sistema UNP.
|
|
6
|
+
"""
|
|
7
|
+
from django.db import models
|
|
8
|
+
from django.contrib.contenttypes.models import ContentType
|
|
9
|
+
from django.db import connection
|
|
10
|
+
import uuid
|
|
11
|
+
from django.db.models import Max
|
|
12
|
+
from django.db import transaction
|
|
13
|
+
|
|
14
|
+
from eco_back.models.static import CanalSolicitud, EstadoEspecifico, FuenteSolicitud, TipoConsulta, TipoCorreccion, TipoEstudio, TipoRuta
|
|
15
|
+
from eco_back.models.usuario import DatosBasicosUsuario
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
##### MODELOS DE REGISTRO BASE #######
|
|
19
|
+
|
|
20
|
+
class Registro(models.Model):
|
|
21
|
+
"""
|
|
22
|
+
Modelo base para registros de solicitudes.
|
|
23
|
+
|
|
24
|
+
Almacena la información general de un registro que puede ser de diferentes tipos
|
|
25
|
+
(personas, colectivos, etc.). Contiene los campos que definen la ruta, canal y
|
|
26
|
+
tipo de estudio del registro.
|
|
27
|
+
|
|
28
|
+
Attributes:
|
|
29
|
+
registro: Identificador único autonumérico del registro.
|
|
30
|
+
objects_id: ID del objeto relacionado (para relaciones genéricas).
|
|
31
|
+
content_type: Tipo de contenido al que pertenece el registro.
|
|
32
|
+
ruta: Ruta de atención asignada al registro.
|
|
33
|
+
canal: Canal por el cual se recibió la solicitud.
|
|
34
|
+
fuente: Fuente de origen de la solicitud.
|
|
35
|
+
tipo_estudio: Tipo de estudio o análisis a realizar.
|
|
36
|
+
|
|
37
|
+
Methods:
|
|
38
|
+
get_next_registro: Obtiene el siguiente número de registro de la secuencia.
|
|
39
|
+
"""
|
|
40
|
+
registro = models.AutoField(primary_key=True)
|
|
41
|
+
objects_id = models.CharField(blank=True, null=True, max_length=50)
|
|
42
|
+
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=True, null=True)
|
|
43
|
+
ruta = models.ForeignKey(TipoRuta, to_field='id_truta', on_delete=models.CASCADE, null=True, blank=True)
|
|
44
|
+
canal = models.ForeignKey(CanalSolicitud, to_field='id_csolicitud', on_delete=models.CASCADE, null=True, blank=True)
|
|
45
|
+
fuente = models.ForeignKey(FuenteSolicitud, to_field='id_fsolicitud', on_delete=models.CASCADE)
|
|
46
|
+
tipo_estudio = models.ForeignKey(TipoEstudio, to_field='id_estudio', on_delete=models.CASCADE, null=True, blank=True)
|
|
47
|
+
|
|
48
|
+
class Meta:
|
|
49
|
+
db_table = 'eco_reg_registro'
|
|
50
|
+
verbose_name_plural = 'Registro'
|
|
51
|
+
|
|
52
|
+
@classmethod
|
|
53
|
+
def get_next_registro(cls):
|
|
54
|
+
with connection.cursor() as cursor:
|
|
55
|
+
cursor.execute("SELECT nextval('eco_reg_registro_id_seq')")
|
|
56
|
+
row = cursor.fetchone()
|
|
57
|
+
return row[0]
|
|
58
|
+
|
|
59
|
+
def __str__(self):
|
|
60
|
+
return str(self.registro)
|
|
61
|
+
|
|
62
|
+
class Radicado(models.Model):
|
|
63
|
+
"""
|
|
64
|
+
Modelo para radicados de solicitudes.
|
|
65
|
+
|
|
66
|
+
Almacena el número de radicación de un registro, incluyendo la sede,
|
|
67
|
+
fecha de asignación y consecutivo para control de orden.
|
|
68
|
+
|
|
69
|
+
Attributes:
|
|
70
|
+
id_radicado: Identificador único UUID del radicado.
|
|
71
|
+
registro: Relación con el registro base.
|
|
72
|
+
fecha_asignacion: Fecha en que se asignó el radicado.
|
|
73
|
+
numero_radicado: Número de radicación oficial.
|
|
74
|
+
sede: Sede donde se radicó la solicitud.
|
|
75
|
+
consecutivo: Número secuencial del radicado.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
class Meta:
|
|
79
|
+
db_table = 'eco_reg_radicado'
|
|
80
|
+
verbose_name_plural = 'Número de radicado'
|
|
81
|
+
ordering = ['consecutivo'] # esto asegura que siempre salgan en orden
|
|
82
|
+
|
|
83
|
+
def save(self, *args, **kwargs):
|
|
84
|
+
# Asigna el consecutivo solo si no se ha definido
|
|
85
|
+
if self.consecutivo is None:
|
|
86
|
+
ultimo = EstadoRegistro.objects.filter(registro=self.registro).aggregate(Max('consecutivo'))['consecutivo__max']
|
|
87
|
+
self.consecutivo = (ultimo or 0) + 1
|
|
88
|
+
super().save(*args, **kwargs)
|
|
89
|
+
|
|
90
|
+
def __str__(self):
|
|
91
|
+
return str(self.id_radicado)
|
|
92
|
+
|
|
93
|
+
class FechaTerminos(models.Model):
|
|
94
|
+
"""
|
|
95
|
+
Modelo para fechas de términos de un registro.
|
|
96
|
+
|
|
97
|
+
Almacena las fechas de inicio y fin de los términos de procesamiento
|
|
98
|
+
de una solicitud.
|
|
99
|
+
|
|
100
|
+
Attributes:
|
|
101
|
+
id_fterminos: Identificador único UUID del registro.
|
|
102
|
+
fecha_inicio: Fecha de inicio de los términos.
|
|
103
|
+
fecha_fin: Fecha de finalización de los términos.
|
|
104
|
+
registro: Relación con el registro base.
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
class Meta:
|
|
108
|
+
db_table = 'eco_reg_fterminos'
|
|
109
|
+
verbose_name_plural = 'Fecha terminos'
|
|
110
|
+
ordering = ['-fecha_inicio'] # descendente: más reciente primero
|
|
111
|
+
|
|
112
|
+
def __str__(self):
|
|
113
|
+
return str(self.id_fterminos)
|
|
114
|
+
|
|
115
|
+
class EstadoRegistro(models.Model):
|
|
116
|
+
"""
|
|
117
|
+
Modelo para seguimiento de estados de un registro.
|
|
118
|
+
|
|
119
|
+
Mantiene un historial de los estados por los que pasa un registro,
|
|
120
|
+
con numeración secuencial de los cambios de estado.
|
|
121
|
+
|
|
122
|
+
Attributes:
|
|
123
|
+
id_estado: Identificador único UUID del estado.
|
|
124
|
+
estado: Estado específico asignado al registro.
|
|
125
|
+
registro: Relación con el registro base.
|
|
126
|
+
consecutivo: Número secuencial del cambio de estado.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
class Meta:
|
|
130
|
+
db_table = 'eco_reg_estadoregistro'
|
|
131
|
+
verbose_name_plural = 'estados del registro'
|
|
132
|
+
ordering = ['consecutivo'] # esto asegura que siempre salgan en orden
|
|
133
|
+
|
|
134
|
+
def save(self, *args, **kwargs):
|
|
135
|
+
# Asigna el consecutivo solo si no se ha definido
|
|
136
|
+
if self.consecutivo is None:
|
|
137
|
+
ultimo = EstadoRegistro.objects.filter(registro=self.registro).aggregate(Max('consecutivo'))['consecutivo__max']
|
|
138
|
+
self.consecutivo = (ultimo or 0) + 1
|
|
139
|
+
super().save(*args, **kwargs)
|
|
140
|
+
|
|
141
|
+
def __str__(self):
|
|
142
|
+
return str(self.id_estado)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
##### MODELOS DE TRAZABILIDAD Y AUDITORíA #######
|
|
146
|
+
|
|
147
|
+
class Trazabilidad(models.Model):
|
|
148
|
+
"""
|
|
149
|
+
Modelo para trazabilidad de procesamiento de registros.
|
|
150
|
+
|
|
151
|
+
Registra el movimiento y procesamiento de un registro a través del flujo,
|
|
152
|
+
incluyendo fechas de recepción, finalización, usuario que lo procesa
|
|
153
|
+
y estado actual.
|
|
154
|
+
|
|
155
|
+
Attributes:
|
|
156
|
+
id_traza: Identificador único UUID del registro de trazabilidad.
|
|
157
|
+
fecha_recibido: Fecha y hora en que se recibió el registro.
|
|
158
|
+
fecha_finalizado: Fecha y hora en que se finalizó el procesamiento.
|
|
159
|
+
usuario: Usuario que procesó el registro.
|
|
160
|
+
registro: Relación con el registro base.
|
|
161
|
+
estado_trazabilidad: Indicador del estado de procesamiento.
|
|
162
|
+
estado_registro: Estado actual del registro.
|
|
163
|
+
observacion: Notas u observaciones sobre el procesamiento.
|
|
164
|
+
"""
|
|
165
|
+
id_traza = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
166
|
+
fecha_recibido = models.DateTimeField(blank=True,null=True)
|
|
167
|
+
fecha_finalizado = models.DateTimeField(blank=True,null=True)
|
|
168
|
+
usuario = models.ForeignKey(DatosBasicosUsuario, to_field='id_busuario', on_delete=models.CASCADE,null=True,blank=True)
|
|
169
|
+
registro = models.ForeignKey(Registro, to_field='registro', on_delete=models.CASCADE,null=True,blank=True)
|
|
170
|
+
estado_trazabilidad = models.BooleanField(default=False)
|
|
171
|
+
estado_registro = models.ForeignKey(EstadoEspecifico, to_field='id_eespecifico', on_delete=models.CASCADE,null=True,blank=True)
|
|
172
|
+
observacion = models.CharField(max_length=500, null=True)
|
|
173
|
+
|
|
174
|
+
class Meta:
|
|
175
|
+
db_table = 'eco_reg_trazabilidad'
|
|
176
|
+
verbose_name_plural = 'trazabilidad'
|
|
177
|
+
ordering = ['fecha_recibido'] # ascendente
|
|
178
|
+
|
|
179
|
+
def __str__(self):
|
|
180
|
+
return str(self.id_traza)
|
|
181
|
+
|
|
182
|
+
def crear_trazabilidad_manual(**kwargs):
|
|
183
|
+
"""
|
|
184
|
+
Función para crear registros de trazabilidad manualmente.
|
|
185
|
+
|
|
186
|
+
Crea un nuevo registro de trazabilidad de forma atómica,
|
|
187
|
+
asignando automáticamente el próximo ID disponible.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
**kwargs: Parámetros para inicializar el modelo Trazabilidad.
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
Trazabilidad: Instancia del registro de trazabilidad creado.
|
|
194
|
+
"""
|
|
195
|
+
with transaction.atomic():
|
|
196
|
+
ultimo_id = Trazabilidad.objects.aggregate(max_id=Max('id_traza'))['max_id'] or 0
|
|
197
|
+
nuevo_id = ultimo_id + 1
|
|
198
|
+
|
|
199
|
+
trazabilidad = Trazabilidad(
|
|
200
|
+
id_traza=nuevo_id,
|
|
201
|
+
**kwargs
|
|
202
|
+
)
|
|
203
|
+
trazabilidad.save()
|
|
204
|
+
return trazabilidad
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
class CorreccionRegistro(models.Model):
|
|
208
|
+
"""
|
|
209
|
+
Modelo para correcciones realizadas a registros.
|
|
210
|
+
|
|
211
|
+
Almacena las correcciones que se realizan a un registro durante su
|
|
212
|
+
procesamiento, incluyendo el tipo de corrección y descripción.
|
|
213
|
+
|
|
214
|
+
Attributes:
|
|
215
|
+
id_correccion: Identificador único UUID de la corrección.
|
|
216
|
+
trazabilidad: Relación con el registro de trazabilidad donde se realizó.
|
|
217
|
+
tipo: Tipo de corrección realizada.
|
|
218
|
+
descripcion: Descripción detallada de la corrección.
|
|
219
|
+
"""
|
|
220
|
+
|
|
221
|
+
class Meta:
|
|
222
|
+
db_table = 'eco_reg_correccionregistro'
|
|
223
|
+
verbose_name_plural = 'Correcciones de registro'
|
|
224
|
+
|
|
225
|
+
def __str__(self):
|
|
226
|
+
return str(self.id_correccion)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
##### MODELOS DE CONSULTAS #######
|
|
230
|
+
|
|
231
|
+
# Creación del modelo para guardar el historial de consultas sigob
|
|
232
|
+
class HistorialConsultaAplicativos(models.Model):
|
|
233
|
+
"""
|
|
234
|
+
Modelo para historial de consultas a aplicativos externos.
|
|
235
|
+
|
|
236
|
+
Registra todas las consultas realizadas a aplicativos externos como SIGOB,
|
|
237
|
+
incluyendo fecha, tipo de consulta y usuario que la realizó.
|
|
238
|
+
|
|
239
|
+
Attributes:
|
|
240
|
+
id_historial: Identificador único UUID del registro.
|
|
241
|
+
usuario: Usuario que realizó la consulta.
|
|
242
|
+
codigo_registro: Código o identificador del registro consultado.
|
|
243
|
+
fecha_consulta: Fecha y hora de la consulta (auto-asignada).
|
|
244
|
+
tipo_consulta: Tipo de consulta realizada.
|
|
245
|
+
"""
|
|
246
|
+
id_historial = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
247
|
+
usuario = models.ForeignKey(DatosBasicosUsuario, to_field='id_busuario', on_delete=models.CASCADE)
|
|
248
|
+
codigo_registro = models.CharField(max_length=50)
|
|
249
|
+
fecha_consulta = models.DateTimeField(auto_now_add=True)
|
|
250
|
+
tipo_consulta = models.ForeignKey(TipoConsulta, to_field='id_tconsulta', on_delete=models.CASCADE, null=True, blank=True)
|
|
251
|
+
class Meta:
|
|
252
|
+
db_table = 'eco_reg_historial_consultas'
|
|
253
|
+
verbose_name_plural = 'Historial de consultas a SIGOB'
|
|
254
|
+
|
|
255
|
+
def __str__(self):
|
|
256
|
+
return str(self.id_historial)
|