Files
system-docs/v4-archive/contratos-comunes/docs/MASON_PROTOCOL_v1.0.md
2025-12-24 17:28:34 +00:00

16 KiB

MASON Protocol v1.0

Version: 1.0 Dependencia: S-CONTRACT.md, NOTARIO.md Estado: Implementación


1. Introducción

MASON es el constructor de documentos del ecosistema GRACE. Prepara, valida, ensambla y transforma datos antes de enviarlos a THE FACTORY para generación o a NOTARIO para certificación.

+---------------------------------------------------------------------+
|                    PRINCIPIO MASON                                   |
|                                                                      |
|   "MASON prepara, FACTORY genera, NOTARIO certifica"                |
+---------------------------------------------------------------------+

2. Arquitectura

+---------------------------------------------------------------------+
|                          MASON                                       |
|                  (Constructor de Documentos)                        |
+---------------------------------------------------------------------+
|                                                                      |
|  Datos Entrada                                                       |
|        |                                                             |
|        v                                                             |
|  +-----------------+                                                 |
|  |   VALIDATOR     |  Valida estructura y campos requeridos          |
|  +-----------------+                                                 |
|        |                                                             |
|        v                                                             |
|  +-----------------+                                                 |
|  |   ENRICHER      |  Añade datos calculados y referencias           |
|  +-----------------+                                                 |
|        |                                                             |
|        v                                                             |
|  +-----------------+                                                 |
|  |   ASSEMBLER     |  Ensambla componentes según template            |
|  +-----------------+                                                 |
|        |                                                             |
|        v                                                             |
|  +-----------------+                                                 |
|  |   FORMATTER     |  Formatea para destino (FACTORY, NOTARIO)       |
|  +-----------------+                                                 |
|        |                                                             |
|        v                                                             |
|  Documento Preparado                                                 |
|                                                                      |
+---------------------------------------------------------------------+

3. Componentes

3.1 VALIDATOR

Valida datos de entrada contra esquemas definidos.

class Validator {
  validate(data, schema) {
    const errors = [];

    // Campos requeridos
    for (const field of schema.required || []) {
      if (!data[field]) {
        errors.push({ field, error: 'required' });
      }
    }

    // Tipos de datos
    for (const [field, type] of Object.entries(schema.types || {})) {
      if (data[field] && typeof data[field] !== type) {
        errors.push({ field, error: 'invalid_type', expected: type });
      }
    }

    // Reglas personalizadas
    for (const rule of schema.rules || []) {
      const result = rule.check(data);
      if (!result.valid) {
        errors.push({ field: rule.field, error: result.error });
      }
    }

    return { valid: errors.length === 0, errors };
  }
}

3.2 ENRICHER

Añade datos calculados y referencias externas.

class Enricher {
  async enrich(data, context) {
    const enriched = { ...data };

    // Timestamps
    enriched.created_at = new Date().toISOString();
    enriched.mason_version = '1.0';

    // Cálculos automáticos
    if (enriched.lineas) {
      enriched.subtotal = this.calculateSubtotal(enriched.lineas);
      enriched.iva = enriched.subtotal * 0.21;
      enriched.total = enriched.subtotal + enriched.iva;
    }

    // Referencias externas
    if (enriched.cliente_id) {
      enriched.cliente = await this.fetchCliente(enriched.cliente_id);
    }

    // Numeración automática
    if (!enriched.numero) {
      enriched.numero = await this.generateNumero(enriched.tipo);
    }

    return enriched;
  }

  calculateSubtotal(lineas) {
    return lineas.reduce((sum, l) => sum + (l.cantidad * l.precio), 0);
  }

  async generateNumero(tipo) {
    const prefix = {
      factura: 'FAC',
      pedido: 'PED',
      presupuesto: 'PRE',
      albaran: 'ALB',
    }[tipo] || 'DOC';

    const year = new Date().getFullYear();
    const seq = await this.getNextSequence(tipo);

    return `${prefix}-${year}-${String(seq).padStart(4, '0')}`;
  }
}

3.3 ASSEMBLER

Ensambla componentes según template.

class Assembler {
  constructor() {
    this.templates = new Map();
  }

  registerTemplate(type, template) {
    this.templates.set(type, template);
  }

  assemble(type, data) {
    const template = this.templates.get(type);
    if (!template) {
      throw new Error(`Template not found: ${type}`);
    }

    return {
      type,
      template: template.name,
      version: template.version,
      sections: this.buildSections(template, data),
      metadata: {
        assembled_at: new Date().toISOString(),
        assembler: 'MASON',
      }
    };
  }

  buildSections(template, data) {
    return template.sections.map(section => ({
      id: section.id,
      type: section.type,
      content: this.renderSection(section, data),
    }));
  }

  renderSection(section, data) {
    // Interpolar variables en contenido
    let content = section.content;

    for (const [key, value] of Object.entries(data)) {
      content = content.replace(new RegExp(`{{${key}}}`, 'g'), value);
    }

    return content;
  }
}

3.4 FORMATTER

Formatea para destino específico.

