fossil 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
data/fossil.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{fossil}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Patrick Lardin, Daniel Sudol"]
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
16
16
  "Rakefile",
17
17
  "VERSION",
18
18
  "fossil.gemspec",
19
+ "lib/fossil.rb",
19
20
  "lib/models/ac_qualification.rb",
20
21
  "lib/models/aircraft.rb",
21
22
  "lib/models/aircraft_cost.rb",
@@ -108,6 +109,7 @@ Gem::Specification.new do |s|
108
109
  "lib/models/vendor.rb",
109
110
  "lib/models/vendor_document.rb",
110
111
  "lib/models/visa.rb",
112
+ "lib/number_helper.rb",
111
113
  "lib/sequel/code_group.rb",
112
114
  "lib/sequel/fos_dates.rb",
113
115
  "lib/sequel/metaprogramming.rb",
data/lib/fossil.rb ADDED
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+
3
+ begin
4
+ gem 'sequel', '=3.5.0'
5
+ p require 'sequel'
6
+ rescue LoadError => e
7
+ warn 'To use Fossil you need the sequel gem:'
8
+ warn '$ sudo gem install sequel -v=3.5.0'
9
+ exit(1)
10
+ end
11
+
12
+ begin
13
+ gem 'activesupport', '=2.3.5'
14
+ p require 'active_support'
15
+ rescue LoadError => e
16
+ p e
17
+ warn 'To use Fossil you need the active_support gem:'
18
+ warn '$ sudo gem install active_support -v=2.3.5'
19
+ exit(1)
20
+ end
21
+
22
+ files = [File.join('lib','number_helper.rb')] +
23
+ [File.join('lib','sequel','serializer','serializer.rb')] +
24
+ Dir.glob(File.join('lib','sequel','*.rb')) +
25
+ Dir.glob(File.join('lib','models','*.rb'))
26
+
27
+ class MockDataset < Sequel::Dataset
28
+ def insert(*args); end
29
+ def insert_select(*args); end
30
+ def update(*args); end
31
+ def fetch_rows(sql); end
32
+ def quoted_identifier(c); end
33
+ end
34
+
35
+ class MockDatabase < Sequel::Database
36
+ def execute(sql, opts={}); end
37
+ def reset; end
38
+ def transaction(opts={}); end
39
+ def dataset; MockDataset.new(self); end
40
+ end
41
+
42
+ MOCK_DB = MockDatabase.new unless defined?(MOCK_DB)
43
+
44
+ Sequel::Model.db = MOCK_DB
45
+
46
+ files.each{|file| p file;require file}
@@ -389,9 +389,5 @@ class Aircraft < Sequel::Model(:'aircraft')
389
389
  column_alias :key9, :'key9'
390
390
  #### END GENERATED SECTION ####
391
391
 
392
- AIRCRAFT_TYPES_IN_USE = ['C750','CL30','PRM1']
393
- def self.in_use
394
- filter(~:serial_number => '', :type_id => AIRCRAFT_TYPES_IN_USE).select(:aircraft_id, :type_id, :tail_number).order(:type_id, :tail_number).all
395
- end
396
392
  end
397
393
 
@@ -243,14 +243,4 @@ class Airport < Sequel::Model(:'airport')
243
243
  column_alias :key9, :'key9'
244
244
  #### END GENERATED SECTION ####
245
245
 
246
- INFO_BY_ICAO_FIELDS =
247
- [:iata, :icao, :time_zone, :city, :state, :country, :runway_length, :runway_width, :elevation,
248
- :runways, :instruments, :latitude, :longitude, :clearance_frequency,
249
- :ground_frequency, :tower_frequency, :atis_frequency, :awos_frequency, :awos_phone]
250
-
251
- #Information about an Airport given its ICAO code
252
- def self.info_by_icao(icao)
253
- airport = Airport.filter(:icao => icao.upcase).select(*INFO_BY_ICAO_FIELDS).first
254
- airport ? airport.fill_hash(INFO_BY_ICAO_FIELDS) : {}
255
- end
256
246
  end
@@ -85,14 +85,4 @@ class OneCost < Sequel::Model(:'one cost')
85
85
  column_alias :key1, :'key1'
86
86
  #### END GENERATED SECTION ####
87
87
 
88
- ####### for GetAdditionalCostsDetail web service #######
89
- column_view :item_total, :precision
90
-
91
- ONE_COST_FIELDS = {
92
- 'cost_type_value_code' => 'CostType',
93
- 'item_total_precision' => 'ItemTotal',
94
- 'quantity' => 'Quantity'
95
- }
96
- ONE_COST_FIELDS.each{|k,v| alias_method v, k }
97
- ####### end GetAdditionalCostsDetail web service #######
98
88
  end
@@ -328,9 +328,4 @@ class Passenger < Sequel::Model(:'passengers')
328
328
  column_alias :key9, :'key9'
329
329
  #### END GENERATED SECTION ####
330
330
 
331
- def self.requesters
332
- requesters = filter(:pax_is_a_requester=>1).select(:kid_date,:kid_time,:kid_mult,:kid_comm,:name).order(:name).all
333
- requesters.each{|r| r.name= r.name.strip} # some names have white space at the beginning
334
- requesters
335
- end
336
331
  end
data/lib/models/quote.rb CHANGED
@@ -333,133 +333,4 @@ class Quote < Sequel::Model(:'quotes - original')
333
333
  column_alias :unused_quote_number, :'unused quote number'
334
334
  #### END GENERATED SECTION ####
335
335
 
