Jak sprawdzić, czy adres rozliczeniowy i adres dostawy są równe?

16

Próbuję sprawdzić, czy adres rozliczeniowy i adres wysyłki są takie same podczas tworzenia plików PDF faktur.

Do tej pory próbowałem:

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

lub

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

ale żadne nie działa. Próbowałem też uzyskać wycenę za pomocą, $order->getQuote()ale to też nie działało.

Czy jest jakiś sposób, aby sprawdzić, czy adres rozliczeniowy i adres dostawy są takie same?

oschloebe
źródło

Odpowiedzi:

10

Użyj 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

być może będziesz musiał usunąć niektóre dane z każdej tablicy przed różnicą. Jestem pewien, że możesz to wypracować;)

ProxiBlue
źródło
2
Chociaż będzie to działać w prawie wszystkich praktycznych przypadkach, powinno tak być, array_diff_assocponieważ array_diff porównuje tylko wartości, więc jeśli na przykład zmienisz imię i nazwisko, adresy będą nadal traktowane jako równe
Fabian Schmengler
7

Chociaż odpowiedź jest już zaakceptowana, chciałbym udostępnić to rozwiązanie, które widziałem (podobnie) raz w module innej firmy:

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

Który został następnie nazwany:

$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
źródło
5

Okej, więc oto moja próba zastosowania się do sugestii 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
}

Zasadniczo usuwam niektóre klucze za pomocą $excludeKeys tablicy, więc array_diffbędę porównywał tylko odpowiednie dane. Aby usunąć kilka kluczy bez konieczności tworzenia pętli, używam array_diff_keyw połączeniu z, array_flipaby pozbyć się niepotrzebnych kluczy tablicy.

Ulepszenia i opinie mile widziane. :)

oschloebe
źródło
1
Chociaż będzie to działać w prawie wszystkich praktycznych przypadkach, powinno tak być, array_diff_assocponieważ array_diff porównuje tylko wartości, więc jeśli na przykład zmienisz imię i nazwisko, adresy będą nadal traktowane jako równe.
Fabian Schmengler,
3

Musisz uzyskać wycenę za pomocą

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

Następnie możesz uzyskać adres wysyłki z oferty i sprawdzić, czy jest on oznaczony jako taki sam jak adres rozliczeniowy:

if($quote->getShippingAddress()->getSameAsBilling()){
    // do stuff
}
gebrial
źródło
Gdzie jest oznaczony jako taki sam? Wygląda na to, że to nie działa dla mnie, ponieważ klient zawsze zaznacza to samo, nawet jeśli adresy domyślne są wyraźnie różne.
TheKitMurkit
0

musiał porównać adresy - jeden z nich właśnie został utworzony (nie został zapisany). Być może pomaga komuś:

na podstawie odpowiedzi @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);
}

EDYCJA 20 01 2016

używam następującej metody, ponieważ opublikowałem powyższą wersję i to działa dla mnie - pomyślałem, że może komuś pomóc:

/**
 * 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
źródło