• Resolved brasofilo

    (@brasofilo)


    Este é o código para fazer essa troca automática. A equipe de finanças pediu pra fazer essa mudança, se o cliente fez upload do recibo, podemos considerar o faturamento completo.

    add_action( 'woocommerce_order_status_pix-receipt', function($order_id){
        if ( ! $order_id ) {
            return;
        }
        $order = wc_get_order( $order_id );
        $order->update_status( 'completed' );
    });

    Melhor usar o plugin Snippets para adicionar esse tipo de códigos. Ou então fazer o seu próprio plugin. Colocar no functions.php é a pior alternativa.

Viewing 8 replies - 1 through 8 (of 8 total)
  • Oi @brasofilo, eu também sou usuário do Plugin (não faço parte dos time de desenvolvedores), mas fiquei pensando, caso o cliente faça o upload de qualquer imagem, o seu código vai atualizar automaticamente o status do pedido, certo?

    Não é melhor que alguém interno faça a conferência pelo menos do comprovante? Porque nada impede de um cliente mandar qualquer arquivo sem realizar de fato o pix e o status do pedido será alterado de qualquer forma.

    Desculpe meter o nariz onde não fui chamado, mas é que esse é um risco que pensei para a minha loja virtual e sempre é bom alertar.

    Um abraço.

    Plugin Author Piggly Dev

    (@pigglydev)

    Como o @marcelosanches falou, @brasofilo primeiro que não recomendamos alterar imediatamente para pedido completado. Afinal, comprovante não é garantia de pagamento e seu cliente pode cair em muitos golpes.

    Segundo, que não é recomendado fazer da forma como você fez, ao invés de utilizar $order->update_status() é preferível utilizar $order->payment_complete(). Isso executará todas as ações do Woocommerce para finalizar e completar o pedido.

    Terceiro, não há problemas em utilizar o functions.php, desde que seja um tema do tipo child, tudo funcionará perfeitamente.

    Futuramente, vamos implementar as API Pix para atualizar automaticamente os pedidos como pagos verificando diretamente na conta bancária, por conta disso, não faremos uma atualização ou um fix para mudar o status pix-receipt para outro.

    Plugin Author Piggly Dev

    (@pigglydev)

    Não vamos deixar essa opção como nativa no plugin. A partir da versão 1.4 (que será lançada em breve) vamos implementar actions e filters em pontos específicos para auxiliar na personalização. Mas, para quem precisar fazer essa transação no momento, embora não seja recomendado utilizar o comprovante como garantia de pagamento, eis o código:

    
    function pix_update_payment_completed ( $order_id, $instance )
    {
        $order = $instance instanceof WC_Order ? $instance : new WC_Order((int)$order_id);
    
        if ( $order )
        { $order->payment_complete(); }
    }
    
    add_action ( 'woocommerce_order_status_pix-receipt', 'pix_update_payment_completed', 99, 2 );
    

    Esse código pode ser adicionado em functions.php em um tema filho ou, ainda, é possível criar um plugin de correções, que apenas tem o arquivo principal do plugin com todas as actions corretivas.

    É importante destacar que a função $order->payment_complete() é mais eficiente que $order->update_status( 'completed' ) pois o método payment_complete executa as actions de pedido concluído, além de adicionar a data de pagamento ao pedido.

    Thread Starter brasofilo

    (@brasofilo)

    Oi @marcelosanches e @pigglydev,
    muito obrigado pelo feedback, agradecido mesmo 🙂

    O troço tá tão corrido que esqueci de ver as respostas aqui.

    Bem que notei algumas inconsistências no comportamento. Vou trocar o código imediatamente.
    Com certeza que existe o risco do cliente enviar qualquer JPG/PNG, mas por enquanto vamos correr o risco e ver o que acontece.

    Quanto ao functions.php, não é o lugar pra ficar acrescentando essas coisas. É o que todo mundo faz? Sim. Não quer dizer que é o correto. Tema é pra design, plugin é pra funcionalidades extras.

    Anyway, obrigadão de novo!

    Plugin Author Piggly Dev

    (@pigglydev)

    É por isso @brasofilo que é uma boa prática você criar um plugin com as correções em acordo com as necessidades particulares de cada projeto. Ao invés de utilizar o functions.php.

    Thread Starter brasofilo

    (@brasofilo)

    @pigglydev

    Curiosamente a função $order->payment_complete(); não está atualizando o status do pedido. Ela retorna true mas o status continua sendo “Comprovante Pix Recebido”.

    Estou fazendo isto porém não encontrei referências quanto ao uso correto do método payment_complete():

    if ( $order ) { 
        $order->update_status( 'completed' );
        $order->payment_complete(); 
    }

    [edit]
    Acabo de testar no live site e ele dispara duas vezes a mensagem de Telegram (pra mim) sobre o faturamento concluído.
    Para o cliente, só um email foi enviado avisando da conclusão…

    • This reply was modified 2 years, 10 months ago by brasofilo.
    Plugin Author Piggly Dev

    (@pigglydev)

    Como esse problema não está relacionado ao plugin assunto dessa thread, recomendo que leia o código da função $order->payment_complete() e entenda como ela funciona clicando aqui.

    Thread Starter brasofilo

    (@brasofilo)

    Acho que finalmente encontrei o problema estudando o método payment_complete().

    É necessário adicionar pix-receipt ao filtro de Valid Orders. Sem isso o payment_complete() não vai atualizar o status nem salvá-lo.

    add_filter('woocommerce_valid_order_statuses_for_payment_complete', function($stati, $that){
       	$stati[] = 'pix-receipt';
        return $stati;
    }, 10, 2);

    E é necessário também marcar este transiente Needs Processing como false. Sem isso, o status do pedido vai ficar como processing em vez de completed.

    add_action ( 'woocommerce_order_status_pix-receipt', function ( $order_id, $instance ) {
        $order = $instance instanceof WC_Order ? $instance : new WC_Order((int)$order_id);
        if ( $order ) {
            $transient_name   = 'wc_order_' . $order_id . '_needs_processing';
            set_transient( $transient_name, false );
            $order->payment_complete();
        }
    }, 99, 2 );

    Imagino que a questão do transiente pode ser resolvida de outra forma pois ela serve pra controlar produtos digitais e minha loja são produtos físicos.

Viewing 8 replies - 1 through 8 (of 8 total)
  • The topic ‘Como trocar o status do pedido de pix-receipt para completed’ is closed to new replies.