Jump to content

Verificar CP, Ciudad y calle


Peibolvig

Recommended Posts

Hola,

 

 

Estamos montando una tienda con prestashop y me piden que el formulario verifique la coherencia de Código Postal, Ciudad, Calle y número.

 

Para comprobar la coherencia entre CP y Ciudad encontré algunos servicios, pero para hacer lo mismo con calle y número lo veo más complicado.

 

Encontré unos listados de CPs asociados a direcciones y ciudad ( www.codigospostales.com ), pero además de que sería un trabajón importante, esos listados no cuentan con ciudades pequeñas que tienen sólo un código postal.

 

Por lo tanto estaba buscando una solución más "automática", un módulo o en su defecto una API que haga eso, busqué módulos y no encontré ninguno que haga justamente eso, en cuanto a APIs tampoco hubo mucha suerte.

 

Me gustaría saber si alguna vez tuvisteis que implementar una funcionalidad como esa o al menos que me pudierais comentar cómo lo haríais vosotros, ya que no tengo nada claro cómo atacar este requisito.

 

PD: Ya hablé con el de logística varias veces y en todas ellas me insistió en que era un requisito imprescindible hacer esa comprobación a nivel de calle y número.

 

 

 

Saludos

Link to comment
Share on other sites

Es un tema muy interesante éste, y desde luego mucho mas complejo de lo que en un principio pueda parecer. En UPS he encontrado algo interesante https://www.ups.com/...erkit?loc=es_ES, en concreto hay una API que se ocupa de validar las direcciones ofreciendo alternativas.

 

A ver si te sirve, ya dirás tus progresos, porque puede ser una información muy interesante para la comunidad.

Edited by Enrique Gómez (see edit history)
Link to comment
Share on other sites

Hola Enrique,

 

Pues no conocía la API esa de UPS (y mira que busqué cosas similares en servicios de correos y similar, pero no UPS).

Si me dan el tiempo necesario (que por desgracia no lo creo), trato de hacer una implementación básica para ver cómo usarla y lo comento, pero independientemente de eso me la guardo, gracias! :)

 

Ahora mismo estoy tratando de implementar una solución en base a la API de google maps:

Con una URL como la siguiente:

http://maps.googleapis.com/maps/api/geocode/json?address=calle+el+limonar+1%20&sensor=false&language=es&region=es&components=locality:el+chaparral|country:es|postal_code:03184|administrative_area:Torrevieja

 

Google maps devuelve un xml/json con datos de la dirección, y si es completa y concisa le asigna el tipo "street address", así filtrando ese xml/json en base a diversos criterios que todavía estoy definiendo, podría comprobar que una dirección con calle, numero y código postal existe. (Confiando en que la información de google maps sea fiable obviamente.)

 

La estructura del xml/json que devuelve no es 100% intuitiva en un principio, pero viendo la documentación se comprende bien.

Por si quieres echarle un ojo, esta es: https://developers.google.com/maps/documentation/geocoding/?hl=es&csw=1

 

A ver qué sale de aquí :)

Link to comment
Share on other sites

Básicamente sería comprobar que el valor de "status": "OK",

Si los parámetros que le envias a la url no son "validos" el valor de "status" : "ZERO_RESULTS"

 

 

Revisa este enlace :

http://stackoverflow...google-maps-api

 

y también este :

http://gabesumner.com/address-validation-using-the-google-maps-api

Edited by petete2008 (see edit history)
Link to comment
Share on other sites

Prácticamente es como dices petete2008, pero hay un matiz.

 

Si a la API le pasas una dirección que no encuentra, pero encuentra que el CP y la calle existen, puede devolverte un dato de "calle+CP" y eso no garantiza que el número de la calle introducido por el usuario sea coherente con calle y CP, porque el usuario puede haber puesto "calle, 156456234234".

 

En ese caso, el valor de Status sería: OK, y el atributo "types" de cada elemento de Results (ojo, no confundir con el "types" de cada componente de dirección), pondría "route".

 

