Overview
The Catalogs API provides CRUD operations for all master data catalogs used throughout the system, including products, sites, fronts, statuses, measurement units, and more.
Catalog Types
The system manages the following catalogs:
Products (Productos)
List Products
From operaciones/urls.py:77-82:
path( 'catalogos/producto/' , catalogos.lista_producto, name = 'lista_producto' ),
path( 'catalogos/producto/datatable_producto/' , catalogos.datatable_producto, name = 'datatable_producto' ),
path( 'catalogos/producto/crear/' , catalogos.crear_producto, name = 'crear_producto' ),
path( 'catalogos/producto/eliminar/' , catalogos.eliminar_producto, name = 'eliminar_producto' ),
path( 'catalogos/producto/obtener/' , catalogos.obtener_producto, name = 'obtener_producto' ),
path( 'catalogos/producto/editar/' , catalogos.editar_producto, name = 'editar_producto' ),
Get Product
Create Product
curl -X POST "https://api.sascop-bme-subtec.com/operaciones/catalogos/producto/obtener/" \
-H "Cookie: sessionid=your_session_id" \
-H "X-CSRFToken: your_csrf_token" \
-H "Content-Type: application/json" \
-d '{"producto_id": 1}'
Product Model
From operaciones/models/produccion_models.py:5-20:
class Producto ( models . Model ):
id_partida = models.CharField( max_length = 100 )
descripcion_concepto = models.TextField( null = True , blank = True )
anexo = models.CharField( max_length = 100 , blank = True , null = True )
id_sitio = models.ForeignKey(Sitio, on_delete = models. CASCADE )
id_tipo_partida = models.ForeignKey(Tipo, on_delete = models. CASCADE )
id_unidad_medida = models.ForeignKey(UnidadMedida, on_delete = models. CASCADE )
precio_unitario_mn = models.DecimalField( max_digits = 15 , decimal_places = 2 )
precio_unitario_usd = models.DecimalField( max_digits = 15 , decimal_places = 2 )
activo = models.BooleanField( default = True )
comentario = models.TextField( blank = True , null = True )
Unique partida identifier (e.g., “C-1-001”)
Description of the work concept
Anexo reference (e.g., “C-1”, “C-2”)
Site where product applies
Partida type (nivel_afectacion: 3)
Sites (Sitios)
From operaciones/urls.py:136-141:
path( 'catalogos/sitios/' , catalogos.lista_sitios, name = 'lista_sitios' ),
path( 'catalogos/datatable_sitios/' , catalogos.datatable_sitios, name = 'datatable_sitios' ),
path( 'catalogos/sitios/crear/' , catalogos.crear_sitio, name = 'crear_sitio' ),
path( 'catalogos/sitios/eliminar/' , catalogos.eliminar_sitio, name = 'eliminar_sitio' ),
path( 'catalogos/sitios/obtener/' , catalogos.obtener_sitio, name = 'obtener_sitio' ),
path( 'catalogos/sitios/editar/' , catalogos.editar_sitio, name = 'editar_sitio' ),
Site Model
From operaciones/models/catalogos_models.py:52-61:
class Sitio ( models . Model ):
descripcion = models.CharField( max_length = 100 )
activo = models.BooleanField( default = True )
id_frente = models.ForeignKey(Frente, on_delete = models. CASCADE , blank = True , null = True )
comentario = models.TextField( blank = True , null = True )
class Meta :
db_table = 'sitio'
Create Site
Get Sites by Front
curl -X POST "https://api.sascop-bme-subtec.com/operaciones/catalogos/sitios/crear/" \
-H "Cookie: sessionid=your_session_id" \
-H "X-CSRFToken: your_csrf_token" \
-H "Content-Type: application/json" \
-d '{
"descripcion": "Plataforma Delta",
"id_frente": 2,
"activo": true,
"comentario": "Nueva plataforma en Golfo de México"
}'
Fronts (Frentes)
From operaciones/urls.py:128-133:
path( 'catalogos/frentes/' , catalogos.lista_frentes, name = 'lista_frentes' ),
path( 'catalogos/datatable_frentes/' , catalogos.datatable_frentes, name = 'datatable_frentes' ),
path( 'catalogos/frentes/crear/' , catalogos.crear_frente, name = 'crear_frente' ),
path( 'catalogos/frentes/eliminar/' , catalogos.eliminar_frente, name = 'eliminar_frente' ),
path( 'catalogos/frentes/obtener/' , catalogos.obtener_frente, name = 'obtener_frente' ),
path( 'catalogos/frentes/editar/' , catalogos.editar_frente, name = 'editar_frente' ),
Frente Model
From operaciones/models/catalogos_models.py:21-31:
class Frente ( models . Model ):
descripcion = models.CharField( max_length = 200 )
nivel_afectacion = models.IntegerField( blank = True , null = True )
comentario = models.TextField( blank = True , null = True )
activo = models.BooleanField( default = True )
class Meta :
db_table = 'frente'
Statuses (Estatus)
From operaciones/urls.py:112-117:
path( 'catalogos/estatus/' , catalogos.lista_cobro, name = 'lista_estatus' ),
path( 'catalogos/datatable_estcobro/' , catalogos.datatable_cobro, name = 'datatable_cobro' ),
path( 'catalogos/estatus/crear/' , catalogos.crear_estatus, name = 'crear_estatus' ),
path( 'catalogos/estatus/eliminar/' , catalogos.eliminar_estatus, name = 'eliminar_estatus' ),
path( 'catalogos/estatus/obtener/' , catalogos.obtener_estatus, name = 'obtener_estatus' ),
path( 'catalogos/estatus/editar/' , catalogos.editar_estatus, name = 'editar_estatus' ),
Estatus Model
From operaciones/models/catalogos_models.py:33-50:
class Estatus ( models . Model ):
TIPO_AFECTACION = [
( '1' , 'PTE' ),
( '2' , 'OT' ),
( '3' , 'COBRO' ),
( '4' , 'PASOS PTE' ),
]
descripcion = models.CharField( max_length = 100 )
nivel_afectacion = models.IntegerField( choices = TIPO_AFECTACION , default = 0 )
comentario = models.TextField( blank = True , null = True )
activo = models.BooleanField( default = True )
class Meta :
db_table = 'cat_estatus'
Status Levels (nivel_afectacion) :
1 : PTE status
2 : OT status
3 : Billing status (COBRO)
4 : Step status for PTEs
5 : Monthly report close status
6 : Daily operational status
Measurement Units (Unidades de Medida)
From operaciones/urls.py:120-125:
path( 'catalogos/unidad_medida/' , catalogos.lista_unidad_medida, name = 'lista_unidad_medida' ),
path( 'catalogos/datatable_unidad_medida/' , catalogos.datatable_unidad_medida, name = 'datatable_unidad_medida' ),
path( 'catalogos/unidad_medida/crear/' , catalogos.crear_unidad_medida, name = 'crear_unidad_medida' ),
path( 'catalogos/unidad_medida/eliminar/' , catalogos.eliminar_unidad_medida, name = 'eliminar_unidad_medida' ),
path( 'catalogos/unidad_medida/obtener/' , catalogos.obtener_unidad_medida, name = 'obtener_unidad_medida' ),
path( 'catalogos/unidad_medida/editar/' , catalogos.editar_unidad_medida, name = 'editar_unidad_medida' ),
UnidadMedida Model
From operaciones/models/catalogos_models.py:63-72:
class UnidadMedida ( models . Model ):
descripcion = models.CharField( max_length = 50 )
clave = models.CharField( max_length = 10 )
activo = models.BooleanField( default = True )
comentario = models.TextField( blank = True , null = True )
class Meta :
db_table = 'unidad_medida'
Steps - PTE (Pasos)
From operaciones/urls.py:144-149:
path( 'catalogos/pasos/' , catalogos.lista_pasos, name = 'lista_pasos' ),
path( 'catalogos/datatable_pasos/' , catalogos.datatable_pasos, name = 'datatable_pasos' ),
path( 'catalogos/pasos/crear/' , catalogos.crear_paso, name = 'crear_paso' ),
path( 'catalogos/pasos/eliminar/' , catalogos.eliminar_paso, name = 'eliminar_paso' ),
path( 'catalogos/pasos/obtener/' , catalogos.obtener_paso, name = 'obtener_paso' ),
path( 'catalogos/pasos/editar/' , catalogos.editar_paso, name = 'editar_paso' ),
Paso Model
From operaciones/models/pte_models.py:4-17:
class Paso ( models . Model ):
descripcion = models.CharField( max_length = 200 )
orden = models.CharField( blank = True , null = True , max_length = 10 )
activo = models.BooleanField( default = True )
importancia = models.FloatField( default = 0 )
tipo = models.IntegerField( blank = True , null = True , default = 1 )
comentario = models.TextField( blank = True , null = True )
id_tipo_cliente = models.ForeignKey(Tipo, on_delete = models. CASCADE , null = True , blank = True )
class Meta :
ordering = [ 'orden' ]
Steps - OT (Pasos OT)
From operaciones/urls.py:152-157:
path( 'catalogos/pasos_ot/' , catalogos.lista_pasos_ot, name = 'lista_pasos_ot' ),
path( 'catalogos/datatable_pasos_ot/' , catalogos.datatable_pasos_ot, name = 'datatable_pasos_ot' ),
path( 'catalogos/pasos_ot/crear/' , catalogos.crear_paso_ot, name = 'crear_paso_ot' ),
path( 'catalogos/pasos_ot/eliminar/' , catalogos.eliminar_paso_ot, name = 'eliminar_paso_ot' ),
path( 'catalogos/pasos_ot/obtener/' , catalogos.obtener_paso_ot, name = 'obtener_paso_ot' ),
path( 'catalogos/pasos_ot/editar/' , catalogos.editar_paso_ot, name = 'editar_paso_ot' ),
PasoOt Model
From operaciones/models/ote_models.py:95-109:
class PasoOt ( models . Model ):
descripcion = models.CharField( max_length = 200 )
orden = models.CharField( blank = True , null = True , max_length = 10 )
activo = models.BooleanField( default = True )
importancia = models.FloatField( default = 0 , blank = True , null = True )
tipo = models.ForeignKey(Tipo, on_delete = models. CASCADE , blank = True , null = True )
comentario = models.TextField( blank = True , null = True )
id_tipo_cliente = models.ForeignKey(Tipo, on_delete = models. CASCADE , null = True , blank = True )
class Meta :
ordering = [ 'orden' ]
Responsible Parties (Responsables)
From operaciones/urls.py:160-165:
path( 'catalogos/responsable/' , catalogos.lista_responsable, name = 'lista_responsable' ),
path( 'catalogos/datatable_responsable/' , catalogos.datatable_responsable, name = 'datatable_responsable' ),
path( 'catalogos/responsable/crear/' , catalogos.crear_responsable, name = 'crear_responsable' ),
path( 'catalogos/responsable/eliminar/' , catalogos.eliminar_responsable, name = 'eliminar_responsable' ),
path( 'catalogos/responsable/obtener/' , catalogos.obtener_responsable, name = 'obtener_responsable' ),
path( 'catalogos/responsable/editar/' , catalogos.editar_responsable, name = 'editar_responsable' ),
ResponsableProyecto Model
From operaciones/models/catalogos_models.py:74-82:
class ResponsableProyecto ( models . Model ):
descripcion = models.CharField( max_length = 50 )
activo = models.BooleanField( default = True )
comentario = models.TextField( blank = True , null = True )
class Meta :
db_table = 'responsable_proyecto'
Clients (Clientes)
From operaciones/urls.py:168-173:
path( 'catalogos/cliente/' , catalogos.lista_cliente, name = 'lista_cliente' ),
path( 'catalogos/datatable_cliente/' , catalogos.datatable_cliente, name = 'datatable_cliente' ),
path( 'catalogos/cliente/crear/' , catalogos.crear_cliente, name = 'crear_cliente' ),
path( 'catalogos/cliente/eliminar/' , catalogos.eliminar_cliente, name = 'eliminar_cliente' ),
path( 'catalogos/cliente/obtener/' , catalogos.obtener_cliente, name = 'obtener_cliente' ),
path( 'catalogos/cliente/editar/' , catalogos.editar_cliente, name = 'editar_cliente' ),
Cliente Model
From operaciones/models/catalogos_models.py:84-93:
class Cliente ( models . Model ):
descripcion = models.CharField( max_length = 100 )
id_tipo = models.ForeignKey(Tipo, on_delete = models. CASCADE , blank = True , null = True )
activo = models.BooleanField( default = True )
comentario = models.TextField( blank = True , null = True )
class Meta :
db_table = 'cliente'
Types (Tipos)
From operaciones/urls.py:96-101:
path( 'catalogos/tipos/' , catalogos.lista_tipos, name = 'lista_tipos' ),
path( 'catalogos/tipos/datatable_tipos/' , catalogos.datatable_tipos, name = 'datatable_tipos' ),
path( 'catalogos/tipos/crear/' , catalogos.crear_tipos, name = 'crear_tipos' ),
path( 'catalogos/tipos/eliminar/' , catalogos.eliminar_tipos, name = 'eliminar_tipos' ),
path( 'catalogos/tipos/obtener/' , catalogos.obtener_tipos, name = 'obtener_tipos' ),
path( 'catalogos/tipos/editar/' , catalogos.editar_tipos, name = 'editar_tipos' ),
Tipo Model
From operaciones/models/catalogos_models.py:2-19:
class Tipo ( models . Model ):
TIPO_CHOICES = [
( '1' , 'PTE' ),
( '2' , 'OT' ),
( '3' , 'PARTIDA' ),
( '4' , 'PRODUCCION' )
]
descripcion = models.CharField( max_length = 200 )
nivel_afectacion = models.IntegerField( choices = TIPO_CHOICES , default = 0 )
comentario = models.TextField( blank = True , null = True )
activo = models.BooleanField( default = True )
class Meta :
db_table = 'tipo'
Common Catalog Endpoints
All catalogs follow a similar endpoint structure:
/catalogos/{catalog}/ - Display catalog list page
/catalogos/datatable_{catalog}/ - DataTable pagination endpoint
/catalogos/{catalog}/crear/ - Create new record
/catalogos/{catalog}/obtener/ - Get single record
/catalogos/{catalog}/editar/ - Update existing record
/catalogos/{catalog}/eliminar/ - Delete record
Master Concepts (Conceptos Maestros)
For contract management:
path( 'catalogos/conceptos/ordinarios/' , catalogos.lista_conceptos_ordinarios),
path( 'catalogos/conceptos/extraordinarios/' , catalogos.lista_conceptos_extraordinarios),
path( 'catalogos/concepto/datatable_concepto/' , catalogos.datatable_conceptos),
path( 'catalogos/concepto/pues_disponibles/' , catalogos.datatable_pues_disponibles),
path( 'catalogos/concepto/convertir_pue/' , catalogos.convertir_pue_a_ordinario),
ConceptoMaestro Model
From operaciones/models/catalogos_models.py:189-221:
class ConceptoMaestro ( models . Model ):
sub_anexo = models.ForeignKey(SubAnexo, on_delete = models. CASCADE )
partida_ordinaria = models.CharField( max_length = 50 , null = True )
codigo_interno = models.CharField( max_length = 50 , blank = True )
descripcion = models.TextField()
unidad_medida = models.ForeignKey(UnidadMedida, on_delete = models. PROTECT )
cantidad = models.DecimalField( max_digits = 20 , decimal_places = 2 , default = 0 )
precio_unitario_mn = models.DecimalField( max_digits = 18 , decimal_places = 2 , default = 0 )
precio_unitario_usd = models.DecimalField( max_digits = 18 , decimal_places = 2 , default = 0 )
id_tipo_partida = models.ForeignKey(Tipo, on_delete = models. CASCADE )
# For PUEs (Extraordinary items)
partida_extraordinaria = models.CharField( max_length = 50 , null = True )
pte_creacion = models.CharField( max_length = 100 , null = True )
ot_creacion = models.CharField( max_length = 100 , null = True )
fecha_autorizacion = models.DateField( null = True )
estatus = models.CharField( max_length = 20 , blank = True )
activo = models.BooleanField( default = True )