336
- ######## for ipc Quote Web Service ##########
337
- column_view :deadhead_flight_time, :time
338
- column_view :deadhead_ft, :time
339
- column_view :deadhead_bt, :time
340
- column_view :dh_taxi, :time
341
- column_view :standby_elap_time, :time, :standby_elapsed_time
342
- column_view :pass_flight_time, :time
343
- column_view :time_quoted, :time
344
- column_view :taxi, :time
345
- column_view :eft, :time, :estimated_flight_time
346
- column_view :ete, :time, :estimated_time_enroute
347
- column_view :date_quoted, :date
348
- column_view :invoice_date, :date
349
- column_view :sched_date, :date
350
- column_view :federal_tax, :precision
351
- column_view :federal_tax, :precision
352
- column_view :dh_legs_cost, :precision
353
- column_view :day_trip_addon_cost, :precision
354
- column_view :pax_legs_cost, :precision
355
- column_view :layover_cost, :precision
356
- column_view :standby_cost, :precision
357
- column_view :ron_cost, :precision
358
- column_view :delta_leg_cost, :precision
359
- column_view :delta_trip_cost, :precision
360
- column_view :ac_cost_subtotal, :precision
361
- column_view :rate_percent_adjust, :precision
362
- column_view :ac_cost_total, :precision
363
- column_view :fuel_cost, :precision
364
- column_view :additional_cost, :precision
365
- column_view :total_tax, :precision
366
- column_view :quote_total_cost, :precision
367
- column_view :rate_percent, :precision
368
- column_view :equivalent_rate_cost, :precision
369
- column_view :state_tax, :precision
370
- column_view :ac_rate, :precision
371
- column_view :dh_rate, :precision
372
- column_view :day_trip_addon_cost, :precision
373
- column_view :paid, :boolean
374
- column_view :actual_times, :boolean
375
- column_view :scheduled_itinerary, :boolean
376
- column_view :approved, :boolean
377
- column_view :scheduled, :boolean
378
- column_view :invoiced, :boolean
379
- column_view :invoice_ready, :boolean
380
- column_view :pass_ft_fixed, :boolean
381
- column_view :confirmed, :boolean
382
-
383
- delegate :employee_number, :to => :requester, :prefix => true, :allow_nil => true
384
- delegate :terms, :to => :requester, :prefix => true, :allow_nil => true
385
- delegate :bill_department, :to => :requester, :prefix => true, :allow_nil => true
386
- delegate :bill_name, :to => :requester, :prefix => true, :allow_nil => true
387
- delegate :costs, :to => :group_cost, :prefix => :one_cost, :allow_nil => true
388
- delegate :company_code_value_description, :to => :aircraft, :prefix => :aircraft, :allow_nil => true
389
- delegate :base_code_value_description, :to => :aircraft, :prefix => :aircraft, :allow_nil => true
390
-
391
- QUOTE_FIELD_MAP = {
392
- 'confirmation_number' => 'ConfirmationNumber',
393
- 'requester_employee_number' => 'ClientNumber',
394
- 'invoice_number' => 'InvoiceNumber',
395
- 'date_quoted_date_view_mdy_ipc' => 'DateQuoted',
396
- 'quoted_trip_departure_date_view_mdy_ipc' => 'TripDepartureDate',
397
- 'contact_key' => 'ContactKey',
398
- 'company_key' => 'CompanyKey',
399
- 'quoted_for_company' => 'QuotedForCompany',
400
- 'requester_bill_name' => 'CompanyBillToName',
401
- 'quoted_trip_arrival_date_view_mdy_ipc' => 'TripArrivalDate',
402
- 'time_quoted_time_view' => 'TimeQuoted',
403
- 'pax_legs_cost_precision' => 'PaxLegsCost',
404
- 'pax_legs_addon' => 'PaxLegsAddon',
405
- 'dh_legs_cost_precision' => 'DHLegsCost',
406
- 'dh_legs_addon' => 'DHLegsAddon',
407
- 'standby_cost_precision' => 'StandbyCost',
408
- 'layover_cost_precision' => 'LayoverCost',
409
- 'ron_cost_precision' => 'RONCost',
410
- 'day_trip_addon_cost_precision' => 'Day_TripAddonCost',
411
- 'delta_leg_cost_precision' => 'DeltaLegCost',
412
- 'delta_trip_cost_precision' => 'DeltaTripCost',
413
- 'ac_cost_subtotal_precision' => 'AircraftCostSubtotal',
414
- 'rate_percent_adjust_precision' => 'RatePercentAdjust',
415
- 'ac_cost_total_precision' => 'AircraftCostTotal',
416
- 'fuel_cost_precision' => 'FuelCost',
417
- 'additional_cost_precision' => 'AdditionalCost',
418
- 'total_tax_precision' => 'TotalTax',
419
- 'quote_total_cost_precision' => 'QuoteTotalCost',
420
- 'nautical_miles' => 'NauticalMiles',
421
- 'statute_miles' => 'StatuteMiles',
422
- 'standby_elapsed_time_view' => 'StandbyElapsedTime',
423
- 'estimated_flight_time_view' => 'EstimatedFlightTime',
424
- 'taxi_time_view' => 'Taxi',
425
- 'estimated_time_enroute_view' => 'EstimatedTimeEnroute',
426
- 'pax' => 'Pax',
427
- 'crew' => 'Crew',
428
- 'rate_percent' => 'RatePercent',
429
- 'quoted_by' => 'QuotedBy',
430
- 'aircraft_type_id' => 'AircraftTypeID',
431
- 'aircraft_id' => 'AircraftID',
432
- 'confirmed_boolean_view' => 'Confirmed',
433
- 'scheduled_boolean_view' => 'Scheduled',
434
- 'pass_flight_time_time_view' => 'PassFlightTime',
435
- 'deadhead_flight_time_time_view' => 'DHFlightTime',
436
- 'equivalent_rate_cost_precision' => 'EquivalentRateCost',
437
- 'invoiced_boolean_view' => 'Invoiced',
438
- 'paid_boolean_view' => 'Paid',
439
- 'actual_times_boolean_view' => 'ActualTimes',
440
- 'scheduled_itinerary_boolean_view'=> 'ScheduledItinerary',
441
- 'invoice_date_date_view_mdy_ipc' => 'InvoiceDate',
442
- 'approved_boolean_view' => 'Approved',
443
- 'invoice_ready_boolean_view' => 'InvoiceReady',
444
- 'ac_base_code_value_description' => 'AircraftBaseCode',
445
- 'aircraft_company_code_value_description' => 'AircraftCompanyCode',
446
- 'trip_type_value_description' => 'TripType',
447
- 'purpose_code' => 'TripPurpose',
448
- 'federal_tax_precision' => 'FederalTax',
449
- 'state_tax_precision' => 'StateTax',
450
- 'ac_rate_precision' => 'AircraftRate',
451
- 'dh_rate_precision' => 'DHRate',
452
- 'deadhead_ft_time_view' => 'DHFT',
453
- 'deadhead_bt_time_view' => 'DHBT',
454
- 'sched_date_date_view_mdy_ipc' => 'SchedDate',
455
- 'dh_taxi_time_view' => 'DHTaxi',
456
- 'ac_cost_rate_ft' => 'AircraftCostRateFt',
457
- }
458
- QUOTE_FIELD_MAP.each{|k,v| alias_method v, k }
459
-
460
- delegate :comment, :to => :client_invoice_comment, :prefix => true, :allow_nil => true
461
- CLIENT_INVOICE_MAP = {
462
- 'client_invoice_comment_comment' => 'Comment' }
463
- CLIENT_INVOICE_MAP.each{|k,v| alias_method v, k }
464
- ######## for for Quote Web Service ##########
465
336
  end
@@ -336,66 +336,4 @@ class QuoteLeg < Sequel::Model(:'quote legs original')
336
336
  column_alias :column_2, :'column_2'
337
337
  #### END GENERATED SECTION ####
338
338
 
339
- def airframe_hours
340
- aircraft_hours/60
341
- end
342
-
343
- ######## Fields and view mapping for QuoteLeg Web Service ##########
344
- column_view :arrival_date_local, :date, :planned_arrival_date_local
345
- column_view :depart_date_local, :date, :planned_departure_date_local
346
- column_view :eta_gmt, :time, :planned_arrival_time_gmt
347
- column_view :etd_gmt, :time, :planned_departure_time_gmt
348
- column_view :eta_local, :time, :planned_arrival_time_local
349
- column_view :etd_local, :time, :planned_departure_time_local
350
- column_view :arrival_date_gmt, :date, :planned_arrival_date_gmt
351
- column_view :dept_date_gmt, :date, :planned_departure_date_gmt
352
- column_view :ete, :time
353
- column_view :egt, :time
354
- column_view :eft, :time
355
- column_view :taxi_time, :time
356
- column_view :additional_time, :time
357
- column_view :deadhead, :boolean
358
- column_view :status, :boolean
359
- column_view :closed, :boolean
360
- column_view :restricted, :boolean
361
- column_view :never_scheduled, :boolean
362
- column_view :international_leg, :boolean
363
-
364
- QUOTE_LEGS_FIELD_MAP = {
365
- 'leg_number' => 'LegNumber',
366
- 'aircraft_type_id' => 'AircraftTypeID',
367
- 'time_zone_change' => 'TimeZoneChange',
368
- 'requester_name_key' => 'RequesterNameKey',
369
- 'aircraft_id' => 'AircraftID',
370
- 'departure_icao' => 'DepartureICAO',
371
- 'arrival_icao' => 'ArrivalICAO',
372
- 'planned_departure_time_gmt_view' => 'ETDGMT',
373
- 'planned_arrival_time_gmt_view' => 'ETAGMT',
374
- 'planned_departure_date_gmt_view_mdy_ipc' => 'DeptDateGMT',
375
- 'planned_arrival_date_gmt_view_mdy_ipc' => 'ArrivalDateGMT',
376
- 'planned_departure_time_local_view' => 'ETDLocal',
377
- 'planned_arrival_time_local_view' => 'ETALocal',
378
- 'planned_departure_date_local_view_mdy_ipc' => 'DepartDateLocal',
379
- 'planned_arrival_date_local_view_mdy_ipc' => 'ArrivalDateLocal',
380
- 'egt_time_view' => 'EGT',
381
- 'eft_time_view' => 'EFT',
382
- 'taxi_time_time_view' => 'TaxiTime',
383
- 'additional_time_time_view' => 'AdditionalTime',
384
- 'ete_time_view' => 'ETE',
385
- 'pax_count' => 'PaxCount',
386
- 'nautical_miles' => 'NauticalMiles',
387
- 'statute_miles' => 'StatuteMiles',
388
- 'leg_type_value_description' => 'LegTypeCode',
389
- 'leg_purpose_value_code' => 'LegPurposeCode',
390
- 'deadhead_boolean_view' => 'Deadhead',
391
- 'status_boolean_view' => 'Status',
392
- 'closed_boolean_view' => 'IsClosed',
393
- 'restricted_boolean_view' => 'Restricted',
394
- 'never_scheduled_boolean_view' => 'NeverScheduled',
395
- 'international_leg_boolean_view' => 'InternationalLeg',
396
- 'regulation_code_description' => 'Regulation'
397
- }
398
-
399
- QUOTE_LEGS_FIELD_MAP.each{|k,v| alias_method v, k }
400
- ######## end Fields and view mapping for QuoteLeg Web Service ##########
401
339
  end
data/lib/models/trip.rb CHANGED
@@ -52,9 +52,6 @@ class Trip < Sequel::Model(:'trips')
52
52
  code_association :approval_code, :'approval_code', :trip_approval
53
53
  code_association :special_qualification, :'specialqualification', :special_qualification
54
54
 
55
- # Column views
56
- column_view :kid_date, :date, :scheduled_date
57
-
58
55
  #### BEGIN GENERATED SECTION ####
59
56
  set_primary_key [:'kid - user', :'kid - mult', :'kid - comm', :'kid - date', :'kid - time']
