Adeudos Directos SEPA en euros Esquema B2B
Re: Adeudos Directos SEPA en euros Esquema B2B
Parece que en el formato texto 19.14 o 19.44, la referencia:
Campo 7: Identificación del fichero: referencia que asigna el presentador al fichero, para su envío a
la entidad receptora.
Esta referencia se estructurará de la siguiente manera, tomando los datos generados
por el ordenador del presentador en el momento de la creación del fichero:
• Indicador del tipo de mensaje (3 caracteres)
• AAAAMMDD (año, mes y día) = (8 caracteres)
• HHMMSSmmmmm (hora minuto segundo y 5 posiciones de milisegundos = 11
caracteres)
• Referencia identificativa que asigne el presentador (13 caracteres)
El indicador de tipo de mensaje tomará el valor:
PRE Fichero de presentación de adeudos
Un ejemplo de Identificación de un fichero de presentación:
PRE20101105223542122450159300491893
Campo 7: Identificación del fichero: referencia que asigna el presentador al fichero, para su envío a
la entidad receptora.
Esta referencia se estructurará de la siguiente manera, tomando los datos generados
por el ordenador del presentador en el momento de la creación del fichero:
• Indicador del tipo de mensaje (3 caracteres)
• AAAAMMDD (año, mes y día) = (8 caracteres)
• HHMMSSmmmmm (hora minuto segundo y 5 posiciones de milisegundos = 11
caracteres)
• Referencia identificativa que asigne el presentador (13 caracteres)
El indicador de tipo de mensaje tomará el valor:
PRE Fichero de presentación de adeudos
Un ejemplo de Identificación de un fichero de presentación:
PRE20101105223542122450159300491893
Adeudos Directos SEPA en euros Esquema B2B
¿Está alguien usándolo ya de forma habitual para generar recibos domiciliados?. Parece que en general en los bancos se siguen aceptando los ficheros planos de texto con las normas antiguas pues los clientes de las empresas que generan estos recibos se resisten a firmar la orden de pago, por aquello de no poder devolver los recibos si no están de acuerdo, y antes que perder clientes prefieren seguir trabajando como hasta ahora.
¿Hay alguna recopilación de funciones para el asunto SEPA?.
Saludos.
¿Hay alguna recopilación de funciones para el asunto SEPA?.
Saludos.
- informaticaeloy
- Posts: 118
- Joined: Fri Dec 20, 2013 10:39 am
- Location: Zaragoza, España
- Contact:
Re: Adeudos Directos SEPA en euros Esquema B2B
Hola. Precisamente, a mis clientes, hoy les han notificado desde Ibarcaja que el 17 de marzo funcionaría la norma 19 y el día 18 no, así que aquí estoy, preparando la 19.14
Windows 10 + FWH 20.08 + BCC 7.4 + Harbour 3.2.0 + PSPad 5.0.3
Re: Adeudos Directos SEPA en euros Esquema B2B
Hola,
Un cliente mío de Barcelona tiene problemas con el carácter ’, que es el chr(146) pero en ascii no me sale en el MED, pero sí que lo meten al programa, y no se admite por SEPA.
¿A alguien le ha sucedido?.
Muchas gracias!.
Un cliente mío de Barcelona tiene problemas con el carácter ’, que es el chr(146) pero en ascii no me sale en el MED, pero sí que lo meten al programa, y no se admite por SEPA.
¿A alguien le ha sucedido?.
Muchas gracias!.
Saludos,
Eduardo
Eduardo
Re: Adeudos Directos SEPA en euros Esquema B2B
SEPA dice que admite todos estos:mgsoft wrote:Hola,
Un cliente mío de Barcelona tiene problemas con el carácter ’, que es el chr(146) pero en ascii no me sale en el MED, pero sí que lo meten al programa, y no se admite por SEPA.
¿A alguien le ha sucedido?.
Muchas gracias!.
Local cCaracteresOK := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
cCaracteresOk := cCaracteresOk + Lower( cCaracteresOk )
cCaracteresOk := cCaracteresOk + "1234567890"
cCaracteresOk := cCaracteresOk + "/-?:().,'+ "
y consigo meterle un literal (sacado del fichero TXT que le doy al banco) así (sin las doble comillas):
"...edelroser.COM 'Consulta rebut' Codi:..."
Saludos,
Un Saludo
Carlos G.
FiveWin 19.06 + Harbour 3.2, BCC 7 Windows 10
Carlos G.
FiveWin 19.06 + Harbour 3.2, BCC 7 Windows 10
Re: Adeudos Directos SEPA en euros Esquema B2B
Hola,
Alguno tiene funcionando el xml?. El Banco dice que desde febrero de 2016 todo tiene que ser xml y no admitirán txt!!!!.
Muy agradecida.
Alguno tiene funcionando el xml?. El Banco dice que desde febrero de 2016 todo tiene que ser xml y no admitirán txt!!!!.
Muy agradecida.
Re: Adeudos Directos SEPA en euros Esquema B2B
Muy estimados,
Se acerca la fatídica fecha del primero de febrero de 2016.
Ese día parece que nuestras remesas habrán de estar codificadas en formato xml. Los
usuarios ya empiezan a estar nerviosos porque los bancos ya les van dando "toquecitos"
de que tienen que pasarselas como archivos .xml.
Probando la clase de Joaquín Ferrer (gracias Joaquin) me encuentro que me da errores.
¿ Alguien la está usando en producción ?
gracias de antemano.
PD. Aquí los errores generados con el testSEPA.xml contra su schema:
Se acerca la fatídica fecha del primero de febrero de 2016.
Ese día parece que nuestras remesas habrán de estar codificadas en formato xml. Los
usuarios ya empiezan a estar nerviosos porque los bancos ya les van dando "toquecitos"
de que tienen que pasarselas como archivos .xml.
Probando la clase de Joaquín Ferrer (gracias Joaquin) me encuentro que me da errores.
¿ Alguien la está usando en producción ?
gracias de antemano.
PD. Aquí los errores generados con el testSEPA.xml contra su schema:
- ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}MsgId': [facet 'maxLength'] The value has a length of '36'; this exceeds the allowed maximum length of '35'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}MsgId': '
PRE2015112518544068080REMESA001 ' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}Max35Text'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}CreDtTm': '
2015-11-25T18:54:40' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}ISODateTime'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}NbOfTxs': [facet 'pattern'] The value '
3' is not accepted by the pattern '[0-9]{1,15}'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}NbOfTxs': '
3' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}Max15NumericText'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}BICOrBEI': [facet 'pattern'] The value '
BSABESBBXXX' is not accepted by the pattern '[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}BICOrBEI': '
BSABESBBXXX' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}AnyBICIdentifier'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtInfId': [facet 'maxLength'] The value has a length of '37'; this exceeds the allowed maximum length of '35'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtInfId': '
PRE2015112518544068080REMESA001-0001' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}Max35Text'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtMtd': [facet 'enumeration'] The value '
DD' is not an element of the set {'DD'}.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtMtd': '
DD' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}PaymentMethod2Code'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}BtchBookg': '
TRUE' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}BatchBookingIndicator'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}NbOfTxs': [facet 'pattern'] The value '
1' is not accepted by the pattern '[0-9]{1,15}'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}NbOfTxs': '
1' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}Max15NumericText'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}Cd': [facet 'maxLength'] The value has a length of '5'; this exceeds the allowed maximum length of '4'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}Cd': '
SEPA' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}ExternalServiceLevel1Code'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}SeqTp': [facet 'enumeration'] The value '
RCUR' is not an element of the set {'FRST', 'RCUR', 'FNAL', 'OOFF'}.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}SeqTp': '
RCUR' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}SequenceType1Code'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}ReqdColltnDt': '
2014-03-03' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}ISODate'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}ChrgBr': This element is not expected. Expected is ( {urn:iso:std:isotech:xsd:pain.008.001.02}CdtrAcct ).
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtInfId': [facet 'maxLength'] The value has a length of '37'; this exceeds the allowed maximum length of '35'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtInfId': '
PRE2015112518544068080REMESA001-0001' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}Max35Text'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtMtd': [facet 'enumeration'] The value '
DD' is not an element of the set {'DD'}.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtMtd': '
DD' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}PaymentMethod2Code'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}BtchBookg': '
TRUE' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}BatchBookingIndicator'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}NbOfTxs': [facet 'pattern'] The value '
1' is not accepted by the pattern '[0-9]{1,15}'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}NbOfTxs': '
1' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}Max15NumericText'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}Cd': [facet 'maxLength'] The value has a length of '5'; this exceeds the allowed maximum length of '4'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}Cd': '
SEPA' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}ExternalServiceLevel1Code'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}SeqTp': [facet 'enumeration'] The value '
RCUR' is not an element of the set {'FRST', 'RCUR', 'FNAL', 'OOFF'}.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}SeqTp': '
RCUR' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}SequenceType1Code'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}ReqdColltnDt': '
2014-03-13' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}ISODate'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}ChrgBr': This element is not expected. Expected is ( {urn:iso:std:isotech:xsd:pain.008.001.02}CdtrAcct ).
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtInfId': [facet 'maxLength'] The value has a length of '37'; this exceeds the allowed maximum length of '35'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtInfId': '
PRE2015112518544068080REMESA001-0001' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}Max35Text'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtMtd': [facet 'enumeration'] The value '
DD' is not an element of the set {'DD'}.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtMtd': '
DD' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}PaymentMethod2Code'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}BtchBookg': '
TRUE' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}BatchBookingIndicator'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}NbOfTxs': [facet 'pattern'] The value '
1' is not accepted by the pattern '[0-9]{1,15}'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}NbOfTxs': '
1' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}Max15NumericText'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}Cd': [facet 'maxLength'] The value has a length of '5'; this exceeds the allowed maximum length of '4'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}Cd': '
SEPA' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}ExternalServiceLevel1Code'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}SeqTp': [facet 'enumeration'] The value '
RCUR' is not an element of the set {'FRST', 'RCUR', 'FNAL', 'OOFF'}.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}SeqTp': '
RCUR' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}SequenceType1Code'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}ReqdColltnDt': '
2014-03-23' is not a valid value of the atomic type '{urn:iso:std:isotech:xsd:pain.008.001.02}ISODate'.
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}ChrgBr': This element is not expected. Expected is ( {urn:iso:std:isotech:xsd:pain.008.001.02}CdtrAcct ).
Re: Adeudos Directos SEPA en euros Esquema B2B
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:isotech: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)
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:isotech: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)
Re: Adeudos Directos SEPA en euros Esquema B2B
Hola Andaretor,
Muchas gracias por tu aporte. Voy a probarlo.
Saludos
Muchas gracias por tu aporte. Voy a probarlo.
Saludos
Re: Adeudos Directos SEPA en euros Esquema B2B
Hay funciones que no aparecen:
ArreglaNombre
DCIdentificador
cGetDigitIDSEPA
¿Podías ponernos el código?
Gracias de antemano.
ArreglaNombre
DCIdentificador
cGetDigitIDSEPA
¿Podías ponernos el código?
Gracias de antemano.
Re: Adeudos Directos SEPA en euros Esquema B2B
Hola!,
¿Algún progreso?.
Yo probé también el código de Quimm y no funciona correctamente.
Muy agradecida .
¿Algún progreso?.
Yo probé también el código de Quimm y no funciona correctamente.
Muy agradecida .
Re: Adeudos Directos SEPA en euros Esquema B2B
Buenas
Por lo que veo, los errores son de validación , no de estructura del XML, por poner un ejemplo ;
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtInfId': [facet 'maxLength'] The value has a length of '37'; this exceeds the allowed maximum length of '35'
Dicen bien claro que estas pasando un valor de longitud de 37, cuando el máx. es de 35.
Por lo tanto, la clase o funcion que crea el XML , debería tener en cuenta el XSD para que cumple el XML.
Saludos Cordiales
Por lo que veo, los errores son de validación , no de estructura del XML, por poner un ejemplo ;
ERROR: Element '{urn:iso:std:isotech:xsd:pain.008.001.02}PmtInfId': [facet 'maxLength'] The value has a length of '37'; this exceeds the allowed maximum length of '35'
Dicen bien claro que estas pasando un valor de longitud de 37, cuando el máx. es de 35.
Por lo tanto, la clase o funcion que crea el XML , debería tener en cuenta el XSD para que cumple el XML.
Saludos Cordiales
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Re: Adeudos Directos SEPA en euros Esquema B2B
Amig@s,
¿Se sabe algo?.
Que dios os bendiga y feliz 2016.
¿Se sabe algo?.
Que dios os bendiga y feliz 2016.