AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 AFIP – SDG SIT – DI INTR WebService: presentacionprocessor Presentación de DDJJ desde Organismos Externos Manual para el desarrollador Revisión correspondiente al 18/07/2013 Página 1 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 Revisión Histórica Versión Fecha Descripción 0.1.0 11/8/10 Creación del documento. 0.1.1 19/8/10 Actualización de URLs de documentación adicional. 0.1.2 19/4/13 Se ajusta el documento para cumplir estándares de los WS de AFIP. 0.1.3 24/04/13 Se agrega descripción de un caso de uso típico donde se usará este WebService 0.1.4 29/04/13 Se ajusta según observaciones de tecnología: - Actualización URL de Producción - Actualización operacion dummy - Actualización nombres de campos y descripciones del upload request 0.1.5 18/07/13 Se agrega aclaración del parámetro representadoCUIT en punto 2.3 Lista de Operaciones Página 2 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 Contenido WebService: presentacionprocessor _________ 1 1. INTRODUCCIÓN..............................................................................................................................4 1.1. 1.2. 1.3. 1.4. 2. Objetivo ____________________________________________________________ 4 Alcance ____________________________________________________________ 4 Precondiciones ______________________________________________________ 4 Caso de Uso ________________________________________________________ 4 ESPECIFICACIÓN DEL WEB SERVICE .....................................................................................5 2.1. 2.2 2.3 URLs del WSDL _____________________________________________________ 5 Servicio: presentacionprocessor__________________________________________ 5 Lista de Operaciones Posibles ___________________________________________ 5 Ejemplo para SOAPUI _________________________________________________ 7 3. TRATAMIENTO DE ERRORES EN EL WS.................................................................................9 3.1. 4. Ejemplos de errores: __________________________________________________ 9 EJEMPLOS DE CLIENTES...........................................................................................................10 4.1. 4.2. Cliente java ________________________________________________________ 10 Cliente Visual Basic .NET _____________________________________________ 12 Página 3 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 1. Introducción 1.1. Objetivo Este documento esta dirigido a los Organismos Externos que deban desarrollar una aplicación cliente, para que puedan realizar la presentación de declaraciones juradas de manera automática en el Sistema de Presentación de Declaraciones Juradas y Pagos de la AFIP. 1.2. Alcance Este documento brinda las especificaciones técnicas para desarrollar el cliente del Web Service que se comunicará con el sistema SETI, para la presentación autómata de una DDJJ. 1.3. Precondiciones Lo detallado en este documento deberá complementarse con los relativos a Servicio de Autenticación, Autorización y Establecimiento del canal de comunicación. El cliente deberá estar autenticado por el WSAA para poder invocar el servicio de web service detallado en este documento. 1.4. Caso de Uso Breve descripción de un caso de uso típico donde se usará este WebService: - El contribuyente ingresa al sitio web de un Organismo Recaudador (ej AGIP) - El contribuyente selecciona la opción [Crear una nueva DJ] - El contribuyente completa una DJ y da clic en la opción [Presentar la DJ] - La aplicación envía la DJ a la AFIP mediante este WebService Página 4 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 2. Especificación del Web Service 2.1. URLs del WSDL Entorno Testing Producción 2.2 Dirección https://awshomo.afip.gov.ar/setiws/webservices/uploadPresentacionService?wsdl https://aws.afip.gov.ar/setiws/webservices/uploadPresentacionService?wsdl Servicio: presentacionprocessor El nombre de servicio ante WSAA es presentacionprocessor El servicio es delegable: “El Organismo Recaudador usuario del servicio (ej AGIP) podría, si lo cree conveniente, terciarizar la operación del cliente del ws con otra empresa (ej: InterBanking)” 2.3 Lista de Operaciones Posibles Request: dummy() Operación para verificar disponibilidad de servicio sin autenticación (no espera recibir token/sign) <!-- Request dummy: --> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dom="http://domain.presentacion.seti.osiris.afip.gov/"> <soapenv:Header/> <soapenv:Body> <dom:dummy/> </soapenv:Body> </soapenv:Envelope> Response: responde status de appserver, dbserver y authserver <!-- Response dummy: --> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns2:dummyResponse xmlns:ns2="http://domain.presentacion.seti.osiris.afip.gov/"> <return> <appserver>OK</appserver> Página 5 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 <authserver>OK</authserver> <dbserver>OK</dbserver> </return> </ns2:dummyResponse> </soap:Body> </soap:Envelope> Request: upload( String token, String sign, Long representadoCuit, String presentacionDataHandler, String fileName ) Operación que permite realizar la presentación de la DJ en el sistema SETI. - token: obtenido desde el WSAA - sign: obtenido desde el WSAA - representadoCuit: cuit del organismo representado (usuario del servicio) La CUIT debe coincidir con la CUIT que usa el certificado para firmar el ticket de acceso al WSAA. - presentacionDataHandler: o referencia al archivo adjunto optimizado con MTOM o xsd:base64Binary xmlmime:expectedContentType="application/octetstream" - fileName: nombre del archivo, debe tener formato valido para SETI, ejemplos: o F5220.20246634360.txt Para el Formulario 5220 donde la CUIT debe ser la del registro 1 de la DJ o 951616F0159.dat Para el Formulario 159 donde los primeros 6 dígitos es el numero verificador de la DJ o 215983F0713.0cbf6f2f45d83adf11cd9d72b3992bdb.b64 Para el Formulario 713 donde los primeros 6 dígitos es el numero verificador de la DJ Página 6 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 Ejemplo para SOAPUI Setear en true las siguientes Request Properties - Enable MTOM = true Force MTOM = true Expand MTOM Attachments = true Adjuntar archivo, en este caso: 215983F0713.0cbf6f2f45d83adf11cd9d72b3992bdb.b64 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dom="http://domain.presentacion.seti.osiris.afip.gov/"> <soapenv:Header/> <soapenv:Body> <dom:upload> <token>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9I nllcyI/Pgo8c3NvIHZlcnNpb249IjIuMCI+CiAgICA8aWQgdW5pcXVlX2lkPSIzMjQ1MDQxODkzIiBzc mM9IkNOPXdzYWFob21vLCBPPUFGSVAsIEM9QVIsIFNFUklBTE5VTUJFUj1DVUlUIDMzNjkzNDUwMjM5I iBnZW5fdGltZT0iMTM2NjIyNTQwNCIgZXhwX3RpbWU9IjEzNjYyNjg2NjQiLz4KICAgIDxvcGVyYXRpb 24gdmFsdWU9ImdyYW50ZWQiIHR5cGU9ImxvZ2luIj4KICAgICAgICA8bG9naW4gdWlkPSJDPWFyLCBPP WFmaXAsIFNFUklBTE5VTUJFUj1DVUlUIDIwMjY3MzM1NTY4LCBDTj1wcmVzZW50YWNpb25wcm9jZXNzb 3IiIHNlcnZpY2U9InByZXNlbnRhY2lvbnByb2Nlc3NvciIgcmVnbWV0aG9kPSIyMiIgZW50aXR5PSIzM zY5MzQ1MDIzOSIgYXV0aG1ldGhvZD0iY21zIj4KICAgICAgICAgICAgPHJlbGF0aW9ucz4KICAgICAgI CAgICAgICAgIDxyZWxhdGlvbiByZWx0eXBlPSI0IiBrZXk9IjIwMjY3MzM1NTY4Ii8+CiAgICAgICAgI CAgIDwvcmVsYXRpb25zPgogICAgICAgIDwvbG9naW4+CiAgICA8L29wZXJhdGlvbj4KPC9zc28+Cgo= </token> <sign>fw08JYAXZezAKpPjk58+YMARjipdh29IgkLNv6pqndV9fecW2R30c6TDPdqetJNhTV BoIPKJNQgCdN2EHMGlepzDCG6blB7bJtHhVGYCbE2Uejq0d8FiH+NFXk1cHhcFTVo0sODlMLthSLf0Vn 3+/g5RsDEvVbVqTd1UDzfNwNg=</sign> <representadoCuit>20267335568</representadoCuit> <presentacion> <presentacionDataHandler>cid:215983F0713.0cbf6f2f45d83adf11cd9d72b3992bdb.b64</presentacionData Handler> <fileName>215983F0713.0cbf6f2f45d83adf11cd9d72b3992bdb.b64</fileName> </presentacion> </dom:upload> Página 7 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 </soapenv:Body> </soapenv:Envelope> Response: número único asignado a la presentación de la DJ por parte de AFIP. <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns2:uploadResponse xmlns:ns2="http://domain.presentacion.seti.osiris.afip.gov/"> <return>62372464</return> </ns2:uploadResponse> </soap:Body> </soap:Envelope> Página 8 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 3. Tratamiento de errores en el WS La operación upload del webService devuelve un SOAP Fault en caso de error. (Ver http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383507) Clasificación de errores: # 1 FaultCode Client.contentError 2 User.businessError 3 Server.processError 3.1. FaultString - CUIT contribuyente inválida etc - Request mal formado - Archivo adjunto inválido - El período fiscal no corresponde etc - Error accediendo a base de datos etc Ejemplos de errores: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <soap:Fault> <faultcode>soap:Client.contentError</faultcode> <faultstring>La cuit [20111111112] no corresponde con ninguna de las cuits habilitadas para la sesion</faultstring> <detail> <server>1</server> </detail> </soap:Fault> </soap:Body> </soap:Envelope> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <soap:Fault> <faultcode>soap:User.businessError</faultcode> <faultstring>El nombre del archivo [F05680.txt] no corresponde con ningún formato válido</faultstring> <detail> <server>1</server> </detail> </soap:Fault> </soap:Body></soap:Envelope> Página 9 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 4. Ejemplos de Clientes 4.1. Cliente java package gov.afip.osiris.seti.presentacion.domain; import gov.afip.osiris.seti.presentacion.domain.service.implementation.ws.Upload; import java.io.File; import java.net.URI; import java.net.URL; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import javax.xml.ws.soap.SOAPBinding; public final class PresentacionProcessorMTOMService_PresentacionProcessorMTOMImplPort_Client { private static final QName SERVICE_NAME = new QName("http://ws.implementation.service.domain.presentacion.seti.osiris.afip.gov/", "upload"); private PresentacionProcessorMTOMService_PresentacionProcessorMTOMImplPort_Client() {} public static void main(String args[]) throws java.lang.Exception { URL wsdlURL = PresentacionProcessorMTOMService_PresentacionProcessorMTOMImplPort_Client.class.getResource( "uploadPresentacionService.wsdl" ); PresentacionProcessorMTOMService port = (new Upload(wsdlURL, SERVICE_NAME)).getPresentacionProcessorMTOMImplPort(); ((SOAPBinding)((BindingProvider)port).getBinding()).setMTOMEnabled(true); File aFile = new File(new URI((PresentacionProcessorMTOMService_PresentacionProcessorMTOMImplPort_Client.class.getResource( "951616F0159.dat" )).toString())); System.out.println("Invoking upload..."); String _upload_token = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9I nllcyI/Pgo8c3NvIHZlcnNpb249IjIuMCI+CiAgICA8aWQgdW5pcXVlX2lkPSIzMjQ1MDQxODkzIiBzc mM9IkNOPXdzYWFob21vLCBPPUFGSVAsIEM9QVIsIFNFUklBTE5VTUJFUj1DVUlUIDMzNjkzNDUwMjM5I iBnZW5fdGltZT0iMTM2NjIyNTQwNCIgZXhwX3RpbWU9IjEzNjYyNjg2NjQiLz4KICAgIDxvcGVyYXRpb 24gdmFsdWU9ImdyYW50ZWQiIHR5cGU9ImxvZ2luIj4KICAgICAgICA8bG9naW4gdWlkPSJDPWFyLCBPP WFmaXAsIFNFUklBTE5VTUJFUj1DVUlUIDIwMjY3MzM1NTY4LCBDTj1wcmVzZW50YWNpb25wcm9jZXNzb 3IiIHNlcnZpY2U9InByZXNlbnRhY2lvbnByb2Nlc3NvciIgcmVnbWV0aG9kPSIyMiIgZW50aXR5PSIzM zY5MzQ1MDIzOSIgYXV0aG1ldGhvZD0iY21zIj4KICAgICAgICAgICAgPHJlbGF0aW9ucz4KICAgICAgI CAgICAgICAgIDxyZWxhdGlvbiByZWx0eXBlPSI0IiBrZXk9IjIwMjY3MzM1NTY4Ii8+CiAgICAgICAgI CAgIDwvcmVsYXRpb25zPgogICAgICAgIDwvbG9naW4+CiAgICA8L29wZXJhdGlvbj4KPC9zc28+Cgo="; String _upload_sign = "fw08JYAXZezAKpPjk58+YMARjipdh29IgkLNv6pqndV9fecW2R30c6TDPdqetJNhTV BoIPKJNQgCdN2EHMGlepzDCG6blB7bJtHhVGYCbE2Uejq0d8FiH+NFXk1cHhcFTVo0sODlMLthSLf0Vn 3+/g5RsDEvVbVqTd1UDzfNwNg="; String _upload_representadoCuit = "20267335568"; PresentacionFileB2B _upload_presentacion = new PresentacionFileB2B(); _upload_presentacion.setPresentacionDataHandler( new DataHandler( new FileDataSource(aFile) ) ); _upload_presentacion.setFileName("951616F0159.dat"); try { long _upload__return = port.upload(_upload_token, _upload_sign, _upload_representadoCuit, _upload_presentacion); System.out.println("upload.result[" + _upload__return + "]"); Página 10 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 } catch (Exception_Exception e) { System.out.println("Expected exception: Exception has occurred."); System.out.println(e.toString()); } System.out.println("Invoking dummy..."); try { gov.afip.osiris.seti.presentacion.domain.DummyReturn _dummy__return = port.dummy(); System.out.println("dummy.result[appserver=" + _dummy__return.getAppserver() + ", authserver=" + _dummy__return.getAuthserver() + ", dbserver=" + _dummy__return.getDbserver() ); } catch (Exception_Exception e) { System.out.println("Expected exception: Exception has occurred."); System.out.println(e.toString()); } System.exit(0); } } Página 11 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador 4.2. Fecha: 18/7/13 Cliente Visual Basic .NET Module Module1 Sub Main() Dim ws As New ConsoleApplication1.presentacionService.PresentacionProcessorMTOMServiceClient Dim dummyReturn As New ConsoleApplication1.presentacionService.dummyReturn Dim presentacion As New ConsoleApplication1.presentacionService.presentacionFileB2B Dim nroTx As New Long Dim token As String Dim sign As String dummyReturn = ws.dummy() Console.WriteLine("dummy response[" + dummyReturn.appserver.ToString + "]") Console.ReadKey() token = " PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9I nllcyI/Pgo8c3NvIHZlcnNpb249IjIuMCI+CiAgICA8aWQgdW5pcXVlX2lkPSIzMjQ1MDQxODkzIiBzc mM9IkNOPXdzYWFob21vLCBPPUFGSVAsIEM9QVIsIFNFUklBTE5VTUJFUj1DVUlUIDMzNjkzNDUwMjM5I iBnZW5fdGltZT0iMTM2NjIyNTQwNCIgZXhwX3RpbWU9IjEzNjYyNjg2NjQiLz4KICAgIDxvcGVyYXRpb 24gdmFsdWU9ImdyYW50ZWQiIHR5cGU9ImxvZ2luIj4KICAgICAgICA8bG9naW4gdWlkPSJDPWFyLCBPP WFmaXAsIFNFUklBTE5VTUJFUj1DVUlUIDIwMjY3MzM1NTY4LCBDTj1wcmVzZW50YWNpb25wcm9jZXNzb 3IiIHNlcnZpY2U9InByZXNlbnRhY2lvbnByb2Nlc3NvciIgcmVnbWV0aG9kPSIyMiIgZW50aXR5PSIzM zY5MzQ1MDIzOSIgYXV0aG1ldGhvZD0iY21zIj4KICAgICAgICAgICAgPHJlbGF0aW9ucz4KICAgICAgI CAgICAgICAgIDxyZWxhdGlvbiByZWx0eXBlPSI0IiBrZXk9IjIwMjY3MzM1NTY4Ii8+CiAgICAgICAgI CAgIDwvcmVsYXRpb25zPgogICAgICAgIDwvbG9naW4+CiAgICA8L29wZXJhdGlvbj4KPC9zc28+Cgo=" sign = " fw08JYAXZezAKpPjk58+YMARjipdh29IgkLNv6pqndV9fecW2R30c6TDPdqetJNhTV BoIPKJNQgCdN2EHMGlepzDCG6blB7bJtHhVGYCbE2Uejq0d8FiH+NFXk1cHhcFTVo0sODlMLthSLf0Vn 3+/g5RsDEvVbVqTd1UDzfNwNg=" presentacion.fileName = "215983F0713.0cbf6f2f45d83adf11cd9d72b3992bdb.b64" presentacion.presentacionDataHandler = FileToByteArray("c:\Temp\cxf\215983F0713.0cbf6f2f45d83adf11cd9d72b3992bdb.b64") nroTx = ws.upload(token, sign, "20267335568", presentacion) Console.WriteLine("nroTx[" + nroTx.ToString + "]") Console.ReadKey() End Sub Public Function FileToByteArray(ByVal _FileName As String) As Byte() Dim _Buffer() As Byte = Nothing Try ' Open file for reading Dim _FileStream As New System.IO.FileStream(_FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read) ' attach filestream to binary reader Dim _BinaryReader As New System.IO.BinaryReader(_FileStream) ' get total byte length of the file Dim _TotalBytes As Long = New System.IO.FileInfo(_FileName).Length ' read entire file into buffer _Buffer = _BinaryReader.ReadBytes(CInt(Fix(_TotalBytes))) ' close file reader _FileStream.Close() _FileStream.Dispose() _BinaryReader.Close() Página 12 de 13 AFIP – SDG SIT – DI INTR ws presentacionprocessor – Manual para el Desarrollador Fecha: 18/7/13 Catch _Exception As Exception ' Error Console.WriteLine("Exception caught in process: {0}", _Exception.ToString()) End Try Return _Buffer End Function End Module Página 13 de 13