workspace-v1/projects/erp-construccion/docs/02-definicion-modulos/MAE-016-gestion-documental/especificaciones/ET-DOC-004-servicio de firma electrónica.md
rckrdmrd 66161b1566 feat: Workspace-v1 complete migration with NEXUS v3.4
Sistema NEXUS v3.4 migrado con:

Estructura principal:
- core/orchestration: Sistema SIMCO + CAPVED (27 directivas, 28 perfiles)
- core/catalog: Catalogo de funcionalidades reutilizables
- shared/knowledge-base: Base de conocimiento compartida
- devtools/scripts: Herramientas de desarrollo
- control-plane/registries: Control de servicios y CI/CD
- orchestration/: Configuracion de orquestacion de agentes

Proyectos incluidos (11):
- gamilit (submodule -> GitHub)
- trading-platform (OrbiquanTIA)
- erp-suite con 5 verticales:
  - erp-core, construccion, vidrio-templado
  - mecanicas-diesel, retail, clinicas
- betting-analytics
- inmobiliaria-analytics
- platform_marketing_content
- pos-micro, erp-basico

Configuracion:
- .gitignore completo para Node.js/Python/Docker
- gamilit como submodule (git@github.com:rckrdmrd/gamilit-workspace.git)
- Sistema de puertos estandarizado (3005-3199)

Generated with NEXUS v3.4 Migration System
EPIC-010: Configuracion Git y Repositorios
2026-01-04 03:37:42 -06:00

1.2 KiB

ET-DOC-004: Servicio de Firma Electrónica

ID: ET-DOC-004 | Módulo: MAE-016

Signature Service

@Injectable()
export class SignatureService {
  async requestSignature(
    documentId: string,
    signerId: string,
    type: 'simple' | 'advanced'
  ): Promise<SignatureRequest> {
    const document = await this.documentRepo.findOne(documentId);
    const signer = await this.userRepo.findOne(signerId);
    
    if (type === 'simple') {
      const otp = this.generateOTP();
      await this.sendOTPEmail(signer.email, otp);
      
      return { requestId: uuidv4(), otp, expiresAt: this.addMinutes(new Date(), 15) };
    } else {
      // FIEL (SAT) signature
      return this.initializeFIELSignature(documentId, signerId);
    }
  }

  async sign(
    documentId: string,
    signerId: string,
    signatureData: string,
    certificate?: string
  ): Promise<Signature> {
    const signature = await this.signatureRepo.save({
      documentId, signerId,
      type: certificate ? 'advanced' : 'simple',
      signatureData,
      certificate,
      signedAt: new Date()
    });
    
    // Embed signature in PDF
    await this.embedSignatureInPDF(documentId, signature);
    
    return signature;
  }
}

Generado: 2025-11-21