improntus / module-rebill

1 stars 0 forks source link

[Back-office] Se permite seleccionar una moneda que no está permitida por la pasarela de pagos #39

Open brunojbarros opened 1 year ago

brunojbarros commented 1 year ago

Funcionalidad/módulo Back-office / Stores / Configuration (en Settings) / Currency Setup Back-office / Catalog / Products

Comportamiento actual Se permite seleccionar una moneda que no está permitida por la pasarela de pagos, esto causa que luego no se pueda generar el pedido, ya que desde Rebill no permitimos que al crear un precio se realice una combinación de gateway+country+currency inválido:

image

Resultado esperado

  1. Obtener todos los gateways de la organización: https://docs.rebill.to/reference/organizationcontroller_getorganization
  2. Buscar el gateway que configuró el seller en la tienda
  3. Obtener las monedas que permite el gateway del seller: https://docs.rebill.to/reference/datacontroller_getcurrencies

Luego, se me ocurre como opciones: a. En "Currency Setup" no permitir que se seleccionen monedas que no permita el gateway, informando que el gateway no acepta dichas monedas. b. No permitir que los productos estén disponibles con el método de pago Rebill (informarlo al momento de la creación/edición del producto el motivo). c. Otras opciones.

mauromm commented 1 year ago

Hola Bruno, para esta opción, la unica que podemos hacer es que al momento de mostrar los medios de pago valide que lo que se esta utilizando sea compatible con rebill. En caso contrario, que no muestre el medio de pago directamente. No se puede añadir otro mensaje, ya que esto va sobre el motor de medios de pago.

brunojbarros commented 1 year ago

@mauromm Con respecto a mostrar el dropdown y permitir que agregue al producto de suscripción al carrito, ¿eso se podrá limitar también?

mauromm commented 1 year ago

Es un tema medio sensible añadir esto ahí, ya que al entrar a cada producto tendría que estar llamando al ws de rebill para validar si se muestra o no el dropdown. Esto puede traer un gran problema que es de performance, ya los que render de página pueden estar condicionados en su carga a que el ws funcione eficientemente. Una tienda que luego de refrescar caché tenga cientos o miles de concurrentes puede tener grandes problemas con esto. Como el checkout al momento de cargar el motor de medios de pago es una sección sin cachear, y que depende de cada medio, no hay problema. Es un tema que ha pasado en años anteriores con empresas como TodoPago, donde en eventos se cayó el ws y mataba tiendas con estas malas prácticas.

mauromm commented 1 year ago

Otro tema, es el FPC (full page caché) de magento, el cual no tiene manera de discriminar entre urls cacheadas si no hay algo diferente en los parametros de la url según la moneda. Por ejemplo, supongamos que sí aplicamos la solución anterior de que lo oculte llamando al WS. El primer usuario que entra a https://rebillnuevo.improntus.dev/reb-test.html con dolar australiano, el FPC lo cachea sin mostrar el selector o posibilidad de compra. Esa pagina queda cacheada así. Luego entra otra persona a la misma url pero va con dolar estadounidense. Lo que va a pasar es que seguirá con el selector oculto por quedar cacheada, ya que la url es la misma para ambas monedas.

mauromm commented 1 year ago

Una opción que podría ser menos terrible, aunque hay que pensar que te va a matar la api, es que cada vez que se ingresa a un producto ejecute un ajax luego del document.ready() para validarlo y te oculte el selector. Un sitio de trafico medianto, puede tener 2k visitas concurrentes, con lo cual te estaría metiendo un minimo de 4k llamadas a estas apis en simultaneo. No es óptimo tampoco, pero es menos rompe piernas que lo anterior.

brunojbarros commented 1 year ago

@mauromm Si el customer llega al punto de elegir el medio de pago, el producto es una suscripción recurrente y no puede pagar con Rebill por la moneda, queda en un "punto muerto" (algo así como pasó en otro bug, no recuerdo cuál bug), ya que el customer no puede avanzar en la compra y tampoco es notificado al customer.

En la pantalla del detalle del carrito, es decir, en esta: image

¿Podrá realizarse lo siguiente?: 1- Los productos que son de suscripción, grisarlos y mostrar un mensaje indicando que no van a poder ser comprados por la moneda. 2- No sumar el monto de esos productos en el monto de la compra. 3- Al avanzar a la pantalla siguiente de métodos de pago, ocultar Rebill.

mauromm commented 1 year ago

En este caso, lo que se puede hacer es el punto 3: "3- Al avanzar a la pantalla siguiente de métodos de pago, ocultar Rebill.", que valide al mostrar los medios de pago la moneda aceptada y si no es asi, que no muestre REbill como opcion de pago.