class Formatter {
  formatForFactory(assembled) {
    return {
      seed: this.buildPrompt(assembled),
      objective: `Documento ${assembled.type} profesional`,
      function: 'DOCUMENT_GENERATION',
      output_format: 'pdf',
      context: {
        template: assembled.template,
        sections: assembled.sections,
      }
    };
  }

  formatForNotario(assembled, options = {}) {
    return {
      document: assembled,
      certification_type: options.certification_type || 'standard',
      requires_blockchain: options.blockchain !== false,
      metadata: {
        formatter: 'MASON',
        formatted_at: new Date().toISOString(),
      }
    };
  }

  buildPrompt(assembled) {
    const lines = [
      `Genera un documento ${assembled.type} profesional.`,
      '',
      'Secciones:',
    ];

    for (const section of assembled.sections) {
      lines.push(`- ${section.id}: ${section.content.substring(0, 100)}...`);
    }

    return lines.join('\n');
  }
}

4. Templates de Documentos

4.1 Factura

{
  "name": "factura_v1",
  "version": "1.0",
  "type": "factura",
  "required_fields": [
    "cliente", "lineas", "fecha"
  ],
  "sections": [
    {
      "id": "header",
      "type": "header",
      "content": "FACTURA {{numero}}"
    },
    {
      "id": "emisor",
      "type": "info_block",
      "content": "{{empresa_nombre}}\n{{empresa_direccion}}\nCIF: {{empresa_cif}}"
    },
    {
      "id": "receptor",
      "type": "info_block",
      "content": "{{cliente_nombre}}\n{{cliente_direccion}}\nCIF: {{cliente_cif}}"
    },
    {
      "id": "detalles",
      "type": "table",
      "content": "{{lineas_tabla}}"
    },
    {
      "id": "totales",
      "type": "totals",
      "content": "Subtotal: {{subtotal}}€\nIVA (21%): {{iva}}€\nTOTAL: {{total}}€"
    },
    {
      "id": "footer",
      "type": "footer",
      "content": "Forma de pago: {{forma_pago}}\nVencimiento: {{fecha_vencimiento}}"
    }
  ]
}

4.2 Pedido

{
  "name": "pedido_v1",
  "version": "1.0",
  "type": "pedido",
  "required_fields": [
    "proveedor", "productos", "fecha"
  ],
  "sections": [
    {
      "id": "header",
      "type": "header",
      "content": "PEDIDO {{numero}}"
    },
    {
      "id": "proveedor",
      "type": "info_block",
      "content": "Proveedor: {{proveedor_nombre}}\nContacto: {{proveedor_contacto}}"
    },
    {
      "id": "productos",
      "type": "table",
      "content": "{{productos_tabla}}"
    },
    {
      "id": "condiciones",
      "type": "text",
      "content": "Plazo de entrega: {{plazo_entrega}}\nCondiciones: {{condiciones}}"
    }
  ]
}

5. Flujo Completo

┌────────────────────────────────────────────────────────────────────┐
│                    FLUJO MASON → FACTORY → NOTARIO                  │
└────────────────────────────────────────────────────────────────────┘

1. CLARA recibe petición de documento
       │
       ▼
2. MASON.validate(datos, schema)
       │ → Si inválido: retorna errores
       ▼
3. MASON.enrich(datos, context)
       │ → Añade cálculos, referencias, numeración
       ▼
4. MASON.assemble(tipo, datos_enriquecidos)
       │ → Construye estructura según template
       ▼
5. MASON.formatForFactory(assembled)
       │
       ▼
6. THE FACTORY genera documento (iterativo)
       │ → Director → Executor → Evaluator → converge
       ▼
7. MASON.formatForNotario(documento)
       │
       ▼
8. NOTARIO certifica
       │ → Hash + Timestamp + Merkle + Blockchain
       ▼
9. LOCKER almacena
       │ → locker://corp/facturas/FAC-2025-0001.pdf
       ▼
10. Retorna referencia certificada

6. API

6.1 Mason.prepare()

const mason = new Mason();

const result = await mason.prepare({
  tipo: 'factura',
  data: {
    cliente_id: 'CLI-001',
    lineas: [
      { concepto: 'Traje azul marino', cantidad: 1, precio: 349 },
      { concepto: 'Ajustes', cantidad: 1, precio: 50 }
    ]
  },
  options: {
    auto_enrich: true,
    validate: true,
    target: 'FACTORY'
  }
});

// Result:
{
  "success": true,
  "document": {
    "numero": "FAC-2025-0001",
    "cliente": { "nombre": "Juan García", "cif": "12345678A" },
    "lineas": [...],
    "subtotal": 399,
    "iva": 83.79,
    "total": 482.79
  },
  "formatted": {
    "seed": "Genera un documento factura profesional...",
    "objective": "...",
    "function": "DOCUMENT_GENERATION"
  }
}

6.2 Mason.build()

const document = await mason.build('factura', preparedData);

// Genera directamente sin pasar por FACTORY
// Útil para documentos simples o regeneración

6.3 Mason.validate()

const validation = mason.validate(data, 'factura');

