add_filter( 'gform_validation', function ( $validation_result ) { $forms_array[46] = array( 'amount_field_id' => 8, 'name_field_id' => 19, 'ledger_form_id' => 47, 'ledger_name_id' => 1, 'ledger_amount_id' => 4, ); // get form $form = $validation_result['form']; // if form isnt in array do nothing if ( ! in_array( $form['id'], array_keys( $forms_array ) ) ) { return $validation_result; } $amount_field_id = $forms_array[ $form['id'] ]['amount_field_id']; // get amount field foreach ( $form['fields'] as $field ) { if ( $field->id == $amount_field_id ) { // get amount $amount = str_replace( array( '$', ',' ), '', $field->gppa_hydrated_value ); // check against balance // get ledger first $ledger_form_id = $forms_array[ $form['id'] ]['ledger_form_id']; $ledger_name_field = $forms_array[ $form['id'] ]['ledger_name_id']; $ledger_amount_field = $forms_array[ $form['id'] ]['ledger_amount_id']; $name_field_id = $forms_array[ $form['id'] ]['name_field_id']; $name_field = null; for ( $j = 0; $j < count( $form['fields'] ); $j++ ) { if ( $form['fields'][ $j ]->id == $name_field_id ) { $name_field = $form['fields'][ $j ]->gppa_hydrated_value; break; } } $search_criteria = array(); $search_criteria['status'] = 'active'; $search_criteria['field_filters'] = array(); $paging_offset = 0; $total_count = 0; $paging = array( 'offset' => $paging_offset, 'page_size' => 25, ); $search_criteria['field_filters'][] = array( 'key' => $ledger_name_field, 'value' => $name_field, ); $ledger_entries = GFAPI::get_entries( $ledger_form_id, $search_criteria, null, $paging, $total_count ); // if more entries then returned then make more calls until get them all while ( $total_count > count( $ledger_entries ) ) { $paging_offset += 25; $paging = array( 'offset' => $paging_offset, 'page_size' => 25, ); $new_entries = GFAPI::get_entries( $ledger_form_id, $search_criteria, null, $paging, $total_count ); foreach ( $new_entries as $new_entry ) { $ledger_entries[] = $new_entry; } } $ledger_amount = 0; foreach ( $ledger_entries as $entry ) { $ledger_amount += $entry[ $ledger_amount_field ]; } $paging_offset = 0; $paging = array( 'offset' => $paging_offset, 'page_size' => 25, ); $search_criteria['field_filters'][0] = array( 'key' => $name_field_id, 'value' => $name_field, ); $search_criteria['field_filters'][] = array( 'key' => 'workflow_final_status', 'value' => 'pending', ); // subtract pending amount $pending_disbursals = 0; $child_entries = GFAPI::get_entries( $form['id'], $search_criteria, null, $paging, $total_count ); // if more entries then returned then make more calls until get them all while ( $total_count > count( $child_entries ) ) { $paging_offset += 25; $paging = array( 'offset' => $paging_offset, 'page_size' => 25, ); $new_entries = GFAPI::get_entries( $form['id'], $search_criteria, null, $paging, $total_count ); foreach ( $new_entries as $new_entry ) { $child_entries[] = $new_entry; } } foreach ( $child_entries as $child_entry ) { $pending_disbursals += $child_entry[ $field['id'] ]; } $balance = $ledger_amount - $pending_disbursals; if ( $amount > $balance ) { $field->failed_validation = true; $money_balance = number_format( $balance, 2 ); $amount_over = $amount - $balance; $amount_over = number_format( $amount_over, 2 ); $field->validation_message = "With this request, your total requested amount exceeds your available balance of $$money_balance by $$amount_over."; $validation_result['is_valid'] = false; } $validation_result['form'] = $form; return $validation_result; } } $validation_result['form'] = $form; return $validation_result; } );