# Integración SAP <!-- Version del documento --> ## Control de Versiones | Versión | Fecha | Autor | Revisor | Descripción del Cambio | |--|--|--|--|--| |1.0|20210405|Segio.nustes/Francisco.Higuera|Jed Horne|Emisión| ## 1 Introduccion Este documento tiene como finalidad exponer la propuesta de integración del backend del ecommerce (order-api) con el webservice del sistema SAP, con el fin de enviar información sobre las órdenes procesadas en el ecommerce para que SAP realice el debido registro, facturación, asiento contable y registro del movimiento de inventario. ## 2 Motivación * Permitir interactuación entre el ecommerce y el ERP SAP, enviando la información de las órdenes para su debido procesamiento y/o facturación. * Recibir parámetros de la aplicación SAP donde se autorice la debida entrega de los productos al cliente y se culmine el proceso de venta, o en su defecto la negación de la venta con la observación respectiva que indique la causa. ## 2.1 Lluvia de Ideas * Realizar la conexión a través del lenguaje python framework django-rest del backend del ecommerce, con el webservice de la aplicación SAP. * El webservice de SAP está basado el protocolo SOAP basado en XML que intercambia información a través de HTTP en la parte inferior, teniendo como principal ventaja que se pueden pasar datos estructurados. * Python posee varias librerías que hacen la conexión con webservice con protocolo SOAP como pueden ser soaplib, osa, suds, zeep, entre otras. * Para generar el archivo XML que se enviará al webservice se debe contar con una librería python que facilite dicho proceso, entre éstas tenemos python-lxml, etree, entre otras. También se puede generar a través de templates donde se encuentre el formato establecido por el webservice y se llene dinámicamente. ## 3 Propuesta de implementación La propuesta consiste en incoporar en el backend del ecommerce, mecanismos necesarios para consumir el webservice de la aplicación SAP, basado en protocolo SOAP basado en intercambio de información con formato XML. El funcionamiento general del consumo del servicio SOAP se encuentra en la siguiente figura: ![](https://i.imgur.com/ph4Dd3S.png) Para efectos de la presente propuesta se sugiere la implementación de la librería Zeep de python compatible con el backend del ecommerce desarrollado en django, lo cual permitirá al momento de empacarel producto para la entrega al cliente, transmitir los datos de la orden a SAP para que realice el respectivo registro y responda el estatus con el detalle del mismo, según la respuesta si el estatus es aprobado se entrega de los productos terminando con esto el proceso de venta, si por el contrario se recibe el estatus no aprobado se realizará el seguimiento para hacer los ajustes correspondientes e informar al cliente. Para consumir el webservice de SAP para la presente propuesta el endpoint correspondiente es: `http://yoruba.la14.com:50000/XISOAPAdapter/MessageServlet?senderParty=&senderService=BS_TIENDA_VIRTUAL_QAS&receiverParty=&receiverService=&interface=SI_OperacionesTV_sync_Out&interfaceNamespace=http://la14po.com/TiendaVirtual/Operaciones` **Estructura del XML:** ``` <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> <soapenv:Header/> <soapenv:Body> <tem:CrearOrden> <!--Optional:--> <tem:orden> <!--Optional:--> <tem:numero>51876</tem:numero> <tem:fecha>2020-04-25</tem:fecha> <!--Optional:--> <tem:cliente> <!--Zero or more repetitions:--> <tem:Cliente> <!--Optional:--> <tem:nombre>ROBERTO DANILO</tem:nombre> <!--Optional:--> <tem:apellido>ZULUAGA GOMEZ</tem:apellido> <!--Optional:--> <tem:telefono>4881414</tem:telefono> <!--Optional:--> <tem:direccion>cra 84E # 25-98</tem:direccion> <!--Optional:--> <tem:email>traidor@hotmail.com</tem:email> <!--Optional:--> <tem:identificacion>10107593</tem:identificacion> <!--Optional:--> <tem:ciudad>Cali</tem:ciudad> <!--Optional:--> <tem:pais>CO</tem:pais> <!--Optional:--> <tem:celular>3182818273</tem:celular> <!--Optional:--> <tem:departamento>76</tem:departamento> <!--Optional:--> <tem:rol>AG</tem:rol> <!--Optional:--> <tem:clienteReferencia>0001600000</tem:clienteReferencia> </tem:Cliente> </tem:cliente> <!--Optional:--> <tem:items> <!--Zero or more repetitions:--> <tem:Item> <!--Optional:--> <tem:plu>3114461</tem:plu> <tem:cantidad>1</tem:cantidad> <tem:precio>1799000</tem:precio> <tem:subtotal>1799000</tem:subtotal> </tem:Item> </tem:items> <!--Optional:--> <tem:medioDePago> <!--Optional:--> <!-- <tem:nroTarjeta>?</tem:nroTarjeta> --> <!--Optional:--> <tem:autorizacion>1328821</tem:autorizacion> <!--Optional:--> <tem:terminal>19974</tem:terminal> <!--Optional:--> <tem:numOrden>99999</tem:numOrden> <!--Optional:--> <tem:viaDePago>TC17</tem:viaDePago> <tem:valor>1799000</tem:valor> <tem:IVA>287235</tem:IVA> <tem:INC>0</tem:INC> <tem:ITC>0</tem:ITC> <tem:Base>1511765</tem:Base> <tem:fecha>2020-04-24</tem:fecha> <!--Optional:--> <tem:ctaConsignacion></tem:ctaConsignacion> <!--Optional:--> <tem:CAJERO>22785</tem:CAJERO> <!--Optional:--> <tem:CAJA>5902</tem:CAJA> </tem:medioDePago> <!--Optional:--> <tem:E1EDK14> <!--Zero or more repetitions:--> <tem:E1EDK14> <!--Optional:--> <tem:QUALF>007</tem:QUALF> <!--Optional:--> <tem:ORGID>20</tem:ORGID> </tem:E1EDK14> <tem:E1EDK14> <!--Optional:--> <tem:QUALF>008</tem:QUALF> <!--Optional:--> <tem:ORGID>1000</tem:ORGID> </tem:E1EDK14> <tem:E1EDK14> <!--Optional:--> <tem:QUALF>018</tem:QUALF> <!--Optional:--> <tem:ORGID>13400;70000;83400</tem:ORGID> </tem:E1EDK14> <tem:E1EDK14> <!--Optional:--> <tem:QUALF>006</tem:QUALF> <!--Optional:--> <tem:ORGID>00</tem:ORGID> </tem:E1EDK14> <tem:E1EDK14> <!--Optional:--> <tem:QUALF>012</tem:QUALF> <!--Optional:--> <tem:ORGID>ZTV2</tem:ORGID> </tem:E1EDK14> <tem:E1EDK14> <!--Optional:--> <tem:QUALF>005</tem:QUALF> <!--Optional:--> <tem:ORGID>TV01</tem:ORGID> </tem:E1EDK14> </tem:E1EDK14> <!--Optional:--> <tem:SECTOR>00</tem:SECTOR> <!--Optional:--> <tem:ORGANIZACION>1000</tem:ORGANIZACION> <!--Optional:--> <tem:CENTRO>TV01</tem:CENTRO> <!--Optional:--> <tem:CLASE_PEDIDO>ZTVI</tem:CLASE_PEDIDO> <!--Optional:--> <tem:MONEDA>COP</tem:MONEDA> <!--Optional:--> <tem:COND_PAGO>D001</tem:COND_PAGO> <!--Optional:--> <tem:MOTIVO_PEDIDO>Y01</tem:MOTIVO_PEDIDO> <!--Optional:--> <tem:CANAL>20</tem:CANAL> </tem:orden> <!--Optional:--> <tem:codSap>?</tem:codSap> </tem:CrearOrden> </soapenv:Body> </soapenv:Envelope> ``` #### 3.1. Flujo del consumo del webservices de SAP: | Empleado | Aplicación | Backend |Webservices| | --- | --- | --- | --- | --- | |<sub>**1.** Proceso de empacado | | <sub>**2.** Cambiar estatus de la orden| || | <sub>**3.** Registrar cambio de estatus de la orden **Status.registerStatus**| || | <sub>**4.** Generar XML con la información de la orden **WebServices.generateXML**| || | <sub>**5.** Enviar XML al webservice de SAP| ||| | <sub>**6.** Registro y procesamiento de la orden || || | <sub>**7.** Registrar datos recibidos del webservices de SAP **WebServices.saveResponse**|| | | <sub>**8.** Mostrar estatus y detalles recibidos del webservices de SAP || **4.** Se debe incluir los siguientes datos en el xml: ``` { "orden": { "date": "2020-04-25", "customer": { "id": "uuid-uuid-uuid-uuidv4", "firstName": "ROBERTO DANILO", "lastName": "ZULUAGA GOMEZ", "phone": "4881414", "address": "cra 84E # 25-98", "email": "roberto@hotmail.com", "identification": "10107593", "city": "Cali", "country": "CO", "mobile": "3182818273", "departament": "09", "departament": "76", "rol": "AG", "customerReference": "0001600000" }, "id": "uuid-uuid-uuid-uuidv4", "items": [ { "plu": "3114461", "quantity": 1, "price": 1799000, "subtotal": 1799000 } ], "paymentMethod": { "authorization": "1328821", "terminal": "19974", "ordenId": "9999999", "paymentVia": "TC17", "value": 1799000, "iva": 287235, "inc": 0, "itc": 0, "base": 1511765, "date": "2020-04-24", "consignmentAccount": "", "cashier": "22785", "cash": "5902" }, "E1EDK14": [ { "QUALF": "007", "ORGID": "20" }, { "QUALF": "008", "ORGID": "1000" }, { "QUALF": "018", "ORGID": "13400;70000;83400" }, "QUALF": "006", "ORGID": "00" }, "QUALF": "012", "ORGID": "ZTV2" }, "QUALF": "005", "ORGID": "TV01" } ], "sector": "00", "organization": "1000", "center": "TV01", "orderClass": "ZTVI", "currency": "COP", "paymentCondition": "D001", "orderReason": "Y01", "canal": "20", } } ``` **5.** Seguridad: se deben enviar las credenciales para consumir el webservice, así como el uso de vpn para la conexión. ## 4 Métricas * Tiempo de procesamiento. * Cantidad de órdenes. * Tiempo de envío al webservice de SAP. * Tiempo de respuesta del webservice de SAP. ## 5 Riesgos e inconvenientes Existe gran cantidad de documentación referente a la tecnología propuesta para consumir webservice de SAP, a pesar de ello se debe invertir tiempo con el fin de analizar dicha documentación para realizar debidamente los métodos y funcionalidades. ## 6 Alternativas En la actualidad hay varias alternativas de librerías que realizan el consumo de webservices basados en protocolo SOAP en python, como lo son soaplib, osa, suds, entre otras. Sin embargo, la mayoría tienen cierto grado de obsolencia o se ha terminado el soporte por los desarrolladores. ## 7 Impacto potencial y dependencias * El registro del proceso de empacado en el sistema. * Con la conexión con un servicio externo al backend del ecommerce la seguridad puede ser afectada, por lo que se deben tomar las consideraciones respecto al este tema. ## 8 Preguntas sin resolver * Consumir múltiples plataformas a través de webservices. ## 9 Ideas futuras * Integrar a través webservices con otras plataformas ERP según demandas de los clientes. * Desarrollar un servicio del backend que permita configurar parámetros genéricos de conexión, datos de envío y recepción para consumir webservices requeridos. ## 10 Conclusión * Con la implementación de este servicio se permitirá consumir el webservice de SAP, de manera rápida y segura. * Igualmente, la tecnología a utilizar es escalable y mantenible, dando la posibilidad de incluir nuevas funcionalidades o ampliar la capacidad de las existentes. ## 11 Estimaciones: | Tarea | Puntos | Equipo | | --- | --- | --- | |Ajustes para llamar el endpoint|5|Backend |Incluir parámetros en configuraciones|3|Backend * Tiempo total: * 1 semana