Wie überprüfe ich, ob Rechnungs- und Lieferadresse gleich sind?

16

Ich versuche zu überprüfen, ob Rechnungs- und Lieferadresse beim Erstellen von Rechnungs-PDFs identisch sind.

Was ich bisher ausprobiert habe, war:

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

oder

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

aber beides funktioniert nicht. Ich habe auch versucht, das Zitat mit zu bekommen, $order->getQuote()aber das hat auch nicht funktioniert.

Gibt es eine Möglichkeit zu überprüfen, ob Rechnungs- und Lieferadresse gleich sind?

oschloebe
quelle

Antworten:

10

Verwenden Sie array_diff.

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

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

Ref: http://us3.php.net/array_diff

Möglicherweise müssen Sie einige Daten der einzelnen Arrays entfernen, bevor der Diff. Ich bin mir sicher, dass du es schaffen kannst;)

ProxiBlue
quelle
2
Obwohl dies in fast allen praktischen Fällen funktioniert, sollte es sein, array_diff_assocdass array_diff nur die Werte vergleicht. Wenn Sie also beispielsweise Vor- und Nachnamen wechseln, werden die Adressen weiterhin als gleich behandelt
Fabian Schmengler,
7

Obwohl es bereits eine akzeptierte Antwort gibt, möchte ich diese Lösung, die ich (ähnlich) einmal gesehen habe, in einem Modul eines Drittanbieters teilen:

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,...
            )
        );
}

Welches hieß dann:

$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
quelle
5

Okay, hier ist mein Versuch, dem Vorschlag von ProxiBlue zu folgen:

$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
}

Grundsätzlich entferne ich einige Schlüssel mithilfe eines $excludeKeysArrays und array_diffvergleiche nur die relevanten Daten. Um mehrere Tasten zu entfernen, ohne eine Schleife erstellen zu müssen, verwende ich array_diff_keyin Kombination mit array_flip, um die unnötigen Array-Tasten zu entfernen.

Verbesserungen und Feedback sind willkommen. :)

oschloebe
quelle
1
Obwohl dies in fast allen praktischen Fällen funktioniert, sollte es sein, array_diff_assocdass array_diff nur die Werte vergleicht. Wenn Sie also beispielsweise Vor- und Nachnamen wechseln, werden die Adressen weiterhin als gleich behandelt.
Fabian Schmengler
3

Sie müssen das Angebot mit erhalten

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

Anschließend können Sie die Lieferadresse aus dem Angebot entnehmen und prüfen, ob sie mit der Rechnungsadresse identisch ist:

if($quote->getShippingAddress()->getSameAsBilling()){
    // do stuff
}
gebrial
quelle
Wo wird es als dasselbe markiert? Es scheint, als würde es bei mir nicht funktionieren, da der Kunde es immer als gleich markiert hat, auch wenn die Standardadressen eindeutig unterschiedlich sind.
TheKitMurkit
0

musste Adressen vergleichen - eine von ihnen wurde gerade erstellt (nicht gespeichert). Vielleicht hilft es jemandem:

basierend auf @Alphawolf Antwort:

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

Ich benutze die folgende Methode, da ich die obige Version gepostet habe und sie für mich funktioniert - dachte, es könnte jemandem helfen:

/**
 * 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);
}
Cottton
quelle