Magento 2 fieldset.xml; copiar campos de presupuesto a pedido

11

He creado un modelo personalizado para crear un pedido a partir de una cotización; Estoy usando fieldset.xml para copiar códigos personalizados de cotización a pedido. He creado columnas personalizadas tanto en presupuesto como en orden con campos coincidentes. Cuando se realiza el pedido, los valores se almacenan en los campos personalizados de presupuesto pero no se copian en el pedido. A continuación se muestra mi fieldset.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="urn:magento:framework:DataObject/etc/fieldset.xsd">
<scope id="global">
    <!--quote convert to order-->
    <fieldset id="sales_convert_quote">            
        <field name="preorder_number">
            <aspect name="to_order" />
        </field>
        <field name="purchase_order_number">
            <aspect name="to_order" />
        </field>
        <field name="reference_number">
            <aspect name="to_order" />
        </field>
    </fieldset>
    <!--quote item convert to order item-->
    <fieldset id="quote_convert_item">
        <field name="preorder_number">
            <aspect name="to_order_item" />
        </field>
        <field name="purchase_order_number">
            <aspect name="to_order_item" />
        </field>
        <field name="reference_number">
            <aspect name="to_order_item" />
        </field>
    </fieldset>
</scope>

¿Qué más necesito hacer?

Abhimanyu Singh
fuente
¿borraste el caché?
Marius
Sí, borré el caché y la generación de ambos, luego los datos de los campos personalizados no se copian de la cotización al pedido
Abhimanyu Singh
Cualquier solución para esto
Abhimanyu Singh
Agregue <? Xml version = "1.0"?> En ese código. Lo que falta
Ramki

Respuestas:

10

Si observa la base de código actual de magento2.1, notará que en la carpeta moduleName / etc hay un fieldset.xml con comando para copiar información de una tabla a otra. Sin embargo esto NO funciona. Si observa más de cerca, también notará que hay un observador que hace exactamente lo mismo. Echa un vistazo a https://github.com/magento/magento2/issues/5823

Para copiar de la tabla de presupuesto * a pedido *, deberá utilizar un observador y / o complemento.

En su Módulo personalizado events.xml agregue

 <event name="sales_model_service_quote_submit_before">
    <observer name="[moduelname]_sales_model_service_quote_submit_before" instance="Company\ModuleName\Observer\SaveOrderBeforeSalesModelQuoteObserver" />
</event>

Entonces

<?php

namespace Company\ModuleName\Observer;

use Magento\Framework\Event\ObserverInterface;

class SaveOrderBeforeSalesModelQuoteObserver implements ObserverInterface
{

    /**
     * List of attributes that should be added to an order.
     *
     * @var array
     */
    private $attributes = [
        'field_1_name_here',
        'field_2_name_here',
        'field_...._here'
    ];


    /**

     *
     * @param \Magento\Framework\Event\Observer $observer
     * @return $this
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        /* @var Magento\Sales\Model\Order $order */
        $order = $observer->getEvent()->getData('order');
        /* @var Magento\Quote\Model\Quote $quote */
        $quote = $observer->getEvent()->getData('quote');

        foreach ($this->attributes as $attribute) {
            if ($quote->hasData($attribute)) {
                $order->setData($attribute, $quote->getData($attribute));
            }
        }

        return $this;
    }
}

Para copiar el elemento de quote_item a order_item, magento parece haber eliminado al mejor observador para obtener el trabajo que era sales_convert_quote_item_to_order_item. Eche un vistazo a este ejemplo que debería ayudarlo a copiar el campo de quote_item a la tabla order_item. ¿Cómo "agregar al carrito" un producto con un campo de entrada personalizado y guardarlo en la base de datos?

Renon Stewart
fuente
Si has llegado hasta aquí, también podrías usar el servicio de copia ...
LM_Fielding
@LM_Fielding puedes ver en mi respuesta cómo puedes usar esto con el servicio de copia
warch
esto no funciona de la dirección del pedido. El pedido creado creará una nueva fila para un nuevo objeto de dirección de pedido. por ejemplo, mis datos personalizados se insertan en la dirección del pedido con ID 500, el nuevo pedido utilizará la dirección 501.
Doni Wibowo
8

La respuesta de Renon Stewart me ayudó mucho, pero pude mejorarla con la documentación oficial para desarrolladores de magento ( http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html )

En su Módulo personalizado events.xml agregue:

<event name="sales_model_service_quote_submit_before">
    <observer name="[moduelname]_sales_model_service_quote_submit_before" instance="Company\ModuleName\Observer\SaveOrderBeforeSalesModelQuoteObserver" />
</event>

Y en saveOrderBeforeSalesModelQuoteObserver.php:

namespace Company\ModuleName\Observer;

use Magento\Framework\Event\ObserverInterface;

class SaveOrderBeforeSalesModelQuoteObserver implements ObserverInterface
{

    /**
     * @var \Magento\Framework\DataObject\Copy
     */
    protected $objectCopyService;


    /**
     * @param \Magento\Framework\DataObject\Copy $objectCopyService
     */
    public function __construct(
        \Magento\Framework\DataObject\Copy $objectCopyService
    )
    {
        $this->objectCopyService = $objectCopyService;
    }

    /**
     *
     * @param \Magento\Framework\Event\Observer $observer
     * @return $this
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        /* @var Magento\Sales\Model\Order $order */
        $order = $observer->getEvent()->getData('order');
        /* @var Magento\Quote\Model\Quote $quote */
        $quote = $observer->getEvent()->getData('quote');

        $this->objectCopyService->copyFieldsetToTarget('sales_convert_quote', 'to_order', $quote, $order);

        return $this;
    }
}
warch
fuente