Magento API: customer_address

Ultima parte de éste módulo de la API.

Hoy vamos a ver cómo gestionar las direcciones vinculadas a un cliente.

Cuando vimos cómo crear clientes, había dejado, a manera de ejemplo, el siguiente cliente creado.

Array
(
    [customer_id] => 1
    [created_at] => 2009-03-14 03:30:33
    [updated_at] => 2009-03-14 03:30:33
    [increment_id] => 000000001
    [store_id] => 0
    [website_id] => 0
    [created_in] => Admin
    [email] => mail@dominio.com.ar
    [firstname] => Damián
    [group_id] => 1
    [lastname] => Culotta
    [password_hash] => 4c882dcb24bcb1bc225391a602feca7c
)

Dado que el uso de éstos métodos ya requieren de algo más de código, vamos a comenzar por las excepciones que devuelve customer_address.

Nuevamente tenemos cuatro códigos de excepción definidos.

  • 100: Invalid address data. Details in error message.
  • 101: Customer not exists.
  • 102: Address not exists.
  • 103: Address not deleted. Details in error message.

Ahora vamos a crear la primera dirección para el cliente que ya tenemos cargado.

<?php
 
//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");
 
//Login
$session = $client->login("usuario", "contraseña");
 
try {
    //Id del cliente
    $id = "1";
 
    //Dirección del nuevo cliente
    $data = array(
        "firstname"           => "Damián",
        "lastname"            => "Culotta",
        "country_id"          => "USA",
        "region_id"           => "2",
        "region"              => "Alaska",
        "city"                => "Anchorage",
        "street"              => array("Calle y Numeración","Departamento 1 Piso 1"),
        "telephone"           => "555-5555",
        "postcode"            => "AAA1111A",
        "is_default_billing"  => true,
        "is_default_shipping" => true
    );
 
    //Crea dirección para el cliente
    $address = $client->call($session, "customer_address.create", array($id, $data));
 
    print_r($address);
 
} catch (SoapFault $exception) {
    echo "<h1>Se produjo un error</h1>";
    echo "<p>Código: " . $exception->faultcode . "</p>";
    echo "<p>Mensaje: " . $exception->faultstring . "</p>";
}
 
//Logout
$client->endSession($session);
?>

Empezamos con las aclaraciones.

La variable $id tiene como valor 1 porque tengo claro, para el ejemplo, el id que tiene el cliente al que quiero cargarle los datos.

Sobre el tema del país y la región (o provincia), fue necesario aplicar valores que ya estuvieran en las tablas de Magento. Si usáramos un valor que no existe, obtendríamos una excepción.

El valor de street es un array con dos valores. Para los que recuerden el formulario de registro y la configuración del mismo, pueden usarse dos líneas de texto para llenar ésta información. Utilizar un sólo valor también funciona.

Además, le especificamos que será la dirección de cobro (is_default_billing) y que será la dirección de entrega preferida (is_default_shipping).

Para poder ver las direcciones cargadas a nuestro cliente, vamos a hacer uso de customer_address.list.

<?php
 
//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");
 
//Login
$session = $client->login("usuario", "contraseña");
 
try {
    //Id del cliente
    $id = "1";
 
    //Listado de direcciones del cliente
    $addresses = $client->call($session, "customer_address.list", $id);
 
    print_r($addresses);
 
} catch (SoapFault $exception) {
    echo "<h1>Se produjo un error</h1>";
    echo "<p>Código: " . $exception->faultcode . "</p>";
    echo "<p>Mensaje: " . $exception->faultstring . "</p>";
}
 
//Logout
$client->endSession($session);
?>

A diferencia del método customer.list, que nos permite hacer búsquedas básicas pasando los campos y sus valores como un array, en el caso de cutomer_address.list, sólo podemos indicar el id del cliente.

Para ver el resultado de éste ejemplo, yo ya creé una segunda dirección para el mismo cliente.

Lo que se obtiene con éste código, debería ser algo como lo siguiente.

Array
(
    [0] => Array
        (
            [customer_id] => 1
            [created_at] => 2009-03-18 04:05:07
            [updated_at] => 2009-03-18 04:05:07
            [increment_id] => 
            [city] => Anchorage
            [country_id] => USA
            [firstname] => Damián
            [lastname] => Culotta
            [postcode] => AAA1111A
            [region] => Alaska
            [region_id] => 2
            [street] => Calle y Numeración
Departamento 1 Piso 1
            [telephone] => 555-5555
            [is_default_billing] => 
            [is_default_shipping] => 
        )
    [1] => Array
        (
            [customer_id] => 2
            [created_at] => 2009-03-25 04:32:04
            [updated_at] => 2009-03-25 04:32:04
            [increment_id] => 
            [city] => Anchorage
            [country_id] => USA
            [firstname] => Damián
            [lastname] => Culotta
            [postcode] => AAA1111A
            [region] => Alaska
            [region_id] => 2
            [street] => Calle 2 y Numeración 2
Departamento 2 Piso 2
            [telephone] => 555-5555
            [is_default_billing] => 
            [is_default_shipping] => 
        )
)

