Skip to main content

Overview

Catalogs define the master data used throughout SASCOP BME SubTec. This guide covers how administrators configure and maintain these critical system components.
Catalog changes affect all modules. Test changes carefully and communicate updates to users.

Catalog Overview

Tipos (Types)

Classifications for PTEs, work orders, and concepts

Estatus (Status)

Status values for different processes

Sitios (Sites)

Work locations (vessels, platforms, yards)

Frentes (Fronts)

Work front classifications

Unidades de Medida

Measurement units

Pasos (Steps)

Workflow steps for PTEs and work orders

Conceptos Maestros

Master catalog of work concepts and pricing

Clientes

Client organizations

Tipos (Types) Management

Understanding nivel_afectacion

Types are categorized by impact level:

Impact Levels

operaciones/views/catalogos.py
nivel_texto=Case(
    When(nivel_afectacion=1, then=Value('PTE')),
    When(nivel_afectacion=2, then=Value('OT')),
    When(nivel_afectacion=3, then=Value('Partida')),
    When(nivel_afectacion=4, then=Value('Produccion')),
    When(nivel_afectacion=5, then=Value('Clientes')),
    default=Value('No definido')
)
  • 1 - PTE: Types of technical-economic proposals
  • 2 - OT: Work order types (Initial=4, Reprogramming=5)
  • 3 - Partida: Line item categories
  • 4 - Produccion: Production status types
  • 5 - Clientes: Client organization types

Creating New Type

1

Navigate to Types

Go to Catálogos > Tipos
2

Click 'Nuevo'

Opens create form
3

Fill Information

operaciones/views/catalogos.py
@require_http_methods(["POST"])
def crear_tipos(request):
    descripcion = request.POST.get('descripcion')
    afectacion = request.POST.get('afectacion')
    comentario = request.POST.get('comentario', '')
    
    tipo = Tipo.objects.create(
        descripcion=descripcion,
        nivel_afectacion=afectacion,
        comentario=comentario,
        activo=True
    )
Required:
  • Description
  • Impact level (1-5)
Optional:
  • Comments
4

Save

New type is immediately available

Editing Types

Requires permission: operaciones.change_tipo
operaciones/views/catalogos.py
@require_http_methods(["POST"])
def editar_tipos(request):
    if not request.user.has_perm('operaciones.change_tipo'):
        return JsonResponse({
            'tipo_aviso': 'error',
            'detalles': 'No tienes permisos para editar',
            'exito': False
        })
    
    tipo = Tipo.objects.get(id=id)
    tipo.descripcion = request.POST.get('descripcion')
    tipo.nivel_afectacion = request.POST.get('afectacion')
    tipo.save()

Sitios (Sites) Configuration

Site Structure

Sites are organized by frente (work front):
operaciones/views/catalogos.py
sitios = Sitio.objects.filter(activo=1).annotate(
    frente_descripcion=F('id_frente__descripcion')
).order_by('id')

Creating New Site

1

Access Sites Catalog

Navigate to Catálogos > Sitios
2

Create Site

@require_http_methods(["POST"])
def crear_sitio(request):
    sitio = Sitio.objects.create(
        descripcion=request.POST.get('descripcion'),
        comentario=request.POST.get('comentario', ''),
        id_frente_id=request.POST.get('id_frente'),
        activo=True
    )
3

Assign to Frente

Select appropriate work front:
  • Tierra (1)
  • Embarcaciones (2)
  • Plataformas (4)
  • Intercom (5)
Site selection in work orders is filtered by frente to show only relevant sites.

Estatus (Status) Management

Status by Module

Different modules use different status catalogs:
Used for PTE headers:
  • 1: Activo
  • 2: En Proceso
  • 3: Terminado
  • 4: Cancelado
  • 9: Suspendido
Used for work orders:
  • 5: ASIGNADA
  • 6: EN PROCESO
  • 7: PAUSADA
  • 10: COMPLETADA
  • 11: CANCELADA
