/** * Gerencia a contagem de vagas reservadas com base na mudança de status do pedido. * * @param int $order_id ID do pedido. * @param string $old_status Status antigo. * @param string $new_status Novo status. */ function pt_woo_gerenciar_vagas_por_status_pedido( $order_id, $old_status, $new_status ) { $order = wc_get_order( $order_id ); if ( ! $order ) { // Log error maybe? return; } // Define quais status devem reservar vagas e quais devem liberar $reserved_statuses = array( 'processing', 'completed' ); $released_statuses = array( 'cancelled', 'refunded', 'failed', 'pending', 'on-hold' ); // Status que não devem manter vagas reservadas // Verifica se a transição implica em reservar vagas $should_reserve = ! in_array( $old_status, $reserved_statuses ) && in_array( $new_status, $reserved_statuses ); // Verifica se a transição implica em liberar vagas (só libera se estava reservado antes) $should_release = in_array( $old_status, $reserved_statuses ) && in_array( $new_status, $released_statuses ); // Se não for nem reservar nem liberar, não faz nada if ( ! $should_reserve && ! $should_release ) { return; } // Itera sobre os itens do pedido foreach ( $order->get_items() as $item_id => $item ) { $product_id = $item->get_product_id(); // Pega a data salva no formato YYYY-MM-DD $data_reservada = $item->get_meta( '_passeio_data_yyyymmdd', true ); // Verifica se é um produto nosso com data e disponibilidade gerenciada if ( $product_id && $data_reservada && metadata_exists( 'post', $product_id, '_passeio_disponibilidade' ) ) { $quantity = $item->get_quantity(); $change_quantity = 0; if ( $should_reserve ) { $change_quantity = $quantity; // Quantidade positiva para incrementar reservas } elseif ( $should_release ) { $change_quantity = -$quantity; // Quantidade negativa para decrementar reservas } if ( $change_quantity !== 0 ) { // Chama a função para atualizar o contador de vagas reservadas $atualizou = pt_woo_atualizar_vagas_reservadas( $product_id, $data_reservada, $change_quantity ); // Opcional: Log ou nota no pedido if ($atualizou) { $order->add_order_note( sprintf( __('Contagem de vagas para o passeio ID %d na data %s ajustada em %d devido à mudança de status para %s.', 'passeios_turisticos'), $product_id, date_i18n( wc_date_format(), strtotime( $data_reservada ) ), $change_quantity, wc_get_order_status_name( $new_status ) ) ); } else { $order->add_order_note( sprintf( __('Erro ao tentar ajustar a contagem de vagas para o passeio ID %d na data %s (ajuste: %d).', 'passeios_turisticos'), $product_id, date_i18n( wc_date_format(), strtotime( $data_reservada ) ), $change_quantity ), true ); // Marca como nota privada para admin } } } } } add_action( 'woocommerce_order_status_changed', 'pt_woo_gerenciar_vagas_por_status_pedido', 10, 3 );