60
57
 
@@ -270,73 +267,4 @@ class Trip < Sequel::Model(:'trips')
270
267
  column_alias :reserved_3, :'reserved 3'
271
268
  #### END GENERATED SECTION ####
272
269
 
273
- def passenger_list
274
- return '' unless passengers
275
- pax_list = passengers.collect{|v| (v.lead_pax==1 ? "Lead Pax " : '' ) + v.name}.uniq!
276
- pax_list ? pax_list.join(" : ") : ''
277
- end
278
-
279
- ##### start trip_invoicing_report #######
280
- TRIP_INVOICING_REPORT_PATH = File.join(RAILS_ROOT,'public','system','reports')
281
- TRIP_INVOICING_FILE_NAME = 'AccountsReceiveableTripInvoicing.csv'
282
- TRIP_INVOICING_REPORT_FILE_PATH = File.join(TRIP_INVOICING_REPORT_PATH,TRIP_INVOICING_FILE_NAME)
283
-
284
- delegate :invoice_ready, :to=> :quote, :prefix => true, :allow_nil => true
285
-
286
- column_view :status, :boolean
287
- column_view :status_closed, :boolean
288
- column_view :cancel_code, :boolean
289
- column_view :arrival_date_gmt, :date, :planned_arrival_date_gmt
290
-
291
- def quote_status
292
- ( quote_invoice_ready == 1 ) ? "Ready" : "Not Ready"
293
- end
294
-
295
- def date_difference(to_date)
296
- (to_date - planned_arrival_date_gmt).to_i
297
- end
298
-
299
- def trip_requester_name
300
- name = trip_requester.name if trip_requester
301
- name || requester_name
302
- end
303
-
304
- TRIP_INVOICING_HEADERS =
305
- ['Date Trip Completed', 'Trip Number', 'Tail Number', 'Client', 'Trip Completed',
306
- 'Trip Cancelled', 'Trip Closed', 'Quote Status', 'Trip Type', "Number of Days from PCS to AR"]
307
-
308
- TRIP_INVOICING_FIELDS =
309
- [:planned_arrival_date_gmt_view_mdy, :trip_number, :ac_tail_number, :trip_requester_name,
310
- :status_boolean_view, :cancel_code_boolean_view, :status_closed_boolean_view,
311
- :quote_status, :trip_type_value_description]
312
-
313
- def self.create_trip_invoicing_report(to_date)
314
- from_date = to_date - 30
315
- trips = trip_invoicing_report_query(from_date, to_date).sort_by{|t| t.date_difference(to_date) }
316
- # write the csv file
317
- FasterCSV.open(TRIP_INVOICING_REPORT_FILE_PATH, "w") do |csv|
318
- csv << TRIP_INVOICING_HEADERS
319
- trips.each do |trip|
320
- csv << TRIP_INVOICING_FIELDS.collect{|field| trip.send(field)} + [trip.date_difference(to_date)]
321
- end
322
- end
323
- end
324
-
325
- def self.trip_invoicing_report_query(from_date, to_date)
326
- unless @trip_invoicing_report_ps
327
- ds = Trip.
328
- filter( :arrival_date_gmt >= :$from_date).filter( :arrival_date_gmt <= :$to_date ).
329
- filter( :trip_number > 0 ).
330
- eager_graph(:trip_requester, :quote, :trip_type_value).
331
- select_fields(
332
- :self => [:trip_number, :requester_name, :arrival_date_gmt, :trip_number, :trip_type_code,
333
- :ac_tail_number, :status, :status_closed, :cancel_code],
334
- :quote => [:invoice_ready],
335
- :trip_type_value => [:code, :description],
336
- :trip_requester => [:name])
337
- @trip_invoicing_report_ps = ds.prepare(:select, :trip_invoicing_report_ps)
338
- end
339
- @trip_invoicing_report_ps.call(:from_date=> from_date.to_fos_days, :to_date => (to_date+1).to_fos_days)
340
- end
341
- ##### end trip_invoicing_report #######
342
270
  end
@@ -63,95 +63,6 @@ class TripLeg < Sequel::Model(:'trip legs')
63
63
  code_association :trip_type, :'leg type code', :trip_type
64
64
  code_association :special_qualification, :'specialqualification', :special_qualification
65
65
 
66
- # Column alias overrides
67
- column_view :dept_date_act_gmt, :date, :actual_departure_date_gmt
68
- column_view :dept_time_act_gmt, :time, :actual_departure_time_gmt
69
- column_def_datetime :actual_departure_date_time_gmt, :'dept date act gmt', :'dept time act gmt'
70
-
71
- column_view :arrival_date_gmt, :date, :actual_arrival_date_gmt
72
- column_view :arriv_time_act_gmt, :time, :actual_arrival_time_gmt
73
- column_def_datetime :actual_arrival_date_time_gmt, :'arr date act gmt', :'arriv time act gmt'
74
-
75
- column_view :dept_date_act_local, :date, :actual_departure_date_local
76
- column_view :dept_time_act_local, :time, :actual_departure_time_local
77
- column_def_datetime :actual_departure_date_time_local, :'dept date act local', :'dept time act local'
78
-
79
- column_view :arrival_date_local, :date, :actual_arrival_date_local
80
- column_view :arriv_time_act_local, :time, :actual_arrival_time_local
81
- column_def_datetime :actual_arrival_date_time_local, :'arr date act local', :'arriv time act local'
82
-
83
- column_view :dept_date_gmt, :date, :planned_departure_date_gmt
84
- column_view :etd_gmt, :time, :planned_departure_time_gmt
85
- column_def_datetime :planned_departure_date_time_gmt, :'dept date gmt', :'etd - gmt'
86
-
87
- column_view :depart_date_local, :date, :planned_departure_date_local
88
- column_view :etd_local, :time, :planned_departure_time_local
89
- column_def_datetime :planned_departure_date_time_local, :'depart date - local', :'etd - local'
90
-
91
- column_view :arrival_date_gmt, :date, :planned_arrival_date_gmt
92
- column_view :eta_gmt, :time, :planned_arrival_time_gmt
93
- column_def_datetime :planned_arrival_date_time_gmt, :'arrival date gmt', :'eta - gmt'
94
-
95
- column_view :arrival_date_local, :date, :planned_arrival_date_local
96
- column_view :eta_local, :time, :planned_arrival_time_local
97
- column_def_datetime :planned_arrival_date_time_local, :'arrival date - local', :'eta - local'
98
-
99
- column_view :dept_date_act_home, :date, :actual_departure_date_base
100
- column_view :depart_time_act_home, :time, :actual_departure_time_base
101
- column_def_datetime :actual_departure_date_time_base_old, :'dept date act home', :'depart time act home'
102
- def actual_departure_date_time_base() actual_departure_date_time_gmt + (home_tz_gmt_offset*360); end
103
-
104
- column_view :arr_date_act_home, :date, :actual_arrival_date_base
105
- column_view :arrival_time_act_hom, :time, :actual_arrival_time_base
106
- column_def_datetime :actual_arrival_date_time_base_old, :'arr date act home', :'arrival time act hom'
107
- def actual_arrival_date_time_base() actual_arrival_date_time_gmt + (home_tz_gmt_offset*360); end
108
-
109
- #Time Formatting Methods
110
- column_view :ete, :time
111
- column_view :eft, :time
112
- column_view :flight_time_actual, :time, :aft_time
113
- column_view :block_time_actual, :time, :abt_time
114
- column_view :t_o_time_act_gmt, :time, :actual_takeoff_time_gmt
115
- column_view :land_time_act_gmt, :time, :actual_land_time_gmt
116
- column_view :delay_1_time, :time, :delay_1_duration
117
- column_view :delay_2_time, :time, :delay_2_duration
118
-
119
-
120
- delegate :tail_number, :to => :aircraft
121
- delegate :max_pax, :to => :aircraft
122
- delegate :name, :to => :airport_fbo, :prefix => true, :allow_nil => true
123
- delegate :name, :to => :fueler, :prefix => true, :allow_nil => true
124
- delegate :name, :to => :lead_passenger, :prefix => true, :allow_nil => true
125
- delegate :name, :to => :trip_requester, :prefix => true, :allow_nil => true
126
- delegate :lead_pax, :to => :trip
127
- delegate :passenger_list, :to => :trip
128
- delegate :name, :to => :lead_pax, :prefix => true, :allow_nil => true
129
-
130
- # :'status' utility methods
131
- @@Statuses = {
132
- 'Scheduled Flight'=>0,
133
- 'Leg Verified'=>1,
134
- 'Cancelled'=>10,
135
- 'Reserved'=>20,
136
- 'Maintenance'=>21,
137
- 'Available'=>22,
138
- 'All Legs Cancelled'=>23,
139
- 'Standby'=>24,
140
- 'Note'=>31
141
- }
142
-
143
- def TripLeg.get_all_statuses
144
- @@Statuses
145
- end
146
-
147
- def TripLeg.to_leg_status_values(names)
148
- names.map{ |name| @@Statuses[name] }
149
- end
150
-
151
- def status_name
152
- @@Statuses.index(self[:status])
153
- end
154
-
155
66
 
