diff --git a/booking.helper.inc b/booking.helper.inc index 2baa4a0..7825940 100644 --- a/booking.helper.inc +++ b/booking.helper.inc @@ -242,6 +242,37 @@ function _datetime_to_ts($date) { //return mktime($date_split[5], $date_split[6], 0, $date_split[2], $date_split[3], $date_split[1]); } +/** + * Function to turn a loosely formatted date into a timestamp + * + * @param $date in format DD/MM/YYYY HH:mm + * @return unix timestamp formatted for current time zone + */ +function _datetime_to_ts_nonstrict($date) { + $pattern = '/^(\d{1,2})\/(\d{1,2})\/(\d{4})(\s+(\d{1,2})\:(\d{1,2}))?/'; + + //check for a match + if (preg_match($pattern, $date, $matches)) + { + $date_split = $matches; + } + //return zero now if no matches + else + { + return 0; + } + + date_default_timezone_set(TIMEZONE); + $tz = new DateTimeZone(TIMEZONE); + + $gmt_ts = mktime($date_split[5], $date_split[6], 0, $date_split[2], $date_split[1], $date_split[3]); + $ts = new DateTime("@$gmt_ts"); + $ts->setTimezone($tz); + + return $ts->format("U"); + +} + /** * Function to split date into array * diff --git a/booking.import_data.inc b/booking.import_data.inc index 3c74ac2..b992ddc 100644 --- a/booking.import_data.inc +++ b/booking.import_data.inc @@ -66,6 +66,8 @@ function booking_import_data_admin_submit($form, &$form_state) $update_counter = 0; $delimiter = ","; $result_array = array(); + $datetime_fields = array('booking_outflight_origin_ts', 'booking_outflight_destination_ts', 'booking_rtrnflight_origin_ts', + 'booking_rtrnflight_destination_ts'); $builtin_fields_to_import = array('nid', 'booking_status'); $custom_fields_to_import = explode(";", variable_get('booking_import_include_fields', '')); @@ -79,8 +81,11 @@ function booking_import_data_admin_submit($form, &$form_state) drupal_set_message(t('Input file uploaded successfully, filename: "@filename"', array('@filename' => $file->filename))); $filename = drupal_realpath($file->uri); + //as per http://stackoverflow.com/questions/4541749/fgetcsv-fails-to-read-line-ending-in-mac-formatted-csv-file-any-better-solution + ini_set("auto_detect_line_endings", "1"); + //convert csv to associative array - //based on http://stackoverflow.com/questions/4801895/csv-to-associative-array + //based on http://stackoverflow.com/questions/4801895/csv-to-associative-array if( ($handle = fopen( $filename, "r")) !== FALSE) { $rowCounter = 0; while (($rowData = fgetcsv($handle, 0, $delimiter)) !== FALSE) { @@ -132,6 +137,12 @@ function booking_import_data_admin_submit($form, &$form_state) $update_text .= " set booking status to '" . $record[$field] . "'; "; $update_array[$field] = _booking_status_lookup($record[$field]); } + //check for fields that need to be converted to a timestamp from text + elseif (in_array($field, $datetime_fields)) + { + $update_array[$field] = _datetime_to_ts_nonstrict($record[$field]); + $update_text .= " set '" . $field . "' to '" . $update_array[$field] . "'; "; + } elseif ( (! isset($record[$field])) || $record[$field] == '' ) { //drupal_set_message("Error: Unable to locate expected field '$field' in input file for record number $update_counter.", 'error', FALSE); diff --git a/booking.install b/booking.install index e529abe..84eb84b 100644 --- a/booking.install +++ b/booking.install @@ -429,6 +429,34 @@ function booking_update_7223() { db_add_field('booking_person', 'booking_internal_flight_inbound', $spec); } +/** +* More fields for flight details +*/ +function booking_update_7224() { + db_drop_field('booking_person', 'booking_internal_flight_outbound'); + db_drop_field('booking_person', 'booking_internal_flight_inbound'); + + $text_spec = array('type' => 'varchar', 'length' => '200', 'not null' => FALSE); + $date_spec = array('type' => 'int', 'not null' => FALSE, 'disp-width' => '11'); + + db_add_field('booking_person', 'booking_outflight_bookingnum', $text_spec); + db_add_field('booking_person', 'booking_outflight_flightnum', $text_spec); + db_add_field('booking_person', 'booking_outflight_origin', $text_spec); + db_add_field('booking_person', 'booking_outflight_origin_ts', $date_spec); + db_add_field('booking_person', 'booking_outflight_connecting_flightnum', $text_spec); + db_add_field('booking_person', 'booking_outflight_destination', $text_spec); + db_add_field('booking_person', 'booking_outflight_destination_ts', $date_spec); + + db_add_field('booking_person', 'booking_rtrnflight_bookingnum', $text_spec); + db_add_field('booking_person', 'booking_rtrnflight_flightnum', $text_spec); + db_add_field('booking_person', 'booking_rtrnflight_origin', $text_spec); + db_add_field('booking_person', 'booking_rtrnflight_origin_ts', $date_spec); + db_add_field('booking_person', 'booking_rtrnflight_connecting_flightnum', $text_spec); + db_add_field('booking_person', 'booking_rtrnflight_destination', $text_spec); + db_add_field('booking_person', 'booking_rtrnflight_destination_ts', $date_spec); +} + + /** * Implementation of hook_install(). */ diff --git a/booking.register.inc b/booking.register.inc index 2708f6b..8dc15bc 100644 --- a/booking.register.inc +++ b/booking.register.inc @@ -1671,9 +1671,26 @@ function booking_view($node, $view_mode) { $rows[] = array(t('Passport Exact Issued Name:'), $node->booking_passport_issue_name); $rows[] = array(t('Passport Issue Location:'), $node->booking_passport_issue_location); $rows[] = array(t('Destination Country:'), $node->booking_destination_country); - $rows[] = array(t('Travel Insurance details:'), $node->booking_travel_insurance); - $rows[] = array(t('Internal Flight Outbound:'), $node->booking_internal_flight_outbound); - $rows[] = array(t('Internal Flight Returning:'), $node->booking_internal_flight_inbound); + $rows[] = array(t('Travel Insurance details:'), $node->booking_travel_insurance); + + $flight_rows[] = array(t('Internal Flight Booking Reference:'), $node->booking_outflight_bookingnum); + $flight_rows[] = array(t('Internal Flight Number:'), $node->booking_outflight_flightnum); + $flight_rows[] = array(t('Internal Flight Origin to Destination:'), $node->booking_outflight_origin); + $flight_rows[] = array(t('Internal Flight Departure Time:'), format_date($node->booking_outflight_origin_ts, 'custom', 'd/m/Y H:i') ); + $flight_rows[] = array(t('Connecting Flight Number:'), $node->booking_outflight_connecting_flightnum); + $flight_rows[] = array(t('Connecting Flight Origin to Destination:'), $node->booking_outflight_destination); + $flight_rows[] = array(t('Internal Flight Arrival Time:'), format_date($node->booking_outflight_destination_ts, 'custom', 'd/m/Y H:i') ); + + //add the flight info to a new section + $flight_heading = t("

Internal Flight Details

"); + $node->content['flight-heading'] = array( + '#markup' => $flight_heading, + '#weight' => 2, + ); + $node->content['flight-details'] = array( + '#markup' => theme('table', array('header' => $header, 'rows' => $flight_rows)), + '#weight' =>2, + ); } $rows[] = array(t('Payment Type Selected:'), t('!amount_paid', array('!amount_paid' => $payment_type))); diff --git a/booking.reports.inc b/booking.reports.inc index 87792f1..7abf375 100644 --- a/booking.reports.inc +++ b/booking.reports.inc @@ -35,22 +35,30 @@ function booking_report_summary() { //define sorting information with the header //as per http://www.drup-all.com/blog/table-sort-pagination-drupal-7 - $header = array( - array('data' => t('Id'), 'field' => 'nid', 'sort' => 'asc'), - array('data' => t('Name'), 'field' => 'booking_lastname'), - array('data' => t('Booking Status'), 'field' => 'booking_status'), - array('data' => t('Studygroups')), - array('data' => t('Room')), - array('data' => t('Travel')), - array('data' => t('Email'), 'field' => 'booking_email'), - array('data' => t('Payment To Date'), 'field' => 'booking_amount_paid'), - array('data' => t('Total Payment Required')), - array('data' => t('Fully paid?')), - array('data' => t('Refund Processed?'), 'field' => 'booking_refund_processed'), - array('data' => t('Refund Due'), 'field' => 'booking_refund_due'), - array('data' => t('Welfare Required?'), 'field' => 'booking_welfare_required'), - array('data' => t('Committee?'), 'field' => 'booking_committee_member'), - ); + $header = array(); + $header[] = array('data' => t('Id'), 'field' => 'nid', 'sort' => 'asc'); + $header[] = array('data' => t('Name'), 'field' => 'booking_lastname'); + $header[] = array('data' => t('Booking Status'), 'field' => 'booking_status'); + + if (variable_get('booking_enable_studygroups', 0) == 1) + { + $header[] = array('data' => t('Studygroups')); + } + if (variable_get('booking_enable_roomallocations', 0) == 1) + { + $header[] = array('data' => t('Room')); + } + + $header[] = array('data' => t('Travel')); + $header[] = array('data' => t('Email'), 'field' => 'booking_email'); + $header[] = array('data' => t('Payment To Date'), 'field' => 'booking_amount_paid'); + $header[] = array('data' => t('Total Payment Required')); + $header[] = array('data' => t('Fully paid?')); + $header[] = array('data' => t('Refund Processed?'), 'field' => 'booking_refund_processed'); + $header[] = array('data' => t('Refund Due'), 'field' => 'booking_refund_due'); + $header[] = array('data' => t('Welfare Required?'), 'field' => 'booking_welfare_required'); + $header[] = array('data' => t('Committee?'), 'field' => 'booking_committee_member'); + $rows = array(); $state_header = array('State', 'Count'); @@ -106,6 +114,7 @@ function booking_report_summary() { foreach ($result as $person) { + $this_row = array(); //$amount_owing = _booking_amount_owing($person->nid, 0, FALSE); $amount_owing = _booking_amount_owing($person, 0, FALSE); @@ -120,24 +129,32 @@ function booking_report_summary() { } //define the row for this person - $rows[] = array( - l(t('View !id', array('!id' => $person->nid)), t('node/!id', array('!id' => $person->nid))), - l(t('!first !last', array('!first' => ucwords($person->booking_firstname), '!last' => ucwords($person->booking_lastname))), - t('node/!id/edit', array('!id' => $person->nid)) - ), - _booking_status_generate($person->booking_status), - l(t('Groups'), t('admin/booking/!id/edit-studygroup', array('!id' => $person->nid))), - l(t('Room'), t('admin/booking/!id/edit-room', array('!id' => $person->nid))), - $travel_link, - t('!email', array('!email' => $person->booking_email)), - t('!payment', array('!payment' => $person->booking_amount_paid)), - t('!payment', array('!payment' => $amount_owing == 0 ? $person->booking_total_pay_reqd : _booking_total_due($person))), - t('!fullypaid', array('!fullypaid' => $amount_owing == 0 ? 'Yes' : 'No')), - t('!reqd', array('!reqd' => $person->booking_refund_processed == 'Y' ? 'Yes' : 'No')), - t('!payment', array('!payment' => $person->booking_refund_due)), - t($person->booking_welfare_required == 'Y' ? 'Yes' : 'No'), - t($person->booking_committee_member == 'Y' ? 'Yes' : 'No'), - ); + $this_row[] = l(t('View !id', array('!id' => $person->nid)), t('node/!id', array('!id' => $person->nid))); + $this_row[] = l(t('!first !last', array('!first' => ucwords($person->booking_firstname), '!last' => ucwords($person->booking_lastname))), + t('node/!id/edit', array('!id' => $person->nid)) + ); + $this_row[] = _booking_status_generate($person->booking_status); + + if (variable_get('booking_enable_studygroups', 0) == 1) + { + $this_row[] = l(t('Groups'), t('admin/booking/!id/edit-studygroup', array('!id' => $person->nid))); + } + if (variable_get('booking_enable_roomallocations', 0) == 1) + { + $this_row[] =l(t('Room'), t('admin/booking/!id/edit-room', array('!id' => $person->nid))); + } + + $this_row[] = $travel_link; + $this_row[] = t('!email', array('!email' => $person->booking_email)); + $this_row[] = t('!payment', array('!payment' => $person->booking_amount_paid)); + $this_row[] = t('!payment', array('!payment' => $amount_owing == 0 ? $person->booking_total_pay_reqd : _booking_total_due($person))); + $this_row[] = t('!fullypaid', array('!fullypaid' => $amount_owing == 0 ? 'Yes' : 'No')); + $this_row[] = t('!reqd', array('!reqd' => $person->booking_refund_processed == 'Y' ? 'Yes' : 'No')); + $this_row[] = t('!payment', array('!payment' => $person->booking_refund_due)); + $this_row[] = t($person->booking_welfare_required == 'Y' ? 'Yes' : 'No'); + $this_row[] = t($person->booking_committee_member == 'Y' ? 'Yes' : 'No'); + $rows[] = $this_row; + //add up the total paid $total_paid += $person->booking_amount_paid; @@ -508,6 +525,9 @@ function booking_csv_report() { $custom_fields_to_skip = explode(";", variable_get('booking_csv_exclude_fields', '')); $fields_to_skip = array_merge($builtin_fields_to_skip, $custom_fields_to_skip); + $datetime_fields = array('booking_outflight_origin_ts', 'booking_outflight_destination_ts', 'booking_rtrnflight_origin_ts', + 'booking_rtrnflight_destination_ts', 'booking_timestamp', 'booking_flight_datetime_inbound', 'booking_flight_datetime_outbound'); + //query the db /* $query = db_select('booking_person', 'p'); @@ -596,8 +616,8 @@ function booking_csv_report() { } //handle more exact dates - if ($key == 'booking_timestamp' || $key == 'booking_flight_datetime_inbound' || $key == 'booking_flight_datetime_outbound') { - $output[] = format_date($value, 'custom', 'd/m/Y H:i'); + if (in_array($key, $datetime_fields)) { + $output[] = $value == 0 ? '0' : format_date($value, 'custom', 'd/m/Y H:i'); continue; }