Overview
SASCOP BME SubTec implements a comprehensive workflow for managing subsea engineering projects from initial proposal through execution and billing. The system tracks each phase with detailed step management, document control, and financial tracking.
Core Workflow : Technical Proposal (PTE) → Work Order (OTE) → Production Tracking → Financial Estimation
Workflow Phases
Phase 1: Technical Proposal (PTE)
Creating a PTE
Initiate PTE Creation
Navigate to PTEs section and click “Crear PTE” Required Information:
Official document number (oficio_pte)
Request document number (oficio_solicitud)
Work description (descripcion_trabajo)
Client (id_cliente)
Request date (fecha_solicitud)
Delivery date (fecha_entrega)
Duration in days (plazo_dias)
Project type (id_tipo)
Project manager (id_responsable_proyecto)
Priority level (prioridad)
Model Definition
URL Pattern
# From operaciones/models/pte_models.py:19-49
class PTEHeader ( models . Model ):
ESTATUS_CHOICES = [
( 1 , 'Activo' ),
( 2 , 'En Proceso' ),
( 3 , 'Terminado' ),
( 4 , 'Cancelado' ),
]
id_tipo = models.ForeignKey(Tipo, on_delete = models. CASCADE )
oficio_pte = models.CharField( max_length = 100 )
oficio_solicitud = models.CharField( max_length = 100 )
descripcion_trabajo = models.TextField()
fecha_solicitud = models.DateField()
fecha_entrega = models.DateField()
plazo_dias = models.FloatField()
id_responsable_proyecto = models.ForeignKey(ResponsableProyecto, on_delete = models. CASCADE )
estatus = models.IntegerField( choices = ESTATUS_CHOICES , default = 1 )
id_cliente = models.ForeignKey(Cliente, on_delete = models. CASCADE )
total_homologado = models.DecimalField( max_digits = 15 , decimal_places = 2 , default = 0 )
Automatic Step Creation
Upon PTE creation, the system automatically creates workflow steps based on the client type: # System creates PTEDetalle records for each Paso
# Steps are filtered by: Paso.objects.filter(id_tipo_cliente=pte.id_cliente.id_tipo)
Common PTE Steps:
Initial Review
Technical Analysis
Budget Preparation
Engineering Review
Client Approval
Final Documentation
Each step is tracked with:
Status (estatus_paso)
Start date (fecha_inicio)
Delivery date (fecha_entrega)
Completion date (fecha_termino)
Comments (comentario)
Attached files (archivo)
Track Step Progress
Monitor PTE progress through the detail view: # From operaciones/urls.py:15
path( 'pte/<int:pte_id>/' , pte.detalle_pte, name = 'detalle_pte' ),
Actions Available:
Update step status
Set start/completion dates
Upload supporting documents
Add comments and notes
View overall progress percentage
operaciones/models/pte_models.py:51-66
class PTEDetalle ( models . Model ):
id_pte_header = models.ForeignKey(PTEHeader, on_delete = models. CASCADE ,
related_name = 'detalles' )
estatus_paso = models.ForeignKey(Estatus, on_delete = models. CASCADE ,
limit_choices_to = { 'nivel_afectacion' : 4 })
id_paso = models.ForeignKey(Paso, on_delete = models. CASCADE )
fecha_entrega = models.DateField( null = True , blank = True )
fecha_inicio = models.DateField( null = True , blank = True )
fecha_termino = models.DateField( null = True , blank = True )
comentario = models.TextField( blank = True , null = True )
archivo = models.TextField( blank = True , null = True )
class Meta :
db_table = 'pte_detalle'
ordering = [ 'id_paso__orden' ]
Update PTE Status
Change overall PTE status as it progresses: # From operaciones/urls.py:31
path( 'pte/cambiar_estatus_pte/' , pte.cambiar_estatus_pte, name = 'cambiar_estatus_pte' ),
Status Options:
Activo (1) : Active, awaiting action
En Proceso (2) : Work in progress
Terminado (3) : Completed successfully
Cancelado (4) : Cancelled or rejected
The system tracks status history for audit purposes via RegistroActividad.
Complete PTE
Once all steps are complete and approved:
Verify all steps show “Completed” status
Update PTE status to “Terminado”
Proceed to create work order (OTE)
PTE Management Features
Edit PTE Modify PTE header information path( 'pte/editar/' , pte.editar_pte, name = 'editar_pte' )
Delete PTE Remove PTE (consider soft delete) path( 'pte/eliminar/' , pte.eliminar_pte, name = 'eliminar_pte' )
Upload Documents Attach supporting files path( 'pte/guardar_archivo_pte/' , pte.guardar_archivo_pte,
name = 'guardar_archivo_pte' )
View Progress Track completion percentage path( 'pte/obtener-progreso-general-pte/' ,
pte.obtener_progreso_general_pte,
name = 'obtener_progreso_general_pte' )
Phase 2: Work Order (OTE)
Creating an OTE from PTE
Generate OTE from PTE
From the PTE detail view, click “Crear OT desde PTE”: # From operaciones/urls.py:26
path( 'ot/crear-desde-pte/' , pte.crear_ot_desde_pte, name = 'crear_ot_desde_pte' ),
The system pre-fills OTE data from the parent PTE:
Links via id_pte_header
Copies work description
Inherits client and project manager
Sets initial status
Complete OTE Information
Add OTE-specific details: Basic Information:
Work order number (orden_trabajo)
Official document (oficio_ot)
Client representative (responsable_cliente)
Work type (id_tipo)
Status (id_estatus_ot)
Duration (plazo_dias)
Scheduling:
Scheduled start date (fecha_inicio_programado)
Scheduled end date (fecha_termino_programado)
Actual start date (fecha_inicio_real)
Actual end date (fecha_termino_real)
Location & Sites:
Work front (id_frente)
Vessel/ship (id_embarcacion)
Platform (id_plataforma)
Interconnection (id_intercom)
Yard (id_patio)
Financial:
Amount in MXN (monto_mxn)
Amount in USD (monto_usd)
Yard Phase (Optional):
Requires yard phase (requiere_patio)
Yard start date (fecha_inicio_patio)
Yard end date (fecha_fin_patio)
operaciones/models/ote_models.py:5-66
class OTE ( models . Model ):
id_tipo = models.ForeignKey(Tipo, on_delete = models. CASCADE ,
limit_choices_to = { 'nivel_afectacion' : 2 })
id_pte_header = models.ForeignKey(PTEHeader, on_delete = models. CASCADE ,
null = True , blank = True )
orden_trabajo = models.CharField( max_length = 100 )
descripcion_trabajo = models.TextField()
id_responsable_proyecto = models.ForeignKey(ResponsableProyecto, on_delete = models. CASCADE )
responsable_cliente = models.CharField( max_length = 200 )
oficio_ot = models.CharField( max_length = 100 )
id_estatus_ot = models.ForeignKey(Estatus, on_delete = models. CASCADE ,
limit_choices_to = { 'nivel_afectacion' : 2 })
# Dates
fecha_inicio_programado = models.DateField( blank = True , null = True )
fecha_inicio_real = models.DateField( blank = True , null = True )
fecha_termino_programado = models.DateField( blank = True , null = True )
fecha_termino_real = models.DateField( blank = True , null = True )
# Sites
id_frente = models.ForeignKey(Frente, on_delete = models. SET_NULL , null = True )
id_embarcacion = models.IntegerField( null = True , blank = True )
id_plataforma = models.IntegerField( null = True , blank = True )
id_intercom = models.IntegerField( null = True , blank = True )
id_patio = models.IntegerField( null = True , blank = True )
# Financial
monto_mxn = models.DecimalField( decimal_places = 2 , max_digits = 25 , default = 0 )
monto_usd = models.DecimalField( decimal_places = 2 , max_digits = 25 , default = 0 )
# Patio phase
requiere_patio = models.BooleanField( default = False )
fecha_inicio_patio = models.DateField( blank = True , null = True )
fecha_fin_patio = models.DateField( blank = True , null = True )
# Reprogramming
num_reprogramacion = models.IntegerField( null = True , blank = True )
ot_principal = models.IntegerField( null = True , blank = True )
Track OTE Workflow Steps
Similar to PTEs, OTEs have workflow steps tracked via OTDetalle: # From operaciones/urls.py:44
path( 'ot/detalle/datatable/' , ote.datatable_ot_detalle, name = 'datatable_ot_detalle' ),
Common OTE Steps:
Mobilization Planning
Equipment Preparation
Personnel Assignment
Execution Phase
Quality Control
Demobilization
Final Report
Each tracked with dates, status, comments, and documents.
Import Anexo C (Pricing Schedule)
Upload the contract pricing schedule: # From operaciones/urls.py:51
path( 'ot/importar_anexo_ot/' , ote.importar_anexo_ot, name = 'importar_anexo_ot' ),
Process:
Prepare Excel file with pricing items (Anexo C format)
Click “Importar Anexo C”
Upload Excel file
System creates ImportacionAnexo header record
System parses Excel and creates PartidaAnexoImportada for each line item
operaciones/models/ote_models.py:135-172
class ImportacionAnexo ( models . Model ):
"""Header de la importación de anexo C."""
ot = models.ForeignKey( OTE , on_delete = models. CASCADE ,
related_name = 'importaciones_anexo' )
archivo_excel = models.FileField( upload_to = generar_ruta_anexo)
fecha_carga = models.DateTimeField( auto_now_add = True )
usuario_carga = models.ForeignKey( 'auth.User' , on_delete = models. SET_NULL , null = True )
total_registros = models.IntegerField( default = 0 )
es_activo = models.BooleanField( default = True )
class PartidaAnexoImportada ( models . Model ):
"""Detalle de la importación de anexo C."""
importacion_anexo = models.ForeignKey(ImportacionAnexo, on_delete = models. CASCADE ,
related_name = 'partidas' )
id_partida = models.CharField( max_length = 10 )
descripcion_concepto = models.TextField()
anexo = models.CharField( max_length = 10 , null = True , blank = True )
unidad_medida = models.ForeignKey(UnidadMedida, on_delete = models. CASCADE )
volumen_proyectado = models.DecimalField( max_digits = 18 , decimal_places = 6 )
precio_unitario_mn = models.DecimalField( max_digits = 15 , decimal_places = 4 )
precio_unitario_usd = models.DecimalField( max_digits = 15 , decimal_places = 4 )
orden_fila = models.IntegerField()
Excel Format:
Column A: Item ID (e.g., “1.1”, “1.2”)
Column B: Concept description
Column C: Annex reference
Column D: Unit of measure
Column E: Projected volume
Column F: Unit price (MXN)
Column G: Unit price (USD)
Only one active import per OTE. Importing a new Anexo C deactivates previous imports.
Import MS Project Schedule (Optional)
For detailed schedule tracking: # From operaciones/urls.py:52
path( 'ot/importar-mpp/' , ote.importar_mpp_ot, name = 'importar_mpp_ot' ),
Process:
Export project schedule from MS Project as XML or MPP
Upload to system
System creates CronogramaVersion record
Parses tasks into TareaCronograma
Tracks task dependencies via DependenciaTarea
Monitor progress with AvanceCronograma
Features:
Dual progress tracking (real vs client)
WBS hierarchy preservation
Task dependencies and lag times
Resource assignments
Multiple versions supported
OTE Rescheduling
For work orders that need date changes:
Create Reprogramming
# From operaciones/urls.py:41
path( 'ot/crear-ot-reprogramacion/' , ote.crear_ot, name = 'crear_ot' ),
Process:
Select original OTE
Click “Reprogramar OT”
System creates new OTE with:
id_tipo = 5 (Reprogramming type)
ot_principal = original OTE ID
num_reprogramacion = sequence number
Enter new dates
Update status and details
Track Reprogramming History
The original OTE shows:
Number of reprogrammings via @property count_reprogramaciones
Flag indicating reprogrammings exist via @property tiene_reprogramaciones
operaciones/models/ote_models.py:68-90
@ property
def tiene_reprogramaciones ( self ):
"""Retorna True si esta OT tiene reprogramaciones asociadas"""
if self .id_tipo_id != 4 : # Solo para OTs iniciales
return False
return OTE .objects.filter(
ot_principal = self .id,
id_tipo_id = 5 ,
estatus__in = [ - 1 , 1 ]
).exists()
@ property
def count_reprogramaciones ( self ):
"""Retorna el número de reprogramaciones asociadas"""
if self .id_tipo_id != 4 :
return 0
return OTE .objects.filter(
ot_principal = self .id,
id_tipo_id = 5 ,
estatus__in = [ - 1 , 1 ]
).count()
Phase 3: Production Tracking
Monthly Report Setup
Create Monthly Report
For each OTE, create monthly production folders: # System automatically creates ReporteMensual
# when production is recorded for a new month
operaciones/models/produccion_models.py:22-42
class ReporteMensual ( models . Model ):
"""Representa la 'Carpeta Mensual' de una OT."""
id_ot = models.ForeignKey( OTE , on_delete = models. CASCADE ,
related_name = 'reportes_mensuales' )
mes = models.IntegerField( help_text = "Mes numérico (1-12)" )
anio = models.IntegerField( help_text = "Año (Ej. 2025)" )
archivo = models.URLField( blank = True , null = True ,
verbose_name = "Link Evidencia (Drive)" )
id_estatus = models.ForeignKey(Estatus, on_delete = models. CASCADE ,
limit_choices_to = { 'nivel_afectacion' : 5 })
class Meta :
unique_together = [ 'id_ot' , 'mes' , 'anio' ]
Record Daily Operational Status
Track daily work status: # From operaciones/urls.py:67
path( 'produccion/guardar_reportes_diarios_masiva/' ,
produccion.guardar_reportes_diarios_masiva,
name = 'guardar_reportes_diarios_masiva' ),
Daily Status Options:
Operating
Weather standby
Mechanical standby
Waiting on client
Mobilization/Demobilization
Non-operational
operaciones/models/produccion_models.py:44-61
class ReporteDiario ( models . Model ):
"""Controla el estatus operativo del día para una OT."""
id_reporte_mensual = models.ForeignKey(ReporteMensual, on_delete = models. CASCADE ,
related_name = 'dias_estatus' )
fecha = models.DateField()
id_estatus = models.ForeignKey(Estatus, on_delete = models. CASCADE ,
limit_choices_to = { 'nivel_afectacion' : 6 })
comentario = models.CharField( max_length = 255 , blank = True , null = True )
bloqueado = models.BooleanField( default = False )
id_sitio = models.ForeignKey(Sitio, on_delete = models. CASCADE )
class Meta :
unique_together = [ 'id_reporte_mensual' , 'fecha' , 'id_sitio' ]
The bloqueado field prevents modifications after supervisor approval.
Record Production Volumes
Enter actual production for each item: # From operaciones/urls.py:64
path( 'produccion/guardar_produccion_masiva/' ,
produccion.guardar_produccion_masiva,
name = 'guardar_produccion_masiva' ),
For each production entry:
Select item from imported Anexo C (id_partida_anexo)
Enter production date (fecha_produccion)
Record volume produced (volumen_produccion)
Specify time type: TE (Effective Time) or CMA (Minimum Cost Applied)
Mark if excess volume (es_excedente)
Set billing status (id_estatus_cobro)
Select production site (id_sitio_produccion)
operaciones/models/produccion_models.py:63-88
class Produccion ( models . Model ):
TIPO_TIEMPO_CHOICES = [
( 'TE' , 'Tiempo Efectivo' ),
( 'CMA' , 'Costo Mínimo Aplicado' ),
]
id_partida_anexo = models.ForeignKey(PartidaAnexoImportada, on_delete = models. PROTECT ,
related_name = 'registros_produccion' )
id_reporte_mensual = models.ForeignKey(ReporteMensual, on_delete = models. CASCADE ,
related_name = 'producciones' )
fecha_produccion = models.DateField()
volumen_produccion = models.DecimalField( max_digits = 15 , decimal_places = 6 )
tipo_tiempo = models.CharField( max_length = 3 , choices = TIPO_TIEMPO_CHOICES )
es_excedente = models.BooleanField( default = False )
id_estatus_cobro = models.ForeignKey(Estatus, on_delete = models. CASCADE ,
limit_choices_to = { 'nivel_afectacion' : 3 })
id_sitio_produccion = models.ForeignKey(Sitio, on_delete = models. SET_NULL , null = True )
class Meta :
unique_together = [ 'id_partida_anexo' , 'fecha_produccion' ,
'tipo_tiempo' , 'id_sitio_produccion' ]
Upload Evidence (GPU)
For billable items (status C-2, C-3), create GPU records: # From operaciones/urls.py:73
path( 'produccion/guardar_estatus_gpu/' ,
produccion.guardar_estatus_gpu,
name = 'guardar_estatus_gpu' ),
GPU (Price Unit Generator) includes:
Link to production record (id_produccion)
Administrative status (id_estatus)
Photo evidence link (archivo - Google Drive URL)
Blocking notes (nota_bloqueo)
Link to estimation if billed (id_estimacion_detalle)
operaciones/models/produccion_models.py:90-104
class RegistroGPU ( models . Model ):
"""Espejo Administrativo y Evidencias. Solo se crea para C-2 y C-3."""
id_produccion = models.OneToOneField(Produccion, on_delete = models. CASCADE ,
related_name = 'gpu' )
id_estatus = models.ForeignKey(Estatus, on_delete = models. CASCADE ,
limit_choices_to = { 'nivel_afectacion' : 6 })
archivo = models.URLField( max_length = 500 , blank = True , null = True ,
verbose_name = "Link Evidencia Fotográfica" )
nota_bloqueo = models.TextField( blank = True , verbose_name = "Observaciones" )
id_estimacion_detalle = models.ForeignKey( 'EstimacionDetalle' ,
on_delete = models. SET_NULL , null = True )
fecha_actualizacion = models.DateTimeField( auto_now = True )
GPU records create the “double truth” - production data must match administrative evidence before billing.
Upload Monthly Evidence
Store monthly documentation: # From operaciones/urls.py:68
path( 'produccion/guardar_archivo_mensual/' ,
produccion.guardar_archivo_mensual,
name = 'guardar_archivo_mensual' ),
Upload link to consolidated monthly evidence (Google Drive folder).
Superintendent Schedule Management
For offshore operations with rotating crews:
Configure Superintendent Cycle
# From operaciones/urls.py:70
path( 'produccion/configurar_ciclo_guardia/' ,
produccion.configurar_ciclo_guardia,
name = 'configurar_ciclo_guardia' ),
Setup:
Select site
Assign Superintendent A
Assign Superintendent B
Set start date for Superintendent A’s first rotation
operaciones/models/produccion_models.py:137-163
class Superintendente ( models . Model ):
nombre = models.CharField( max_length = 150 )
sitio_asignado = models.ForeignKey( 'Sitio' , on_delete = models. SET_NULL , null = True )
color = models.CharField( max_length = 7 , default = "#3498db" )
activo = models.BooleanField( default = True )
class CicloGuardia ( models . Model ):
"""Define los cambios de guardia en base a la fecha de inicio inicial del super A"""
sitio = models.OneToOneField( 'Sitio' , on_delete = models. CASCADE )
super_a = models.ForeignKey(Superintendente, on_delete = models. CASCADE ,
related_name = 'ciclos_a' )
super_b = models.ForeignKey(Superintendente, on_delete = models. CASCADE ,
related_name = 'ciclos_b' )
fecha_inicio_super_a = models.DateField( help_text = "Fecha en que inició guardia el Super A" )
System calculates rotation schedule automatically (typically 14 days on/14 days off).
View Rotation Calendar
# From operaciones/urls.py:71
path( 'produccion/obtener_guardias_mes/' ,
produccion.obtener_guardias_mes,
name = 'obtener_guardias_mes' ),
Calendar view shows which superintendent is on duty each day.
Phase 4: Financial Estimation
Creating an Estimation
Initiate Estimation
From production tracking, generate billing estimation: Estimation Header:
Select OTE (id_ot)
Set estimation date (fecha_estimacion)
Define period: from date (fecha_desde) to date (fecha_hasta)
Set billing status (id_estatus_cobro)
Select Production Records
Choose which production records to include:
Filter by date range
Filter by billing status (typically C-2 or C-3)
Filter by site if needed
Verify GPU evidence exists
System creates EstimacionDetalle for each included production record.
Review and Adjust
For each line item:
View actual volume (volumen_actual)
Set estimated/billable volume (volumen_estimado)
Update billing status if needed
Add adjustment comments (comentario_ajuste)
operaciones/models/produccion_models.py:124-135
class EstimacionDetalle ( models . Model ):
id_estimacion_header = models.ForeignKey(EstimacionHeader, on_delete = models. CASCADE ,
related_name = 'detalles' )
id_produccion = models.ForeignKey(Produccion, on_delete = models. CASCADE )
volumen_actual = models.DecimalField( max_digits = 15 , decimal_places = 2 )
volumen_estimado = models.DecimalField( max_digits = 15 , decimal_places = 2 , default = 0 )
id_estatus_cobro = models.ForeignKey(Estatus, on_delete = models. CASCADE ,
limit_choices_to = { 'nivel_afectacion' : 3 })
comentario_ajuste = models.TextField( blank = True )
Calculate Totals
System automatically calculates:
Total produced volume
Total estimated/billable volume
Total amount in MXN (volume × unit price MXN)
Total amount in USD (volume × unit price USD)
Values stored in EstimacionHeader totals fields.
Generate Estimation Document
Export estimation as PDF or Excel:
Cover page with OTE details
Summary table with totals
Detailed breakdown by item
Supporting evidence references
Signatures section
Use reportlab (PDF) or openpyxl (Excel) libraries for document generation.
Submit for Approval
Update estimation status through approval workflow:
Draft
Under Review
Client Submitted
Client Approved
Paid
Track status changes via RegistroActividad.
Business Intelligence & Reporting
Centro de Consulta
Access comprehensive analytics dashboard:
# From operaciones/urls.py:182
path( 'centro_consulta/centro-consulta/' ,
centro_consulta.fn_centro_consulta,
name = 'centro_consulta' ),
Global Search path( 'centro_consulta/busqueda-global/' ,
centro_consulta.fn_api_busqueda_global,
name = 'api_busqueda_global' )
Search across PTEs, OTEs, production, and catalogs.
Dashboard & Charts path( 'centro_consulta/busqueda-global-graficas/' ,
centro_consulta.fn_api_obtener_dashboard,
name = 'api_busqueda_global_graficas' )
Visual analytics with charts and KPIs.
Excel Export path( "centro_consulta/descargar-excel/" ,
centro_consulta.fn_api_descargar_excel_bi,
name = "api_descargar_excel_bi" )
Export filtered data to Excel.
Email Reports path( "centro_consulta/enviar-correo/" ,
centro_consulta.fn_api_enviar_correo_bi,
name = "api_enviar_correo_bi" )
Email reports to stakeholders.
Activity Logging
All user actions are tracked:
# From operaciones/urls.py:55-57
path( 'registro_actividad/' ,
registro_actividad.registro_actividad,
name = 'registro_actividad' ),
path( 'registro_actividad/datatable' ,
registro_actividad.datatable_registro_actividad,
name = 'datatable_registro_actividad' ),
Tracked Information:
User ID and name
Action performed (CREATE, UPDATE, DELETE, VIEW)
Module/entity affected
Description of change
Timestamp
IP address
Workflow Best Practices
Create PTEs immediately upon client request
Assign appropriate project manager
Set realistic delivery dates with buffer
Update step status daily
Upload all supporting documents
Communicate delays to client promptly
Complete all steps before generating OTE
Verify PTE completion before OTE creation
Import Anexo C immediately after OTE creation
Review pricing accuracy before starting production
Update actual dates as work progresses
Create reprogramming records for date changes
Track all sites involved in multi-location work
Monitor schedule vs actual regularly
Record daily status before production entry
Enter production data daily, not in batches
Verify volumes against projected amounts
Upload photo evidence same day as production
Lock daily reports after supervisor review
Reconcile monthly totals before closing
Store consolidated evidence in organized structure
Generate estimations on regular schedule (weekly/bi-weekly)
Review GPU evidence before including in estimation
Reconcile estimated vs actual volumes
Track payment status after submission
Archive approved estimations with evidence
Monitor aging of unbilled production
Coordinate with finance team on discrepancies
Regular audits of workflow completion
Cross-check production vs evidence
Verify calculations before client submission
Review permission assignments quarterly
Monitor system performance and optimization
Backup critical data daily
Train new users on complete workflow
Common Scenarios
Client Change Request
Multi-Site Project
Weather Standby
Excess Volume
Quality Issue
Scenario: Client requests scope change mid-projectWorkflow:
Create new PTE for change order
Reference original PTE in comments
Complete PTE approval workflow
Generate supplemental OTE
Link to original OTE via comments
Track production separately
Generate separate estimation
Scenario: Work spans multiple platforms/vesselsWorkflow:
Create single PTE for overall project
Create separate OTE for each site
Link OTEs to parent PTE
Import same Anexo C to all OTEs
Track production by site
Generate consolidated or separate estimations
Use Centro de Consulta for cross-site reporting
Scenario: Operations halted due to weatherWorkflow:
Update ReporteDiario status to “Weather Standby”
Add comment with weather details
Do not record production for affected days
Continue daily status tracking
Resume production tracking when operations restart
Document in estimation comments if affects billing
Scenario: Actual production exceeds projectedWorkflow:
Record production normally
Mark as es_excedente=True
Set appropriate billing status
Document reason in comments
May require PTE for pricing approval
Track separately in estimation
Get client approval before billing
Scenario: Work must be redone due to qualityWorkflow:
Do not record original work as production
Update daily status with issue description
Create internal tracking record
Record only accepted work as production
Document in RegistroActividad
Generate internal cost tracking report
Exclude from client billing
Integration Points
Email Notifications Configure email alerts for:
New PTE assignments
Step deadlines approaching
OTE status changes
Estimation approvals
System alerts
Document Storage Integrate with:
Google Drive for evidence
SharePoint for documents
Network shares for backups
Cloud storage for archives
External Systems Potential integrations:
Accounting systems (invoicing)
HR systems (personnel)
Equipment tracking
Weather services
Client portals
Reporting Tools Export data to:
Excel for analysis
Power BI for dashboards
Tableau for visualization
Custom reports via API
Next Steps
Architecture Deep dive into system architecture and data models
User Roles Configure permissions for workflow participants
Installation Set up your SASCOP BME SubTec instance
Quickstart Quick reference guide
This workflow guide reflects the complete operational process implemented in SASCOP BME SubTec, from technical proposals through financial billing.