brunojbarros commented 1 year ago

@mauromm en realidad eran los tres pasos, y no opciones, si solamente se hiciera esto:

"3- Al avanzar a la pantalla siguiente de métodos de pago, ocultar Rebill."

Tendríamos el problema que comentaba al principio del comentario.

Volviendo un poco a la idea original, y considerando lo que estuvimos hablando luego, quizás que se podría hacer lo siguiente: 1- Obtener todos los gateways de la organización: https://docs.rebill.to/reference/organizationcontroller_getorganization 2- Buscar el gateway que configuró el seller en la tienda 3- Obtener las monedas que permite el gateway del seller: https://docs.rebill.to/reference/datacontroller_getcurrencies 4- Así como se guarda el token del seller por 24 horas, guardar también las monedas. Incluso, consultar las monedas podría hacerse con menos frecuencia ya que no es usual que cambien, aunque podrían. 5- Al ingresar al detalle de un producto de suscripción, ocultar el dropdown que permite elegir una frecuencia. 6- Al avanzar en el checkout, al momento de tener que elegir el método de pago, ocultar Rebill.

Hay que encontrar una manera que: 1- No se envíen continuamente requests para evitar problemas de performance ni evitar generar costos en Rebill. 2- No hacer que el cliente llegue a un punto donde no sabe cómo avanzar o bien no es claro cómo hacerlo.

MauroImp91 commented 1 year ago

@brunojbarros Buenas tardes Bruno, estuvimos revisando este tema. Te comento las siguientes soluciones que vamos a estar implementando:

  1. Al momento que se guarden las credenciales en el panel de admin, se va a mostrar la lista de monedas que están disponibles en Rebill. Al mismo tiempo esa lista se va a guardar dentro de Magento para no estar consultando constantemente en Rebill al momento de realizar las siguientes validaciones (esto no va a modificar nada desde el lado de Rebill, solamente guardamos esos datos en una tabla de Magento).

  2. Cuando el customer ingrese a un producto marcado como subscription y esta configurada una moneda que no este disponible en Rebill, se va a deshabilitar el botón para agregar al carro y mostrar un mensaje indicando el motivo.

  3. Al momento de realizar el Checkout si tiene productos de Rebill y esta configurada una moneda que no es compatible con Rebill, se le va a redirigir al carro para que se puedan sacar esos productos.

mauromm commented 1 year ago

Ya en nuestro QA, para subir a la brevedad.

MauroImp91 commented 1 year ago

Se agrego la funcionalidad para que no permita realizar una subscripcion al tener configurada una moneda incompatible con la plataforma. Primero se deben descargar las monedas desde el panel de admin dentro del Store --> Sales --> Payment Methods Con configurar las credenciales de Rebill y darle a SaveConfig ya se descargaran las currencies.

Una vez descargada las currencies y seleccionar una moneda que no este en esa lista, no se podrá agregar productos en el carrito, y en caso de que tenga productos desde antes tampoco podrá realizar el checkout.

brunojbarros commented 1 year ago

@MauroImp91

Seleccioné un gateway de MercadoPago, pero veo en el listado de currencies monedas que no se corresponden a MP, probé también limpiando caché: screencapture-rebillnuevo-improntus-dev-admin-admin-system-config-edit-key-567d8189cf66d1fb6dde9b9b478d2a2c58121e8c1d3e70617aaf50b50b53b886-section-payment-2023-01-10-15_56_30

mauromm commented 1 year ago

Bruno, con esta validación que añadimos ya queda resuelto. El tema de traer las monedas por gateway lo podemos hacer, pero eso ya lo dejo como mejora posterior.

brunojbarros commented 1 year ago

@mauromm @MauroImp91

Acorde al siguiente comentario: https://github.com/improntus/module-rebill/issues/39#issuecomment-1363271269

Noto que: 1- No se están listando todas las monedas, faltan: 'Cólon Costarricense' ('₡'), 'Quetzal' ('Q') y 'Peso Dominicano' ('RD$'), ¿en qué momento concretamente obtienen el listado de monedas disponible? 2- Al haber habilitado solamente "Guaraní", la tienda estar configurada en Euro y el customer estar usando dicha moneda, se permite agregar al carrito y avanzar en el checkout:

image image image image image
mauromm commented 1 year ago

Vamos a ponerle un display none o disabled al "enabled currencies" para que el usuario no pueda tocarlo, ya que es meramente para dejar la info en la base de datos:

image