by andaretor » Wed Dec 02, 2015 11:19 am
Hola:
Yo lo he hecho un poco rudimentario pero me lo ha aceptado el banco. Aquí os dejo cómo he elaborado el XML.
Espero que os sirva.
Ahora estoy con el tema de las devoluciones.
Un saludo.
fichero := "PRUEBA.xml"
nHandle:= FCreate( fichero )
// RAIZ DEL MENSAJE
cadena := "<?xml version=" + CHR(34) + "1.0" + CHR(34) + " encoding=" + CHR(34) + "utf-8" + CHR(34) + "?>"
FWriteLn( nHandle , cadena )
cadena := "<Document xmlns=" + CHR(34) + "urn:iso:std:iso:20022:tech:xsd:pain.008.001.02" + CHR(34) + " xmlns:xsi=" + CHR(34) + "http://www.w3.org/2001/XMLSchema-instance" + CHR(34) + ">"
FWriteLn( nHandle , cadena )
cadena := "<CstmrDrctDbtInitn>"
FWriteLn( nHandle , cadena )
// CABECERA
cadena := "<GrpHdr>"
FWriteLn( nHandle , cadena )
cadena := "<MsgId>" + "PRE" + Str( Year( date() ), 4 ) + Padl( Month( date() ), 2, "0" ) + Padl( Day( date() ), 2, "0" ) + Padr( cTime, 11, "0" ) + Padr( oDatos[ ( dbGesBanco )->( fieldpos( "Codigo" ) ) ], 13, "0" ) + "</MsgId>"
FWriteLn( nHandle , cadena )
cadena := "<CreDtTm>" + Str( Year( date() ), 4 ) + "-" + Padl( Month( date() ), 2, "0" ) + "-" + Padl( Day( date() ), 2, "0" ) + "T" + time() + "</CreDtTm>"
FWriteLn( nHandle , cadena )
cadena := "<NbOfTxs>" + AllTrim( Str( nCont ) ) + "</NbOfTxs>"
FWriteLn( nHandle , cadena )
cadena := "<CtrlSum>" + AllTrim( Transform( nTotImp, cPictImpSEPA(.F.) ) ) + "</CtrlSum>"
FWriteLn( nHandle , cadena )
cadena := "<InitgPty>"
FWriteLn( nHandle , cadena )
cadena := "<Nm>" + AllTrim( Padr( ArreglaNombre( oDatos[ ( dbGesBanco )->( fieldpos( "NOMBRE" ) ) ] ), 70, " " ) ) + "</Nm>"
FWriteLn( nHandle , cadena )
cadena := "<Id>"
FWriteLn( nHandle , cadena )
cadena := "<OrgId>"
FWriteLn( nHandle , cadena )
cadena := "<Othr>"
FWriteLn( nHandle , cadena )
cadena := "<Id>" + AllTrim( "ES" + cGetDigitIDSEPA( AllTrim( oDatos[ ( dbGesBanco )->( fieldpos( "NIF" ) ) ] ), "ES" ) + oDatos[ ( dbGesBanco )->( fieldpos( "Sufijo" ) ) ] + Padr( oDatos[ ( dbGesBanco )->( fieldpos( "NIF" ) ) ], 28, " " ) ) + "</Id>"
FWriteLn( nHandle , cadena )
cadena := "</Othr>"
FWriteLn( nHandle , cadena )
cadena := "</OrgId>"
FWriteLn( nHandle , cadena )
cadena := "</Id>"
FWriteLn( nHandle , cadena )
cadena := "</InitgPty>"
FWriteLn( nHandle , cadena )
cadena := "</GrpHdr>"
FWriteLn( nHandle , cadena )
// INFORMACION DEL PAGO
cadena := "<PmtInf>"
FWriteLn( nHandle , cadena )
cadena := "<PmtInfId>" + Str( Year( date() ), 4 ) + Padl( Month( date() ), 2, "0" ) + Padl( Day( date() ), 2, "0" ) + Padr( cTime, 11, "0" ) + Padr( oDatos[ ( dbGesBanco )->( fieldpos( "Codigo" ) ) ], 13, "0" ) + "</PmtInfId>"
FWriteLn( nHandle , cadena )
cadena := "<PmtMtd>DD</PmtMtd>"
FWriteLn( nHandle , cadena )
cadena := "<PmtTpInf>"
FWriteLn( nHandle , cadena )
cadena := "<SvcLvl>"
FWriteLn( nHandle , cadena )
cadena := "<Cd>SEPA</Cd>"
FWriteLn( nHandle , cadena )
cadena := "</SvcLvl>"
FWriteLn( nHandle , cadena )
cadena := "<LclInstrm>"
FWriteLn( nHandle , cadena )
cadena := "<Cd>CORE</Cd>"
FWriteLn( nHandle , cadena )
cadena := "</LclInstrm>"
FWriteLn( nHandle , cadena )
cadena := "<SeqTp>RCUR</SeqTp>"
FWriteLn( nHandle , cadena )
cadena := "</PmtTpInf>"
FWriteLn( nHandle , cadena )
cadena := "<ReqdColltnDt>" + Str( Year( dFecha ), 4 ) + "-" + Padl( Month( dFecha ), 2, "0" ) + "-" + Padl( Day( dFecha ), 2, "0" ) + "</ReqdColltnDt>"
FWriteLn( nHandle , cadena )
cadena := "<Cdtr>"
FWriteLn( nHandle , cadena )
cadena := "<Nm>" + AllTrim( Padr( ArreglaNombre( oDatos[ ( dbGesBanco )->( fieldpos( "NOMBRE" ) ) ] ), 70, " " ) ) + "</Nm>"
FWriteLn( nHandle , cadena )
cadena := "</Cdtr>"
FWriteLn( nHandle , cadena )
cadena := "<CdtrAcct>"
FWriteLn( nHandle , cadena )
cadena := "<Id>"
FWriteLn( nHandle , cadena )
cadena := "<IBAN>" + AllTrim( Padr( oDatos[ ( dbGesBanco )->( fieldpos( "CCCABONO" ) ) ], 34, " " ) ) + "</IBAN>"
FWriteLn( nHandle , cadena )
cadena := "</Id>"
FWriteLn( nHandle , cadena )
cadena := "</CdtrAcct>"
FWriteLn( nHandle , cadena )
cadena := "<CdtrAgt>"
FWriteLn( nHandle , cadena )
cadena := "<FinInstnId>"
FWriteLn( nHandle , cadena )
cadena := "</FinInstnId>"
FWriteLn( nHandle , cadena )
cadena := "</CdtrAgt>"
FWriteLn( nHandle , cadena )
cadena := "<CdtrSchmeId>"
FWriteLn( nHandle , cadena )
cadena := "<Id>"
FWriteLn( nHandle , cadena )
cadena := "<PrvtId>"
FWriteLn( nHandle , cadena )
cadena := "<Othr>"
FWriteLn( nHandle , cadena )
cadena := "<Id>" + AllTrim( "ES" + cGetDigitIDSEPA( AllTrim( oDatos[ ( dbGesBanco )->( fieldpos( "NIF" ) ) ] ), "ES" ) + oDatos[ ( dbGesBanco )->( fieldpos( "Sufijo" ) ) ] + Padr( oDatos[ ( dbGesBanco )->( fieldpos( "NIF" ) ) ], 28, " " ) ) + "</Id>"
FWriteLn( nHandle , cadena )
cadena := "<SchmeNm>"
FWriteLn( nHandle , cadena )
cadena := "<Prtry>SEPA</Prtry>"
FWriteLn( nHandle , cadena )
cadena := "</SchmeNm>"
FWriteLn( nHandle , cadena )
cadena := "</Othr>"
FWriteLn( nHandle , cadena )
cadena := "</PrvtId>"
FWriteLn( nHandle , cadena )
cadena := "</Id>"
FWriteLn( nHandle , cadena )
cadena := "</CdtrSchmeId>"
FWriteLn( nHandle , cadena )
// INFORMACION DEL ADEUDO DIRECTO
( cDbTmp )->( DbGoTop() )
nCont := 0
nTotImp := 0
nContReg := 0
While ( cDbTmp )->( !Eof() )
If ( cDbTmp )->LSELECT .and. ( cDBTmp )->IMPORTE > 0
nCont ++
nTotImp += ( cDbTmp )->IMPORTE
cadena := "<DrctDbtTxInf>"
FWriteLn( nHandle , cadena )
cadena := "<PmtId>"
FWriteLn( nHandle , cadena )
cadena := "<EndToEndId>" + Padr( "REMESA HERMANDAD REF. "+oDatos[ ( dbGesBanco )->( fieldpos( "Codigo" ) ) ]+( cDbTmp )->CODIGO, 35, " " ) + "</EndToEndId>"
FWriteLn( nHandle , cadena )
cadena := "</PmtId>"
FWriteLn( nHandle , cadena )
cadena := "<InstdAmt Ccy=" + CHR(34) + "EUR" + CHR(34) + ">" + AllTrim( Transform( ( cDbTmp )->IMPORTE, cPictImpSEPA(.F.) ) ) + "</InstdAmt>"
FWriteLn( nHandle , cadena )
cadena := "<DrctDbtTx>"
FWriteLn( nHandle , cadena )
cadena := "<MndtRltdInf>"
FWriteLn( nHandle , cadena )
cadena := "<MndtId>" + Padr( ( cDbTmp )->REFBANCO, 35, " " ) + "</MndtId>"
FWriteLn( nHandle , cadena )
cadena := "<DtOfSgntr>" + Str( Year( ( cDbTmp )->MANDATO ), 4 ) + "-" + Padl( Month( ( cDbTmp )->MANDATO ), 2, "0" ) + "-" + Padl( Day( ( cDbTmp )->MANDATO ), 2, "0" ) + "</DtOfSgntr>"
FWriteLn( nHandle , cadena )
cadena := "</MndtRltdInf>"
FWriteLn( nHandle , cadena )
cadena := "</DrctDbtTx>"
FWriteLn( nHandle , cadena )
cadena := "<DbtrAgt>"
FWriteLn( nHandle , cadena )
cadena := "<FinInstnId>"
FWriteLn( nHandle , cadena )
cadena := "</FinInstnId>"
FWriteLn( nHandle , cadena )
cadena := "</DbtrAgt>"
FWriteLn( nHandle , cadena )
cadena := "<Dbtr>"
FWriteLn( nHandle , cadena )
cadena := "<Nm>" + AllTrim( Padr( ArreglaNombre( AllTrim( ( cDbTmp )->NOMBRE ) + " " + AllTrim( ( cDbTmp )->APELLIDOS ) ), 70, " " ) ) + "</Nm>"
FWriteLn( nHandle , cadena )
cadena := "</Dbtr>"
FWriteLn( nHandle , cadena )
cadena := "<DbtrAcct>"
FWriteLn( nHandle , cadena )
cadena := "<Id>"
FWriteLn( nHandle , cadena )
cadena := "<IBAN>" + AllTrim( Padr( "ES" + DCIdentificador( ( cDbTmp )->CBANCO + ( cDbTmp )->COFICINA + ( cDbTmp )->CCUENTA + "ES00" ) + ( cDbTmp )->CBANCO + ( cDbTmp )->COFICINA + ( cDbTmp )->CCUENTA, 34, " " ) ) + "</IBAN>"
FWriteLn( nHandle , cadena )
cadena := "</Id>"
FWriteLn( nHandle , cadena )
cadena := "</DbtrAcct>"
FWriteLn( nHandle , cadena )
cadena := "<RmtInf>"
FWriteLn( nHandle , cadena )
cadena := "<Ustrd>" + AllTrim( Padr( ArreglaNombre( AllTrim( ( cDbTmp )->OBSERV ) ), 140, " " ) ) + "</Ustrd>"
FWriteLn( nHandle , cadena )
cadena := "</RmtInf>"
FWriteLn( nHandle , cadena )
cadena := "</DrctDbtTxInf>"
FWriteLn( nHandle , cadena )
end if
( cDbTmp )->( DbSkip() )
end while
cadena := "</PmtInf>"
FWriteLn( nHandle , cadena )
cadena := "</CstmrDrctDbtInitn>"
FWriteLn( nHandle , cadena )
cadena := "</Document>"
FWriteLn( nHandle , cadena )
FClose(nHandle)