Diferencia entre la cotización de ventas y la dirección de la cotización de ventas

8

Estoy buscando qué observador de collect_totals puedo usar. Hay dos observadores, sales_quote_collect_totals_before y sales_quote_address_collect_totals_before .

Se pueden encontrar en /app/code/core/Mage/Sales/Model/Quote.phpy /app/code/core/Mage/Sales/Model/Quote/Address.php.

Me pregunto cuál es la diferencia entre los dos archivos, ya que ambos tienen las funciones de recopilación total.

usuario1240207
fuente

Respuestas:

14

/app/code/core/Mage/Sales/Model/Quote.php

es la clase de cotización para el objeto de cotización

/app/code/core/Mage/Sales/Model/Quote/Address.php

es la clase de Dirección de presupuesto para cualquier objeto de dirección de presupuesto

Un objeto de presupuesto normalmente contendría 2 objetos de dirección, pero puede contener más si hay varias direcciones de entrega.

Con respecto al método (s) 'collecttotals': Primero, comprendamos cada método y su propósito:

El método en Mage_Sales_Model_Quote, es el punto de entrada inicial para el Totals Collectorsubsistema, y ​​se inicia mediante un carrito de guardar,

(esto le permite inyectar métodos de clase en los cálculos del carrito, para afectar el resultado de los totales del carrito; por ejemplo: cálculos de descuentos del carrito)

Código de flujo de la siguiente manera:

Mage_Checkout_Model_Cart::save()

Mage_Sales_Model_Quote::collectTotals() <--- punto de entrada del subsistema colector

Mage_Sales_Model_Quote_Address::collectTotals() <- se llama a cada dirección adjunta al objeto de presupuesto, a través de un bucle en el objeto de recopilación de totales de presupuesto.

Ahora, en el método de coleccionismo de direcciones, se realiza un bucle, utilizando todos los 'colectores' definidos por el sistema, llamando a cada clase / método, permitiendo así que los totales para el pedido se ajusten mediante cálculos adicionales (recuerde que todos los totales cuelgan de la dirección objeto (s), no el objeto de cotización real, lo que permite a magento realizar el pago a múltiples direcciones)

foreach ($this->getTotalCollector()->getCollectors() as $model) {
            $model->collect($this);
} 

Una lista de posibles 'coleccionistas' sería:

ingrese la descripción de la imagen aquí

Puede inyectar su propio recopilador de totales a través de una configuración de módulo como tal, y debe tener un collectmétodo como punto de entrada.

<sales>
   <quote>
      <totals>
         <giftpromo>
           <class>giftpromo/promo_gift</class>
           <after>discount</after>
           <before>tax,grand_total</before>
           <sort_order>12410</sort_order>
         </giftpromo>
      </totals>
    </quote>
</sales>

Ahora, considerando toda esa información, y los eventos disparados:

sales_quote_collect_totals_before : se dispara antes de que se cargue cualquier objeto de dirección y se activa el recopilador de totales

sales_quote_address_collect_totals_before : se dispara dentro de los objetos de dirección de cotización, antes de que cada objeto de dirección ejecute la lista de posibles objetos de colección.

Sin conocer tu final del juego, no podría determinar cuál es el adecuado para ti, sin embargo, también te sugiero que consideres si ninguno de los dos es el adecuado y que serías el más adecuado para agregar un nuevo colector para el sistema colector de totales

Espero que esta información lo ayude a determinar la forma correcta de ampliar la funcionalidad y brindar una solución estable.

ProxiBlue
fuente
super explicación!
David Manners
Leí la primera línea y ya decidí +1.
pspahn
@ProxiBlue después de leer tu respuesta, creo que me ayudas a resolver un problema relacionado con el método collectTotals (). Por lo tanto, tengo dos atributos de descuento en mi tabla Producto para aplicar descuentos en productos en la colocación de pedidos. Entonces, cuando creamos Cotización, agregamos estos descuentos y el monto after_discount en la tabla de cotizaciones, lo cual está bien. Ahora, cuando hago el pedido, veo en la línea $ quote-> collectTotals () -> save () los valores de descuento se convierten en 0 y el monto total se convierte en el precio original (sin precio de descuento). ¿Puedes decir cómo solucionar esto?
apandey846