lunes, 23 de agosto de 2021

Crear XML a partir de un XSD

 PROCEDURE GP_INV_XmlGeneraECI(gsIdDB_Inv_Contrato,gnAño,gnMes)
//Genera el xml del estado de cuenta de inversión

nContador                 is int = 0
nActual                 is int = 0
nAnterior                 is int = 0


dPeriodoDel             is Date = FirstDayOfMonth(gnAño,gnMes)
dPeriodoAl                 is Date = LastDayOfMonth(gnAño, gnMes)
sResultado                 is ANSI string

HReadSeekFirst(DB_Inv_Contrato,IdDB_Inv_Contrato, gsIdDB_Inv_Contrato)
HReadSeekFirst(DB_Socio,IdSocio,DB_Inv_Contrato.IdSocio)


miEci         is xmlDocument <description = "eci_v02">
nNameSpace1 is xmlNamespace
nNameSpace2 is xmlNamespace
nNode         is dynamic xmlNode
nNode         = miEci.eci

nNameSpace1.Name     = "xsi"
nNameSpace1.URI     = "http://www.w3.org/2001/XMLSchema-instance"
Add(nNode..NamespaceDeclared, nNameSpace1)

nNameSpace2.Name    = "schemaLocation"
nNameSpace2.URI        = "eci_v02.xsd"
Add(nNode..NamespaceDeclared, nNameSpace2)

miEci.eci:version             =  "1.0"
miEci.eci:fechaEmision         = DateToString(Today(),"YYYY-MM-DD")
miEci.eci:periodoDel           = DateToString(dPeriodoDel,"YYYY-MM-DD")
miEci.eci:periodoAl           = DateToString(dPeriodoAl ,"YYYY-MM-DD")    
miEci.eci:contratoNo        = DB_Inv_Contrato.Folio
miEci.eci:comisionesPer        = 0
miEci.eci:interesesAcum     = 0
miEci.eci:ImpuestosRet        = 0
miEci.eci:fechaCorte         = dPeriodoAl

miEci.eci.socio:noSocio     = DB_Socio.NoSocio
miEci.eci.socio:razonSocial = DB_Socio.RazonSocial
miEci.eci.socio:rfc            = DB_Socio.RFC  

HReadSeekFirst(DB_Soc_Domicilio, IdSocio,DB_Socio.IdSocio)
WHILE HFound(DB_Soc_Domicilio) = True
    IF DB_Soc_Domicilio.Legal = True THEN
    miEci.eci.socio:calle         = DB_Soc_Domicilio.Calle
    miEci.eci.socio:noExterior    = DB_Soc_Domicilio.NoExterior
    miEci.eci.socio:noInterior    = DB_Soc_Domicilio.NoInterior
    miEci.eci.socio:cp             = DB_Soc_Domicilio.Cp
    miEci.eci.socio:colonia     = DB_Soc_Domicilio.Colonia
    miEci.eci.socio:ciudad         = DB_Soc_Domicilio.Localidad
    miEci.eci.socio:estado         = DB_Soc_Domicilio.Estado
    BREAK
    END
    HReadNext(DB_Soc_Domicilio,IdSocio)
END