Aquí puedes ver uno de esos casos: http://maps.googleapis.com/maps/api/geocode/json?address=calle+el+limonar+15555%20&sensor=false&language=es&region=es&components=locality:el+chaparral|country:es|postal_code:03184|administrative_area:Torrevieja

 

Yo lo que estoy haciendo es diferenciarlo y sólo me vale como resultado positivo (que concuerdan calle, número, CP, Provincia y País) cuando el types del elemento de Results es "street_address", ya que ello indica que se encontró la dirección que se escribió (normalmente también pone que es un partial_match, pero eso no es relevante para lo que yo busco validar, al menos en las pruebas que hice no lo fue).

 

Por otra parte, y sin extenderme mucho porque estoy bastante liado ahora mismo, comentar que la implementación en base a eso la hice con un override de la clase AddressController.php, concretamente del método processSubmitAddress().

 

Ahora mismo estoy peleándome con un problema, ya que la consulta me está devolviendo status "REQUEST_DENIED", a pesar de estar poniendo "sensor=false" a la url.

 

Lo curioso es que desde la aplicación en local me devuelve el "REQUEST_DENIED", así que le hice un echo() para ver qué url está utilizando, para ver si está bien formada, y lo curioso es que cogiendo esa misma url y pegándola en un navegador, la consulta la hace perfectamente. (Y eso que estoy detrás de la misma IP porque todo lo hago desde el mismo equipo en local)

¿Alguna sugerencia?

Link to comment
Share on other sites

Por cierto, decir que no estoy usando ninguna key de la API. Todas las consultas que hago son siempre anónimas, sin key de la API.

Y no puede ser que me haya excedido del límite diario, porque desde el navegador sigo pudiendo hacer las consultas y me las devuelve perfectamente.

Link to comment
Share on other sites

Vaya....lo complica entonces pues.

Nunca he usado la api de google maps por lo que no soy el más indicado para ayudarte. Tú que la has utilizado, me gustaría preguntarte si crees que sería posible obtener por ejemplo el nombre de todas las calles de una localidad en concreto. Supongo que no, pero no quería quedarme con la duda y por eso te pregunto.

Gracias y ánimo con tu proyecto!!

Link to comment
Share on other sites

Yo empecé a usar la API de google maps hace un día, para este tema que comento. Pero bueno, de todo lo que llevo leído, sólo utilizo lo que ellos llaman: "Geocoding".

Usando geocoding eso que comentas de sacar todas las calles de una localidad en concreto no se me ocurre cómo hacerlo, porque aunque sólo tiene dos parámetros obligatorios, uno de ellos es la dirección que buscas.

 

Quizás haya otra funcionalidad de la API que te permita hacer eso que comentas, pero no puedo decirte gran cosa porque me centré sólo en geocoding ;(

 

Gracias por el ánimo, a ver si consigo solucionar el problema ese de "REQUEST_DENIED" que me está pasando.

Ya probé incluso desde disntinas IPs y nada... (Pero desde el navegador si, por eso hay algo que se me está escapando... si lo consigo solucionar lo comento ;) )

Link to comment
Share on other sites

Genial! ya lo conseguí.

 

El problema era un tanto rebuscado...

 

Al hacer algunas pruebas ví que la consulta que estaba utilizando en lugar de ... &region= ... me estaba transformando el '&reg' por el símbolo que es como el del copyright pero con una letra 'R' en lugar de una 'C'.

 

Total, que como eso creí que me iba a dar problemas, traté de escaparlo de mil maneras, y la única que parecía darme resultado era usando:

http_build_query($url_param,'','&');

para que el caracter '&' me lo interpretara como '&'

Haciendo eso, todo parecía estar correcto, me aparecía bien toda la ruta de la query, peeeeeero, así no funcionaba (aquí era cuando me daba el error de REQUEST_DENIED).

 

Probé a quitar el parametro 'region' y seguía sin irme, así que lo que hice fue dejar el http_build_query como sigue:

http_build_query($url_param);

 

Pero haciendo eso, volvía al problema inicial.

 

