Copie dados personalizados da cotação para o pedido e o item do pedido depois que o pedido for feito no magento2

15

Estou construindo um módulo personalizado no magento 2 que tem um desconto personalizado. Estou tentando copiar o desconto da cotação, do item de cotação para o pedido e do item do pedido. No magento 1, declaro config.xmlassim:

<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> 

e meu valor de desconto personalizado foi copiado para as tabelas: sales_flat_ordere sales_flat_order_itemconforme o esperado.

No Magento 2, criei um nome de arquivo: fieldset.xml com 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>

mas não há sucesso. O que mais eu preciso fazer no magento 2 para que ele funcione? Vocês podem me ajudar?

FireKirin
fonte

Respostas:

7

Parece que os conjuntos de campos não são mais uma opção para mover campos de dados personalizados. Não está claro se isso é intencional ou é um efeito colateral de outras alterações.

Acabei de encontrar o mesmo problema com pagamentos. Rastreei isso de volta para \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;
}

Ela começa por processar o conjunto de campos para copiar dados de $objectdentro da $paymentDatamatriz, mas, em seguida, alimenta essa matriz em \Magento\Framework\Api\DataObjectHelper::populateWithArray()que, na verdade, definir os valores no objecto alvo (aqui, $orderPayment).

Em vez de adicionar diretamente a matriz de dados ao objeto como no Magento 1, DataObjectHelperprocura os métodos 'set__' ou 'setIs__' correspondentes a cada chave e, em seguida, chama esses métodos com o valor. Se esse método não existir, a chave de dados será ignorada completamente.

Os endereços e itens de cotação são processados ​​da mesma maneira, em \Magento\Quote\Model\Quote\Address\ToOrderAddresse \Magento\Quote\Model\Quote\Item\ToOrderItemrespectivamente.

O que isso significa?

  1. Adicionar a chave a um conjunto de campos não é suficiente, a menos que já exista um método definido no objeto correspondente a essa chave.
  2. Parece que a cópia de campos personalizados de cotação para pedido exigirá a substituição da classe de destino para adicionar o (s) método (s) setter (s) necessário (via injeção de dependência) ou o uso de observadores sales_model_service_quote_submit_beforepara copiar os dados manualmente.

Observe também que o módulo de cotação possui seus próprios conjuntos de campos definidos, incluindo quote_convert_addresse quote_convert_item. Parece que os conjuntos de campos sales_convert_quote * já estão em uso.

Ryan Hoerr
fonte
: - Estou confuso com a sua resposta, apenas entendi que os dados em movimento da cotação para a ordem foram removidos no magebnto2, então como fazê-lo nos meus campos personalizados? você pode postar o código, na minha resposta eu dei correção para o problema principal do magento (verifique minha resposta acima), você tem alguma outra solução para esse problema?
Pradeep Kumar
você conseguiu alguma solução
jibin george 18/10/19
5

As vendas do Magento2 convertem de cotação em pedido e seu item não está funcionando
cotação Converter modelo para cotação em pedido e seu item é movido do módulo de vendas para o módulo Cotação no Magento2 Mas não está funcionando

<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> 

converter de pedido e item de pedido em fatura, remessa e Creditmemo está funcionando bem no Magento2

abaixo está a correção para converter cotação para ordem no magento2; caso contrário, você precisa gravar o evento para mover todo o valor arquivado da cotação para a tabela de ordens 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 (linha no 428)

antes

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

na função submitQuote () adicione código abaixo

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

alteração no app \ code \ Magento \ Quote \ Model \ Quote \ Item \ ToOrderItem.php (lin no around 78)

depois de

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

na função convert () adicione o código abaixo

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

funcionará bem, mas
certifique-se de que eu mencionei acima o fieldset.xml deve estar no seu módulo personalizado e você também deve escrever um evento para definir o atributo do produto depois que o produto for adicionado ao carrinho, como no magento1.x, e você também deve definir o arquivamento personalizado na tabela de cotação, somente ele copiará da cotação e item para o pedido e seu item

Pradeep Kumar
fonte
Pradeep. Ainda não é suportado?
awavi
0

Eu estive investigando isso e, no módulo Magento \ GiftMessage, também há conversão de campos (fieldset.xml):

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

A maneira como eles o adicionam à ordem é via observador (Observer / SalesEventQuoteSubmitBeforeObserver.php, registrado em etc / frontend / events.xml):

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

    return $this;
}

Então, acho que essa é uma opção viável a ser considerada.

epson121
fonte
É possível que o Magento 2 copie automaticamente valores para pedidos, pagamentos etc. usando atributos de extensão. No entanto, a criação de atributos de extensão para order_items requer observadores personalizados para manipular o carregamento e o salvamento de dados nos objetos quote_item e order_item. Por esse motivo, é muito mais simples seguir a abordagem sugerida acima para adicionar uma coluna às tabelas relevantes e usar um único método de observador para copiar os dados. Infelizmente, o Magento tentou tornar a extensibilidade da v2 tão flexível que requer muito clichê para valer a pena.
Robert Egginton 15/06
@ epson121: você poderia compartilhar seu events.xml nesse caso?
Ipsita Rout
@IpsitaRout você pode verificar o código Magento padrão (app / code / Magento / GiftMessage / etc / frontend / Events.xml) ou verificar este trecho: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121