public function delete(booking_storage_object $sto) { if (!$sto->exists()) { return true; } if (unlink($this->build_file_path($sto)) === false) { throw new Exception(sprintf('Unable to delete "%s" from storage "%s"', $sto->get_identifier(), $this->get_owner_id())); } }
public function generate_for(array $completed_reservation_exports) { $export_types = $this->get_available_export_types(); $export_results = array_fill_keys($export_types, array()); $export_data = array_fill_keys($export_types, ''); $export_infos = array_fill_keys($export_types, array()); $export_configurations = array_fill_keys($export_types, array()); $total_items = array_fill_keys($export_types, 0); $total_cost = array_fill_keys($export_types, 0.0); $entity_export_files = array(); $export_files = array(); $export_conf_updates = array(); try { $this->db->transaction_begin(); $do_generate_files = false; foreach ($export_types as $export_type) { foreach ($completed_reservation_exports as $export) { if ($this->export_has_generated_file($export, $export_type)) { continue; //Don't include data for exports that already have a generated file } $do_generate_files = true; list($conf, $export_result) = $this->get_export_file_data($export, $export_type); $export_results[$export_type][] = $export_result; if (!is_null($export_result['export'])) { $export_infos[$export_type][] = $export_result['export']['info']; } if ($export_type == 'external') { $export_result['total_items'] = $export_result['export']['header_count']; if (!is_null($export_result['export']['data_log'])) { $export_log .= $export_result['export']['data_log']; } else { $export_log .= ""; } } $export_configurations[$export_type][$export['id']] = $conf; $total_items[$export_type] += $export_result['total_items']; $total_cost[$export_type] += $export_result['total_cost']; } $export_data[$export_type] = $this->combine_export_result_data($export_results[$export_type]); } $log = "Reservasjon_Id;Reservasjon_Type;Ordrenr;Kunde navn - Nummer;Varelinjer med dato;Bygg;Beløp\n"; $log .= $export_log; $export_log = $log; if ($do_generate_files === false) { return false; } foreach ($export_types as $export_type) { $entity_export_file = array(); $entity_export_file['type'] = $export_type; $entity_export_file['total_cost'] = $total_cost[$export_type]; $entity_export_file['total_items'] = $total_items[$export_type]; $receipt = $this->add($entity_export_file); $entity_export_file['id'] = $receipt['id']; $entity_export_file['filename'] = 'export_' . $export_type . '_' . $entity_export_file['id'] . '.' . $this->file_type_for_export_type($export_type); $export_file = new booking_storage_object($entity_export_file['filename']); $export_files[] = $export_file; $export_file->set_data($export_data[$export_type]); $this->file_storage->attach($export_file)->persist(); if ($export_type == 'external') { $entity_export_file['log_filename'] = 'log_' . $export_type . '_' . $entity_export_file['id'] . '.csv'; $log_export_file = new booking_storage_object($entity_export_file['log_filename']); $log_export_files[] = $log_export_file; $log_export_file->set_data($export_log); $this->file_storage->attach($log_export_file)->persist(); } $this->update($entity_export_file); //Save the generated file name $entity_export_files[$entity_export_file['id']] = $entity_export_file; foreach ($export_configurations[$export_type] as $export_id => $conf) { $export_conf_updates[] = sprintf("UPDATE bb_completed_reservation_export_configuration SET export_file_id=%s WHERE id=%s", $entity_export_file['id'], $conf['id']); } $associated_reservation_count = 0; foreach ($export_infos[$export_type] as $key => &$export_info_collection) { if (!is_array($export_info_collection)) { continue; } foreach ($export_info_collection as $item_key => &$export_item_info) { $this->associate_reservation_with_export_file($export_item_info['id'], $entity_export_file['id'], $export_item_info['invoice_file_order_id']); $associated_reservation_count++; } } //double-check that the total_items match the total number of completed reservations associated with the exported file # if ($associated_reservation_count !== $entity_export_file['total_items']) { # throw new UnexpectedValueException(sprintf( # "Exported item count (%s) does not match count (%s) of associated completed reservations", # $entity_export_file['total_items'], # $associated_reservation_count # )); # } } /** * Sigurd: block SQL-injection by not allowing multiple statements in one query */ foreach ($export_conf_updates as $sql) { $this->db_query($sql, __LINE__, __FILE__); } // $this->db_query( // join(";\n", $export_conf_updates), // __LINE__, __FILE__ // ); if ($this->db->transaction_commit()) { return $entity_export_files; } throw new UnexpectedValueException('Transaction failed.'); } catch (Exception $e) { $this->delete_export_system_files($export_files); throw $e; } return false; }