vindi / vindi-woocommerce

Plugin Vindi para pagamento recorrente no Woocommerce
https://vindi.com.br
GNU General Public License v3.0
6 stars 12 forks source link

Produtos com gerenciamento de estoque fracionado geram erro #93

Closed stenioanibal closed 2 years ago

stenioanibal commented 3 years ago

Produtos com estoque fracionado (Ex: Pisos, materiais de construção) onde a quantidade é adquirida em metros e podem ser fracionadas (1,20 metros quadrados) geram erro na transação.

A correção pode ser feita alterando a função build_product_items_for_bill para:

protected function build_product_items_for_bill($order_item)
    {
        $item = array(
            'product_id' => $order_item['vindi_id'],
            'quantity' => ceil($order_item['qty']),
            'pricing_schema' => array(
                'price' => $order_item['price'],
                'schema_type' => 'per_unit',
            ),
        );

        if(!is_int($order_item['qty'])){
            $item = array(
                'product_id'        => $order_item['vindi_id'],
                'amount'          => $order_item['price'] * $order_item['qty']
            );
        }

        if (
            'discount' == $order_item['type'] || 'shipping' == $order_item['type'] ||
            'tax' == $order_item['type'] || 'interest_rate' == $order_item['type'] || 'sign_up_fee' == $order_item['type']
        ) {
            $item = array(
                'product_id' => $order_item['vindi_id'],
                'amount' => $order_item['price'],
            );
        }

        return $item;
    }

Desta forma, a função garantirá o envio de valores inteiros na quantidade para a API (que só aceita valores inteiros). Utilizo o módulo antigo com essa edição e, como aparentemente ele foi descontinuado (ou será em breve), resolvi abrir a issue aqui, garantindo o funcionamento correto com essa solução já que, a quantidade não impacta em nada no processamento dos dados na Vindi e a alteração da API é inviável.

devaguia commented 2 years ago

O WooCommerce por padrão não lida com estoque fracionado mas sim com números inteiros. Mesmo que adicione um número fracionado e salve o WooCommerce sempre vai arredondar o número. Ex: Se colocar 4.2 vai ser salvo como 4. Screenshot from 2022-08-31 16-02-33

Acho que uma solução seria gerenciar o seu estoque por quantidade e converter a quantidade em metros para a quantidade de produtos que cabem em um metro.

Ex: Você vendeu 1m² de piso e cada peça do piso mede 25cm², logo você vendeu 4 peças de 25cm².