Comment vérifier si les adresses de facturation et de livraison sont égales?

16

J'essaie de vérifier si l'adresse de facturation et de livraison sont égales lors de la création de PDF de facture.

Jusqu'à présent, j'ai essayé:

$order = $invoice->getOrder();
if( $order->getBillingAddress()->getData() != $order->getShippingAddress()->getData() )

ou

$order = $invoice->getOrder();
if( $order->getShippingAddress()->getData('same_as_billing')!='1' )

mais ni ne fonctionne. J'essayais également d'obtenir le devis en utilisant $order->getQuote()mais cela n'a pas fonctionné non plus.

Existe-t-il un moyen de vérifier si les adresses de facturation et de livraison sont égales?

oschloebe
la source

Réponses:

10

Utilisez array_diff.

$order = $invoice->getOrder();
$billing = $order->getBillingAddress()->getData();
$shipping = $order->getShippingAddress()->getData();

$diff = array_diff($billing,$shipping);

réf: http://us3.php.net/array_diff

vous devrez peut-être supprimer certaines des données de chaque tableau, avant la différence. Je suis sûr que vous pouvez y arriver;)

ProxiBlue
la source
2
Bien que cela fonctionne dans presque tous les cas pratiques, cela devrait être array_diff_assocdû au fait que array_diff ne compare que les valeurs, donc si vous changez par exemple le prénom et le nom, les adresses seront toujours traitées comme égales
Fabian Schmengler
7

Même s'il existe déjà une réponse acceptée, je voudrais partager cette solution que j'ai vue (similaire) une fois dans un module tiers:

function serializeAddress(Mage_Sales_Model_Quote_Address $address)  {  
        return serialize(
            array(
                 'firstname' => $address->getFirstname(),
                 'lastname'  => $address->getLastname(),
                 'street'    => $address->getStreet(),
                 'city'      => $address->getCity(),
                 'postcode'  => $address->getPostcode(),
                 //add the attributes you want to check for here for ex. company,...
            )
        );
}

Qui s'appelait alors:

$shippingAddress = $invoice->getShippingAddress();

if (!$shippingAddress->getSameAsBilling()) {

     $shippingData = $this->serializeAddress($shippingAddress);
     $billingData = $this->serializeAddress($invoice->getBillingAddress());

     if (strcmp($shippingData, $billingData) != 0) {
        return false;
     }
}
Anna Völkl
la source
5

D'accord, voici donc ma tentative suivant la suggestion de ProxiBlue:

$excludeKeys = array('entity_id', 'customer_address_id', 'quote_address_id', 'region_id', 'customer_id', 'address_type');
$oBillingAddress = $order->getBillingAddress()->getData();
$oShippingAddress = $order->getShippingAddress()->getData();
$oBillingAddressFiltered = array_diff_key($oBillingAddress, array_flip($excludeKeys));
$oShippingAddressFiltered = array_diff_key($oShippingAddress, array_flip($excludeKeys));

$addressDiff = array_diff($oBillingAddressFiltered, $oShippingAddressFiltered);

if( $addressDiff ) { // billing and shipping addresses are different
    // Print stuff
}

Fondamentalement, je supprime certaines clés en utilisant un $excludeKeystableau, donc array_diffje ne comparerai que les données pertinentes. Pour supprimer plusieurs clés sans avoir à créer une boucle, j'utilise array_diff_keyen combinaison avec array_flippour supprimer les clés de tableau inutiles.

Améliorations et commentaires bienvenus. :)

oschloebe
la source
1
Bien que cela fonctionne dans presque tous les cas pratiques, cela devrait être array_diff_assocdû au fait que array_diff ne compare que les valeurs, donc si vous changez par exemple le prénom et le nom, les adresses seront toujours traitées comme égales.
Fabian Schmengler
3

Vous devez obtenir le devis en utilisant

$order = $invoice->getOrder();
$quote = Mage::getModel('sales/quote')->load($order->getQuoteId());

Ensuite, vous pouvez obtenir l'adresse de livraison du devis et vérifier si elle est marquée comme étant la même que l'adresse de facturation:

if($quote->getShippingAddress()->getSameAsBilling()){
    // do stuff
}
gebrial
la source
Où est-il marqué comme le même? Il semble que cela ne fonctionne pas pour moi, car le client l'a toujours marqué de la même manière, même si les adresses par défaut sont clairement différentes.
TheKitMurkit
0

a dû comparer des adresses - l'une d'elles vient d'être créée (non enregistrée). Peut-être que cela aide quelqu'un:

basé sur la réponse @Alphawolf:

public function isDifferentAddresses(Mage_Customer_Model_Address $adr1, Mage_Customer_Model_Address $adr2, array $excludeKeys = array())
{
    if (!count($excludeKeys)) {
        $excludeKeys = array(
            'entity_id',
            'entity_type_id',
            'attribute_set_id',
            'is_active',
            'increment_id',
            'parent_id',
            'created_at',
            'updated_at',
            'customer_id',
            'customer_address_id',
            'quote_address_id',
            'region_id',
            'address_type',
            'is_default_billing',
            'is_default_shipping',
            'save_in_address_book'
        );
    }
    $excludeKeys = array_flip($excludeKeys);
    $adr1Filtered = array_diff_key($adr1->getData(), $excludeKeys);
    $adr2Filtered = array_diff_key($adr2->getData(), $excludeKeys);
    $diff = array_diff_assoc($adr1Filtered, $adr2Filtered); 
    return !empty($diff);
}

EDIT 20 01 2016

im en utilisant la méthode suivante depuis que j'ai posté la version ci-dessus et cela fonctionne pour moi - pensé que cela peut aider quelqu'un:

/**
 * returns if address 1 is different to address 2
 *
 * @param Mage_Customer_Model_Address $adr1
 * @param Mage_Customer_Model_Address $adr2
 * @param array                       $excludeKeys
 *
 * @return bool
 */
public function isDifferentAddresses(Mage_Customer_Model_Address $adr1,
    Mage_Customer_Model_Address $adr2, array $excludeKeys = array()
) {
    if (!count($excludeKeys)) {
        $excludeKeys = array(
            'prefix',
            'suffix',
            //'region',
            //'region_id',
            'entity_id',
            'vat_id',
            'entity_type_id',
            'attribute_set_id',
            'is_active',
            'increment_id',
            'parent_id',
            'created_at',
            'updated_at',
            'customer_id',
            'customer_address_id',
            'quote_address_id',
            'address_type',
            'is_default_billing',
            'is_default_shipping',
            'save_in_address_book'
        );
    }
    $excludeKeys = array_flip($excludeKeys);
    $adr1Filtered = array_diff_key($adr1->getData(), $excludeKeys);
    $adr2Filtered = array_diff_key($adr2->getData(), $excludeKeys);
    $diff = array_diff_assoc($adr1Filtered, $adr2Filtered);
    return !empty($diff);
}
coton
la source