Used for PTE/OT steps:
  • 1: PENDIENTE
  • 2: PROCESO
  • 3: COMPLETADO
  • 14: NO APLICA
Used for daily reports:
  • 17: CERRADO (locked)
  • Others: Work status types

Unidades de Medida (Units)

Standard Units

Common measurement units:

Square meters

kg

Kilograms

pza

Pieces

m

Meters

lt

Liters

hr

Hours

Creating Units

operaciones/views/catalogos.py
@require_http_methods(["POST"])
def crear_unidad_medida(request):
    unidad_medida = UnidadMedida.objects.create(
        descripcion=request.POST.get('descripcion'),
        clave=request.POST.get('clave'),  # Short code (e.g., "m2")
        comentario=request.POST.get('comentario', ''),
        activo=True
    )
The “clave” field is used in imports and displays. Keep it concise (2-4 characters).

Pasos (Steps) Configuration

Step Types

Steps are categorized by type:
  • tipo=1: Main steps
  • tipo=2: Substeps (e.g., for Volumetría)

Creating Steps

operaciones/models/pte_models.py
class Paso(models.Model):
    descripcion = models.CharField(max_length=200)
    orden = models.CharField(max_length=10)  # Display order
    activo = models.BooleanField(default=True)
    importancia = models.FloatField(default=0)  # Weight for progress
    tipo = models.IntegerField(default=1)  # 1=main, 2=substep
    id_tipo_cliente = models.ForeignKey(Tipo)  # Client type
1

Define Step

Create step with:
  • Clear description
  • Logical order number
  • Importance weight
  • Associated client type
2

Auto-Creation

When a PTE is created, steps are automatically generated:
operaciones/views/pte.py
# Get client type
clientes = Cliente.objects.get(id=id_cliente)
tipo_cliente = clientes.id_tipo_id

# Create steps for this client type
pasos = Paso.objects.filter(
    activo=1, 
    id_tipo_cliente_id=tipo_cliente
).order_by('id', 'orden')

for paso in pasos:
    PTEDetalle.objects.create(
        id_pte_header_id=pte_header.id,
        id_paso_id=paso.id,
        estatus_paso_id=1  # PENDIENTE
    )

Conceptos Maestros (Master Concepts)

Concept Types

Ordinarios vs Extraordinarios

Conceptos Ordinarios (tipo_partida=6):
  • Pre-approved concepts in Anexo C
  • Fixed pricing
  • partida_ordinaria field used
  • sub_anexo assigned (C-2, C-3, etc.)
Conceptos Extraordinarios (tipo_partida=7):
  • Project-specific concepts (PUEs)
  • Require special authorization
  • partida_extraordinaria field used
  • Can be converted to ordinarios

Creating Ordinary Concept

1

Navigate to Catalog

Catálogos > Conceptos Ordinarios
2

Click 'Nuevo'

Opens creation form
3

Fill Information

  • Partida Ordinaria: Concept code (e.g., “2.1.1.05”)
  • Descripción: Full description
  • Anexo: Sub-annex (C-2, C-3, etc.)
  • Unidad de Medida: Select from catalog
  • Precio Unitario MXN: Unit price in pesos
  • Precio Unitario USD: Unit price in dollars (optional)
4

Save

Concept is available for use in annexes

Creating Extraordinary Concept (PUE)

operaciones/views/catalogos.py
@require_http_methods(["POST"])
def crear_producto(request):
    id_partida = request.POST.get('id_partida')  # Can be "NA" for pending
    tipo_partida_id = 7  # Extraordinary
    
    concepto = ConceptoMaestro.objects.create(
        partida_extraordinaria=id_partida,
        descripcion=descripcion_concepto,
        id_tipo_partida_id=tipo_partida_id,
        unidad_medida=unidad_medida,
        precio_unitario_mn=precio_mn,
        precio_unitario_usd=precio_usd,
        pte_creacion=pte_origen,  # Source PTE
        ot_creacion=ot_origen,    # Source OT
        estatus='EN ELABORACION',
        activo=True
    )