Solución: moví el parámetro 'region' al primer lugar de la consulta (sí, lo sé... es un apaño... pero en serio que le di miles de vueltas con montón de funciones y trucos para escapar caracteres y no hubo forma...)

 

Así que la estructura de la consulta que no me funcionaba era:

http://maps.googleapis.com/maps/api/geocode/json?address=calle+el+limonar+1%20&sensor=false&language=es&region=es&components=locality:el+chaparral|country:es|postal_code:03184|administrative_area:Torrevieja

 

Y la que funciona quedó así;

http://maps.googleapis.com/maps/api/geocode/json?region=es&address=calle+el+limonar+1%20&sensor=false&language=es&components=locality:el+chaparral|country:es|postal_code:03184|administrative_area:Torrevieja

 

De ese modo evito que se junte &region y produzca el caracter no deseado.

 

 

Ahora mismo ya tengo funcionando la validación de dirección completa, con calle, número, CP, ciudad, provincia y país. Todas las pruebas que hice son satisfactorias, pero aún tengo que estresarlo un poco y ver qué tal responde. Pinta bien ;)

  • Like 1
Link to comment
Share on other sites

Genial! ya lo conseguí.

 

El problema era un tanto rebuscado...

 

Al hacer algunas pruebas ví que la consulta que estaba utilizando en lugar de ... &region= ... me estaba transformando el '&reg' por el símbolo que es como el del copyright pero con una letra 'R' en lugar de una 'C'.

 

Total, que como eso creí que me iba a dar problemas, traté de escaparlo de mil maneras, y la única que parecía darme resultado era usando:

http_build_query($url_param,'','&');

para que el caracter '&' me lo interpretara como '&'

Haciendo eso, todo parecía estar correcto, me aparecía bien toda la ruta de la query, peeeeeero, así no funcionaba (aquí era cuando me daba el error de REQUEST_DENIED).

 

Probé a quitar el parametro 'region' y seguía sin irme, así que lo que hice fue dejar el http_build_query como sigue:

http_build_query($url_param);

 

Pero haciendo eso, volvía al problema inicial.

 

Solución: moví el parámetro 'region' al primer lugar de la consulta (sí, lo sé... es un apaño... pero en serio que le di miles de vueltas con montón de funciones y trucos para escapar caracteres y no hubo forma...)

 

Así que la estructura de la consulta que no me funcionaba era:

http://maps.googleapis.com/maps/api/geocode/json?address=calle+el+limonar+1%20&sensor=false&language=es&region=es&components=locality:el+chaparral|country:es|postal_code:03184|administrative_area:Torrevieja

 

Y la que funciona quedó así;

http://maps.googleapis.com/maps/api/geocode/json?region=es&address=calle+el+limonar+1%20&sensor=false&language=es&components=locality:el+chaparral|country:es|postal_code:03184|administrative_area:Torrevieja

 

De ese modo evito que se junte &region y produzca el caracter no deseado.

 

 

Ahora mismo ya tengo funcionando la validación de dirección completa, con calle, número, CP, ciudad, provincia y país. Todas las pruebas que hice son satisfactorias, pero aún tengo que estresarlo un poco y ver qué tal responde. Pinta bien ;)

 

Estimado Peibolvig,

 

Si puedes y sin obligación, estas invitado a publicar el aporte completo en la sección de aportes gratuitos del foro: http://www.prestashop.com/forums/index.php?/forum/168-modulos-gratis-sobrecargas-y-otras-astucias-que-cambian-la-vida/

 

PD: Gracias por su colaboración con la Comunidad de Prestashop.

Link to comment
Share on other sites

  • 2 weeks later...
  • 5 months later...

Hola!

 

Como te va?

 

Soy un integrador en argentina y estoy buscando una solucion para que cuando el cliente registre su direccion de entrega, el sistema verifique si es correcta teniendo en cuenta (calle, numero, CP, ciudad y provincia)

 

Pudiste lograrlo?

 

Espero tu respuesta

 

Saludos

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...