156
67
  #### BEGIN GENERATED SECTION ####
157
68
  set_primary_key [:'kid - user', :'kid - mult', :'kid - comm', :'kid - date', :'kid - time']
@@ -713,437 +624,4 @@ class TripLeg < Sequel::Model(:'trip legs')
713
624
  column_alias :key8, :'key8'
714
625
  #### END GENERATED SECTION ####
715
626
 
716
-
717
- def client_name
718
- theStatus = trip_status
719
- !(theStatus=='MAINT' || theStatus=='RESVD') ? requester : ''
720
- end
721
-
722
- def ebt_time
723
- theStatus = trip_status
724
- if theStatus='SCHED' || theStatus='VERI' || (arrival_ap_prefix != departure_ap_prefix)
725
- minutes_between = (planned_arrival_date_time_gmt - planned_departure_date_time_gmt)/60;
726
- return Time.from_fos_time(minutes_between)
727
- end
728
- Time.from_fos_time(0)
729
- end
730
-
731
- # get pic or sic or purser for this trip leg. type should be :pic or :sic or :pur
732
- def pilot_code(type)
733
- return '' unless type
734
- cl = crew_legs.find{|cl| cl.position_code_code == type.to_s.upcase }
735
- return cl ? cl.crew : ''
736
- end
737
- def pic; pilot_code(:pic); end
738
- def sic; pilot_code(:sic); end
739
-
740
-
741
- ##### for the web service TripLegsByDate #######
742
- column_view :closed, :boolean
743
- column_view :cancelled, :boolean
744
- column_view :never_scheduled, :boolean
745
- column_view :trip_request, :boolean
746
- column_view :is_deadhead?, :boolean
747
-
748
- def status_code
749
- return "Cancelled" if cancel_code != 0
750
- case status
751
- when 0 then "Scheduled"
752
- when 1 then "Leg Verified"
753
- when 10 then "Cancelled"
754
- when 23 then "All Legs Cancelled"
755
- when 21 then "Maintenance"
756
- when 20 then "Reserved"
757
- else "[#{status}]"
758
- end
759
- end
760
-
761
- TRIP_LEGS_FIELD_MAP =
762
- {
763
- 'status_code' => 'TripLegStatus',
764
- 'leg_number' => 'leg',
765
- 'trip_requester_name' => 'Requester',
766
- 'requester_name_key' => 'reqnamekey',
767
- 'aircraft_id' => 'AircraftID',
768
- 'leg_count' => 'LegCount',
769
- 'departure_icao' => 'DepartICAO',
770
- 'arrival_icao' => 'ArrivalICAO',
771
- 'planned_departure_date_gmt_view_mdy_ipc' => 'DepartDateZulu',
772
- 'planned_arrival_date_gmt_view_mdy_ipc' => 'ArriveDateZulu',
773
- 'planned_departure_date_local_view_mdy_ipc' => 'DepartDateLocal',
774
- 'planned_arrival_date_local_view_mdy_ipc' => 'ArriveDateLocal',
775
- 'planned_departure_time_gmt_view' => 'DepartTimeZulu',
776
- 'planned_arrival_time_gmt_view' => 'ArriveTimeZulu',
777
- 'planned_departure_time_local_view' => 'DepartTimeLocal',
778
- 'planned_arrival_time_local_view' => 'ArriveTimeLocal',
779
- 'pax_count' => 'PaxCount',
780
- 'is_deadhead?_boolean_view' => 'Deadhead',
781
- 'status' => 'Status',
782
- 'closed_boolean_view' => 'Closed',
783
- 'cancelled_boolean_view' => 'Cancelled',
784
- 'cancel_code' => 'CancelCode',
785
- 'never_scheduled_boolean_view' => 'NeverScheduled',
786
- 'trip_request_boolean_view' => 'TripRequest',
787
- 'trip_number' => 'TripNumber',
788
- 'tail_number' => 'TailNumber',
789
- 'aircraft_type_id' => 'AircraftType',
790
- 'fueler_name' => 'DEPFBOName',
791
- 'airport_fbo_name' => 'ARRFBOName',
792
- 'pic' => 'CrewPIC',
793
- 'sic' => 'CrewSIC',
794
- 'lead_pax_name' => 'LeadPax'
795
- }
796
-
797
-
798
- TRIP_LEGS_FIELD_MAP.each{|k,v| alias_method v, k }
799
- ##### END for web service TripLegsByDate #######
800
-
801
- subset(:live_departures, :'trip legs__status'=>[0,1], :'trip legs__cancel_code'=>0, ~:leg_type_code=>[7, 103, 113])
802
- subset(:maintenance_legs, :status=>21, :leg_type_code=>7 )
803
-
804
- def self.trip_legs_by_date_range(from_date, to_date)
805
- unless @trip_legs_by_date_ps
806
- ds = TripLeg.
807
- filter( :depart_date_key >= :$from_date).filter( :depart_date_key <= :$to_date ).
808
- filter( ~:'trip legs__status'=> 31 ). # exclude comments which have status 31
809
- eager_graph(:crew_legs => :position_code).eager_graph(:aircraft, :fueler, :airport_fbo, :trip_requester, :trip).
810
- select_fields(
811
- :self => [:trip_number, :leg_number, :arrival_icao, :departure_icao, :depart_ap_prefix,
812
- :arrival_icao_iata_id, :arrival_icao, :arrival_iata, :arrival_ap_prefix, :arrival_airport_id,
813
- :time_zone_change, :dept_date_gmt, :arrival_date_gmt, :depart_date_local,
814
- :arrival_date_local, :ete, :etd_local, :eta_local, :etd_gmt, :eta_gmt,
815
- :passengers_actual, :pax_count, :leg_count, :requester, :requester_name_key,
816
- :aircraft_type_id, :leg_type_code, :trip_request, :fuel_burned, :deadhead,
817
- :status, :closed, :cancelled, :cancel_code, :never_scheduled],
818
- :crew_legs => [:crew, :position],
819
- :crew_legs__position_code => [:code],
820
- :aircraft => [:max_pax, :tail_number, :aircraft_id],
821
- :fueler => [:name],
822
- :airport_fbo => [:name],
823
- :trip_requester => [:name],
824
- :trip => [:approval_code]).
825
- order(:'trip legs__trip_number',:'trip legs__leg_number')
826
- @trip_legs_by_date_ps = ds.prepare(:select, :trip_legs_by_date_ps)
827
- end
828
- @trip_legs_by_date_ps.call(:from_date=> from_date.to_fos_days, :to_date => to_date.to_fos_days)
829
- end
830
-
831
- def pic_val; pic.blank? ? "N/A" : pic; end
832
- def sic_val; sic.blank? ? "N/A" : sic; end
833
-
834
- CRES_LIVE_DEPARTURES_FIELDS = [
835
- :trip_number, :leg_number, :arrival_icao, :departure_icao, :time_zone_change,
836
- :pax_count, :passengers_actual, :tail_number, :max_pax,
837
- :pic_val, :sic_val, :requester, :ete_time_view,
838
- :actual_departure_date_gmt, :planned_arrival_date_gmt,
839
- :planned_departure_time_local_view, :planned_arrival_time_local_view
840
- ]
841
-
842
- IROPS_LIVE_DEPARTURES_FIELDS = CRES_LIVE_DEPARTURES_FIELDS.dup << :lead_pax_name
843
-
844
- def self.live_departures_by_date_range(from_date, to_date)
845
- unless @live_departures_by_date_ps
846
- ds = TripLeg.live_departures.
847
- filter( :depart_date_key >= :$from_date).filter( :depart_date_key <= :$to_date ).
848
- eager_graph(:crew_legs => :position_code).eager_graph(:aircraft,:trip).
849
- select_fields(
850
- :self => [:trip_number, :leg_number, :arrival_icao, :departure_icao, :requester,
851
- :time_zone_change, :dept_date_gmt, :arrival_date_gmt, :depart_date_local,
852
- :arrival_date_local, :ete, :etd_local, :eta_local, :etd_gmt, :eta_gmt, :dept_date_act_gmt,
853
- :status, :closed, :cancelled, :cancel_code, :passengers_actual, :pax_count],
854
- :crew_legs => [:crew, :position],
855
- :crew_legs__position_code => [:code],
856
- :trip => [:approval_code], # picked just any field so i can get the primary key fields also
857
- :aircraft => [:max_pax, :tail_number]).
858
- order(:'trip legs__trip_number',:'trip legs__leg_number')
859
- @live_departures_by_date_ps = ds.prepare(:select, :live_departures_by_date_ps)
860
- end
861
- @live_departures_by_date_ps.call(:from_date=> from_date.to_fos_days, :to_date => to_date.to_fos_days)
862
- end
863
-
864
- def self.live_departures_by_date(date)
865
- live_departures_by_date_range(date, date)
866
- end
867
-
868
- def self.daily_report_by_date_range(from_date, to_date)
869
- unless @daily_report_by_date_ps
870
- ds = TripLeg.live_departures.
871
- filter( :depart_date_key >= :$from_date).filter( :depart_date_key <= :$to_date ).
872
- filter( :cancel_code => 0).
873
- eager_graph(:crew_legs => :position_code).eager_graph(:aircraft).
874
- select_fields(
875
- :self => [:trip_number, :leg_number, :arrival_icao, :departure_icao, :requester,
876
- :time_zone_change, :dept_date_gmt, :arrival_date_gmt, :depart_date_local,
877
- :arrival_date_local, :ete, :etd_local, :eta_local, :etd_gmt, :eta_gmt,
878
- :status, :closed, :cancelled, :cancel_code, :passengers_actual, :pax_count],
879
- :crew_legs => [:crew, :position],
880
- :crew_legs__position_code => [:code],
881
- :aircraft => [:max_pax, :tail_number]).
882
- order(:'trip legs__trip_number',:'trip legs__leg_number')
883
- @daily_report_by_date_ps = ds.prepare(:select, :daily_report_by_date_ps)
884
- end
885
- @daily_report_by_date_ps.call(:from_date=> from_date.to_fos_days, :to_date => to_date.to_fos_days)
886
- end
887
-
888
- def self.daily_report_by_date(date)
889
- daily_report_by_date_range(date, date)
890
- end
891
-
892
- def self.scheduled_maintenance_in_date_range(from_date, to_date)
893
- maintenance_leg.filter(:depart_date_key => from_date.to_fos_days..to_date.to_fos_days)
894
- end
895
-
896
- ##### for the trip_report query/service on crewres #######
897
- # fields to return
898
- TRIP_REPORT_FIELDS = [:trip_number, :leg_number,
899
- :departure_icao_val, :arrival_icao_val, :aircraft_type_id, :tail_number,
900
- :statute_miles, :trip_total_statute_miles, :miles, :fuel_burned,
901
- :passengers_actual, :pax_count, :trip_status,
902
- :planned_departure_date_local, :planned_departure_time_local_view,
903
- :actual_arrival_date_local, :planned_arrival_time_local_view,
904
- :actual_departure_time_gmt_view, :actual_arrival_time_gmt_view,
905
- :actual_takeoff_time_gmt_view, :actual_land_time_gmt_view,
906
- :eft_time, :ebt_time, :aft_time, :abt_time ]
907
-
908
- def self.trip_report(from_date, to_date, hash)
909
- extra_fields = hash['extra_fields'] ? hash['extra_fields'] : []
910
- filters = []
911
- filters << [const_get(hash['status_filter'])] if hash['status_filter']
912
- filters << [LIMIT_AIRCRAFT_IDS, hash['aircraft_id_filter']] if hash['aircraft_id_filter']
913
- filters << [LIMIT_REPORT_REQUESTER, hash['requester_filter']] if hash['requester_filter']
914
- filters << [const_get(hash['regional_filter'])] if hash['regional_filter']
915
- filters << [const_get(hash['icao_filter'][0]), hash['icao_filter'][1].split(',')] if hash['icao_filter']
916
- # perform query and use filters ( if any ) to select trips that match
917
- trip_legs = trip_report_query(from_date, to_date, extra_fields).select do |tl|
918
- # all filters applied must be true, so finding one being false will deselect this trip leg
919
- !filters.find{|filter, args| filter.call(tl,args) == false}
920
- end
921
- return trip_legs, {:methods=>(TRIP_REPORT_FIELDS + extra_fields)}
922
- end
923
-
924
- TRIP_REPORT_SELECT_FIELDS = { # fields to select in the query
925
- :self => [:status, :cancel_code, :trip_number, :leg_number,
926
- :requester_kid_date, :requester_kid_time, :requester_kid_mult, :requester_kid_comm,
927
- :arrival_icao, :departure_icao, :depart_ap_prefix, :depart_airport_id, :aircraft_type_id,
928
- :arrival_ap_prefix, :arrival_airport_id, :arrival_iata, :departure_iata,
929
- :statute_miles, :fuel_burned, :regulation, :leg_type_code, :passengers_actual, :pax_count,
930
- :dept_date_gmt, :dept_time_act_gmt, :arrival_date_gmt, :depart_date_local, :arriv_time_act_gmt,
931
- :arrival_date_gmt, :arrival_date_local, :ete, :etd_local, :eta_local, :etd_gmt, :eta_gmt,
932
- :t_o_time_act_gmt, :land_time_act_gmt, :eft, :flight_time_actual, :block_time_actual],
933
- :aircraft => [:type_id, :tail_number, :aircraft_id],
934
- :trip => [:total_statute_miles] }
935
-
936
- EAGER_GRAPH_OPTIONS = [:aircraft, :trip]
937
-
938
- def self.trip_report_query(from_date, to_date, extra_fields)
939
- filter_args = {~:'trip legs__status'=> 31, :depart_date_key => from_date.to_fos_days..to_date.to_fos_days}
940
- selecting_fields = TRIP_REPORT_SELECT_FIELDS.dup
941
- eager_graph_options = EAGER_GRAPH_OPTIONS.dup
942
- if extra_fields.include?('pic')
943
- selecting_fields.merge!(:crew_legs => [:crew, :position],:crew_legs__position_code => [:code])
944
- eager_graph_options += [{:crew_legs => :position_code}]
945
- elsif extra_fields.include?('trip_requester_name')
946
- selecting_fields.merge!(:trip_requester => [:name])
947
- eager_graph_options += [:trip_requester]
948
- end
949
- TripLeg.filter(filter_args).eager_graph(eager_graph_options).select_fields(selecting_fields).all
950
- end
951
-
952
- #### aliases and special methods #####
953
- # This method guarantees an icao for a view that needs one. If there is an icao, use it, otherwise make
954
- # it from the prefix and airport_id .. which works as an icao, but beware, because these put together
955
- # icao's that you make are valid icao codes, but you can't search the airport based it, since these
956
- # airport rows don't have an icao code at all, they only have the prefix and airport_id. whacky.
957
- def departure_icao_val
958
- departure_icao || depart_ap_prefix + depart_airport_id
959
- end
960
-
961
- # same comment as above
962
- def arrival_icao_val
963
- arrival_icao || arrival_ap_prefix + arrival_airport_id
964
- end
965
-
966
- def departure_icao_expanded
967
- "#{departure_icao_val} #{departure_airport.name} #{departure_airport.city} ,#{departure_airport.state_abbreviation}"
968
- end
969
-
970
- def arrival_icao_expanded
971
- "#{arrival_icao_val} #{arrival_airport.name} #{arrival_airport.city} ,#{arrival_airport.state_abbreviation}"
972
- end
973
-
974
- def trip_status
975
- return "CANC" if cancel_code != 0
976
- case status
977
- when 0 then "SCHED"
978
- when 1 then "VERI"
979
- when 10 then "CANC"
980
- when 23 then "CANC"
981
- when 21 then "MAINT"
982
- when 20 then "SCHED" #was "RESVD"
983
- else "[#{status}]"
984
- end
985
- end
986
-
987
- def trip_total_statute_miles
988
- trip ? trip.total_statute_miles.to_f/10.0 : 0
989
- end
990
-
991
- alias miles statute_miles
992
-
993
- # special id which mushes 4 of the requester kids together.
994
- # don't need 5th one( kid_user ) to get unique value, so not using it
995
- def requester_id
996
- [requester_kid_date,requester_kid_time,requester_kid_mult,requester_kid_comm].join('|')
997
- end
998
-
999
- #### status filters ##### ["CANC","SCHED", "VERI"]
1000
- LIMIT_REPORT_STATUS_ONLY_UNVERIFIED = lambda {|v,args| ["CANC","SCHED"].include?(v.trip_status) }
1001
- LIMIT_REPORT_STATUS_ONLY_VERIFIED = lambda {|v,args| ["VERI"].include?(v.trip_status) }
1002
- LIMIT_REPORT_STATUS_ONLY_SCHEDULED = lambda {|v,args| ["SCHED"].include?(v.trip_status) }
1003
- LIMIT_REPORT_STATUS_ONLY_UNVERIFIED_SHOW_CANCELLED_LEGS = lambda {|v,args| ["CANC","SCHED"].include?(v.trip_status) }
1004
- LIMIT_REPORT_STATUS_ONLY_VERIFIED_SHOW_CANCELLED_LEGS = lambda {|v,args| ["CANC","VERI"].include?(v.trip_status) }
1005
- LIMIT_REPORT_STATUS_ONLY_SCHEDULED_SHOW_CANCELLED_LEGS = lambda {|v,args| ["CANC","SCHED"].include?(v.trip_status) }
1006
- SHOW_CANCELLED_LEGS = lambda {|v,args| ["CANC"].include?(v.trip_status) }
1007
- #### region filters #####
1008
- US_PREFIXES = ["K","PA","PF","PO","PP","PH"]
1009
- LIMIT_REPORT_REGION_ONLY_INTERNATIONAL = lambda {|v,args| !US_PREFIXES.include?(v.depart_ap_prefix) }
1010
- LIMIT_REPORT_REGION_ONLY_USA = lambda {|v,args| US_PREFIXES.include?(v.depart_ap_prefix) }
1011
- #### request filter #####
1012
- LIMIT_REPORT_REQUESTER = lambda {|v,requester_id| v.requester_id == requester_id }
1013
- #### aircraft id filter #####
1014
- LIMIT_AIRCRAFT_IDS = lambda {|v,aircraft_ids| aircraft_ids.include?(v.aircraft_id) }
1015
- #### city pair filters #####
1016
- LIMIT_CITY_PAIR_FROM_ICAO = lambda {|trip_leg,icao_arr| icao_arr.include?(trip_leg.departure_icao_val) }
1017
- LIMIT_CITY_PAIR_TO_ICAO = lambda {|trip_leg,icao_arr| icao_arr.include?(trip_leg.arrival_icao_val) }
1018
- LIMIT_CITY_PAIR_FROM_ICAO_COUNTRY_CODE = lambda {|trip_leg,country_codes| country_codes.include?(trip_leg.depart_ap_prefix) }
1019
- LIMIT_CITY_PAIR_TO_ICAO_COUNTRY_CODE = lambda {|trip_leg,country_codes| country_codes.include?(trip_leg.arrival_ap_prefix) }
1020
- CITY_PAIR_SPECIFIC_FIELDS = [:depart_ap_prefix, :departure_iata, :arrival_ap_prefix, :arrival_iata]
1021
- # The vars param is an array of filters for the 4 fields that correspond to CITY_PAIR_SPECIFIC_FIELDS.
1022
- # If the vars array is ['K','SFO'] then this filter should check that the depart_ap_prefix matches 'K'
1023
- # and the depart_iata matches 'SFO'.
1024
- LIMIT_CITY_PAIR_SPECIFIC = lambda {|trip_leg,vars|
1025
- CITY_PAIR_SPECIFIC_FIELDS.enum_with_index.find{|field,idx|
1026
- # check to see if the field value is not equal to the filter but only check if there is a filter for that field
1027
- trip_leg.send(field) != vars[idx] unless vars[idx].blank?
1028
- }.blank?
1029
- # if all matched ok, then returns nil, and if one of the filters did not match then will have
1030
- # the value of that non matching field. So, if result is blank?, this trip leg is valid
1031
- }
1032
- ##### END the trip_report query/service on crewres #######
1033
-
1034
-
1035
- ############ kbi report ###############
1036
- def is_deadhead?
1037
- status==1 and (deadhead==1 or pax_count==0) and [107, 115, 108, 104].include? leg_type_code
1038
- end
1039
-
1040
- def is_owner_occupied?
1041
- status==1 and deadhead==0 and pax_count>0 and [107, 115, 108, 104].include? leg_type_code
1042
- end
1043
-
1044
- def self.kbi_stats(date)
1045
- start_date_month, end_date_month = date.beginning_of_month, date.end_of_month
1046
- start_date_week, end_date_week = date.beginning_of_week.to_fos_days, date.end_of_week.to_fos_days
1047
-
1048
- hash = Hash.new {|k,v| k[v]=0}
1049
-
1050
- trips = TripLeg.filter(:arrival_date_home=>start_date_month.to_fos_days..end_date_month.to_fos_days).
1051
- select(:arrival_date_home, :aircraft_type_id, :flight_time_actual, :eft, :status, :pax_count, :deadhead, :leg_type_code)
1052
-
1053
- occupied_hours = 0
1054
-
1055
- trips.each do |trip|
1056
- # hours scheduled/flown per aircraft type
1057
- if ["C750","CL30"].include? trip.aircraft_type_id
1058
- # month totals
1059
- hash["hours_scheduled_month_#{trip.aircraft_type_id}"] += trip.eft / 60.0
1060
- hash["hours_flown_month_#{trip.aircraft_type_id}"] += (trip.flight_time_actual / 60.0) if trip.status == 1
1061
- # week totals
1062
- if trip.arrival_date_home.between? start_date_week,end_date_week
1063
- hash["hours_scheduled_week_#{trip.aircraft_type_id}"] += trip.eft / 60.0
1064
- end
1065
- end
1066
- # month charter hours scheduled/flown
1067
- if [100,11].include? trip.leg_type_code
1068
- hash["hours_scheduled_month_charter"] += trip.eft / 60.0
1069
- hash["hours_flown_month_charter"] += (trip.flight_time_actual / 60.0) if trip.status == 1
1070
- end
1071
-
1072
- # owner deadhead month hours flown
1073
- hash[:hours_flown_month_deadhead] += trip.flight_time_actual / 60.0 if trip.is_deadhead?
1074
- # owner deadhead month hours flown
1075
- hash[:hours_flown_month_owner] += trip.flight_time_actual / 60.0 if trip.is_owner_occupied?
1076
-
1077
- # other hours flown month
1078
- hash[:hours_flown_month_other] += trip.flight_time_actual / 60.0 if !([100,11,107,115,108,104].include? trip.leg_type_code)
1079
-
1080
- # monthly passenger occupied hours
1081
- if trip.pax_count > 0 && trip.deadhead == 0 and trip.status == 1
1082
- occupied_hours += trip.flight_time_actual / 60.0
1083
- end
1084
- end
1085
-
1086
- # calculate passenger utilization
1087
- hours_flown = hash["hours_flown_month_C750"] + hash["hours_flown_month_CL30"]
1088
- hash[:passenger_utilization] = (occupied_hours / hours_flown)*100 rescue 0
1089
- # owner guaranteed deadhead percentage month
1090
- hash[:owner_guarantee_deadhead] = (hash[:hours_flown_month_deadhead] / (hash[:hours_flown_month_deadhead] + hash[:hours_flown_month_owner])) * 100 rescue 0
1091
- hash
1092
- end
1093
-
1094
- CUST_SATISFACTION_FIELDS =
1095
- [:status_code, :actual_departure_date_gmt, :actual_departure_trip]
1096
-
1097
- # filtering on these leg_type codes ["FXL", 107], ["FXM", 115], ["FXO", 108], ["TPGC", 121], ["TPGP", 122], ["XOLP", 104]
1098
- #
1099
- def customer_satisfaction_trip_report(date)
1100
- trips = Trip.filter(:status=>1, ~:cancel_code=>1, :leg_type_code=> [104,107,108,115,121,122], :arrival_date_gmt=>date.to_fos_days).all
1101
-
1102
- # :status, :dept_date_act_local, :dept_time_act_local, :requester
1103
- # :leg_requestor => [:name, :authorizer_string ]
1104
-
1105
-
1106
- # :status_code
1107
- # :actual_departure_date_local, :actual_departure_time_local,
1108
- # leg_requestor_name, :lead_pax_name
1109
- # lead pax info: lead_pax.passenger.pax_office_phone, pax_email
1110
- # planner info: lead_pax.passenger.travel_planner, pl_office_phone , pl_email
1111
- # :depture_icao, :arrival_icao,
1112
- # :leg_number
1113
- # leg_requestor.authorizer_string, leg_requestor.name
1114
- #
1115
- # delay_1_time, :delay_1_reson
1116
- # :statute_miles
1117
- end
1118
-
1119
- #pp ts.collect{|t| t.trip_legs.collect{|tl| [tl.trip_number,tl.leg_number,tl.arrival_date_gmt,tl.arriv_time_act_gmt,tl.leg_type_code,tl.leg_type_value_code,tl.is_deadhead?]}}
1120
-
1121
- # [[[68302, 1, 39928, 996, 11, "WHSL", false],
1122
- # [68302, 2, 39928, 1332, 11, "WHSL", false]],
1123
- # [[68085, 1, 39924, 684, 11, "WHSL", false],
1124
- # [68085, 2, 39924, 930, 11, "WHSL", false],
1125
- # [68085, 3, 39928, 1224, 11, "WHSL", false]],
1126
- # [[68206, 1, 39927, 1050, 107, "FXL", true],
1127
- # [68206, 2, 39928, 1218, 107, "FXL", false],
1128
- # [68206, 3, 39928, 1242, 107, "FXL", true]],
1129
- # [[68376, 1, 39928, 216, 107, "FXL", false],
1130
- # [68376, 2, 39928, 222, 107, "FXL", true]],
1131
- # [[68437, 1, 39928, 1068, 107, "FXL", true],
1132
- # [68437, 2, 39928, 1308, 107, "FXL", false]],
1133
- # [[68550, 1, 39928, 1164, 107, "FXL", true],
1134
- # [68550, 2, 39928, 1398, 107, "FXL", false]],
1135
- # [[68552, 1, 39928, 1332, 107, "FXL", false]],
1136
- # [[68576, 1, 39928, 1404, 107, "FXL", false]],
1137
- # [[68604, 1, 39928, 876, 107, "FXL", true],
1138
- # [68604, 2, 39928, 1218, 107, "FXL", false]],
1139
- # [[68607, 1, 39927, 1104, 107, "FXL", true],
1140
- # [68607, 2, 39928, 738, 107, "FXL", false],
1141
- # [68607, 3, 39928, 1026, 107, "FXL", false],
1142
- # [68607, 4, 39928, 1074, 107, "FXL", true]],
1143
- # [[68610, 1, 39928, 1122, 11, "WHSL", false],
1144
- # [68610, 2, 39928, 1356, 11, "WHSL", false],
1145
- # [68610, 3, 39928, 1374, 11, "WHSL", false]]]
1146
- end
1147
-
1148
-
1149
-
627
+ end
@@ -0,0 +1,303 @@
1
+ module ActionView
2
+ module Helpers #:nodoc:
3
+ # Provides methods for converting numbers into formatted strings.
4
+ # Methods are provided for phone numbers, currency, percentage,
5
+ # precision, positional notation, and file size.
6
+ module NumberHelper
7
+ # Formats a +number+ into a US phone number (e.g., (555) 123-9876). You can customize the format
8
+ # in the +options+ hash.
9
+ #
10
+ # ==== Options
11
+ # * <tt>:area_code</tt> - Adds parentheses around the area code.
12
+ # * <tt>:delimiter</tt> - Specifies the delimiter to use (defaults to "-").
13
+ # * <tt>:extension</tt> - Specifies an extension to add to the end of the
14
+ # generated number.
15
+ # * <tt>:country_code</tt> - Sets the country code for the phone number.
16
+ #
17
+ # ==== Examples
18
+ # number_to_phone(5551234) # => 555-1234
19
+ # number_to_phone(1235551234) # => 123-555-1234
20
+ # number_to_phone(1235551234, :area_code => true) # => (123) 555-1234
21
+ # number_to_phone(1235551234, :delimiter => " ") # => 123 555 1234
22
+ # number_to_phone(1235551234, :area_code => true, :extension => 555) # => (123) 555-1234 x 555
23
+ # number_to_phone(1235551234, :country_code => 1) # => +1-123-555-1234
24
+ #
25
+ # number_to_phone(1235551234, :country_code => 1, :extension => 1343, :delimiter => ".")
26
+ # => +1.123.555.1234 x 1343
27
+ def number_to_phone(number, options = {})
28
+ number = number.to_s.strip unless number.nil?
29
+ options = options.symbolize_keys
30
+ area_code = options[:area_code] || nil
31
+ delimiter = options[:delimiter] || "-"
32
+ extension = options[:extension].to_s.strip || nil
33
+ country_code = options[:country_code] || nil
34
+
35
+ begin
36
+ str = ""
37
+ str << "+#{country_code}#{delimiter}" unless country_code.blank?
38
+ str << if area_code
39
+ number.gsub!(/([0-9]{1,3})([0-9]{3})([0-9]{4}$)/,"(\\1) \\2#{delimiter}\\3")
40
+ else
41
+ number.gsub!(/([0-9]{0,3})([0-9]{3})([0-9]{4})$/,"\\1#{delimiter}\\2#{delimiter}\\3")
42
+ number.starts_with?('-') ? number.slice!(1..-1) : number
43
+ end
44
+ str << " x #{extension}" unless extension.blank?
45
+ str
46
+ rescue
47
+ number
48
+ end
49
+ end
50
+
51
+ # Formats a +number+ into a currency string (e.g., $13.65). You can customize the format
52
+ # in the +options+ hash.
53
+ #
54
+ # ==== Options
55
+ # * <tt>:precision</tt> - Sets the level of precision (defaults to 2).
56
+ # * <tt>:unit</tt> - Sets the denomination of the currency (defaults to "$").
57
+ # * <tt>:separator</tt> - Sets the separator between the units (defaults to ".").
58
+ # * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults to ",").
59
+ # * <tt>:format</tt> - Sets the format of the output string (defaults to "%u%n"). The field types are:
60
+ #
61
+ # %u The currency unit
62
+ # %n The number
63
+ #
64
+ # ==== Examples
65
+ # number_to_currency(1234567890.50) # => $1,234,567,890.50
66
+ # number_to_currency(1234567890.506) # => $1,234,567,890.51
67
+ # number_to_currency(1234567890.506, :precision => 3) # => $1,234,567,890.506
68
+ #
69
+ # number_to_currency(1234567890.50, :unit => "&pound;", :separator => ",", :delimiter => "")
70
+ # # => &pound;1234567890,50
71
+ # number_to_currency(1234567890.50, :unit => "&pound;", :separator => ",", :delimiter => "", :format => "%n %u")
72
+ # # => 1234567890,50 &pound;
73
+ def number_to_currency(number, options = {})
74
+ options.symbolize_keys!
75
+
76
+ defaults = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
77
+ currency = I18n.translate(:'number.currency.format', :locale => options[:locale], :raise => true) rescue {}
78
+ defaults = defaults.merge(currency)
79
+
80
+ precision = options[:precision] || defaults[:precision]
81
+ unit = options[:unit] || defaults[:unit]
82
+ separator = options[:separator] || defaults[:separator]
83
+ delimiter = options[:delimiter] || defaults[:delimiter]
84
+ format = options[:format] || defaults[:format]
85
+ separator = '' if precision == 0
86
+
87
+ begin
88
+ format.gsub(/%n/, number_with_precision(number,
89
+ :precision => precision,
90
+ :delimiter => delimiter,
91
+ :separator => separator)
92
+ ).gsub(/%u/, unit)
93
+ rescue
94
+ number
95
+ end
96
+ end
97
+
98
+ # Formats a +number+ as a percentage string (e.g., 65%). You can customize the
99
+ # format in the +options+ hash.
100
+ #
101
+ # ==== Options
102
+ # * <tt>:precision</tt> - Sets the level of precision (defaults to 3).
103
+ # * <tt>:separator</tt> - Sets the separator between the units (defaults to ".").
104
+ # * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults to "").
105
+ #
106
+ # ==== Examples
107
+ # number_to_percentage(100) # => 100.000%
108
+ # number_to_percentage(100, :precision => 0) # => 100%
109
+ # number_to_percentage(1000, :delimiter => '.', :separator => ',') # => 1.000,000%
110
+ # number_to_percentage(302.24398923423, :precision => 5) # => 302.24399%
111
+ def number_to_percentage(number, options = {})
112
+ options.symbolize_keys!
113
+
114
+ defaults = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
115
+ percentage = I18n.translate(:'number.percentage.format', :locale => options[:locale], :raise => true) rescue {}
116
+ defaults = defaults.merge(percentage)
117
+
118
+ precision = options[:precision] || defaults[:precision]
119
+ separator = options[:separator] || defaults[:separator]
120
+ delimiter = options[:delimiter] || defaults[:delimiter]
121
+
122
+ begin
123
+ number_with_precision(number,
124
+ :precision => precision,
125
+ :separator => separator,
126
+ :delimiter => delimiter) + "%"
127
+ rescue
128
+ number
129
+ end
130
+ end
131
+
132
+ # Formats a +number+ with grouped thousands using +delimiter+ (e.g., 12,324). You can
133
+ # customize the format in the +options+ hash.
134
+ #
135
+ # ==== Options
136
+ # * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults to ",").
137
+ # * <tt>:separator</tt> - Sets the separator between the units (defaults to ".").
138
+ #
139
+ # ==== Examples
140
+ # number_with_delimiter(12345678) # => 12,345,678
141
+ # number_with_delimiter(12345678.05) # => 12,345,678.05
142
+ # number_with_delimiter(12345678, :delimiter => ".") # => 12.345.678
143
+ # number_with_delimiter(12345678, :separator => ",") # => 12,345,678
144
+ # number_with_delimiter(98765432.98, :delimiter => " ", :separator => ",")
145
+ # # => 98 765 432,98
146
+ #
147
+ # You can still use <tt>number_with_delimiter</tt> with the old API that accepts the
148
+ # +delimiter+ as its optional second and the +separator+ as its
149
+ # optional third parameter:
150
+ # number_with_delimiter(12345678, " ") # => 12 345.678
151
+ # number_with_delimiter(12345678.05, ".", ",") # => 12.345.678,05
152
+ def number_with_delimiter(number, *args)
153
+ options = args.extract_options!
154
+ options.symbolize_keys!
155
+
156
+ defaults = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
157
+
158
+ unless args.empty?
159
+ ActiveSupport::Deprecation.warn('number_with_delimiter takes an option hash ' +
160
+ 'instead of separate delimiter and precision arguments.', caller)
161
+ delimiter = args[0] || defaults[:delimiter]
162
+ separator = args[1] || defaults[:separator]
163
+ end
164
+
165
+ delimiter ||= (options[:delimiter] || defaults[:delimiter])
166
+ separator ||= (options[:separator] || defaults[:separator])
167
+
168
+ begin
169
+ parts = number.to_s.split('.')
170
+ parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}")
171
+ parts.join(separator)
172
+ rescue
173
+ number
174
+ end
175
+ end
176
+
177
+ # Formats a +number+ with the specified level of <tt>:precision</tt> (e.g., 112.32 has a precision of 2).
178
+ # You can customize the format in the +options+ hash.
179
+ #
180
+ # ==== Options
181
+ # * <tt>:precision</tt> - Sets the level of precision (defaults to 3).
182
+ # * <tt>:separator</tt> - Sets the separator between the units (defaults to ".").
183
+ # * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults to "").
184
+ #
185
+ # ==== Examples
186
+ # number_with_precision(111.2345) # => 111.235
187
+ # number_with_precision(111.2345, :precision => 2) # => 111.23
188
+ # number_with_precision(13, :precision => 5) # => 13.00000
189
+ # number_with_precision(389.32314, :precision => 0) # => 389
190
+ # number_with_precision(1111.2345, :precision => 2, :separator => ',', :delimiter => '.')
191
+ # # => 1.111,23
192
+ #
193
+ # You can still use <tt>number_with_precision</tt> with the old API that accepts the
194
+ # +precision+ as its optional second parameter:
195
+ # number_with_precision(number_with_precision(111.2345, 2) # => 111.23
196
+ def number_with_precision(number, *args)
197
+ options = args.extract_options!
198
+ options.symbolize_keys!
199
+
200
+ defaults = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
201
+ precision_defaults = I18n.translate(:'number.precision.format', :locale => options[:locale],
202
+ :raise => true) rescue {}
203
+ defaults = defaults.merge(precision_defaults)
204
+
205
+ unless args.empty?
206
+ ActiveSupport::Deprecation.warn('number_with_precision takes an option hash ' +
207
+ 'instead of a separate precision argument.', caller)
208
+ precision = args[0] || defaults[:precision]
209
+ end
210
+
211
+ precision ||= (options[:precision] || defaults[:precision])
212
+ separator ||= (options[:separator] || defaults[:separator])
213
+ delimiter ||= (options[:delimiter] || defaults[:delimiter])
214
+
215
+ begin
216
+ rounded_number = (Float(number) * (10 ** precision)).round.to_f / 10 ** precision
217
+ number_with_delimiter("%01.#{precision}f" % rounded_number,
218
+ :separator => separator,
219
+ :delimiter => delimiter)
220
+ rescue
221
+ number
222
+ end
223
+ end
224
+
225
+ STORAGE_UNITS = [:byte, :kb, :mb, :gb, :tb].freeze
226
+
227
+ # Formats the bytes in +size+ into a more understandable representation
228
+ # (e.g., giving it 1500 yields 1.5 KB). This method is useful for
229
+ # reporting file sizes to users. This method returns nil if
230
+ # +size+ cannot be converted into a number. You can customize the
231
+ # format in the +options+ hash.
232
+ #
233
+ # ==== Options
234
+ # * <tt>:precision</tt> - Sets the level of precision (defaults to 1).
235
+ # * <tt>:separator</tt> - Sets the separator between the units (defaults to ".").
236
+ # * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults to "").
237
+ #
238
+ # ==== Examples
239
+ # number_to_human_size(123) # => 123 Bytes
240
+ # number_to_human_size(1234) # => 1.2 KB
241
+ # number_to_human_size(12345) # => 12.1 KB
242
+ # number_to_human_size(1234567) # => 1.2 MB
243
+ # number_to_human_size(1234567890) # => 1.1 GB
244
+ # number_to_human_size(1234567890123) # => 1.1 TB
245
+ # number_to_human_size(1234567, :precision => 2) # => 1.18 MB
246
+ # number_to_human_size(483989, :precision => 0) # => 473 KB
247
+ # number_to_human_size(1234567, :precision => 2, :separator => ',') # => 1,18 MB
248
+ #
249
+ # You can still use <tt>number_to_human_size</tt> with the old API that accepts the
250
+ # +precision+ as its optional second parameter:
251
+ # number_to_human_size(1234567, 2) # => 1.18 MB
252
+ # number_to_human_size(483989, 0) # => 473 KB
253
+ def number_to_human_size(number, *args)
254
+ return nil if number.nil?
255
+
256
+ options = args.extract_options!
257
+ options.symbolize_keys!
258
+
259
+ defaults = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
260
+ human = I18n.translate(:'number.human.format', :locale => options[:locale], :raise => true) rescue {}
261
+ defaults = defaults.merge(human)
262
+
263
+ unless args.empty?
264
+ ActiveSupport::Deprecation.warn('number_to_human_size takes an option hash ' +
265
+ 'instead of a separate precision argument.', caller)
266
+ precision = args[0] || defaults[:precision]
267
+ end
268
+
269
+ precision ||= (options[:precision] || defaults[:precision])
270
+ separator ||= (options[:separator] || defaults[:separator])
271
+ delimiter ||= (options[:delimiter] || defaults[:delimiter])
272
+
273
+ storage_units_format = I18n.translate(:'number.human.storage_units.format', :locale => options[:locale], :raise => true)
274
+
275
+ if number.to_i < 1024
276
+ unit = I18n.translate(:'number.human.storage_units.units.byte', :locale => options[:locale], :count => number.to_i, :raise => true)
277
+ storage_units_format.gsub(/%n/, number.to_i.to_s).gsub(/%u/, unit)
278
+ else
279
+ max_exp = STORAGE_UNITS.size - 1
280
+ number = Float(number)
281
+ exponent = (Math.log(number) / Math.log(1024)).to_i # Convert to base 1024
282
+ exponent = max_exp if exponent > max_exp # we need this to avoid overflow for the highest unit
283
+ number /= 1024 ** exponent
284
+
285
+ unit_key = STORAGE_UNITS[exponent]
286
+ unit = I18n.translate(:"number.human.storage_units.units.#{unit_key}", :locale => options[:locale], :count => number, :raise => true)
287
+
288
+ begin
289
+ escaped_separator = Regexp.escape(separator)
290
+ formatted_number = number_with_precision(number,
291
+ :precision => precision,
292
+ :separator => separator,
293
+ :delimiter => delimiter
294
+ ).sub(/(\d)(#{escaped_separator}[1-9]*)?0+\z/, '\1\2').sub(/#{escaped_separator}\z/, '')
295
+ storage_units_format.gsub(/%n/, formatted_number).gsub(/%u/, unit)
296
+ rescue
297
+ number
298
+ end
299
+ end
300
+ end
301
+ end
302
+ end
303
+ end
@@ -1,5 +1,3 @@
1
- require File.join(RAILS_ROOT, 'lib', 'sequel', 'serializer', 'serializer.rb')
2
-
3
1
  class Sequel::Model
4
2
  include Sequel::Serialization # our own custom serializer
5
3
  include ActionView::Helpers::NumberHelper
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fossil
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Lardin, Daniel Sudol
@@ -25,6 +25,7 @@ files:
25
25
  - Rakefile
26
26
  - VERSION
27
27
  - fossil.gemspec
28
+ - lib/fossil.rb
28
29
  - lib/models/ac_qualification.rb
29
30
  - lib/models/aircraft.rb
30
31
  - lib/models/aircraft_cost.rb
@@ -117,6 +118,7 @@ files:
117
118
  - lib/models/vendor.rb
118
119
  - lib/models/vendor_document.rb
119
120
  - lib/models/visa.rb
121
+ - lib/number_helper.rb
120
122
  - lib/sequel/code_group.rb
121
123
  - lib/sequel/fos_dates.rb
122
124
  - lib/sequel/metaprogramming.rb