Converting PUE to Ordinary

Once a PUE is approved:
1

Select PUE

From Conceptos Extraordinarios list
2

Click 'Convert'

Opens conversion dialog
3

Assign Partida Ordinaria

Enter official concept code
4

Assign Anexo

Select sub-annex (C-2, C-3, etc.)
5

Confirm Conversion

operaciones/views/catalogos.py
@require_http_methods(["POST"])
def convertir_pue_a_ordinario(request):
    concepto = ConceptoMaestro.objects.get(id=pue_id)
    
    # Change type to ordinary
    concepto.id_tipo_partida_id = 6
    concepto.partida_ordinaria = nueva_partida
    concepto.sub_anexo = sub_anexo_obj
    concepto.estatus = "AUTORIZADO"
    
    concepto.save()
Once converted, the PUE becomes available in the ordinary concepts catalog for future use.

Anexo Structure

Concepts are organized by annex:

Annex Hierarchy

AnexoContrato (Master)
  • Main contract annex
SubAnexo (Sub-annexes)
  • C-2: Structural work
  • C-3: Mechanical work
  • C2EXT: Extraordinary structural
  • C3EXT: Extraordinary mechanical
  • Custom sub-annexes
ConceptoMaestro (Concepts)
  • Individual work items within sub-annexes

Clientes (Clients) Management

Client configuration affects workflow:
operaciones/views/pte.py
# Steps created based on client type
clientes = Cliente.objects.get(id=id_cliente)
tipo_cliente = clientes.id_tipo_id

pasos = Paso.objects.filter(
    activo=1, 
    id_tipo_cliente_id=tipo_cliente
)
1

Create Client

Define client organization
2

Assign Type

Select client type (nivel_afectacion=5)
3

Configure Steps

Create appropriate workflow steps for this client type

Data Import and Validation

Excel Import Validation

When importing annexes, system validates against catalogs:
operaciones/views/ote.py
# Validate units exist
for u in UnidadMedida.objects.all():
    unidades_lookup[clean_str(u.clave)] = u.id
    unidades_lookup[clean_str(u.descripcion)] = u.id

# Validate concepts exist
for concept in conceptos_db:
    clave_p = clean_str(concept.partida)
    clave_c = clean_str(concept.descripcion)
    clave_u_id = concept.unidad_medida.id
    
    key = (clave_p, clave_c, clave_u_id)
    catalogo_map[key] = concept

# Check each row
if key_busqueda not in catalogo_map:
    errores_validacion.append({
        'OBSERVACIONES_SISTEMA': 'NO ENCONTRADO en catálogo'
    })
Catalog data must be complete and accurate for imports to succeed. Review and test changes before users import data.

Maintenance Best Practices

Test Changes

Test catalog changes in development before production

Communicate Updates

Notify users of new concepts or units

Maintain Consistency

Use consistent naming conventions

Document Additions

Keep log of catalog changes and reasons

Deactivate, Don't Delete

Set activo=False instead of deleting

Regular Review

Audit catalogs quarterly for obsolete entries

Troubleshooting

Cause: Catalog data doesn’t match ExcelSolution:
  • Review error export file
  • Check unit abbreviations match exactly
  • Verify concept codes are in catalog
  • Add missing concepts before re-importing
Cause: Missing required catalog entriesSolution:
  • Verify tipos exist for selected type
  • Check estatus records are active
  • Ensure pasos exist for client type
Cause: Same partida exists multiple timesSolution:
  • Deactivate duplicates (don’t delete)
  • Use most recent/accurate version
  • Document which is correct

Managing Users

User account administration

Executing Work Orders

How catalogs are used in work orders

Build docs developers (and LLMs) love