Como verificar se o endereço de cobrança e entrega é igual?

16

Estou tentando verificar se o endereço de cobrança e entrega é igual ao criar PDFs de fatura.

O que eu tentei até agora foi:

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

ou

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

mas nem funciona. Eu também estava tentando obter a cotação usando$order->getQuote() mas isso também não funcionou.

Existe alguma maneira de verificar se o endereço de cobrança e entrega é igual?

oschloebe
fonte

Respostas:

10

Use 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

pode ser necessário remover alguns dos dados de cada matriz antes do diff. Tenho certeza que você pode resolver isso;)

ProxiBlue
fonte
2
Enquanto isso funciona em quase todos os casos práticos, deve ser array_diff_assocporque array_diff só compara os valores, por isso, se você, por exemplo mudar primeiro e último nome, os endereços serão ainda tratados como iguais
Fabian Schmengler
7

Embora já exista uma resposta aceita, gostaria de compartilhar esta solução que vi (semelhante) uma vez em um módulo de terceiros:

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

Que foi então chamado:

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

Ok, então aqui está minha tentativa de seguir a sugestão do 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
}

Basicamente, estou retirando algumas chaves usando uma $excludeKeysmatriz, por array_diffisso compararei apenas os dados relevantes. Para retirar várias chaves sem ter que criar um loop, estou usando array_diff_keyem combinação com array_flippara me livrar das chaves desnecessárias da matriz.

Melhorias e feedback são bem-vindos. :)

oschloebe
fonte
1
Embora isso funcione em quase todos os casos práticos, deve ser array_diff_assocporque array_diff compara apenas os valores; portanto, se você alternar, por exemplo, o nome e o sobrenome, os endereços ainda serão tratados como iguais.
Fabian Schmengler
3

Você precisa obter a cotação usando

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

Em seguida, você pode obter o endereço de entrega da cotação e verificar se está marcado como sendo o mesmo que o endereço de cobrança:

if($quote->getShippingAddress()->getSameAsBilling()){
    // do stuff
}
gebrial
fonte
Onde está sendo marcado como o mesmo? Parece que não está funcionando para mim, porque o cliente sempre marcou o mesmo, mesmo que os endereços padrão sejam claramente diferentes.
TheKitMurkit 14/02/19
0

teve que comparar endereços - um deles acabou de ser criado (não salvo). Talvez ajude alguém:

com base na resposta @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 20 2016

Estou usando o método a seguir, pois eu publiquei a versão acima e ela funciona para mim - pensei que poderia ajudar alguém:

/**
 * 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
fonte