I managed to do this through this code
<?php
// 1) Validação: bloqueia o envio se o saldo for insuficiente
add_action( 'elementor_pro/forms/validation', function( $record, $ajax_handler ) {
// Nome do formulário (Avançado > Nome do formulário)
if ( 'artigo_saldo' !== $record->get_form_settings( 'form_name' ) ) {
return;
}
// Captura o valor selecionado no form
$fields = $record->get( 'fields' );
$valor = floatval( $fields['saldo_artigo']['value'] );
// Usuário logado
$user_id = get_current_user_id();
if ( ! $user_id ) {
$ajax_handler->add_error( 'saldo_artigo', 'Você precisa estar logado para usar seu saldo.' );
return;
}
// Recupera o saldo bruto direto do meta do usuário
$raw_balance = get_user_meta( $user_id, '_current_woo_wallet_balance', true );
$balance = floatval( $raw_balance );
// Se o saldo for menor que o valor do form, dispara erro no campo
if ( $balance < $valor ) {
$ajax_handler->add_error(
'saldo_artigo',
sprintf(
'Saldo insuficiente. Seu saldo atual é R$ %s.',
number_format( $balance, 2, ',', '.' )
)
);
}
}, 10, 2 );
// 2) Débito: só é executado se passar pela validação acima
add_action( 'elementor_pro/forms/new_record', function( $record, $handler ) {
// Mesma checagem do nome do formulário
if ( 'artigo_saldo' !== $record->get_form_settings( 'form_name' ) ) {
return;
}
$fields = $record->get( 'fields' );
$valor = floatval( $fields['saldo_artigo']['value'] );
$user_id = get_current_user_id();
if ( $user_id && $valor > 0 ) {
$descricao = 'Débito automático após envio do formulário de artigo';
woo_wallet()->wallet->debit( $user_id, $valor, $descricao );
}
}, 10, 2 );