Otras dos aclaraciones.

Para empezar, lo que estamos viendo son direcciones de un cliente, no clientes. Aclarado éste punto, veamos que el primer campo de cada array se llama customer_id.

Lo correcto sería algo parecido a customer_address_id, ya que ese id muestra ese valor y no el id de cliente.

Dado el post, lo he reportarlo como bug, con el número 11989.

Otro detalle/error que podemos ver, es que en ambos casos se nos devuelven los campos is_default_billing e is_default_shipping con valor false (en vez de usar print_r para ver la salida prueben con var_dump).

Esto es un bug, que por suerte, ya fue reportado el 13 de Febrero de éste año, con el id 10966 (es en casos como éstos cuando a uno le parece, al menos, muy pobre la respuesta de Varien hacia la comunidad, ya que no es un tema menor para los que tenemos que integrar Magento con otros sistemas).

Ya pudimos crear direcciones y listarlas. Vamos a probar de modificar esos datos.

Voy a tomar para el ejemplo, la segunda dirección, la del id 2.

Vamos a modificar algunos valores a través del método update.

<?php
 
//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");
 
//Login
$session = $client->login("usuario", "contraseña");
 
try {
    //Id dirección
    $id = "2";
 
    //Datos a actualizar
    $data = array(
        "postcode" => "ZZZ999Z",
        "telephone" => "999-9999",
        "is_default_shipping" => true
    );
 
    $address = $client->call($session, "customer_address.update", array($id, $data));
 
    print_r($address);
 
} catch (SoapFault $exception) {
    echo "<h1>Se produjo un error</h1>";
    echo "<p>Código: " . $exception->faultcode . "</p>";
    echo "<p>Mensaje: " . $exception->faultstring . "</p>";
}
 
//Logout
$client->endSession($session);
?>

El resultado a imprimir será un valor booleano referente al estado de la operación.

Para estar seguros que los datos fueron cambiados como queríamos, vamos a ejecutar otro de los métodos: info.

<?php
 
//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");
 
//Login
$session = $client->login("usuario", "contraseña");
 
try {
    //Id de la dirección
    $id = "2";
 
    //Dirección del cliente
    $addresses = $client->call($session, "customer_address.info", $id);
 
    print_r($addresses);
 
} catch (SoapFault $exception) {
    echo "<h1>Se produjo un error</h1>";
    echo "<p>Código: " . $exception->faultcode . "</p>";
    echo "<p>Mensaje: " . $exception->faultstring . "</p>";
}
 
//Logout
$client->endSession($session);
?>

La dirección debería verse de la siguiente forma.

Array
    (
        [customer_id] => 2
        [created_at] => 2009-03-25 04:32:04
        [updated_at] => 2009-03-27 06:02:17
        [increment_id] => 
        [city] => Anchorage
        [country_id] => USA
        [firstname] => Damián
        [lastname] => Culotta
        [postcode] => ZZZ999Z
        [region] => Alaska
        [region_id] => 2
        [street] => Calle 2 y Numeración 2
Departamento 2 Piso 2
        [telephone] => 999-9999
        [is_default_billing] => 
        [is_default_shipping] => 
    )

Para corroborar lo hecho hasta el momento, podemos entrar al backend y ver la información de la cuenta de usuario.

Siguiendo siempre dentro del ejemplo, veríamos lo siguiente.

Direcciones de un cliente en Magento

Por último, vamos a borrar una dirección, haciendo uso del método delete.

Para ésto, el código a ejecutar podría ser algo como ésto:

<?php
 
//Url de la conexión
$client = new SoapClient("http://www.dominio.com.ar/index.php/api/?wsdl");
 
//Login
$session = $client->login("usuario", "contraseña");
 
try {
    //Id dirección
    $id = "2";
 
    $address = $client->call($session, "customer_address.delete", $id);
 
    print_r($address);
 
} catch (SoapFault $exception) {
    echo "<h1>Se produjo un error</h1>";
    echo "<p>Código: " . $exception->faultcode . "</p>";
    echo "<p>Mensaje: " . $exception->faultstring . "</p>";
}
 
//Logout
$client->endSession($session); 
?>

Al igual que con update, la salida que vemos es un resultado booleano referente al estado de la operación.

Si ahora miramos los datos del cliente, vamos a notar dos cosas.

Dirección única para un cliente en Magento

Lo primero es que efectivamente, la dirección con id 2 fue eliminada.

Lo segundo, es que al haber usado esa dirección como predeterminada para los envíos, la única dirección que dejamos, no tiene seleccionada esa opción.

Lo correcto sería que luego del delete, si es que borramos la dirección de entrega, hagamos un update para indicar cuál será la nueva dirección predeterminada para los envíos.

Con éste último método terminamos de repasar customer_address y, además, terminamos con el módulo Mage_Customer.