//**** MOVIMIENTOS DEL PERIODO  ****
HReadSeekFirst(DB_Inv_Inversion,IdDB_Inv_Contrato,gsIdDB_Inv_Contrato)
WHILE HFound(DB_Inv_Inversion) = True
    IF  (DB_Inv_Inversion.FechaInversion >= dPeriodoDel AND DB_Inv_Inversion.FechaInversion <= dPeriodoAl) THEN    
        nContador++
        miEci.eci.movimientos.movimiento[nContador]:fecha       = DB_Inv_Inversion.FechaInversion
        miEci.eci.movimientos.movimiento[nContador]:concepto       = "PAGARE"
        miEci.eci.movimientos.movimiento[nContador]:certificado = DB_Inv_Inversion.Folio
        miEci.eci.movimientos.movimiento[nContador]:plazo         = DB_Inv_Inversion.Plazo
        miEci.eci.movimientos.movimiento[nContador]:inversion     = DB_Inv_Inversion.FechaInversion
        miEci.eci.movimientos.movimiento[nContador]:vencimiento = DB_Inv_Inversion.FechaVencimiento
        miEci.eci.movimientos.movimiento[nContador]:tasa         = DB_Inv_Inversion.TasaBruta
        miEci.eci.movimientos.movimiento[nContador]:gatNominal     = 0
        miEci.eci.movimientos.movimiento[nContador]:gatReal        = 0
        miEci.eci.movimientos.movimiento[nContador]:debe         = 0
        miEci.eci.movimientos.movimiento[nContador]:haber         = DB_Inv_Inversion.APagar
        miEci.eci.movimientos.movimiento[nContador]:total         = DB_Inv_Inversion.APagar
    END
    IF  (DB_Inv_Inversion.FechaVencimiento >= dPeriodoDel AND DB_Inv_Inversion.FechaVencimiento <= dPeriodoAl) THEN    
        nContador++
        miEci.eci.movimientos.movimiento[nContador]:fecha       = DB_Inv_Inversion.FechaVencimiento
        miEci.eci.movimientos.movimiento[nContador]:concepto       = "VENCIMIENTO"
        miEci.eci.movimientos.movimiento[nContador]:certificado = DB_Inv_Inversion.Folio
        miEci.eci.movimientos.movimiento[nContador]:plazo         = DB_Inv_Inversion.Plazo
        miEci.eci.movimientos.movimiento[nContador]:inversion     = DB_Inv_Inversion.FechaInversion
        miEci.eci.movimientos.movimiento[nContador]:vencimiento = DB_Inv_Inversion.FechaVencimiento
        miEci.eci.movimientos.movimiento[nContador]:tasa         = DB_Inv_Inversion.TasaBruta
        miEci.eci.movimientos.movimiento[nContador]:gatNominal     = 0
        miEci.eci.movimientos.movimiento[nContador]:gatReal        = 0
        miEci.eci.movimientos.movimiento[nContador]:debe         = DB_Inv_Inversion.APagar
        miEci.eci.movimientos.movimiento[nContador]:haber         = 0
        miEci.eci.movimientos.movimiento[nContador]:total         = DB_Inv_Inversion.APagar
    END    
    //**** PORTAFOLIO MES ACTUAL  ****
    IF  (DB_Inv_Inversion.FechaVencimiento > dPeriodoAl) THEN    
        nActual++    
        miEci.eci.actual.portafolio[nActual]:concepto       = "PAGARE"
        miEci.eci.actual.portafolio[nActual]:certificado    = DB_Inv_Inversion.Folio
        miEci.eci.actual.portafolio[nActual]:plazo             = DB_Inv_Inversion.Plazo
        miEci.eci.actual.portafolio[nActual]:inversion         = DB_Inv_Inversion.FechaInversion
        miEci.eci.actual.portafolio[nActual]:vencimiento     = DB_Inv_Inversion.FechaVencimiento
        miEci.eci.actual.portafolio[nActual]:tasa             = DB_Inv_Inversion.TasaBruta
        miEci.eci.actual.portafolio[nActual]:gatNominal     = 0
        miEci.eci.actual.portafolio[nActual]:gatReal        = 0    
        miEci.eci.actual.portafolio[nActual]:importe        = DB_Inv_Inversion.APagar        
    END
    //**** PORTAFOLIO MES ANTERIOR  ****
    IF  DB_Inv_Inversion.FechaInversion < dPeriodoDel AND DB_Inv_Inversion.FechaVencimiento > dPeriodoAl THEN
        nAnterior++    
        miEci.eci.anterior.portafolio[nAnterior]:concepto       = "PAGARE"
        miEci.eci.anterior.portafolio[nAnterior]:certificado    = DB_Inv_Inversion.Folio
        miEci.eci.anterior.portafolio[nAnterior]:plazo             = DB_Inv_Inversion.Plazo
        miEci.eci.anterior.portafolio[nAnterior]:inversion         = DB_Inv_Inversion.FechaInversion
        miEci.eci.anterior.portafolio[nAnterior]:vencimiento     = DB_Inv_Inversion.FechaVencimiento
        miEci.eci.anterior.portafolio[nAnterior]:tasa             = DB_Inv_Inversion.TasaBruta
        miEci.eci.anterior.portafolio[nAnterior]:gatNominal     = 0
        miEci.eci.anterior.portafolio[nAnterior]:gatReal        = 0    
        miEci.eci.anterior.portafolio[nAnterior]:importe        = DB_Inv_Inversion.APagar            
    END    
        
    HReadNext(DB_Inv_Inversion,IdDB_Inv_Contrato)
    
END
//info("terminé xml")

IF miEci.eci.movimientos..Occurrence > 0 OR miEci.eci.actual..Occurrence > 0 THEN
    IF XMLValidDocument(miEci) = True THEN    
        sResultado = XMLBuildString(miEci)
        HReset(DB_Inv_Eci)
        DB_Inv_Eci.IdDB_Inv_eci        = GP_DameIdentificador()
        DB_Inv_Eci.IdDB_Inv_Contrato= gsIdDB_Inv_Contrato
        DB_Inv_Eci.Contenido        = sResultado
        DB_Inv_Eci.Año               = gnAño
        DB_Inv_Eci.Mes               = gnMes
        IF HSave(DB_Inv_Eci) = True THEN
            //info("guardado")
        END
        //Ahora guardo el archivo para poder timbrarlo    
        IF ErrorOccurred = True THEN
            Error("No se pudo grabar el documento", ErrorInfo())
        ELSE
            //Info("OK")
        END
    ELSE
        Error("El documento XML es inválido", ErrorInfo())
    END
    
END

RESULT sResultado


Try catch end

 // -------------------------------------------------- // Procedure principal que executa uma query com tratamento de exceção // -----------...