Copie los datos personalizados de la cotización al pedido y el artículo del pedido una vez que el pedido se realiza en magento2

15

Estoy creando un módulo personalizado en magento 2 que tiene un descuento personalizado. Estoy tratando de copiar el descuento de la cotización, la cotización del artículo al pedido y el artículo del pedido. En magento 1, declaro config.xmlasí:

<fieldsets>
    <sales_convert_quote_address>
        <custom_discount_amount><to_order>*</to_order></custome_discount_amount>
        <base_custom_discount_amount><to_order>*</to_order></base_custome_discount_amount>
    </sales_convert_quote_address>
    <sales_convert_quote_item>
        <custome_discount_amount><to_order_item>*</to_order_item></custome_discount_amount>
        <base_custom_discount_amount><to_order_item>*</to_order_item></base_custom_discount_amount>
    </sales_convert_quote_item>
</fieldsets> 

y mi cantidad de descuento personalizada se copió en tablas: sales_flat_ordery sales_flat_order_itemcomo se esperaba.

En Magento 2, creé un nombre de archivo: fieldset.xmlcon este código:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Object/etc/fieldset.xsd">
<scope id="global">
    <fieldset id="sales_convert_quote_item">
        <field name="custom_discount_amount">
            <aspect name="to_order_item" />
        </field>
        <field name="base_custom_discount_amount">
            <aspect name="to_order_item" />
        </field>
    </fieldset>         
      <fieldset id="sales_convert_quote_address">
        <field name="custom_discount_amount">
            <aspect name="to_order" />
        </field>
        <field name="base_custom_discount_amount">
            <aspect name="to_order" />
        </field>
    </fieldset>   
</scope>

Pero no hay éxito. ¿Qué más necesito hacer en magento 2 para que funcione? ¿Pueden ustedes ayudarme por favor?

FireKirin
fuente

Respuestas:

7

Parece que los conjuntos de campos ya no son una opción para mover campos de datos personalizados. No está claro si esto es intencional o un efecto secundario de otros cambios.

Me encontré con el mismo problema con los pagos. Lo rastreé hasta \Magento\Quote\Model\Quote\Payment\ToOrderPayment::convert():

public function convert(Payment $object, $data = [])
{
    $paymentData = $this->objectCopyService->getDataFromFieldset(
        'quote_convert_payment',
        'to_order_payment',
        $object
    );

    $orderPayment = $this->orderPaymentFactory->create();
    $this->dataObjectHelper->populateWithArray(
        $orderPayment,
        array_merge($paymentData, $data),
        '\Magento\Sales\Api\Data\OrderPaymentInterface'
    );
    $orderPayment->setAdditionalInformation(
        array_merge(
            $object->getAdditionalInformation(),
            [Substitution::INFO_KEY_TITLE => $object->getMethodInstance()->getTitle()]
        )
    );
    // set directly on the model
    $orderPayment->setCcNumber($object->getCcNumber());
    $orderPayment->setCcCid($object->getCcCid());

    return $orderPayment;
}

Comienza procesando el conjunto de campos para copiar datos de $objectla $paymentDatamatriz, pero luego alimenta esa matriz \Magento\Framework\Api\DataObjectHelper::populateWithArray()para establecer realmente los valores en el objeto de destino (aquí, $orderPayment).

En lugar de agregar directamente la matriz de datos al objeto como en Magento 1, DataObjectHelperbusca los métodos 'set__' o 'setIs__' correspondientes a cada clave, y luego llama a esos métodos con el valor. Si dicho método no existe, la clave de datos se omite por completo.

Las direcciones de cotización y los elementos se procesan de la misma manera, en \Magento\Quote\Model\Quote\Address\ToOrderAddressy \Magento\Quote\Model\Quote\Item\ToOrderItemrespectivamente.

Qué significa eso?

  1. Agregar la clave a un conjunto de campos no es suficiente, a menos que ya exista un método establecido en el objeto correspondiente a esa clave.
  2. Parece que copiar campos personalizados de presupuesto a pedido requerirá anular la clase de destino para agregar los métodos de establecimiento necesarios (mediante inyección de dependencia) o utilizar observadores como sales_model_service_quote_submit_beforepara copiar los datos manualmente.

También tenga en cuenta que el módulo de presupuesto tiene sus propios conjuntos de campos definidos, incluidos quote_convert_addressy quote_convert_item. No parece que los conjuntos de campos sales_convert_quote * ya estén en uso.

Ryan Hoerr
fuente
: - Estoy confundido por su respuesta, justo entendí que mover datos desde la cotización al pedido se eliminó en magebnto2, ¿cómo hacerlo para mis campos personalizados? ¿puede publicar el código? En mi respuesta, di una solución para el problema principal de magento (verifique mi respuesta anterior), ¿tiene alguna otra solución para este problema?
Pradeep Kumar
¿
obtuviste
5

