Skip to main content

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

Sites

Fronts

Statuses

Measurement Units

Steps (PTE)

Steps (OT)

Responsible Parties

Clients

Types

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'),
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)
id_partida
string
required
Unique partida identifier (e.g., “C-1-001”)
descripcion_concepto
string
required
Description of the work concept
anexo
string
Anexo reference (e.g., “C-1”, “C-2”)
id_sitio
integer
Site where product applies
id_tipo_partida
integer
required
Partida type (nivel_afectacion: 3)
id_unidad_medida
integer
required
Measurement unit ID
precio_unitario_mn
number
Unit price in MXN
precio_unitario_usd
number
Unit price in USD

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'
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:
list
GET
/catalogos/{catalog}/ - Display catalog list page
datatable
POST
/catalogos/datatable_{catalog}/ - DataTable pagination endpoint
create
POST
/catalogos/{catalog}/crear/ - Create new record
get
POST
/catalogos/{catalog}/obtener/ - Get single record
edit
POST
/catalogos/{catalog}/editar/ - Update existing record
delete
POST
/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)

Build docs developers (and LLMs) love