• 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 3 years, 6 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.