Las ventas de Magento2 se convierten de cotización a pedido y su artículo no funciona
cotización Convertir el modelo de cotización a orden y su artículo se mueve del módulo de ventas al módulo de cotización en Magento2 Pero no funciona

<fieldset id="sales_convert_quote">
            <field name="custom_field">
                <aspect name="to_order" />
            </field>
        </fieldset>        
        <fieldset id="quote_convert_item">
            <field name="custom_sku">
                <aspect name="to_order_item" />
            </field>
        </fieldset> 

convertir de pedido y artículo de pedido a factura, envío y Creditmemo funciona bien en Magento2

a continuación se encuentra la solución para convertir la cotización al pedido en magento2; de lo contrario, debe escribir el evento para mover todo el valor archivado de la cotización a la tabla de pedidos magento2a \ app \ code \ Sugarcode \ Test \ etc \ fieldset.xml

    <?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Object/etc/fieldset.xsd">
    <scope id="global">
        <fieldset id="sales_convert_quote">
            <field name="custom_field">
                <aspect name="to_order" />
            </field>
        </fieldset>        
        <fieldset id="quote_convert_item">
            <field name="custom_sku">
                <aspect name="to_order_item" />
            </field>
        </fieldset>         
        <fieldset id="sales_convert_order">
            <field name="custom_field">
                <aspect name="to_quote" />
                <aspect name="to_invoice" />
                <aspect name="to_shipment" />
                <aspect name="to_cm" />
            </field>
        </fieldset>        
        <fieldset id="sales_convert_order_item">
            <field name="custom_sku">
                <aspect name="to_quote_item" />
                <aspect name="to_invoice_item" />
                <aspect name="to_shipment_item" />
                <aspect name="to_cm_item" />
            </field>            
        </fieldset>
    </scope>
</config>


app \ code \ Magento \ Quote \ Model \ QuoteManagement.php (línea no 428)

antes de

$billingAddress = $this->quoteAddressToOrderAddress->convert(
            $quote->getBillingAddress(),
            [
                'address_type' => 'billing',
                'email' => $quote->getCustomerEmail()
            ]
        );

en la función submitQuote () agregue el siguiente código

$order=$this->quoteAddressToOrder->convert($quote->getBillingAddress(), $orderData);

cambio en app \ code \ Magento \ Quote \ Model \ Quote \ Item \ ToOrderItem.php (lin no alrededor de 78)

después

$orderItem = $this->orderItemFactory->create();

en la función convert () agregue el siguiente código

$this->objectCopyService->copyFieldsetToTarget('quote_convert_item', 'to_order_item', $item, $orderItem);

funcionará bien, pero
asegúrese de que, como mencioné anteriormente, fieldset.xml debe estar allí en su módulo personalizado y también debe escribir el evento para establecer el atributo del producto una vez que el producto se agrega al carrito como en magento1.x y también debe configurar el archivo personalizado en la tabla de cotizaciones, solo se copiará de la cotización y el artículo al pedido y su artículo

Pradeep Kumar
fuente
Pradeep ¿Todavía no es compatible?
awavi
0

He estado investigando esto, y en el módulo Magento \ GiftMessage, también hay conversión de campos (fieldset.xml):

<fieldset id="sales_convert_quote_address">
    <field name="gift_message_id">
        <aspect name="to_order" />
    </field>
</fieldset>

La forma en que lo agregan al pedido es a través del observador (Observer / SalesEventQuoteSubmitBeforeObserver.php, registrado en etc / frontend / events.xml):

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $observer->getEvent()->getOrder()->setGiftMessageId($observer->getEvent()->getQuote()->getGiftMessageId());

    return $this;
}

Entonces, supongo, esta es una opción viable a considerar.

epson121
fuente
Es posible hacer que Magento 2 copie automáticamente valores para pedidos, pagos, etc. mediante el uso de atributos de extensión. Sin embargo, la creación de atributos de extensión para order_items requiere observadores personalizados para manejar la carga y el almacenamiento de datos en los objetos quote_item y order_item. Debido a esto, es mucho más simple seguir el enfoque sugerido anteriormente para agregar una columna a las tablas relevantes y utilizar un único método de observación para copiar los datos. Lamentablemente, Magento ha tratado de hacer que la extensibilidad en v2 sea tan flexible que requiere demasiada repetitiva para que valga la pena nuestro tiempo.
Robert Egginton
@ epson121: ¿podría compartir su events.xml en este caso?
Ipsita Rout
@IpsitaRout puede verificar el código predeterminado de Magento (app / code / Magento / GiftMessage / etc / frontend / events.xml) o ver este extracto: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121