if (!validation.valid) {
  console.log('Errores:', validation.errors);
  // [{ field: 'cliente', error: 'required' }]
}

7. Integración con S-CONTRACT

7.1 Request a MASON

{
  "contract_version": "2.1",
  "request_id": "msn-abc123",
  "source": {
    "system": "CORP",
    "orchestrator": "CLARA"
  },
  "target": {
    "service": "MASON",
    "operation": "prepare"
  },
  "input": {
    "tipo": "factura",
    "data": { ... },
    "options": {
      "auto_enrich": true,
      "target": "FACTORY"
    }
  }
}

7.2 Response de MASON

{
  "contract_version": "2.1",
  "request_id": "msn-abc123",
  "status": {
    "code": "SUCCESS",
    "message": "Document prepared successfully"
  },
  "output": {
    "document": { ... },
    "formatted": { ... },
    "validation": {
      "valid": true,
      "errors": []
    }
  },
  "metadata": {
    "mason_version": "1.0",
    "template_used": "factura_v1",
    "enrichments_applied": ["calculate_totals", "generate_numero", "fetch_cliente"]
  }
}

8. Configuración

mason:
  enabled: true

  # Validación
  strict_validation: true
  fail_on_warning: false

  # Enriquecimiento
  auto_enrich: true
  fetch_external_refs: true

  # Numeración
  sequence_prefix: "TZZR"
  sequence_padding: 4
  reset_yearly: true

  # Templates
  templates_dir: "./templates"
  custom_templates_enabled: true

  # Destinos
  default_target: "FACTORY"

  # Cache
  cache_enrichments: true
  cache_ttl_seconds: 300

9. Schemas de Validación

9.1 Factura

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Factura Schema",
  "type": "object",
  "required": ["cliente", "lineas", "fecha"],
  "properties": {
    "cliente": {
      "type": "object",
      "required": ["nombre"],
      "properties": {
        "nombre": { "type": "string", "minLength": 1 },
        "cif": { "type": "string", "pattern": "^[A-Z0-9]{9}$" },
        "direccion": { "type": "string" },
        "email": { "type": "string", "format": "email" }
      }
    },
    "lineas": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": ["concepto", "cantidad", "precio"],
        "properties": {
          "concepto": { "type": "string" },
          "cantidad": { "type": "number", "minimum": 0 },
          "precio": { "type": "number", "minimum": 0 }
        }
      }
    },
    "fecha": { "type": "string", "format": "date" },
    "forma_pago": {
      "type": "string",
      "enum": ["transferencia", "tarjeta", "efectivo", "domiciliacion"]
    }
  }
}

10. Implementación Completa

/**
 * MASON - Constructor de Documentos
 */
class Mason {
  constructor(config = {}) {
    this.version = '1.0';
    this.validator = new Validator();
    this.enricher = new Enricher(config);
    this.assembler = new Assembler();
    this.formatter = new Formatter();

    // Cargar templates por defecto
    this.loadDefaultTemplates();
  }

  loadDefaultTemplates() {
    this.assembler.registerTemplate('factura', FACTURA_TEMPLATE);
    this.assembler.registerTemplate('pedido', PEDIDO_TEMPLATE);
    this.assembler.registerTemplate('presupuesto', PRESUPUESTO_TEMPLATE);
    this.assembler.registerTemplate('albaran', ALBARAN_TEMPLATE);
  }

  async prepare(request) {
    const { tipo, data, options = {} } = request;

    // 1. Validar
    if (options.validate !== false) {
      const validation = this.validator.validate(data, this.getSchema(tipo));
      if (!validation.valid) {
        return { success: false, errors: validation.errors };
      }
    }

    // 2. Enriquecer
    let enriched = data;
    if (options.auto_enrich !== false) {
      enriched = await this.enricher.enrich(data, { tipo });
    }

    // 3. Ensamblar
    const assembled = this.assembler.assemble(tipo, enriched);

    // 4. Formatear para destino
    let formatted;
    switch (options.target) {
      case 'FACTORY':
        formatted = this.formatter.formatForFactory(assembled);
        break;
      case 'NOTARIO':
        formatted = this.formatter.formatForNotario(assembled, options);
        break;
      default:
        formatted = assembled;
    }

    return {
      success: true,
      document: enriched,
      assembled,
      formatted,
      validation: { valid: true, errors: [] }
    };
  }

  getSchema(tipo) {
    return SCHEMAS[tipo] || {};
  }
}

module.exports = { Mason, Validator, Enricher, Assembler, Formatter };

11. Checklist de Implementación

  • Definir arquitectura de componentes
  • Implementar Validator
  • Implementar Enricher
  • Implementar Assembler
  • Implementar Formatter
  • Crear templates de documentos
  • Definir schemas de validación
  • Integrar con S-CONTRACT
  • Tests unitarios
  • Tests de integración con FACTORY
  • Tests de integración con NOTARIO

Fin del Documento MASON Protocol - Version 1.0

Sistema GRACE - "MASON prepara, FACTORY genera, NOTARIO certifica"