whooohq/whq-woocommerce-chilexpress-shipping

Filtro de comunas?

Closed this issue · 17 comments

Estimado, sería posible hacer que los campos se filtren automáticamente? es decir que al seleccionar región se desplieguen solo las ciudades de esa región?. También serviría que al elegir comuna el campo región se poble automáticamente.

En mi instalación me muestra primero la lista de comunas y despues la lista de regiones y permite seleccionar indistintamente, es decir tengo que elegir la comuna y despues elegir la región (siendo que una comuna pertenece a una sola región).

Quizás es porque mi instalación está corrupta, subí aparte ese issue a ver si me pueden echar una mano, el punto es que si mis select estan bien no veo sentido en tener que seleccionar la comuna y despues la region de dicha comuna.

Atte.

Filtrar y mostrar solo las ciudades/localidades que corresponden a X región sería lo ideal, claro que si.
El problema es que la API de Chilexpress no trae esa asociación, si no me equivoco. Y mantenerla a mano, considerando la cantidad de datos que son y que es dinámico... Chilexpress puede modificarlo agregando (o sacando) localidades... no es menor lo que habría que estar manteniendo ahí.

Siendo sincero, como está implementado Select2 en ese campo, y escribir para filtrar el que buscas es trivial con eso, la verdad es que no me apura ver una solución para esto, comparado con #5 que si es algo que quiero ver apenas tenga tiempo para hacerlo.

Ayuda aquí, para ver una solución y contribuir con un PR, es bienvenida como siempre.


Sobre el orden de la ciudad y región, efectivamente ES así en WooCommerce. Primero ciudad, luego región.
Pero después de ver lo que pasa en #4 (comment) creo que es algo que no corresponde a este plugin (el reordernar esos campos).
Lo mejor es que eso sea a gusto de quien esté implementando WooCommerce en realidad.

Me explico.

Para cambiar eso a mano, puedes probar algo como esto en tu functions.php (en el theme activo):

add_filter( 'woocommerce_checkout_fields', 'whq_wcchp_order_checkout_fields' );
function whq_wcchp_order_checkout_fields( $fields ) {
	$fields['billing']['billing_city']['priority']    = 80;
	$fields['shipping']['shipping_city']['priority']  = 80;
	$fields['billing']['billing_state']['priority']   = 70;
	$fields['shipping']['shipping_state']['priority'] = 70;

	return $fields;
}

Source: woocommerce/woocommerce#14618
También de ahí mismo pueden probar woocommerce/woocommerce#14618 (comment)

Si no me equivoco, WooCommerce usa esas prioridades (que pueden fijar en el functions.php) para ordenar los campos en el front-end usando Tinysort.

Más aún: existe un plugin oficial de WooCommece que permite editar y reordenar esos campos también: https://woocommerce.com/products/woocommerce-checkout-field-editor/
Que era el plugin con el que tuvimos conflicto en un principio por haber tratado de reordenar nosotros los campos a mano para todos.

Y uno no oficial pero que, en teoría, hace lo mismo: https://wordpress.org/plugins/woo-checkout-field-editor-pro/

Dicho eso, me parece que aquello es algo que no necesariamente debería tocar este plugin, por lo que podríamos causar.
Abierto a opiniones al respecto en todo caso.

Lo del orden en verdad no es relevante, pero sí que los campos estén coordinados y que si el cliente elige la comuna el campo region se poble solo, incluso pienso que debería venir bloqueado.

Estoy mirando el código y las comunas se están metiendo en duro acá :

https://github.com/whooohq/whq-woocommerce-chilexpress-shipping/blob/master/classes/WC_WHQ_Cities_CL.php

No sería solo agregar la region a cada comuna para que se llene el segundo select? probablemente se me está pasando, sería buenísimo que me lo explicaras.

Perdón, estaba pensando en otra cosa :) (con la cabeza en cualquier lado). Lo siento.

Si, el listado de comunas está en una clase, listado fijo.
Si, se podría mantener una relación entre regiones y sus localidades/ciudades específicas para lograr lo que dices; que alguien seleccione una localidad/ciudad, y el checkout auto-seleccione la región correspondiente.

Tal como dije antes, si alguien quiere resolverlo pronto, la ayuda (vía un PR) es bienvenida y agradecida ;)

@llermaly Esas comunas son solo para mostrarla en la parte administrable del woocommerce acá , la que son usadas para llenar los campos en el carrito de es mediante un ajax, que si se pudiera arreglar en un select anidado.

Revisar esto y seguramente se pueda mejorar esta consulta por etapas.
cURL para cargar las comunidas y regiones
ajax para cargar los select

Gracias por la ayuda en la aclaración, @jhoynerk. Bienvenida :)

Me perdí un poco con los archivos wsdl , nunca he trabajado con soap.

Lo que me llama la atención es que haya que hacer un request para las regiones cuando estas apenas cambian. Debería existir una definición interna de comuna - region, me parece muy overkill un request para un dato que ya se debería tener.

Las comunas puede que cambien a medida que Chilexpress vaya aumentando cobertura, sin embargo tengo una implementación en Opencart andando hace 4 años con la misma DB y no ha habido ningun problema.

Esto sin contar con que la comuna debería venir con el id de region dentro del request, me imagino que es tema de Chilexpress no tenerlo.

A buenas y primeras se me ocurre guardar las regiones en duro y validar las comunas dentro de una función en el plugin. Qué les parece?. Incluso si me apuran dejaria comunas y regiones en duro, dado que la cobertura de Chilexpress es casi completa en este momento. Lo importante son los precios y eso se está haciendo bien, porque estos si cambian seguido.

Puedo compartir mi base de datos que tiene las comunas de Chilexpress con las tablas comuna y region relacionadas. Les tinca?

