$event->eid,)); //empty payment option $payment_type_options[0] = ''; foreach($result as $row) { $price = $early_price_applies == true ? $row->booking_price : $row->booking_late_price; $payment_type_options[$row->pid] = $row->booking_price_descrip . ' ($' . $price . ')'; } //any html to put at the start of the form $prefix = t("

Create manual payment records

Enter the amount below, select the people making the payment, then click the Update button at the bottom of the page

"); $form['booking_earlybird'] = array ( '#type' => 'hidden', '#value' => $early_price_applies, ); $form['payment-type'] = array( '#type' => 'select', '#title' => t('Payment Type'), '#description' => t('Either select one of the built-in payment amounts, or enter a custom dollar amount in the next field.'), '#required' => FALSE, '#default_value' => '0', '#options' => $payment_type_options, ); $form['payment-custom-amount'] = array( '#type' => 'textfield', '#title' => t('Custom Amount Paid'), '#maxlength' => 10, '#field_prefix' => '$', '#required' => FALSE, '#default_value' => '0.00' ); $form['payment-balance-type'] = array( '#type' => 'radios', '#title' => t('Balance or total payment?'), '#description' => t('For balance payments, the amount entered above will be added to any payments the person has already made.
' . 'A total payment will replace the person\'s total payment with the value entered above.'), '#options' => $payment_balance_options, '#default_value' => 1, '#required' => FALSE, ); $header = array ( 'booking_nid' => array('data' => t('Booking ID')), 'booking_name' => array('data' => t('Name')), 'booking_email' => array('data' => t('Email Address')), 'amount_paid' => array('data' => t('Amount Paid To Date')), 'amount_reqd' => array('data' => t('Gross Payment Required')), 'booking_status' => t('Status'), 'booking_fully_paid' => t('Fully Paid?'), 'welfare_required' => t('Welfare Required?'), ); $result = db_query("SELECT * FROM {booking_person} WHERE booking_eventid = :eid", array(':eid' => $event->eid)); foreach($result as $data) { $options[$data->nid] = array ( 'booking_nid' => l(t('!id', array('!id' => $data->nid)), t('node/!id', array('!id' => $data->nid))), 'booking_name' => $data->booking_firstname . " " . $data->booking_lastname, 'booking_email' => $data->booking_email, 'amount_paid' => $data->booking_amount_paid, 'amount_reqd' => $data->booking_total_pay_reqd, 'booking_status' => _booking_status_generate($data->booking_status), 'booking_fully_paid' => $data->booking_amount_paid < $data->booking_total_pay_reqd ? 'No' : 'Yes', 'welfare_required' => $data->booking_welfare_required == 'Y' ? 'Yes' : 'No', ); } $form['table'] = array ( '#type' => 'tableselect', '#header' => $header, '#options' => $options, ); $form['submit'] = array ( '#type' => 'submit', '#value' => t('Update'), ); return array ( 'first_para' => array ( '#type' => 'markup', '#markup' => $prefix, ), 'form' => $form, ); } function booking_manual_payment_admin_submit($form, &$form_state) { global $event; $counter = 0; $price = 0; $fully_paid = 'N'; $payment_date = REQUEST_TIME; $checkboxes = $form_state['values']['table']; //$values['booking_price_active']; //watchdog('booking', 'Formstate when setting buttons: @info', array ('@info' => var_export($form_state['values'], TRUE))); //watchdog('booking', 'Checkboxes when setting buttons: @info', array ('@info' => var_export($checkboxes, TRUE))); //watchdog('booking', 'Manual payment form contents: @info', array('@info' => var_export($form_state['values'], TRUE))); //check if there is a pre-defined payment type selected if ((!empty($form_state['values']['payment-type'])) && $form_state['values']['payment-custom-amount'] == '0.00') { //look up the price relating to the price id selected $price_query = db_query("SELECT price.booking_price, price.booking_late_price, price.booking_price_descrip " . "FROM {booking_price} price " . "WHERE price.pid = :pid ", array(':pid' => $form_state['values']['payment-type'])) ->fetchObject(); $price = $form_state['values']['booking_earlybird'] == true ? $price_query->booking_price : $price_query->booking_late_price; $description = $price_query->booking_price_descrip; } elseif ($form_state['values']['payment-custom-amount'] != '0.00' && is_numeric($form_state['values']['payment-custom-amount'])) { $price = $form_state['values']['payment-custom-amount']; $description = "Custom Amount"; } else { drupal_set_message("Error: Could not determine payment amount to update user(s).", 'error', FALSE); return; } //loop through the list of attendees foreach($checkboxes as $key => $value) { //if an attendee's checkbox was ticked, then process their payment if (is_numeric($key) && $value != 0) { //check if they exist in the database first /* $person = db_query("SELECT person.nid, person.booking_firstname, person.booking_lastname, person.booking_status, " . "person.booking_partner_id, person.booking_amount_paid " . "FROM {booking_person} person " . "WHERE nid = :nid", array(':nid' => $key)) ->fetchObject(); */ $person = node_load($key); if ($person) { // Check whether this is a balance or total payment $payment_type = $form_state['values']['payment-balance-type']; // Refund if ($payment_type == 2) { //subtract this payment to their existing balance $total_paid = $person->booking_amount_paid - $price; $invoice_type = "Refund"; } // Balance payment elseif ($payment_type == 1) { //add this payment to their existing balance $total_paid = $person->booking_amount_paid + $price; $invoice_type = "ManualPayment"; } // Total payment elseif ($payment_type == 0) { //set this as the persons new balance $total_paid = $price; //change $price so that we add the correct dollar amount in the payment record //the actual amount newly paid is the price entered in the form, subtracting what they had previously paid //use the function so it takes care of paypal transaction fees etc $newprice = $price - _booking_amount_paid($key, $person); watchdog('booking', 'Changing price for payment record from $!price to !newprice.', array('!price' => $price, '!newprice' => $newprice)); $price = $newprice; $invoice_type = "ManualPayment"; } //check if they have now fully paid if ($total_paid >= _booking_total_due($person)) { $fully_paid = 'Y'; } //work out what their booking status is now if ($person->booking_status == 1 || _booking_check_bookings_full() == FALSE) { //either they were already booked in, or there is room on the booked-in list $status = 1; } else { //there must be a waiting list, so put them on that $status = 2; } /* //determine what their booking status is now if (_booking_check_bookings_full() == True || $person->booking_status == 2) $status = 2; else $status = 1; */ watchdog('booking', 'New payment for regn id !nid of $!price and status is now !status', array('!nid' => $key, '!price' => $price, '!status' => $status)); db_update('booking_person') ->fields(array( 'booking_amount_paid' => $total_paid, 'booking_status' => $status, 'booking_payment_complete' => $fully_paid, )) ->condition('nid', $key) ->execute(); //Create a payment record entry for this update $result = db_insert('booking_payment') ->fields(array( 'booking_person_nid' => $key, 'booking_eventid' => $event->eid, 'booking_mc_gross' => $price, 'booking_mc_currency' => 'AUD', 'booking_mc_fee' => '0.00', 'booking_quantity' => 1, 'booking_invoice' => $invoice_type, 'booking_payer_id' => '', 'booking_payment_date' => $payment_date, 'booking_payment_status' => '', 'booking_first_name' => $person->booking_firstname, 'booking_last_name' => $person->booking_lastname, 'booking_buyer_email' => '', 'booking_payer_status' => '', 'booking_item_name' => $description, 'booking_ipn_track_id' => '', )) ->execute(); //send any emails if necessary //at this point we don't know if it was a balance payment but send TRUE anyway _booking_postpayment_trigger($key, $person, TRUE); $counter++; } else drupal_set_message("Error: Unable to find person with registration ID " . $key, 'error', FALSE); } } drupal_set_message("Added manual payments for $counter people of " . '$' . "$price.", 'status', FALSE); }