@llermaly no me parece mala idea, las regiones y comunas son datos con cambios esporádicos o casi nulos. Mejoraria bastante la carga directa de estos campos si están almacenados en nuestra base de datos.
Pero si seria interesante utilizar el proceso que se tiene actualmente para almacenar la información de las comunas y regiones desde chileexpress a nuestra base de datos, Para evitar cualquier actualización en Chilexpress que pueda afectar el plugin sobre esto.
Dejando la posibilidad en el admin de actualizar esta data a 1 solo click.

@TCattd Que te parece ?

@jhoynerk podríamos usar un transient de WP, que es lo que ya estoy usando para cachear las consultas a SOAP https://github.com/whooohq/whq-woocommerce-chilexpress-shipping/blob/master/includes/soap_call.php#L22 y guardar el listado de ciudades y regiones por un periodo más prolongado ahí (un mes como mínimo, por ejemplo).

Los transients de WP quedan en la DB almacenados. Y manejarlos (para debugear) es sencillo (hay utilidades como https://wordpress.org/plugins/transients-manager/ para poder verlos fácilmente desde el mismo wp-admin).

No creo que haya problema con eso.

De hecho el listado hard-coded de origen de envío (la clase con ese listado) podría ser dinámica, traer el mismo listado del transient, y así no manejamos ningún listado 100% estático (pensando en que Chilexpress pueda cambiar/ampliar eso a futuro. Poco probable, pero posible).

Mi duda ahora es: la relación ciudad/región no viene en la API de Chilexpress, ¿o no?. Si es así, ¿había que mantener a mano esa relación para poder mostrar las ciudades que correspondan a cierta región?.

@TCattd Lo mismo pensaba, no sirve mucho un boton en el admin para cargar las comunas de CXP si vienen sin la región, y agregar un select para cargar la región manualmente me parece demasiado esfuerzo y se presta para errores del usuario. Mejor updatearlo con el repo LA vez cada 100 años que CXP va a agregar cobertura.

Adjunto las tablas Mysql de comunas Chilexpress con sus regiones.

comunas_chilexpress.zip

Resuelto en la v1.1.0:

https://www.youtube.com/watch?v=JaLp1wmtKlk

Solo cargan las ciudades/localidades correspondientes a la región seleccionada.

No hubo necesidad de usar el esquema de la DB; agradecido de todos modos por la ayuda con eso, estimado ;)

De paso: las localidades se pueden cachear en local por X periodo de tiempo ahora, configurable en las opciones del plugin (WooCommerce -> Ajustes -> Envío -> Chilexpress).

Estimado, felicidades!!. Ahora lo de re-ordenar los campos y bloquear el campo region pasan a ser pequeñeces.

Actualicé de todos modos la versión y me tira este error :

Notice: Undefined index: locations_cache in /var/www/html/wp-content/plugins/woo-chilexpress-shipping/classes/WC_WHQ_Chilexpress_Shipping.php on line 110

El formulario se queda cargando.

Se agradece KILOS su aporte.

Puede ser porque la opción no existe en la DB hasta que se guarda en la página de configuración.

¿Puedes ir a WooCommerce -> Ajustes -> Envío -> Chilexpress y guardar una vez los ajustes, y ver si continua ocurriendo el error, por favor?.

Funcionó! , pero el hecho de que el primer field que es comuna se quede cargando hasta que llenes el segundo de la sensación de que hay que esperar que cargue, me quedé harto rato mirándolo hasta que lo recordé.

Eso fue a proposito (el uso de BlockUI en ese caso) ;)

Gracias por confirmar, estimado.
Subí un update con un fix para aquel error. Aún cuando WooCommerce permite definir un defualt en esas opciones, si no se han guardado no existen en la DB aún. Punto a considerar a futuro si se añaden nuevas configuraciones.

Buen fin de semana ;)

Sí, me imagino que fue a propósito, pero al usuario de a pie le va a explotar la cabeza al ver que no puede avanzar todavía, derrepente agregar algún texto por ahi advirtiendole.

Buen finde y descansen! , se lo merecen.

Me puse a revisar algunas comunas al azar y Sierra Gorda por ejemplo me marca $100.000 de envio, corroboré con el cotizador de CXP y marca $7.000 . Será atado de ellos?.

Que tengan un muy buen finde, se lo merecen.

Otra solucion podria ser agregar un placeholder que diga "SELECCIONE REGION". Probé de buenas a primeras cambiar el orden mediante filtro pero no pude, seguiré tratando.

Otro detalle es que el precio por default que me marca son $100.000, como que asusta a cualquiera. No sería mejor dejarlo en 0 ?

Abierto a sugerencias con lo del BlockUI. Mientras más apegado a WooCommerce sea la sugerencia, mejor.

Sobre el monto aquel, la verdad, aún no se porque Chilexpress no retorna un monto en ciertas ocasiones.
El monto fijo (100k) está hard coded en la clase. No es Chilexpress.

Ahora, el problema es saber por qué Chilexpress no entrega un monto en ciertas consultas (la API entrega 0), y es lejos de ideal que se le cobre 0 a un usuario (por X motivo o falla en la respuesta de la API de Chilexpress) e irse a pérdida con el envío.

Me ha pasado que la API no retorna un valor o retorna cero, para localidades que la misma API definió.
Lo otro sería que, cuando retorne cero, no permitir seleccionar Chilexpress (como se hace ahora cuando la API está caída).

Esto sin contar las veces que se cae la API completa y no se puede cotizar. No han sido muchas en mi experiencia, pero... Pasa.

@jhoynerk si tienes alguna idea, bienvenida sea.

De todos modos voy a abrir otro issue para ver esto puntualmente.
Aunque no se que tanto podamos hacer al respecto.