Compare commits

...

656 Commits

Author SHA1 Message Date
Nabeel Shahzad
6f7735afa7 Formatting 2018-10-25 18:10:37 -05:00
Nabeel Shahzad
3aef1a0aae Merge branch 'dev' of github.com:nabeelio/phpvms into dev 2018-10-25 17:56:03 -05:00
Nabeel Shahzad
cd327502d9 API: Call submit() for the PIREP 2018-10-08 09:01:35 -05:00
Nabeel Shahzad
900e8ffe26 Merge pull request #284 from arv187/es-translations
More acceptable translation to opt-in (es)
2018-10-02 13:50:42 -05:00
Nabeel Shahzad
270556eb1c Merge pull request #283 from tripph/master
Fix 404s to requirements/setup in README.md
2018-10-02 13:40:16 -05:00
arv187
e319f8eba4 More acceptable translation to opt-in (es) 2018-10-02 20:25:18 +02:00
Tripp Hill
48b14091c4 Fixed link to installation details page, was 404'd 2018-10-01 18:42:38 -04:00
Tripp Hill
88122c14d2 Fixed link to requirements page, 404'd before 2018-10-01 18:40:53 -04:00
Nabeel Shahzad
3911d95107 Set the currect aircraft location #277 2018-09-21 22:40:30 -04:00
Nabeel Shahzad
61c7a3d54d Merge pull request #280 from nkevins/expired_flight_cleaning
Hide expired live flight from live map and remove from DB
2018-09-20 18:44:42 -05:00
Kevin
075d4b3069 Add missing php extension 2018-09-21 06:46:44 +08:00
Nabeel Shahzad
c5498937dc Merge pull request #278 from nabeelio/laravel-57
[WIP] Laravel 5.7 Update
2018-09-20 14:20:25 -05:00
Nabeel Shahzad
f8b21c99e2 Use ClassMapGenerator from composer, symfony 4.x removed theirs 2018-09-20 14:08:42 -05:00
Nabeel Shahzad
8b6c44de6f StyleCI fixes 2018-09-20 13:55:58 -05:00
Nabeel Shahzad
b852bdc411 Merge pull request #276 from nkevins/admin_css_update
Make admin input outline darker
2018-09-20 13:55:21 -05:00
Nabeel Shahzad
2e0cc10ded Move redirect configs into phpvms config 2018-09-20 13:55:08 -05:00
Nabeel Shahzad
7707d8816e Laravel 5.7 versions 2018-09-20 13:55:08 -05:00
Nabeel Shahzad
a3239e78db Default install doesn't enable debug mode 2018-09-20 13:55:07 -05:00
Nabeel Shahzad
bbce735e31 Fix ordering for styleci 2018-09-20 13:55:07 -05:00
Nabeel Shahzad
262aad2d7a Add the Laravel 5.7 email verification 2018-09-20 13:55:07 -05:00
Nabeel Shahzad
99e472f99c Dependencies updated for Laravel 5.7 2018-09-20 13:55:07 -05:00
Kevin
d40c9ba91f Hide expired live flight from live map and remove from DB 2018-09-21 02:27:39 +08:00
Nabeel Shahzad
ab5480fdc9 Add explicit TOC accepted checkbox #244 2018-09-20 11:14:18 -05:00
Nabeel Shahzad
fbcaa382f4 add the opt-in button for emails #244 2018-09-20 10:00:23 -05:00
Nabeel Shahzad
aebb517791 Form close 2018-09-20 09:38:56 -05:00
Nabeel Shahzad
2de900eaa8 Minor JS cleanup 2018-09-20 09:36:15 -05:00
Nabeel Shahzad
e878168d4c Add eslint and styleci files 2018-09-10 09:25:45 -05:00
Nabeel Shahzad
d04565919b Allow admin to set a user's airport to be anywhere 2018-09-08 14:07:31 -05:00
Nabeel Shahzad
146fe05bdc Remove return nulls 2018-09-08 11:40:03 -05:00
Nabeel Shahzad
daffd1017f Add alt airport to pirep tables 2018-09-08 11:38:30 -05:00
Kevin
b66f10510e Make admin input border darker 2018-09-05 21:13:16 +08:00
Nabeel Shahzad
9e55f8ecf0 Merge pull request #275 from nkevins/transfer_hours
capture & display pilot transfer hours
2018-09-05 08:01:06 -04:00
Kevin Susanto
bac6396b19 Fix styleci checking 2018-09-05 09:27:16 +08:00
Kevin
b73182f830 Capturing pilot transfer hours 2018-09-05 08:09:33 +08:00
Nabeel Shahzad
ec873f2b82 Merge pull request #273 from nkevins/fix_repo_saving
Fix SettingsController saving boolean value as 'on'
2018-09-04 17:35:40 -04:00
Nabeel Shahzad
24fb55872f Merge pull request #274 from nkevins/fix_eager_loading
Optimize query with eager loading
2018-09-04 17:35:23 -04:00
Kevin
f7ae027156 Optimize query with eager loading 2018-09-04 20:02:16 +08:00
Kevin Susanto
f46e5090ae Fix SettingsController saving boolean value as 'on' 2018-09-04 16:11:51 +08:00
Nabeel Shahzad
c95fe3c971 Merge pull request #271 from nkevins/hide_inactive_pilot
Hide inactive pilot from pilot list page
2018-09-03 00:21:19 -04:00
Kevin
5992dad5a3 Hide inactive pilot from pilot list page 2018-09-03 08:12:11 +08:00
Nabeel Shahzad
646987764f Styleci annoying 2018-09-02 15:10:43 -04:00
Nabeel Shahzad
ebac18ebef Make sure created ICAO in factory is unique otherwise tests fail 2018-09-02 15:07:54 -04:00
Nabeel Shahzad
f2f0873b2e Merge branch 'dev' of github.com:nabeelio/phpvms into dev 2018-09-02 14:52:21 -04:00
Nabeel Shahzad
f14f7c1a5e Move the settings into a yml seed file and sync during install/update 2018-09-02 13:18:32 -04:00
Nabeel Shahzad
fbe3804658 Merge pull request #270 from nkevins/fix_search_flight_restriction
Fix flight search restriction
2018-09-02 11:04:41 -05:00
Nabeel Shahzad
1c1c0d55f4 Force truth state on pilot acceptance value #269 2018-09-02 10:47:37 -04:00
Kevin
20d8a2d0a7 Fix flight search restriction 2018-09-02 22:20:52 +08:00
Nabeel Shahzad
e71f12311a Merge pull request #268 from nabeelio/analysis-z4KMan
Apply fixes from StyleCI
2018-09-01 22:37:01 -05:00
Nabeel Shahzad
19a206f4ac Apply fixes from StyleCI 2018-09-02 03:31:16 +00:00
Nabeel Shahzad
8171d681a6 Fix METAR parsing for runway visibility 2018-09-01 16:58:38 -04:00
Nabeel Shahzad
aba23f99bd Merge pull request #264 from nkevins/fix_metar_issue
Fix METAR issue
2018-08-28 19:07:31 -05:00
Kevin
525e8ba8bb Adding cloud height assertion 2018-08-29 07:58:57 +08:00
Kevin
75ef658d8f Fix metar parsing issue 2018-08-29 07:27:53 +08:00
Nabeel Shahzad
e5935507c8 Merge pull request #262 from nabeelio/analysis-Xl4mPr
Apply fixes from StyleCI
2018-08-26 13:52:07 -05:00
Nabeel Shahzad
3c32f2d89d Apply fixes from StyleCI 2018-08-26 18:51:47 +00:00
Nabeel Shahzad
e95b3eb366 Code cleanup from inspection results 2018-08-26 13:50:08 -05:00
Nabeel Shahzad
0f3424f41e Fix datetime parser 2018-08-26 12:25:51 -05:00
Nabeel Shahzad
046dac5db5 Merge pull request #261 from nabeelio/analysis-8Kyry9
Apply fixes from StyleCI
2018-08-26 12:19:08 -05:00
Nabeel Shahzad
9596d88b48 Apply fixes from StyleCI 2018-08-26 16:40:04 +00:00
Nabeel Shahzad
20f46adbc4 Merge pull request #259 from nkevins/enable_eager_loading
Enable eager loading
2018-08-26 09:07:35 -05:00
Kevin
7b8e20f348 Enable eager loading 2018-08-26 21:43:47 +08:00
Nabeel Shahzad
996ebde501 Merge pull request #258 from nkevins/add_remove_expired_bids
Implement cron to remove expired bids
2018-08-24 12:16:50 -05:00
Kevin
36d91265d3 Adding newline at end of file 2018-08-25 01:14:35 +08:00
Kevin
796053cfa5 Implement cron to remove expired bids 2018-08-25 01:07:14 +08:00
Nabeel Shahzad
1c32ef838d Merge pull request #257 from nkevins/fix_timezone_list_encoded
Fix timezone list HTML Escaped
2018-08-24 10:39:59 -05:00
Kevin
a62c938099 Update attrSet initializer to empty string 2018-08-24 23:39:08 +08:00
Kevin
a9536064d3 Fix timezone list HTML Escaped 2018-08-24 23:16:23 +08:00
Nabeel Shahzad
543026da18 Nav data import fixed - thanks Kevin S! 2018-08-23 09:27:54 -05:00
Nabeel Shahzad
e77488c66a Fix CronWeekly console task to actually read Weekly 2018-08-23 08:26:39 -05:00
Nabeel Shahzad
91a64113fb Add faker package back 2018-08-20 13:22:42 -05:00
Nabeel Shahzad
25cead3288 Clean temp/cache folder 2018-08-20 12:01:13 -05:00
Nabeel Shahzad
80556dcda3 Remove the tests folder 2018-08-20 11:35:47 -05:00
Nabeel Shahzad
ffccb01670 Try to remove an requires-devs scripts 2018-08-20 11:24:32 -05:00
Nabeel Shahzad
299f391455 Cleanup of deploy script 2018-08-20 10:39:44 -05:00
Nabeel Shahzad
666c5d50d4 Add assets and banner message for EU cookie laws 2018-08-20 10:25:40 -05:00
Nabeel Shahzad
56c1f5ce4d Remove circleci config 2018-08-20 10:17:06 -05:00
Nabeel Shahzad
79806c3b42 Asset rebuild 2018-08-20 09:59:38 -05:00
Nabeel Shahzad
66a9b361cb Cosmetics 2018-08-20 09:48:39 -05:00
Nabeel Shahzad
89baf34824 Initial user stats recalculation #254 2018-08-20 09:42:54 -05:00
Nabeel Shahzad
5ee053cace Fix PIREP field error on file 2018-08-20 09:20:03 -05:00
Nabeel Shahzad
2dee3190ce Update dependencies 2018-08-20 09:19:44 -05:00
Nabeel Shahzad
1f50d2b7f7 check for empty route 2018-08-04 11:47:56 -05:00
Nabeel Shahzad
c40a8c893d Readd bids.disable_flight_on_bid, fixes tests 2018-07-24 15:58:11 -05:00
Nabeel Shahzad
b2cc818b7a Extra logging about cron 2018-07-24 14:58:12 -05:00
Nabeel Shahzad
0ce86e9e44 Rewrite add/remove bids code w additional tests 2018-07-24 14:50:50 -05:00
Nabeel Shahzad
e680f33326 Add more tests for days of week 2018-07-24 11:21:52 -05:00
Nabeel Shahzad
69eebd9370 Remove extra }} 2018-07-18 08:33:09 -05:00
Nabeel Shahzad
fb17159743 Merge branch 'dev' of https://github.com/nabeelio/phpvms into dev 2018-07-16 20:10:47 -05:00
Nabeel Shahzad
0f1a4bbf33 Change lat/lon fields to text 2018-07-16 09:23:50 -05:00
Nabeel Shahzad
68b00f776a Translation fixes 2018-07-15 15:06:25 -05:00
Nabeel Shahzad
87206ed2b4 Merge pull request #255 from arv187/es-translations
Update 07/13/2018 es-translations
2018-07-13 10:46:27 -05:00
arv187
5b233da11b update 07/13/2018
Add new files.
2018-07-13 17:30:54 +02:00
Nabeel Shahzad
28f10eaf41 Validator fix for airport import/export 2018-07-13 07:45:29 -05:00
Nabeel Shahzad
26061deced Fix flight visibility for day 2018-07-13 07:43:27 -05:00
arv187
3f3f0dd81d Merge remote-tracking branch 'upstream/dev' into es-translations 2018-07-13 14:15:32 +02:00
Nabeel Shahzad
4596ddae58 Undo null check for flight 2018-07-12 22:40:39 -05:00
Nabeel Shahzad
91b1fd5dca Add "visible" field to factory 2018-07-12 22:36:13 -05:00
Nabeel Shahzad
1b51bc8c04 Log error 2018-07-12 22:32:56 -05:00
Nabeel Shahzad
0af85a3fff Only show flights if they're also marked as visible 2018-07-12 22:29:50 -05:00
Nabeel Shahzad
4ca58ed754 Extra logging for cron and add flight visible field 2018-07-12 22:23:45 -05:00
Nabeel Shahzad
f640381978 Export extra fields for airports 2018-07-12 22:21:39 -05:00
Nabeel Shahzad
761c845300 Clean up some comments 2018-07-12 21:47:27 -05:00
Nabeel Shahzad
1b62cb7109 Fix extra brackets 2018-07-12 21:37:18 -05:00
Nabeel Shahzad
ad7aa7c8ce Missing flight log translation 2018-07-12 21:29:14 -05:00
Nabeel Shahzad
9cc640b866 Fix PIREP field and non-existant airport errors when editing PIREPs 2018-07-12 21:20:10 -05:00
Nabeel Shahzad
85615300e0 Wrap ifs 2018-07-11 08:35:26 -05:00
Nabeel Shahzad
5caecf9c5f update vacentral lib to fix airport lookup 2018-07-11 08:07:58 -05:00
Nabeel Shahzad
a1868075ed update composer 2018-07-11 08:06:07 -05:00
Nabeel Shahzad
81ecb5673f Merge branch 'dev' of https://github.com/nabeelio/phpvms into dev 2018-07-05 14:07:56 -05:00
Nabeel Shahzad
7c414e5419 (API) Delete the PIREP route before it's posted again 2018-07-05 14:07:54 -05:00
arv187
8b368a3808 upload spanish translation to es-translations branch 2018-06-28 01:08:56 +02:00
Nabeel Shahzad
fef36f89f4 Merge pull request #250 from arv187/master
ES translation
2018-06-27 17:36:59 -05:00
arv187
e9aaa85fc7 ES translation 2018-06-28 00:16:58 +02:00
Nabeel Shahzad
9125cc3d87 Fix updater 2018-06-22 09:26:08 -05:00
Nabeel Shahzad
230d3bebd3 Fix the api controller generation 2018-06-22 08:31:15 -05:00
Nabeel Shahzad
5b227c3a60 fix log 2018-06-21 09:53:14 -05:00
Nabeel Shahzad
316bc14526 Composer update 2018-06-20 11:39:28 -05:00
Nabeel Shahzad
9bc3a67c9a Move some database calls into a support class 2018-06-20 11:18:30 -05:00
Nabeel Shahzad
a083f9c671 Fix PIREP submission and field slug problems on PIREP edit 2018-05-30 14:00:20 -05:00
Nabeel Shahzad
b7a6cb4fbc Add missing flighttime translation 2018-05-29 14:21:44 -05:00
Nabeel Shahzad
d76b264238 Fix saving PIREPs as draft 2018-05-29 11:04:28 -05:00
Nabeel Shahzad
e02ae682a8 lang fixes 2018-05-29 09:16:07 -05:00
Nabeel Shahzad
59b99497a7 Route sorting 2018-05-28 18:15:51 -05:00
Nabeel Shahzad
42fb13294b Lang fixes 2018-05-25 15:37:53 -05:00
Nabeel Shahzad
a515921143 Add opt-in as part of GDPR #244 2018-05-24 22:17:41 -05:00
Nabeel Shahzad
019cf9b4fb Set IDs to unique ints so tests don't occasionally fail 2018-05-21 12:23:26 -05:00
Nabeel Shahzad
17cece598b Fix typos and missing lang 2018-05-21 12:05:22 -05:00
Nabeel Shahzad
8179611cac Remove unneeded migratoin 2018-05-21 12:00:14 -05:00
Nabeel Shahzad
0a7f002217 More organizing for translations 2018-05-21 11:55:40 -05:00
Nabeel Shahzad
36dcd61feb Move downloads into separate files 2018-05-21 11:27:57 -05:00
Nabeel Shahzad
072a7ffe12 split out email files 2018-05-21 11:25:51 -05:00
Nabeel Shahzad
9173558a0b Moved nav to files 2018-05-21 10:32:38 -05:00
Nabeel Shahzad
7cba92d420 move toc files 2018-05-21 10:28:50 -05:00
Nabeel Shahzad
3288467aa1 Move user files 2018-05-21 09:58:31 -05:00
Nabeel Shahzad
2b074ee894 Move widgets/home 2018-05-21 09:58:31 -05:00
Nabeel Shahzad
33ef3dd252 Move widgets into separate file 2018-05-21 09:58:21 -05:00
Nabeel Shahzad
bd84877f0e Move airports into separate file 2018-05-21 09:58:21 -05:00
Nabeel Shahzad
1258b87671 Move profile into separate file 2018-05-21 09:57:49 -05:00
Nabeel Shahzad
ba1bf4581d Move flights into separate file 2018-05-21 09:57:48 -05:00
Nabeel Shahzad
440a0c5425 Move dashboard into separate file 2018-05-21 09:57:46 -05:00
Nabeel Shahzad
74b53b4ba7 Move PIREPs to separate file 2018-05-21 09:57:45 -05:00
Nabeel Shahzad
1a3065b1ca Reformat error and auth translations 2018-05-21 09:57:43 -05:00
Nabeel Shahzad
fb6fc118e3 Move installer_messages.* to installer.* 2018-05-21 09:57:41 -05:00
Nabeel Shahzad
b63c9a8cd4 Move frontend.auth.* to auth.* 2018-05-21 09:57:41 -05:00
Nabeel Shahzad
203b6496fc Move frontend.global.* to common.* 2018-05-21 09:57:40 -05:00
Nabeel Shahzad
a747657642 remove dbal/predis from composer reqs 2018-05-21 09:57:38 -05:00
Nabeel Shahzad
ba9c64f420 Remove airplane image and restore original homepage for now 2018-05-21 09:57:38 -05:00
lordwilbur
c2bcebdb29 rebuilt assets again... 2018-05-21 09:57:38 -05:00
lordwilbur
f4ca576178 rebuilt assets 2018-05-21 09:57:38 -05:00
lordwilbur
459f69f609 frontend translation + other stuff 2018-05-21 09:57:34 -05:00
lordwilbur
06f8322eeb - fixed an error on finance in admin panel
- flight ident now use this format: VA IATA(if empty ICAO) + Flight Number + - + Flight Code (without C) + - + Flight Leg (without L)
- added function __trans_choice in helpers.php for translation
- fixed error in flight edit/insert panel not showing/inserting Tuesday in days
- fixed an error occurring when metar retrieved is empty
- edited now-ui-kit.css to align login fields correctly
- added /public/assets/frontend/js/core/jquery-3.3.1.min.js to fix a missed resource error in authentication pages
- added translations file for en and it locales
- translated all the frontend templates
2018-05-21 09:57:34 -05:00
lordwilbur
84f64f45d9 frontend translation + other stuff 2018-05-21 09:57:32 -05:00
lordwilbur
6899ea1964 - fixed an error on finance in admin panel
- flight ident now use this format: VA IATA(if empty ICAO) + Flight Number + - + Flight Code (without C) + - + Flight Leg (without L)
- added function __trans_choice in helpers.php for translation
- fixed error in flight edit/insert panel not showing/inserting Tuesday in days
- fixed an error occurring when metar retrieved is empty
- edited now-ui-kit.css to align login fields correctly
- added /public/assets/frontend/js/core/jquery-3.3.1.min.js to fix a missed resource error in authentication pages
- added translations file for en and it locales
- translated all the frontend templates
2018-05-21 09:57:26 -05:00
lordwilbur
81c148fc4d More translations 2018-05-21 09:57:10 -05:00
lordwilbur
89ebcbdb10 added predis/predis to composer 2018-05-21 09:57:10 -05:00
lordwilbur
a38bad9648 rebuilt assets again... 2018-05-21 09:57:10 -05:00
lordwilbur
7432ea5cc7 rebuilt assets 2018-05-21 09:57:10 -05:00
lordwilbur
1c84dd1e44 changed Flight model to match update of route_leg column in db. 2018-05-21 09:57:10 -05:00
lordwilbur
078f361a39 added doctrine/dbal to composer.json 2018-05-21 09:57:10 -05:00
lordwilbur
0b1670aae5 frontend translation + other stuff 2018-05-21 09:57:10 -05:00
lordwilbur
10867b2641 - fixed an error on finance in admin panel
- flight ident now use this format: VA IATA(if empty ICAO) + Flight Number + - + Flight Code (without C) + - + Flight Leg (without L)
- added function __trans_choice in helpers.php for translation
- fixed error in flight edit/insert panel not showing/inserting Tuesday in days
- fixed an error occurring when metar retrieved is empty
- edited now-ui-kit.css to align login fields correctly
- added /public/assets/frontend/js/core/jquery-3.3.1.min.js to fix a missed resource error in authentication pages
- added translations file for en and it locales
- translated all the frontend templates
2018-05-21 09:56:53 -05:00
lordwilbur
a346b0df2e frontend translation + other stuff 2018-05-21 09:54:18 -05:00
lordwilbur
ba8a819c7d - fixed an error on finance in admin panel
- flight ident now use this format: VA IATA(if empty ICAO) + Flight Number + - + Flight Code (without C) + - + Flight Leg (without L)
- added function __trans_choice in helpers.php for translation
- fixed error in flight edit/insert panel not showing/inserting Tuesday in days
- fixed an error occurring when metar retrieved is empty
- edited now-ui-kit.css to align login fields correctly
- added /public/assets/frontend/js/core/jquery-3.3.1.min.js to fix a missed resource error in authentication pages
- added translations file for en and it locales
- translated all the frontend templates
2018-05-21 09:53:08 -05:00
Nabeel Shahzad
77a2fd70c3 Merge pull request #242 from LordWilbur/vaflights
flights filtered per va
2018-05-19 14:04:39 -05:00
lordwilbur
1c0c7e0012 removed $flights variable 2018-05-19 09:05:24 +02:00
lordwilbur
e026a8d333 corrected code and replicated in Api/FlightController.php 2018-05-19 02:37:11 +02:00
lordwilbur
650d9884b0 removed tabs
added setting
corrected code
2018-05-19 02:03:06 +02:00
lordwilbur
0d53c5487d pilot unable to place bids on flight if pilots.only_flights_from_current = true and departure airport is not the same pilot's current airport. 2018-05-19 00:55:08 +02:00
lordwilbur
993513c22b flights filtered per va 2018-05-19 00:28:34 +02:00
Nabeel Shahzad
959db2e247 circleci 2018-05-17 08:06:38 -05:00
Nabeel Shahzad
c64dec1080 CircleCI build script 2018-05-17 08:02:52 -05:00
Nabeel Shahzad
da0a7cbe81 Add ACARS live time/coords/default zoom into admin settings 2018-05-16 10:54:01 -05:00
Nabeel Shahzad
a63a784dec Update to use leaflet-providers 2018-05-14 14:17:47 -05:00
Nabeel Shahzad
40c7fd8977 Add leaflet-providers 2018-05-14 14:14:27 -05:00
Nabeel Shahzad
3e96b195a6 Add short timeout to HTTP calls by default; cache METAR lookups 2018-05-14 11:22:20 -05:00
Nabeel Shahzad
c8a9ebd26d Data cleanup; set flight ident in response 2018-05-13 16:59:35 -05:00
Nabeel Shahzad
63897a5666 More cleanup of admin template 2018-05-11 16:02:43 -05:00
Nabeel Shahzad
9332f64284 Cleanup admin pirep form and read-only state 2018-05-11 13:53:24 -05:00
Nabeel Shahzad
3f1bb26ee5 Fix PIREPs not showing in admin 2018-05-11 13:43:33 -05:00
Nabeel Shahzad
9ca8825868 Merge branch 'dev' of https://github.com/nabeelio/phpvms into dev 2018-05-11 13:05:37 -05:00
Nabeel Shahzad
b8424f712d Acars log ordering 2018-05-11 13:05:34 -05:00
Nabeel Shahzad
bc7fccfb95 Cleanup the cancelled PIREP logic 2018-05-11 12:08:55 -05:00
Nabeel Shahzad
605bf477ad More date casting on API 2018-05-10 15:28:42 -05:00
Nabeel Shahzad
df88cb141a Allow draft for PIREPs, separate out the save/submit and delete functionality 2018-05-10 10:35:10 -05:00
Nabeel Shahzad
5230fc9600 change artisan calls 2018-05-10 10:22:45 -05:00
Nabeel Shahzad
62aa825c0f Use artisan for the reload-db dev command 2018-05-10 10:17:41 -05:00
Nabeel Shahzad
42c6a11780 Don't show in progress PIREPs in admin and order the map data 2018-05-09 17:58:51 -05:00
Nabeel Shahzad
4fa024045d refactorings of pirep/acars api calls; separate field calls 2018-05-09 12:45:24 -05:00
Nabeel Shahzad
9542c23717 Fix tests formatting of DateTime/Carbon objects 2018-05-09 09:15:07 -05:00
Nabeel Shahzad
7d2d932f50 remove field block_time 2018-05-08 21:26:57 -05:00
Nabeel Shahzad
bd7bd7e802 Cleanup of sample data and date/time parsing 2018-05-08 20:59:19 -05:00
Nabeel Shahzad
4fc30ec4bc Allow the created_at/updated_at fields to be edited 2018-05-08 17:30:44 -05:00
Nabeel Shahzad
00458ee754 unit test airport id length fix 2018-05-07 15:11:59 -05:00
Nabeel Shahzad
3f1f83438d remove observed_date test from metar code 2018-05-07 14:37:08 -05:00
Nabeel Shahzad
f593c7d92f Fix some more table column sizes 2018-05-07 14:07:41 -05:00
Nabeel Shahzad
feeb4946d1 Add some indexes and tests for airports 2018-05-07 14:07:41 -05:00
Nabeel Shahzad
f671d3f624 Update deploy scripts to remove some extra packages 2018-05-07 14:07:41 -05:00
Nabeel Shahzad
0cd7b3b71f live map updates 2018-05-04 13:59:47 -05:00
Nabeel Shahzad
d80e70e2b1 Fix Unit type conversions in tests 2018-05-03 16:13:25 -05:00
Nabeel Shahzad
f8965f1785 Fix tests for new datatypes 2018-05-03 15:36:26 -05:00
Nabeel Shahzad
23f1a8225a update livemap to use rivets.js bindings for data updates 2018-05-03 15:07:16 -05:00
Nabeel Shahzad
cbb5182cea Add distance/fuel fields to ACARS tables 2018-05-03 15:06:50 -05:00
Nabeel Shahzad
ff8f29be24 Update dev tools to add incremental inserts 2018-05-03 15:06:28 -05:00
José Bustos
64302252c0 Resize settings
Resize method only works with numbers as a parameter, is not necessary to put px at the end.
2018-05-02 18:59:57 -05:00
José Bustos
d768b9cc0e Avatar field on database
corrected the path to user avatar based on get avatar attribute on user model
2018-05-02 18:59:57 -05:00
José Bustos
4bc7d7735d Src avatar
Changed src call for user avatar, this will return the correct url based on avatar attribute of User Model
2018-05-02 18:59:57 -05:00
José Bustos
8aa629fc56 Grammar Error
corrected string
2018-05-02 18:59:57 -05:00
José Bustos
ec273d2928 Add getAvatarAttribute()
refactoring other methods this will work
2018-05-02 18:59:57 -05:00
Jose Miguel Bustos Espinoza
06d767279b Added input fields to upload avatar. 2018-05-02 18:59:57 -05:00
Jose Miguel Bustos Espinoza
b1209712d1 Added isset verification on avatar index at array, to put nullable validator. 2018-05-02 18:59:57 -05:00
Jose Miguel Bustos Espinoza
ecf2307542 Allow files upload in edit profile form for avatar file. 2018-05-02 18:59:57 -05:00
Jose Miguel Bustos Espinoza
24a2467338 Added avatar src in case of avatar exists, else will show default gravatar. 2018-05-02 18:59:57 -05:00
Jose Miguel Bustos Espinoza
4c65bf8142 Added avatar resize config 2018-05-02 18:59:57 -05:00
Jose Miguel Bustos Espinoza
31d0683592 Added avatar upload method into resource controller 2018-05-02 18:59:57 -05:00
Jose Miguel Bustos Espinoza
41f4c76006 Remote getAvatarAttribue() beacuse it cause conflict with final avatar path. 2018-05-02 18:59:57 -05:00
José Bustos
d0485f98a9 Installation of intervetion/image package to manage pilots avatars and others images. 2018-05-02 18:59:57 -05:00
Nabeel Shahzad
ec565fa0de Regen assets 2018-05-02 17:27:56 -05:00
Nabeel Shahzad
4f9c028676 Map fixes/updates 2018-05-02 15:28:57 -05:00
Nabeel Shahzad
5dff563c75 Fixes for API and live map 2018-05-02 15:14:18 -05:00
Nabeel Shahzad
9183e0b2aa Add phar file to gitignore 2018-05-02 09:54:21 -05:00
Nabeel Shahzad
6701ce8c1a comment out superfluous debug statements 2018-05-01 22:53:41 -05:00
Nabeel Shahzad
3a81e2ec27 Fix block_off/on_time and fix the metar date parsing 2018-05-01 22:52:31 -05:00
Nabeel Shahzad
b96f1cd7c4 api fixes/updates 2018-05-01 20:58:05 -05:00
Nabeel Shahzad
50abda71cb Fix if submitted_at blank 2018-04-30 17:51:18 -05:00
Nabeel Shahzad
73ffc9cf44 Fix flight type parameter 2018-04-30 17:29:50 -05:00
Nabeel Shahzad
7decac105f Add another sample flight/airports for testing 2018-04-29 11:29:31 -05:00
Nabeel Shahzad
89f067807b comment out the flight dupe check on import 2018-04-25 12:05:12 -05:00
Nabeel Shahzad
5cd9c608a7 Add score to model and fields 2018-04-25 11:56:05 -05:00
Nabeel Shahzad
531e86f5e7 Fix flight duplicate detection in add/edit/import; fix active checkbox 2018-04-25 11:53:32 -05:00
José Bustos
fb6d5a6a0a Install bug
It shows a blank page on install route in apache, it could be an rewrite error at line 
RewriteBase /
exactly, removing that line sould be fix.
2018-04-24 22:08:13 -05:00
Nabeel Shahzad
fe5400a3bb Add extra fields needed for internal active flags 2018-04-24 12:52:11 -05:00
Nabeel Shahzad
9502dd9835 Fix active/inactive check on flight page 2018-04-24 11:16:16 -05:00
Nabeel Shahzad
203ee72052 google font api from ssl 2018-04-24 11:02:02 -05:00
Nabeel Shahzad
29d206bba3 Merge branch 'dev' 2018-04-23 11:45:22 -05:00
Nabeel Shahzad
110fde34ea Fix subfleet addition error (pikaday missing) 2018-04-23 11:06:17 -05:00
Nabeel Shahzad
2c2b569c6c Fix setting the subfleet pay 2018-04-23 10:36:11 -05:00
Nabeel Shahzad
6c83b539c8 Merge branch 'dev' of github.com:nabeelio/phpvms into dev 2018-04-23 10:25:11 -05:00
Nabeel Shahzad
b7a1c2cb41 Add gitignore into uploads folder 2018-04-23 09:18:07 -05:00
Nabeel Shahzad
cff7e2c4da some cleanup as-per phpstan 2018-04-23 08:46:28 -05:00
Nabeel Shahzad
59302ded0f Fix another flight day test 2018-04-16 16:57:22 -05:00
Nabeel Shahzad
ea32353890 Fix flight on days deactivation test 2018-04-16 16:46:51 -05:00
Nabeel Shahzad
0965465601 add whereNotInOrder() to repository 2018-04-16 16:33:41 -05:00
Nabeel Shahzad
2319a8c9f4 Added more flight phases from ADREP 2018-04-16 09:33:45 -05:00
Nabeel Shahzad
63c5d69e10 Some fixes to trends parsing 2018-04-15 14:14:40 -05:00
Nabeel Shahzad
e369695da5 Fix link highlight color 2018-04-15 12:37:19 -05:00
Nabeel Shahzad
775900bb14 Filter out draft PIREPs 2018-04-15 12:37:04 -05:00
Nabeel Shahzad
9d3d284df7 Check start/end/days of week in cron and active/deactivate flights accordingly 2018-04-12 16:12:32 -05:00
Nabeel Shahzad
395642f69c Add /api/news route 2018-04-11 20:01:41 -05:00
Nabeel Shahzad
8d2fd22e3e Shrink min-height on the card boxes 2018-04-11 13:28:47 -05:00
Nabeel Shahzad
e668a5089e Fix create pirep errors 2018-04-10 07:22:21 -05:00
Nabeel Shahzad
f54f19100c Add a PIREP flag for ready_only; some more METAR cleanup 2018-04-09 22:04:59 -05:00
Nabeel Shahzad
4a19f609fc fix heading stylings within containers 2018-04-09 20:14:29 -05:00
Nabeel Shahzad
e109e00aa8 More styling, banner when nothing is added 2018-04-09 20:04:21 -05:00
Nabeel Shahzad
e1c8174b3f More styling fixes in admin/flight add/edit form 2018-04-09 19:32:38 -05:00
Nabeel Shahzad
0986cddae1 admin styling 2018-04-09 15:16:01 -05:00
Nabeel Shahzad
86d28aafd6 added a few columns for scheduling, styling in admin 2018-04-08 20:51:27 -05:00
Nabeel Shahzad
f842e86885 styling fixes 2018-04-08 16:00:22 -05:00
Nabeel Shahzad
5a30ba683e dependency updates 2018-04-08 09:52:41 -05:00
Nabeel Shahzad
c102a0d858 Refactor all of the unit conversion code 2018-04-07 20:52:12 -05:00
Nabeel Shahzad
eae5989845 Replace METAR data with custom class 2018-04-07 09:05:06 -05:00
Nabeel Shahzad
f4f41cd900 Fix check for block_off_time 2018-04-06 17:25:57 -05:00
Nabeel Shahzad
078f8038e4 quick comment over the ClassLoader 2018-04-06 17:23:55 -05:00
Nabeel Shahzad
d5fba47dc6 Move migration base class entirely into the interface 2018-04-06 17:21:10 -05:00
Nabeel Shahzad
3e89a53fc1 Move cron scripts to root namespace 2018-04-06 17:14:01 -05:00
Nabeel Shahzad
7179910bc6 Backend state for saving PIREP as a draft 2018-04-06 17:12:35 -05:00
Nabeel Shahzad
12a442970e PIREP form styling and improvments 2018-04-06 17:10:45 -05:00
Nabeel Shahzad
42264eb180 More refactoring of metar parser 2018-04-04 23:37:10 -05:00
Nabeel Shahzad
a31b704203 add metar lib and adding some modifications 2018-04-04 20:59:52 -05:00
Nabeel Shahzad
129c551fa0 Reorganized PIREP page 2018-04-04 17:42:43 -05:00
Nabeel Shahzad
d8dad44e43 Add compositional interface for METAR parser class 2018-04-04 17:14:46 -05:00
Nabeel Shahzad
e27f6f1b14 Add addtl fields to pirep - block_off and block_on times, calculate block_off time if not there 2018-04-04 13:03:10 -05:00
Nabeel Shahzad
052813ba4a Fixes in how METARs are parsed 2018-04-04 09:04:14 -05:00
Nabeel Shahzad
7a3a2f3e9a Remove the url generator 2018-04-04 08:46:46 -05:00
Nabeel Shahzad
9ff3c1ab10 remove single entry for pagination testing 2018-04-03 22:45:45 -05:00
Nabeel Shahzad
a0422899a5 redesigning the pirep page a bit 2018-04-03 22:44:11 -05:00
Nabeel Shahzad
6fb66a1d80 Fixing some styling on the frontend 2018-04-03 19:21:42 -05:00
Nabeel Shahzad
4d3fb5b873 removed/update composer dependencies 2018-04-03 18:15:10 -05:00
Nabeel Shahzad
af28156498 Add user balance to dashboard 2018-04-03 12:06:06 -05:00
Nabeel Shahzad
99555539a7 Fix timezone/country not being saved on register #223 2018-04-03 09:43:32 -05:00
Nabeel Shahzad
04d63ca931 Remove medialibrary stuff 2018-04-03 08:16:39 -05:00
Nabeel Shahzad
2351dbe717 Move caching into Metar base class, clean up of caller in the widget 2018-04-02 22:44:31 -05:00
Nabeel Shahzad
717118cfb4 Add METAR interface and use local library for decoding 2018-04-02 22:35:25 -05:00
Nabeel Shahzad
3dba586f83 Add downloads page 2018-04-02 18:37:41 -05:00
Nabeel Shahzad
36a7886668 Add laravel-medialibrary for avatars 2018-04-02 17:49:04 -05:00
Nabeel Shahzad
0f98e729ce Save file asset 2018-04-02 17:34:58 -05:00
Nabeel Shahzad
ccfa904300 change file controller name 2018-04-02 13:42:24 -05:00
Nabeel Shahzad
9e1e0142e9 Route downloads through controller; file IDs as hash to prevent guessing; download count; download list on airport page 2018-04-02 12:55:37 -05:00
Nabeel Shahzad
3ddee56359 Add description field for files 2018-04-02 11:46:33 -05:00
Nabeel Shahzad
bbfad3a0ef Allow uploads for top level airline 2018-04-02 11:08:38 -05:00
Nabeel Shahzad
026a83591d Fixes to file uploading; include disk name, remove clunky redirect code 2018-04-02 11:04:32 -05:00
Nabeel Shahzad
6c516cf4bf metar template change #61 2018-04-02 07:11:02 -05:00
Nabeel Shahzad
c000034cab Some changes to WX template layout and cache the API call out #61 2018-04-02 07:06:00 -05:00
Nabeel Shahzad
f84ff8de92 Add a column for the user avatar #226 2018-04-02 06:47:31 -05:00
Nabeel Shahzad
bb73af3806 Add weather to the dashboard for the current airport 2018-04-02 06:47:05 -05:00
Nabeel Shahzad
cfd0853d79 Convert expense type to char, translations for ExpenseType 2018-04-01 22:26:20 -05:00
Nabeel Shahzad
2a01a935c0 Add enums to language strings file 2018-04-01 21:44:04 -05:00
Nabeel Shahzad
02fa97504e Rename Off-block to Departed 2018-04-01 20:47:44 -05:00
Nabeel Shahzad
eb06c07fdb Update PIREP statuses 2018-04-01 20:37:10 -05:00
Nabeel Shahzad
0f521c3af9 Change PIREP states to follow AIDX guidelines 2018-04-01 20:18:12 -05:00
Nabeel Shahzad
ee077ffa16 Add public/uploads to installer permissions check 2018-04-01 19:28:15 -05:00
Nabeel Shahzad
e358b8706f Backend for file uploads attached to any generic model, initially on aircraft and airports #226 2018-04-01 18:02:12 -05:00
Nabeel Shahzad
793b3e7134 change ref_class to ref_model 2018-04-01 14:32:01 -05:00
Nabeel Shahzad
0bed38c78b Add airport overview page and links to it #225 2018-03-31 15:57:30 -05:00
Nabeel Shahzad
46f9b3d9b9 Typo #96 2018-03-30 22:36:01 -05:00
Nabeel Shahzad
1275d7ebc4 Set user on ON_LEAVE automatically after days in settings() #96 2018-03-30 22:28:19 -05:00
Nabeel Shahzad
3744dbfd5d few more checks on aircraft fields 2018-03-30 21:56:55 -05:00
Nabeel Shahzad
8fb239fb8f tests on all airport fields 2018-03-30 21:51:13 -05:00
Nabeel Shahzad
9eb8ed1804 fix aircraft status field type in model 2018-03-30 21:45:11 -05:00
Nabeel Shahzad
a3bfcf01b7 Fix mock storage for airports 2018-03-30 21:25:54 -05:00
Nabeel Shahzad
71da25eca5 Add mock stock to test the csv round-trip 2018-03-30 21:19:48 -05:00
Nabeel Shahzad
217da07007 Fix column headers 2018-03-30 20:57:30 -05:00
Nabeel Shahzad
70e5ccda6f Add IATA and ZFW to aircraft import/export and tables 2018-03-30 20:21:18 -05:00
Nabeel Shahzad
777167f46e Fix flag icons not showing 2018-03-30 19:05:15 -05:00
Nabeel Shahzad
f2952c6567 Fix blank/empty field being returned as invalid object #222 2018-03-30 18:53:43 -05:00
Nabeel Shahzad
2c726f6c52 Fix error with days input missing from flight create/edit 2018-03-30 18:25:27 -05:00
Nabeel Shahzad
1cbfdbdac5 don't attempt to convert flight type in flight exporter 2018-03-30 18:08:03 -05:00
Nabeel Shahzad
63544088cd Add validation to importers to fix invalid/empty columns #222 2018-03-30 17:27:29 -05:00
Nabeel Shahzad
bd30b1f900 Check for departure airport restrictions #221 2018-03-30 11:08:53 -05:00
Nabeel Shahzad
35fb6f0e52 Fix 404 for airport lookup 2018-03-30 08:12:11 -05:00
Nabeel Shahzad
36063e2ca6 Fix api call to airport lookup 2018-03-29 20:32:08 -05:00
Nabeel Shahzad
08d3578d38 Add cost_block_hour tests; extra logging 2018-03-29 14:55:25 -05:00
Nabeel Shahzad
2090f05236 Composer dep updates 2018-03-29 14:24:36 -05:00
Nabeel Shahzad
7fbcfa391b block on/off times in FormRequest check 2018-03-29 14:12:25 -05:00
Nabeel Shahzad
2ab4db3a2e Add edit for flight type; block_on_time and block_off_time for PIREP API 2018-03-29 14:10:49 -05:00
Nabeel Shahzad
be6fead812 Switch to yarn; add select2 2018-03-29 13:49:04 -05:00
Nabeel Shahzad
badfcb0e76 Switch to yarn; add select2 2018-03-29 13:48:50 -05:00
Nabeel Shahzad
cf43685740 Add/implement subfleet cost_block_hour and block_time for PIREP API 2018-03-29 13:42:16 -05:00
Nabeel Shahzad
0bf1286c3a Fix error in flight importer 2018-03-29 11:47:37 -05:00
Nabeel Shahzad
184123194b Fix column type for flight_type 2018-03-29 11:38:39 -05:00
Nabeel Shahzad
bc013e31c8 Fix charter cargo name 2018-03-29 11:36:08 -05:00
Nabeel Shahzad
b31384f429 Expand flight types to match IATA SSIM 2018-03-29 11:34:36 -05:00
Nabeel Shahzad
ec553f06c8 Switch to yarn instead of npm 2018-03-29 11:32:49 -05:00
Nabeel Shahzad
95fed87ad4 Fix js deps and airport lookup 2018-03-28 23:04:53 -05:00
Nabeel Shahzad
d5452d6517 split out some more vendor files 2018-03-28 15:51:44 -05:00
Nabeel Shahzad
e366ca9375 More organization of web assets 2018-03-28 14:01:38 -05:00
Nabeel Shahzad
12caa3b214 Some more messing with webpack 2018-03-28 13:39:57 -05:00
Nabeel Shahzad
226c3d0ce2 more asset file cleanup 2018-03-27 18:45:25 -05:00
Nabeel Shahzad
a1a8c6f141 strip unnecessary imports from js app files 2018-03-27 18:18:25 -05:00
Nabeel Shahzad
1518b8d4f7 vendor files 2018-03-27 16:34:55 -05:00
Nabeel Shahzad
999b11deb5 Move sass files out of public to resources/sass 2018-03-27 16:34:37 -05:00
Nabeel Shahzad
30a8028827 delete extra files and pull into vendor file 2018-03-27 15:46:54 -05:00
Nabeel Shahzad
8ad83a5f9f asset cleanup 2018-03-27 14:46:32 -05:00
Nabeel Shahzad
504b33ba2a Add AirspaceMap widget; airport overview page 2018-03-27 11:40:37 -05:00
Nabeel Shahzad
5cbb480f6e Remove Google libs 2018-03-26 15:49:07 -05:00
Nabeel Shahzad
46f49048c8 Remove composer deps 2018-03-26 15:45:57 -05:00
Nabeel Shahzad
5cad037d7d version file name 2018-03-26 15:28:28 -05:00
Nabeel Shahzad
75874e1ed0 Don't delete the import folder in build 2018-03-26 15:26:47 -05:00
Nabeel Shahzad
9387ad1891 fix version file generation 2018-03-26 15:20:25 -05:00
Nabeel Shahzad
ca831170f4 Add different version files based on branch/tag 2018-03-26 15:07:24 -05:00
Nabeel Shahzad
c51b074e32 Keep composer install without wiping 2018-03-26 14:56:03 -05:00
Nabeel Shahzad
c9b58a4d9d Change order of cleanup 2018-03-26 14:48:01 -05:00
Nabeel Shahzad
99142f9fec Fixed merge 2018-03-26 09:35:01 -05:00
Nabeel Shahzad
46e956475a Fix comments 2018-03-26 09:33:45 -05:00
Nabeel Shahzad
5ecfc2d437 Switch to autodiscover for console commands 2018-03-25 16:52:13 -05:00
Nabeel Shahzad
ca2f8e1aa5 Move helper generation to new command 2018-03-25 16:50:48 -05:00
Nabeel Shahzad
204f0b7a10 Build package without dev dependencies 2018-03-25 16:20:49 -05:00
Nabeel Shahzad
699883f2fc Update dependencies, remove ide_helper generating always 2018-03-25 16:19:24 -05:00
Nabeel Shahzad
eefce8bab6 updated composer deps 2018-03-25 09:57:15 -05:00
Nabeel Shahzad
02ae2353d4 Stylesheet changes 2018-03-25 09:38:58 -05:00
Nabeel Shahzad
0671742703 Load subfleet page first, can add aircraft from there #217 2018-03-23 20:30:31 -05:00
Nabeel Shahzad
1eb7e5d59a Fix issue with flight fields not adding correctly 2018-03-23 20:29:37 -05:00
Nabeel Shahzad
33daaf4a35 Add an InternalError type that piggybacks ValidationError 2018-03-23 17:29:54 -05:00
Nabeel Shahzad
f5c492bb7e Sort aircraft by registration 2018-03-23 16:41:09 -05:00
Nabeel Shahzad
c81fc5f25b only output airline icao in subfleet export 2018-03-23 16:38:56 -05:00
Nabeel Shahzad
eb64f268d3 Fix flight field bugs 2018-03-23 15:02:26 -05:00
Nabeel Shahzad
f8f5a71564 Move subfleet add/remove to fleet service for a flight 2018-03-23 14:10:18 -05:00
Nabeel Shahzad
1161106d9c Fix airport field row being inserted and check against airport ID 2018-03-23 12:27:28 -05:00
Nabeel Shahzad
c6f423087d fix failed to error 2018-03-23 10:37:34 -05:00
Nabeel Shahzad
182cb2d33b Change flight_number field to uint 2018-03-22 23:11:59 -05:00
Nabeel Shahzad
49dfa7fc17 Sort flights by flight_number 2018-03-22 22:50:41 -05:00
Nabeel Shahzad
28a44631fc add field values to flight api 2018-03-22 22:48:54 -05:00
Nabeel Shahzad
29b84f9281 Reverse the iata/icao columns for airport import 2018-03-22 22:21:54 -05:00
Nabeel Shahzad
7105e82922 Add days of week to flights table; add to import/export for flights 2018-03-22 21:21:35 -05:00
Nabeel Shahzad
8b53ca2fdc Fix types and codes import 2018-03-22 19:59:35 -05:00
Nabeel Shahzad
112a72ac6f Subfleet exporter #194 2018-03-22 17:59:10 -05:00
Nabeel Shahzad
46d8fb125a Add fare import/exporter #194 2018-03-22 17:48:57 -05:00
Nabeel Shahzad
a44204b185 Import/export expenses #194 2018-03-22 17:17:37 -05:00
Nabeel Shahzad
4e3a9fd9ea Export airports 2018-03-22 13:04:13 -05:00
Nabeel Shahzad
d4f79b1331 Add aircraft export 2018-03-22 12:55:56 -05:00
Nabeel Shahzad
78e70fec3b Fix directory creation path 2018-03-22 12:48:27 -05:00
Nabeel Shahzad
fbfd71adcf Cleanup Exporter; use firstOrCreate for any missing data we can infer/setup defaults for 2018-03-22 12:43:58 -05:00
Nabeel Shahzad
9657e8bd40 Rename import/export, fix tests with parser 2018-03-21 19:12:36 -05:00
Nabeel Shahzad
276b93fc57 Export flights to CSV in admin #194 2018-03-21 17:07:30 -05:00
Nabeel Shahzad
95a7365fee remove unique on update #214 2018-03-21 12:35:06 -05:00
Nabeel Shahzad
dad44db0bc Fix table reference for uniques 2018-03-21 10:34:04 -05:00
Nabeel Shahzad
0dca866f11 Fix unique validation 2018-03-21 09:55:02 -05:00
Nabeel Shahzad
bb5bb4d4c7 Fixed scoping rules in Model classes 2018-03-20 19:40:19 -05:00
Nabeel Shahzad
b9beb6c804 Add importers in console and admin for flights/aircraft/subfleets and airport #194 2018-03-20 19:17:11 -05:00
Nabeel Shahzad
782121829a Fix seeder for flight_subfleet 2018-03-20 16:12:33 -05:00
Nabeel Shahzad
5d5565e5a8 rename flight subfleet join table 2018-03-20 16:11:24 -05:00
Nabeel Shahzad
9e43955fbb rename yaml import/export 2018-03-20 16:10:52 -05:00
Nabeel Shahzad
25a299fb74 Add flight fields for templated fields on edit flight #213 2018-03-20 13:47:47 -05:00
Nabeel Shahzad
485c6e86bb add separate flight_fields table and move over to flight_field_values 2018-03-20 13:06:06 -05:00
Nabeel Shahzad
a9454c319a Add helper field() method to Pirep model 2018-03-20 11:46:48 -05:00
Nabeel Shahzad
712cb185b4 Add a helper method in the Flight model to more easily get a custom value 2018-03-20 11:36:28 -05:00
Nabeel Shahzad
4e59bd0442 view flight bids in flights screen #203 2018-03-20 11:28:06 -05:00
Nabeel Shahzad
06e1cd15c0 Fix database connection test in installer 2018-03-20 09:29:45 -05:00
Nabeel Shahzad
273ccc648d Set some more methods as final in interfaces 2018-03-19 21:01:32 -05:00
Nabeel Shahzad
ccf56ddec1 Fix formatting and interfaces in nearly every file 2018-03-19 20:50:40 -05:00
Nabeel Shahzad
04c5b9e7bf Move Enum base class to App\Interfaces 2018-03-18 21:24:41 -05:00
Nabeel Shahzad
36ea12e135 Move the model callbacks into Observables; reduce caching since it held balances incorrectly 2018-03-18 20:37:35 -05:00
Nabeel Shahzad
6b002f24a8 Store full datetime in post_date; recalculate finances on every pirep 2018-03-17 22:20:08 -05:00
Nabeel Shahzad
6fa724d7b7 Reduce the number of flights created in tests to reduce collisions 2018-03-17 18:45:18 -05:00
Nabeel Shahzad
02a6d0d056 Change the PilotFlightAwards parameter name to be more descriptive #155 2018-03-17 18:38:09 -05:00
Nabeel Shahzad
28d180e850 Change the parameter name into the award check() method #155 2018-03-17 18:19:05 -05:00
Nabeel Shahzad
3a1ee94acf Ordering in ClassLoader 2018-03-17 18:07:42 -05:00
Nabeel Shahzad
776cea7055 Add error handler when trying to invoke in ClassLoader 2018-03-17 18:07:13 -05:00
Nabeel Shahzad
4b7cd6ce6e Splice the logger to use the cron stack for the console 2018-03-17 18:05:51 -05:00
Nabeel Shahzad
67ef6872af Call the AwardListener in the proper UserStatsChanged event #155 2018-03-17 12:55:50 -05:00
Nabeel Shahzad
3c39aeee43 Change rank field from image_link to image_url for consistency 2018-03-17 12:19:26 -05:00
Nabeel Shahzad
e9baf4acb5 Add/edit the award class in Admin #155 2018-03-17 12:17:38 -05:00
Nabeel Shahzad
a21e2dd412 Clean up Award controller in admin #155 2018-03-17 11:39:51 -05:00
Nabeel Shahzad
7feecb507d Add ability to pass in parameters to an Award class #155 2018-03-17 11:35:34 -05:00
Nabeel Shahzad
26f00ccaae Add the event listener for the awards #155 2018-03-17 00:55:39 -05:00
Nabeel Shahzad
31b9195a6e Implement the other functionality for awards #154 2018-03-17 00:18:03 -05:00
Nabeel Shahzad
45a22e26be Merge #154 Awards into dev 2018-03-17 00:03:17 -05:00
Nabeel Shahzad
7dd6a7e7f3 Awards base class and scaffolding #155 2018-03-16 23:59:53 -05:00
Nabeel Shahzad
067fb0f9f0 Implement events for cron expenses; add processing of daily/monthly expenses #136 2018-03-16 20:12:56 -05:00
Nabeel Shahzad
d34de098e5 Add separate redirect config after registration 2018-03-16 11:42:01 -05:00
Nabeel Shahzad
428d016e26 Customize redirect after login 2018-03-16 11:41:18 -05:00
Nabeel Shahzad
15d483b332 Add config to change redirect after login 2018-03-16 11:40:09 -05:00
Nabeel Shahzad
92bb56e344 Add recaptcha implementation #212 2018-03-16 11:38:06 -05:00
Nabeel Shahzad
b9380b2c3a Dependencies for captcha #212 2018-03-16 10:50:04 -05:00
Nabeel Shahzad
ccbc109db2 Add setting to automatically remove bid on PIREP accept #200 2018-03-15 18:20:07 -05:00
Nabeel Shahzad
58fbbd98a4 url param was missing 2018-03-14 19:54:58 -05:00
Nabeel Shahzad
2aae789e2a Make sure inline scripts in admin all have the full base url 2018-03-14 18:14:35 -05:00
Nabeel Shahzad
e5ff927f7d Add bid was missing url() call to put the URL correctly 2018-03-14 10:40:57 -05:00
Nabeel Shahzad
afd7aebe20 Allow the fares to be submitted via API for ACARS #125 2018-03-14 10:34:41 -05:00
Nabeel Shahzad
7148f27d33 Find/replace the LoadConfiguration class #163 2018-03-14 09:46:02 -05:00
Nabeel Shahzad
6975167a77 formatting to js standard 2018-03-14 09:07:41 -05:00
Nabeel Shahzad
57cddee3fd Cleanup the api_key and csrf_token setters 2018-03-13 01:55:14 -05:00
Nabeel Shahzad
684ee545cf include csrf token and fix escaping for admin scripts 2018-03-13 01:48:47 -05:00
Nabeel Shahzad
bff80c2dc7 Change user bid to POST 2018-03-13 01:26:27 -05:00
Nabeel Shahzad
acb289f6d0 Make sure login uses Form to get the csrf token 2018-03-12 22:17:58 -05:00
Nabeel Shahzad
05655632cc Update ssri npm package bc of vulnerability 2018-03-12 20:20:59 -05:00
Nabeel Shahzad
1896e1cc35 Configure axios library and read the api-key dynamically 2018-03-12 20:14:55 -05:00
Nabeel Shahzad
0f9ce8bbb9 Frontend maps to use the commonjs compiled files 2018-03-12 18:10:35 -05:00
Nabeel Shahzad
8076c2d8c1 Fixing XSS vulnerability by using the proper output tags 2018-03-12 17:58:12 -05:00
Nabeel Shahzad
17f9464208 first pass splitting js into commonjs modules 2018-03-12 17:30:52 -05:00
Nabeel Shahzad
843cf26140 Add Axios dependency 2018-03-12 11:00:12 -05:00
Nabeel Shahzad
a3264c1cd1 re-enable csrf token for forms 2018-03-12 10:33:46 -05:00
Nabeel Shahzad
46452edf55 Include Theme as facade 2018-03-11 22:26:19 -05:00
Nabeel Shahzad
d90e118f56 Move vaCentral config to its own config file and ServiceProvider 2018-03-11 18:14:34 -05:00
Nabeel Shahzad
7cc3fc6a3a Remove the phpvms.skin config, use theme instead 2018-03-11 18:05:53 -05:00
Nabeel Shahzad
98ebd5e358 Remove the skin_view() call from base Controller class 2018-03-11 18:03:15 -05:00
Nabeel Shahzad
f05e37767f Update skinning with more flexible theme module 2018-03-11 18:00:42 -05:00
Nabeel Shahzad
03c15473b9 remove with() 2018-03-11 17:22:25 -05:00
Nabeel Shahzad
df8f6372f1 Fix issue with SKIN_NAME being undefined 2018-03-11 10:55:20 -05:00
Nabeel Shahzad
2ec7bc1caa dependency updates 2018-03-11 10:39:49 -05:00
Nabeel Shahzad
4f8f82f69f find proper rank when assigning subfleet 2018-03-09 13:03:43 -06:00
Nabeel Shahzad
724daabc5a Fix error with adding rank 2018-03-09 10:24:22 -06:00
Nabeel Shahzad
83f0f1bfe3 Fix notification events callers 2018-03-09 08:52:55 -06:00
Nabeel Shahzad
aac355b077 Fix boot magic name in trait 2018-03-08 08:56:27 -06:00
Nabeel Shahzad
f13c961863 Fix flight page errors and some naming fixes 2018-03-08 08:51:36 -06:00
Nabeel Shahzad
fefc6bc22a Add back in --base-only to version generation 2018-03-08 08:16:42 -06:00
Nabeel Shahzad
d42bfc7aae Fix version number generation 2018-03-07 10:24:29 -06:00
Nabeel Shahzad
dc2570a408 Rename the PirepService class 2018-03-06 17:36:06 -06:00
Nabeel Shahzad
a325470b8f Aircraft can have its own expenses #130 2018-03-06 17:32:56 -06:00
Nabeel Shahzad
c7925db0e7 Add field to charge an expense to a user #130 2018-03-06 17:15:42 -06:00
Nabeel Shahzad
dad923489b Set tags on transactions #130 2018-03-06 06:40:49 -06:00
Nabeel Shahzad
453ca5b180 Cleanup the transaction memos 2018-03-06 06:17:45 -06:00
Nabeel Shahzad
9d3953f3ac Refactor expenses; move finance service classes; add daily/monthly skeletons #130 #136 2018-03-05 22:49:42 -06:00
Nabeel Shahzad
db10ebf807 Add expenses on airports as well #130 #136 2018-03-05 22:10:00 -06:00
Nabeel Shahzad
88a8fd2bbd Remove subfleet_expenses and combine into main expenses table; select expense type on subfleet #130 #136 2018-03-05 21:24:49 -06:00
Nabeel Shahzad
8c05ad134e Move images to right directory 2018-03-05 21:23:17 -06:00
Nabeel Shahzad
505931736c Finance overview page added to admin with monthly breakdown #130 2018-03-05 19:55:48 -06:00
Nabeel Shahzad
01af6f6855 finance link on menu 2018-03-05 14:36:14 -06:00
Nabeel Shahzad
8b163348a2 Cleanup comments 2018-03-05 14:19:14 -06:00
Nabeel Shahzad
53e4bf533f Add finance controller; morphable expense type so they can be applied to any model #130 2018-03-05 14:18:54 -06:00
Nabeel Shahzad
33c2ee702b Cleanup subfleet expense name; reload page on recalculate #130 2018-03-05 13:15:47 -06:00
Nabeel Shahzad
a7a70ce423 Added refresh finances button to transactions list #130 2018-03-05 13:07:10 -06:00
Nabeel Shahzad
96e8fbfa78 Add subfleet specific expenses, fixed bug for pirep fares #130 #136 2018-03-05 12:21:38 -06:00
Nabeel Shahzad
bf94a20e57 Set the default email driver to the default php mail 2018-03-05 09:21:40 -06:00
Nabeel Shahzad
65940c6df2 Updated composer reqs 2018-03-05 09:18:31 -06:00
Nabeel Shahzad
56f5276bae update symfony version deps 2018-03-04 15:07:28 -06:00
Nabeel Shahzad
454b2b488b Add transaction group filter 2018-03-04 09:45:23 -06:00
Nabeel Shahzad
2eb0f76f32 Fix sample data removing extra expenses #130 2018-03-02 17:52:20 -06:00
Nabeel Shahzad
9424bf7c46 Fix finding expenses call #130 2018-03-02 17:48:36 -06:00
Nabeel Shahzad
fa5237179b Remove balance field from user table #130 2018-03-02 17:31:58 -06:00
Nabeel Shahzad
586769fbf0 Fix tests and docs/better checks #130 2018-03-02 17:29:11 -06:00
Nabeel Shahzad
2df09c533b show transactions in pirep 2018-03-02 16:09:48 -06:00
Nabeel Shahzad
9d65515290 Add index of ref class+id #130 2018-03-02 13:15:18 -06:00
Nabeel Shahzad
607367feb2 Replace the ref_class_id 2018-03-02 13:14:20 -06:00
Nabeel Shahzad
9f89447070 Add pilot pay to journals; cleanup payment code #130 2018-03-02 13:12:39 -06:00
Nabeel Shahzad
284db21a3a Hide API key from admin 2018-03-02 09:26:25 -06:00
Nabeel Shahzad
02374dcd57 Update balance in callbacks 2018-03-01 22:00:11 -06:00
Nabeel Shahzad
92a18448eb YAML table exporter 2018-03-01 21:59:58 -06:00
Nabeel Shahzad
a3305249a6 Test for credits and debits with fixed amounts 2018-03-01 19:15:55 -06:00
Nabeel Shahzad
f9208c9d72 Don't throw exception is journal exists #130 2018-03-01 18:59:24 -06:00
Nabeel Shahzad
2c52a2f7e6 Post fares/expenses on PIREP to Airline journal #130 2018-03-01 16:20:13 -06:00
Nabeel Shahzad
f1b9ea94dc Use morphed column types 2018-03-01 09:51:48 -06:00
Nabeel Shahzad
d22eed50ad Add test to get the balance group #130 2018-02-28 21:54:58 -06:00
Nabeel Shahzad
498e795e4b Fixes and tests for the journal and journaled transactions #130 2018-02-28 21:52:36 -06:00
Nabeel Shahzad
1794549a20 Move journal transaction code to repository #130 2018-02-28 19:04:56 -06:00
Nabeel Shahzad
d1fcecf873 Change to getValue() on Money class 2018-02-28 18:17:15 -06:00
Nabeel Shahzad
f557e9f965 Add ledger and journal tables #130 2018-02-28 18:01:32 -06:00
Nabeel Shahzad
7ffef849d2 Remove useless tests 2018-02-28 15:42:43 -06:00
Nabeel Shahzad
448a9846c9 Implement airport hub restriction closes #104 2018-02-28 15:37:24 -06:00
Nabeel Shahzad
3188f356eb Add setting for home airport restriction #104 2018-02-28 15:27:46 -06:00
Nabeel Shahzad
e7868868c4 Fix the module stubs and sample module for admin closes #201 2018-02-28 15:16:36 -06:00
Nabeel Shahzad
208b6e73dc Don't overwrite pagination counts, let it default to the config #162 2018-02-28 15:06:57 -06:00
Nabeel Shahzad
6993cba55a Don't change rank if it seems like it's been manually changed by an admin #196 2018-02-28 15:01:23 -06:00
Nabeel Shahzad
e03abc1a64 Moved away from the phpmoney library since it requires intl extension 2018-02-28 13:54:14 -06:00
Nabeel Shahzad
777bd5e26d Return the pay in Money() format 2018-02-28 13:34:49 -06:00
Nabeel Shahzad
a6afcc944c Add Money composition class to Support 2018-02-27 21:38:05 -06:00
Nabeel Shahzad
ae0c3c5f27 Get the pilot pay, reconcile with values for subfleet overrides 2018-02-27 16:16:40 -06:00
Nabeel Shahzad
bb4fdc5b7f cleanup if on table 2018-02-27 14:30:31 -06:00
Nabeel Shahzad
dfa6d6da51 Split rank pay rate into separate rates for acars and manual flights 2018-02-27 14:29:45 -06:00
Nabeel Shahzad
81b867fa20 Add bid expire time 2018-02-27 14:23:09 -06:00
Nabeel Shahzad
3aa4b8a410 Cleanup and move subfleet/rank settings to FleetService class 2018-02-27 14:12:03 -06:00
Nabeel Shahzad
f0977b48e5 alt_airports missing in flight create 2018-02-27 13:38:11 -06:00
Nabeel Shahzad
baccf7e3ad Fix the flight time not showing closes #199 2018-02-27 13:37:29 -06:00
Nabeel Shahzad
97764866f2 Rename user_bids table to bids 2018-02-27 13:25:32 -06:00
Nabeel Shahzad
c89926399b Delete a bid by either the bid_id or the flight_id 2018-02-27 13:14:58 -06:00
Nabeel Shahzad
a38b4e063b Return the flight object with the bid 2018-02-27 13:11:48 -06:00
Nabeel Shahzad
4c22a098c1 remove QSA, seems to cause problems 2018-02-27 12:32:58 -06:00
Nabeel Shahzad
18aa573a16 remove extra libs 2018-02-26 20:30:50 -06:00
Nabeel Shahzad
d61ade4482 move currency to config file; change units to their own group in settings 2018-02-26 20:23:48 -06:00
Nabeel Shahzad
920b92c096 Update node and package deps 2018-02-26 19:44:10 -06:00
Nabeel Shahzad
10a2084163 Shrink left nav margins in admin 2018-02-26 19:43:42 -06:00
Nabeel Shahzad
e6d78f3e22 cleanup some templates 2018-02-26 19:23:22 -06:00
Nabeel Shahzad
cdd5fc749c Add the acars and manual payrates in the rank/subfleet forms 2018-02-26 19:14:10 -06:00
Nabeel Shahzad
f6ec647eb6 Add base payrate field for ranks 2018-02-26 17:56:30 -06:00
Nabeel Shahzad
4a73a5a6b3 Add table/models and admin for expenses #136 2018-02-26 15:16:12 -06:00
Nabeel Shahzad
286ed78436 Add RewriteBase and QSA to htaccess 2018-02-26 12:35:15 -06:00
Nabeel Shahzad
4393523929 Fix some error conditions in installer; hide passwords in logs 2018-02-25 15:27:20 -06:00
Nabeel Shahzad
d9abaa2f06 Cleanup config files if the db setup fails 2018-02-25 15:13:04 -06:00
Nabeel Shahzad
88e4c26b8f db host placeholder 2018-02-25 15:02:50 -06:00
Nabeel Shahzad
f20cfb53a6 laravel/composer deps updates 2018-02-25 11:23:52 -06:00
Nabeel Shahzad
82b5ff620d put a minimal config for installer into config dir 2018-02-25 11:12:27 -06:00
Nabeel Shahzad
44f839e104 Fix module provider sub 2018-02-25 11:12:01 -06:00
Nabeel Shahzad
3bbcd2a20d fix pirep ids in sample; rename navs to flight reports 2018-02-24 16:05:00 -06:00
Nabeel Shahzad
d0b3b27975 Remove the flight_id column from the pireps table 2018-02-24 15:51:04 -06:00
Nabeel Shahzad
7345dd8076 change some of the sample data 2018-02-24 15:47:43 -06:00
Nabeel Shahzad
2e57f84657 Add sample data for pirep fares #125 2018-02-24 15:45:43 -06:00
Nabeel Shahzad
58e0f50c48 specify fares, js to dynamically change fare form; get applicable fares for the flight/pirep #125 2018-02-24 15:38:25 -06:00
Nabeel Shahzad
910c0e0eab Convert aircraft active to more detailed status #134 2018-02-23 16:37:10 -06:00
Nabeel Shahzad
709aec83e2 Add multiplier to factory #134 2018-02-23 16:07:53 -06:00
Nabeel Shahzad
db94f5b405 Add a ground_handling_multiplier to the subfleet table #134 2018-02-23 16:00:14 -06:00
Nabeel Shahzad
4142d5d28a Add ground_handling_cost to airport #134 2018-02-23 15:48:50 -06:00
Nabeel Shahzad
b8b4fe7a8a Add percentages as part of sample data #125 2018-02-23 15:34:14 -06:00
Nabeel Shahzad
d5aef6fb87 Allow setting percent for fare overrides against base fare #125 2018-02-23 15:12:09 -06:00
Nabeel Shahzad
dd144cc9bc Update changelog 2018-02-23 11:47:57 -06:00
Nabeel Shahzad
7eef7f6cfe Remove extra header from changelog 2018-02-22 17:00:26 -06:00
Nabeel Shahzad
6332bfc6f3 Updated CHANGELOG 2018-02-22 16:38:58 -06:00
Nabeel Shahzad
b2d91ba4c9 Show how pirep was filed in list/edit 2018-02-22 15:29:25 -06:00
Nabeel Shahzad
53b0bbd936 Convert errors into HttpException calls 2018-02-22 15:15:00 -06:00
Nabeel Shahzad
3748ab77d2 Fix aircraft active/inactive states 2018-02-22 14:59:09 -06:00
Nabeel Shahzad
8931f4e271 Change pirep action colors 2018-02-22 14:55:42 -06:00
Nabeel Shahzad
10b0798a30 Cleanup info callouts into components 2018-02-22 14:21:00 -06:00
Nabeel Shahzad
67f6dfc2f4 Cleanup of icons and removed ones not used #195 2018-02-22 13:28:12 -06:00
Nabeel Shahzad
fc381da21b Clean JS in admin to use const/let instead of var 2018-02-22 11:47:28 -06:00
Nabeel Shahzad
98eef1eb12 Update vendor files with font change 2018-02-22 11:44:19 -06:00
Nabeel Shahzad
72c3191c02 Copyright/license update 2018-02-22 11:37:47 -06:00
Nabeel Shahzad
ad5f36f85e Cleanup frontend user bid add/remove to use the API, script and html cleanup #172 2018-02-22 11:34:57 -06:00
Nabeel Shahzad
6dfab75f08 Add api routes to get/add/remove bids for a user #172 2018-02-22 10:44:15 -06:00
Nabeel Shahzad
e176772512 Rename system.js to phpvms.js to make it clearer 2018-02-22 10:14:45 -06:00
Nabeel Shahzad
487b7480af Refactor how errors are handled 2018-02-22 10:14:12 -06:00
Nabeel Shahzad
5d2ef3a9d3 Fix wrong Exception being thrown 2018-02-22 09:41:23 -06:00
Nabeel Shahzad
7b68642fa3 Checkboxes are the bane of my existence closes #181 2018-02-22 09:36:07 -06:00
Nabeel Shahzad
abf47274a1 Cleanup some class names; move acars data into separate seed file 2018-02-22 09:31:07 -06:00
Nabeel Shahzad
3abf38ab93 Return string if not multi-value; add delete_previous flag #194 2018-02-21 21:42:47 -06:00
Nabeel Shahzad
9ed370693d First pass at csv column parsing for kvp as values #194 2018-02-21 21:38:35 -06:00
Nabeel Shahzad
964ea904a1 Make sure the subfleet type field doesn't have spaces 2018-02-21 20:18:50 -06:00
Nabeel Shahzad
1a54aadc19 Make sure the subfleet name doesn't have spaces 2018-02-21 20:16:49 -06:00
Nabeel Shahzad
7872a6a442 Remove debug stuff in xml converter 2018-02-21 15:25:58 -06:00
Nabeel Shahzad
9dfdc8195d Add flight log to both frontend and admin pirep edit view 2018-02-21 15:24:46 -06:00
Nabeel Shahzad
77055991af Get the correct ordering for flight route on map 2018-02-21 15:15:12 -06:00
Nabeel Shahzad
ec9d00c597 Fix map centering 2018-02-21 15:07:44 -06:00
Nabeel Shahzad
a18c00ee95 Convert sequelpro xml to yaml for import 2018-02-21 15:02:24 -06:00
Nabeel Shahzad
713fd66da6 Fix timezone not populating from lookup closes #182 2018-02-21 14:36:41 -06:00
Nabeel Shahzad
ea09a18956 Fixed formatting of almost every file 2018-02-20 22:33:09 -06:00
Nabeel Shahzad
c5b6ca53fa Redirect subfleet create to edit page 2018-02-20 21:55:01 -06:00
Nabeel Shahzad
14d04604cb Add ranks from the subfleet edit page closes #160 2018-02-20 21:53:50 -06:00
Nabeel Shahzad
1c143f3b23 subfleet table fix and edit in name 2018-02-20 21:30:36 -06:00
Nabeel Shahzad
bac829b425 Shrink decimal field sizes as they're overly large 2018-02-20 15:57:31 -06:00
Nabeel Shahzad
7185f6cedf Restrict max number in factory, might be hitting 32 bit limit in tests 2018-02-20 15:41:05 -06:00
Nabeel Shahzad
8386951511 Rename toInt to toNumber 2018-02-20 15:32:49 -06:00
Nabeel Shahzad
b9e88527dd Unit conversion fixes #193 2018-02-20 14:23:02 -06:00
Nabeel Shahzad
aeacd80bcb Check aircraft permissions in PIREP update/file 2018-02-20 14:14:20 -06:00
Nabeel Shahzad
653711fa96 Change volume units to be in lbs/kg closes #193 2018-02-20 14:07:33 -06:00
Nabeel Shahzad
463de8d7e7 Make sure the rank restriction disabled works closes #170 2018-02-20 13:28:53 -06:00
Nabeel Shahzad
4e43223f3a Refuse pirep prefile is user not allowed to use aircraft #170 2018-02-20 12:59:49 -06:00
Nabeel Shahzad
8393ae2851 Add /flight/:id/route resource, returns all route info that's in the navaid database closes #183 2018-02-20 12:06:52 -06:00
Nabeel Shahzad
fdf18cf533 Remove raw_data field from pireps closes #188 2018-02-20 11:17:34 -06:00
Nabeel Shahzad
5ee8c1e779 level not required in prefile; distance required in file 2018-02-20 11:12:50 -06:00
Nabeel Shahzad
2955f93573 Fix a few items in composer.json 2018-02-19 21:56:41 -06:00
Nabeel Shahzad
bc8c5e581c Updated lock file 2018-02-19 20:58:32 -06:00
Nabeel Shahzad
ad4259625c Add flight time to flight create/edit form 2018-02-19 13:33:26 -06:00
Nabeel Shahzad
246c828d7a Remove extra level field and fix documentation link 2018-02-19 11:26:11 -06:00
Nabeel Shahzad
3d55fc09f7 Add options field on setting data import 2018-02-19 11:19:18 -06:00
Nabeel Shahzad
1bb77e1d4b Upgrade to Laravel 5.6 #165 2018-02-19 11:09:56 -06:00
Nabeel Shahzad
3d9d17d9b9 Add call to get user's PIREPs #192 2018-02-19 10:35:49 -06:00
Nabeel Shahzad
5c58dfe1ae generate a hex code for an aircraft on creation #33 2018-02-12 20:58:23 -06:00
Nabeel Shahzad
2678514077 API: Only show active airlines 2018-02-12 12:05:10 -06:00
Nabeel Shahzad
ee71f4a1c8 Remove tail_number field from aircraft 2018-02-12 11:03:25 -06:00
Nabeel Shahzad
62506a26a1 set country on the airline, in admin and installer #191 2018-02-12 10:51:04 -06:00
Nabeel Shahzad
61dc0a046d Fix rank image field 2018-02-12 10:26:27 -06:00
Nabeel Shahzad
c817d1ae4b Installer fixes 2018-02-12 09:47:12 -06:00
Nabeel Shahzad
ecfda6de15 Add collision for test listeners and remove one old dep 2018-02-12 09:02:05 -06:00
Nabeel Shahzad
2f8a69b774 Undo casting time types to Time object #189 2018-02-11 20:50:48 -06:00
Nabeel Shahzad
61af5fe226 Cleanup column types and assign Time class to fields #189 2018-02-11 20:38:56 -06:00
Nabeel Shahzad
fd4407a798 Move internal unit definitions to config file #189 2018-02-11 20:19:02 -06:00
Nabeel Shahzad
4eef254688 set nautical miles as the default mass unit #189 2018-02-11 19:58:07 -06:00
Nabeel Shahzad
d5c2d25c74 finally fixed serialization of conversions #189 2018-02-10 22:49:08 -06:00
Nabeel Shahzad
0700c96901 fix serialization of converter classes #189 2018-02-10 22:30:42 -06:00
Nabeel Shahzad
9b9a20b437 set default storage unit #189 2018-02-10 22:18:07 -06:00
Nabeel Shahzad
f14a9e3ba1 implements ArrayAccess for casting to type #189 2018-02-10 22:04:30 -06:00
Nabeel Shahzad
cb02a7c15e add Time support class #189 2018-02-10 21:36:13 -06:00
Nabeel Shahzad
a8e06c6cc6 base conversion classes for units #189 2018-02-10 21:16:32 -06:00
Nabeel Shahzad
176855b680 check if airport exists 2018-02-10 20:30:11 -06:00
Nabeel Shahzad
3aa01aaa18 tests check the data object in return #186 2018-02-10 18:17:38 -06:00
Nabeel Shahzad
04d44d9bd7 Add SKIN_NAME to error message pages #187 2018-02-10 17:58:11 -06:00
Nabeel Shahzad
762544ea6f don't change rank if it's not auto promoted #168 2018-02-10 17:53:25 -06:00
Nabeel Shahzad
2a289e0468 pirep route wrap the data object #186 2018-02-10 17:48:51 -06:00
Nabeel Shahzad
21e13b6b92 make sure resources return the data object #186 2018-02-10 17:34:46 -06:00
Nabeel Shahzad
e57fb5a7c6 Move code of conduct to wiki 2018-02-10 17:31:59 -06:00
Nabeel Shahzad
5a89b4f194 write the route if it hasn't been set by acars #184 2018-02-10 16:10:19 -06:00
Nabeel Shahzad
7a6b228d8f make planned_distance optional #185 2018-02-10 16:02:15 -06:00
Nabeel Shahzad
fbd73b0717 make planned_distance optional #185 2018-02-10 16:00:43 -06:00
Nabeel Shahzad
7a527f2ed3 Set access modifier on all enums (php 7.1) 2018-02-10 14:06:25 -06:00
Nabeel Shahzad
e6290c3396 set pirep source to acars #177 2018-02-10 13:41:24 -06:00
Nabeel Shahzad
8acb9291fe hide all cancelled pireps #180 2018-02-10 13:25:40 -06:00
Nabeel Shahzad
3ded06390c ignore cancelled pireps in dupe check #179 2018-02-10 13:12:12 -06:00
Nabeel Shahzad
936bceba5d Add --reset-db flag to phpvms:dev-install command #176 2018-02-09 17:16:52 -06:00
Nabeel Shahzad
d94294e3f6 Added new phpvms:dev-install command #176 2018-02-09 17:11:55 -06:00
Nabeel Shahzad
390f08d25f Cleanup the sample env.php file 2018-02-09 16:36:02 -06:00
Nabeel Shahzad
f0d2b4ed2f update changelog 2018-02-09 15:44:36 -06:00
Nabeel Shahzad
80cd80a5cf Change the filtering to operate without being in the service layer #174 2018-02-09 15:42:37 -06:00
Nabeel Shahzad
17f1085ffb Filter out flights depending on the only_flights_from_current setting #174 2018-02-09 15:36:13 -06:00
Nabeel Shahzad
9b55a9691f Setting which filters out aircraft not at the departure airport #171 2018-02-09 15:07:34 -06:00
Nabeel Shahzad
13b4a3854b move filterSubfleets() to FlightService class #170 2018-02-09 14:36:36 -06:00
Nabeel Shahzad
f6b2102e48 fix bug where aircraft restrictions aren't respected in flight calls #170 2018-02-09 14:26:14 -06:00
Nabeel Shahzad
71189e4f2d Change most APIs to require API key #173 2018-02-09 13:20:35 -06:00
Nabeel Shahzad
041cef91de Refactor how settings are added to generate the offsets and order 2018-02-09 12:57:00 -06:00
Nabeel Shahzad
2a0e97c043 update composer 2018-02-08 19:16:03 -06:00
Nabeel Shahzad
bcc6be0d29 Updates for addon/modules to make it easier to create APIs 2018-02-08 19:11:53 -06:00
Nabeel Shahzad
b4ea82f327 Cleanup of the test classes and remove superfluous dependencies 2018-02-08 11:07:21 -06:00
Nabeel Shahzad
48346ae805 Use migrate:fresh instead of refresh 2018-02-07 10:37:54 -06:00
Nabeel Shahzad
b5dbde84c4 Fix rank image link field to be string 2018-02-06 14:09:20 -06:00
Nabeel Shahzad
e69d9f4c38 Add pirep fields to the API response; add tests for setting/getting them 2018-02-06 13:59:40 -06:00
Nabeel Shahzad
de0c71cb06 Set fields to pireps in prefile/update calls 2018-02-06 13:46:23 -06:00
Nabeel Shahzad
8b2eddc72d Travis build distros on PHP 7.1 2018-02-06 13:13:45 -06:00
Nabeel Shahzad
cf286986e2 change variable name 2018-02-06 13:13:00 -06:00
Nabeel Shahzad
7d8dc2a4d4 Cleanup factories and seed data for airport timezone column change 2018-02-06 13:11:42 -06:00
Nabeel Shahzad
531c7ddba3 Set hours to read-only once they've changed away from PENDING #167 2018-02-06 12:58:48 -06:00
Nabeel Shahzad
ac0058e951 Some more attribute cleanup 2018-02-06 12:01:55 -06:00
Nabeel Shahzad
56bf277fe0 Add shorthands for timezone to tz 2018-02-06 11:02:40 -06:00
Nabeel Shahzad
1cc999a4f9 Change Airport tz field to timezone 2018-02-06 10:59:31 -06:00
Nabeel Shahzad
c6b1a475e9 Add timezone aliases 2018-02-06 10:33:39 -06:00
Nabeel Shahzad
8d76e16220 Add the validation error fields in the templates 2018-02-06 10:18:22 -06:00
Nabeel Shahzad
995d53df3e Set slug properly on pirep field and fix validation 2018-02-06 10:02:34 -06:00
Nabeel Shahzad
282421deb8 Add a /update to update an install #164 2018-02-05 16:16:24 -06:00
Nabeel Shahzad
eebf7871cb Cleanup composer file and reqs in readme #166 2018-02-05 13:26:54 -06:00
Nabeel Shahzad
9d46cee07a Bump minimum PHP version to 7.1; library cleanup #166 2018-02-05 11:29:50 -06:00
Servetas George
78724e981c Awards Administration 2018-01-28 21:19:35 +02:00
1464 changed files with 117424 additions and 90294 deletions

7
.eslintignore Normal file
View File

@@ -0,0 +1,7 @@
.travis/*
.idea/*
.vscode/*
node_modules/*
public/*
gulpfile.js
webpack.mix.js

25
.eslintrc Normal file
View File

@@ -0,0 +1,25 @@
{
"extends": "airbnb",
"env": {
"es6": true,
"mocha": true
},
"parserOptions": {
"ecmaVersion": 8
},
"rules": {
"camelcase": 0,
"no-param-reassign": [
2,
{
"props": false
}
],
"import/no-extraneous-dependencies": [
"error",
{
"devDependencies": true
}
]
}
}

3
.gitignore vendored
View File

@@ -3,7 +3,8 @@ _ide_helper.php
/vendor
node_modules/
npm-debug.log
composer.phar
yarn-error.log
*.bak
# Laravel 4 specific

31
.styleci.yml Normal file
View File

@@ -0,0 +1,31 @@
preset: recommended
risky: true
enabled:
- align_double_arrow_minimal
# - align_equals_minimal
# - date_time_immutable
- ereg_to_preg
- function_to_constant
# - mb_str_functions
- modernize_types_casting
# - native_function_invocation
- no_blank_lines_after_return
- no_homoglyph_names
- no_php4_constructor
- no_useless_else
- phpdoc_add_missing_param_annotation
disabled:
- align_double_arrow
- blank_line_before_return
# - hash_to_slash_comment
- phpdoc_summary
- phpdoc_var_without_name
# - unalign_equals
finder:
exclude:
- modules
- node_modules
- storage
- vendor
name: "*.php"
not-name: "*.blade.php"

View File

@@ -1,8 +1,8 @@
language: php
php:
- '7.0'
#- '7.0'
- '7.1'
#- '7.2'
- '7.2'
#- nightly
cache:
@@ -12,11 +12,10 @@ cache:
services:
- mysql
#- redis-server
before_script:
- cp .travis/env.travis.php env.php
- composer install --no-interaction --verbose
- composer install --dev --no-interaction --verbose
script:
- php artisan database:create --reset
@@ -39,7 +38,7 @@ jobs:
script: ./.travis/deploy_script.sh
on:
all_branches: true
php: '7.0'
php: '7.1'
- stage: release
script: skip
before_deploy:
@@ -55,4 +54,4 @@ jobs:
on:
tags: true
repo: nabeelio/phpvms
php: '7.0'
php: '7.1'

27
.travis/Formatting.xml Normal file
View File

@@ -0,0 +1,27 @@
<code_scheme name="PHPVMS" version="173">
<option name="RIGHT_MARGIN" value="100" />
<PHPCodeStyleSettings>
<option name="ALIGN_KEY_VALUE_PAIRS" value="true" />
<option name="LOWER_CASE_BOOLEAN_CONST" value="true" />
<option name="LOWER_CASE_NULL_CONST" value="true" />
<option name="ALIGN_CLASS_CONSTANTS" value="true" />
<option name="FORCE_SHORT_DECLARATION_ARRAY_STYLE" value="true" />
</PHPCodeStyleSettings>
<XML>
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
</XML>
<codeStyleSettings language="JAVA">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JSON">
<indentOptions>
<option name="INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="PHP">
<option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
<option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" />
</codeStyleSettings>
</code_scheme>

View File

@@ -28,40 +28,92 @@ if [ "$TRAVIS" = "true" ]; then
echo "Cleaning files"
make clean
rm -rf vendor
composer install --no-dev --prefer-dist --no-interaction --verbose
# Clean up the dependencies to remove some of the dev packages
# declare -a remove_packages=(
# 'barryvdh/laravel-ide-helper'
# 'bpocallaghan/generators'
# 'codedungeon/phpunit-result-printer'
# 'fzaninotto/faker'
# 'nikic/php-parser'
# 'phpstan/phpstan'
# 'phpunit/phpunit',
# 'weebly/phpstan-laravel'
# )
#
# for pkg in "${remove_packages[@]}"
# do
# composer --optimize-autoloader --no-interaction remove $pkg
# done
# Leftover individual files to delete
declare -a remove_files=(
.git
.sass-cache
.idea
.travis
tests
_ide_helper.php
.dpl
.eslintignore
.eslintrc
.phpstorm.meta.php
.styleci.yml
env.php
config.php
Makefile
phpunit.xml
phpvms.iml
Procfile
phpstan.neon
node_modules
composer.phar
vendor/willdurand/geocoder/tests
)
for file in "${remove_files[@]}"
do
rm -rf $file
done
rm -rf env.php config.php
find ./vendor -type d -name ".git" -print0 | xargs rm -rf
find . -type d -name "sass-cache" -print0 | xargs rm -rf
# clear any app specific stuff that might have been loaded in
find storage/app -mindepth 1 -not -name '.gitignore' -not -name public -not -name import -print0 -exec rm -rf {} +
find storage/app/public -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} +
find storage/app -mindepth 1 -not -name '.gitignore' -not -name public -print0 -exec rm -rf {} +
find storage/framework/cache -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} +
find storage/framework/sessions -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} +
find storage/framework/views -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} +
find storage/logs -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} +
# Remove any development files
rm -rf .sass-cache
rm -rf .idea phpvms.iml .travis .dpl
rm -rf .phpstorm.meta.php _ide_helper.php phpunit.xml Procfile
make clean
# remove large sized files
rm -rf .git
rm -rf node_modules
rm -rf composer.phar
# delete files in vendor that are rather large
rm -rf vendor/willdurand/geocoder/tests
echo "creating tarball"
echo "Creating Tarball"
cd /tmp
tar -czf $TAR_NAME -C $TRAVIS_BUILD_DIR/../ phpvms
sha256sum $TAR_NAME > "$TAR_NAME.sha256"
echo "uploading to s3"
echo "Uploading to S3"
mkdir -p $TRAVIS_BUILD_DIR/build
cd $TRAVIS_BUILD_DIR/build
mv "/tmp/$TAR_NAME" "/tmp/$TAR_NAME.sha256" .
artifacts upload --target-paths "/" $TAR_NAME $TRAVIS_BUILD_DIR/VERSION $TAR_NAME.sha256
# Upload the version for a tagged release. Move to a version file in different
# tags. Within phpVMS, we have an option of which version to track in the admin
if test "$TRAVIS_TAG"; then
echo "Uploading release version file"
cp "$TRAVIS_BUILD_DIR/VERSION" release_version
artifacts upload --target-paths "/" release_version
else
echo "Uploading ${TRAVIS_BRANCH}_version file"
cp $TRAVIS_BUILD_DIR/VERSION ${TRAVIS_BRANCH}_version
artifacts upload --target-paths "/" ${TRAVIS_BRANCH}_version
fi
curl -X POST --data "{\"content\": \"A new build is available at http://downloads.phpvms.net/$TAR_NAME ($VERSION)\"}" -H "Content-Type: application/json" $DISCORD_WEBHOOK_URL
fi

View File

@@ -18,6 +18,9 @@
<directory suffix=".php">./app</directory>
</whitelist>
</filter>
<listeners>
<listener class="NunoMaduro\Collision\Adapters\Phpunit\Listener"/>
</listeners>
<php>
<ini name="error_reporting" value="E_ALL"/>
<ini name="display_errors" value="On"/>

View File

@@ -1,8 +1,72 @@
# Changelog
## Alpha 3
## [Unreleased]
!! Please do a complete reinstall, with a new database
## 7.0.0-alpha1
- Finances! The finance portions have been implemented, you can [read about them here](http://docs.phpvms.net/concepts/finances)
- Awards! Added the award plugin system. [see docs](http://docs.phpvms.net/customizing/awards)
- Import/Export in admin panel for aircraft, airports, expenses, fares, flights and subfleets
- Changed theme system to using [laravel-theme](https://github.com/igaster/laravel-theme), there are changes to making theming much simpler with much more flexibility.
- Added cron task for background tasks
- Expanded on flight types to match IATA SIMM format
- Added subfleet `cost_block_hour`
- Fixed several security vulnerabilities (thanks magicflyer!)
- Fuel units changed to lbs/kgs [#193](https://github.com/nabeelio/phpvms/issues/193)
- Airports can be restricted to only hubs on registration/user profile
- Cleaned up a lot unused icons and files [#195](https://github.com/nabeelio/phpvms/issues/195)
- Rank restrictions for PIREPs are respected [#170](https://github.com/nabeelio/phpvms/issues/170)
- API: Added the ability to get/update/delete user bids [#172](https://github.com/nabeelio/phpvms/issues/172)
- API: Added `block_time` parameter for PIREP prefile/update/file calls
- API: Added `block_on_time` and `block_off_time` for PIREP prefile/update/file calls
- Artisan: Added a `phpvms:csv-import [table] [file]` to import from CSV
- Artisan: Added a `phpvms:yaml-export [tables]` to export tables to YAML files which can be re-imported using `phpvms:yaml-import`
- Numerous bug fixes
### Added
- Initial release
## Alpha 2 (2018-02-23, v7.0.0-alpha2)
!! Please do a full reinstall, with recreating the database
- Bump minimum PHP version to 7.1, since 7.0 is already deprecated - [#166](https://github.com/nabeelio/phpvms/issues/166)
- Upgraded to Laravel 5.6
- Installer: Updated to create `config.php` file, to override config file values without having to modify the config files themselves
- Installer: Moved most options into the `config.php`, out of the `env.php` file
- Admin: Set the country for the airline [#191](https://github.com/nabeelio/phpvms/issues/191)
- Admin: Add ranks from the subfleet edit page
- Admin: Added flight time field to flight add/edit page
- Admin: PIREP hours can't be changed after it's no longer in a pending state
- Admin: Removed the tail number field
- DB: `airport.tz` to `airport.timezone`
- DB: Removed `aircaft.tail_number`
- DB: Decimal type field sizes shrunk to the default sizes
- DB: Removed the `raw_data` field from the PIREPs table
- API: All units expected in imperial (distance in nautical miles, fuel in lbs, mass in lbs)
- API: Added ability to add/remove bids for users
- API: Added a setting to only show aircraft that are at the departure airport of a flight [#171](https://github.com/nabeelio/phpvms/issues/171)
- API: Most calls, with exception of ACARS, are now private and require an API key to access [#173](https://github.com/nabeelio/phpvms/issues/173)
- API: Create an `/api/flight/:id/route` call to return the route information for a flight [#183](https://github.com/nabeelio/phpvms/issues/183)
- API: Allow a `fields` object to set custom PIREP fields, also returns the current values
- API: `level` not required in prefile anymore
- Setting: Restrict to aircraft that are at a flight's departure airport [#171](https://github.com/nabeelio/phpvms/issues/171)
- Setting: Implementation of filtering flights that are only at the user's current airport [#174](https://github.com/nabeelio/phpvms/issues/174)
- Templates: Add a `SKIN_NAME` template variable to reference the current skin, vs hardcoding the skin name in the templates
- Console: Added `php artisan phpvms:dev-install` command which creates the config files and creates the database/inserts sample data in one command [#176](https://github.com/nabeelio/phpvms/issues/176)
- Rank aircraft restrictions are properly working now [#170](https://github.com/nabeelio/phpvms/issues/170)
#### Fixes
- PIREP fields being set when filing manually is working
- ACARS data wasn't being ordered properly, causing issues on the map [77055991](https://github.com/nabeelio/phpvms/commit/77055991af36877552e1921466987d3066774d6b)
- Field for the rank's image changed to string input [b5dbde8](https://github.com/nabeelio/phpvms/commit/b5dbde84c4c786799f474117381b8227642f0777)
- Set a default value for a setting [#106](https://github.com/nabeelio/phpvms/issues/106)
- Admin: Rank image field fixed
- API: Only active airlines are returned
- API; Return errors if user isn't allowed on the submitted aircraft [#170](https://github.com/nabeelio/phpvms/issues/170)
- API: Fixed typo from `subfleet` to `subfleets` in the `/api/flights` call(s) [f6b2102](https://github.com/nabeelio/phpvms/commit/f6b2102e4827da6177eb4eee0c3ce0d38eb78ce3)
- API: Wrapped all calls in a `data` field
- API: `planned_distance` and `planned_flight_time` fields are now optional
- Setting: Subfleets returned in the flight calls respect the `pireps.restrict_aircraft_to_rank` setting [#170](https://github.com/nabeelio/phpvms/issues/170)
------
## Alpha 1 (2018-02-04, v7.0.0-alpha1)
- Initial Release

View File

@@ -1,46 +0,0 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at gm@nabs.io. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View File

@@ -1,6 +1,6 @@
BSD 3-Clause License
Copyright (c) 2017, phpvms
Copyright (c) 2017, phpvms - http://www.phpvms.net
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@@ -36,8 +36,7 @@ build:
# This is to build all the stylesheets, etc
.PHONY: build-assets
build-assets:
npm update
npm run dev
yarn run dev
.PHONY: install
install: build
@@ -53,16 +52,13 @@ update: build
@echo "Done!"
.PHONY: reset
reset: clean
reset: cleanapp/Models/Traits/JournalTrait.php
@php $(COMPOSER) dump-autoload
@make reload-db
.PHONY: reload-db
reload-db:
@php artisan database:create --reset
@php artisan migrate:refresh --seed
@php artisan phpvms:import app/Database/seeds/sample.yml
#php artisan phpvms:navdata
@php artisan phpvms:dev-install --reset-db
.PHONY: tests
tests: test
@@ -72,6 +68,10 @@ test:
#php artisan database:create --reset
vendor/bin/phpunit --debug --verbose
.PHONY:
phpstan:
vendor/bin/phpstan analyse -c phpstan.neon -v --level 2 app
.PHONY: replay-acars
replay-acars:
#@php artisan phpvms:replay AAL10,AAL3113,BAW172,DAL988,FIN6,MSR986 --manual

View File

@@ -1,6 +1,6 @@
# phpvms <sup>7</sup>
[![Build Status](https://travis-ci.org/nabeelio/phpvms.svg)](https://travis-ci.org/nabeelio/phpvms) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/d668bebb0a3c46bda381af16ce3d9450)](https://www.codacy.com/app/nabeelio/phpvms?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nabeelio/phpvms&amp;utm_campaign=Badge_Grade) [![Total Downloads](https://poser.pugx.org/nabeel/phpvms/downloads)](https://packagist.org/packages/nabeel/phpvms) [![Latest Stable Version](https://poser.pugx.org/nabeel/phpvms/v/stable)](https://packagist.org/packages/nabeel/phpvms) [![Latest Unstable Version](https://poser.pugx.org/nabeel/phpvms/v/unstable)](https://packagist.org/packages/nabeel/phpvms) [![License](https://poser.pugx.org/nabeel/phpvms/license)](https://packagist.org/packages/nabeel/phpvms)
[![Build Status](https://travis-ci.org/nabeelio/phpvms.svg)](https://travis-ci.org/nabeelio/phpvms) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/d668bebb0a3c46bda381af16ce3d9450)](https://www.codacy.com/app/nabeelio/phpvms?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nabeelio/phpvms&amp;utm_campaign=Badge_Grade) [![Latest Stable Version](https://poser.pugx.org/nabeel/phpvms/v/stable)](https://packagist.org/packages/nabeel/phpvms) ![StyleCI](https://github.styleci.io/repos/93688482/shield?branch=dev) [![License](https://poser.pugx.org/nabeel/phpvms/license)](https://packagist.org/packages/nabeel/phpvms)
The next phpvms version built on the laravel framework. work in progress. If you're looking for
the old, phpVMS classic, it's [available here](https://github.com/nabeelio/phpvms_v2).
@@ -15,7 +15,7 @@ The latest documentation, with installation instructions is available
## Requirements
- PHP 7.0+, extensions:
- PHP 7.1+, extensions:
- cURL
- JSON
- mbstring
@@ -25,11 +25,11 @@ The latest documentation, with installation instructions is available
- Database:
- MySQL 5.5+ (or MySQL variant, including MariaDB and Percona)
[View more details on requirements](http://docs.phpvms.net/basics/requirements)
[View more details on requirements](http://docs.phpvms.net/setup/requirements)
## Installer
1. Upload to your server
2. Visit the site, and follow the link to the installer
[View installation details](http://docs.phpvms.net/basics/installation)
[View installation details](http://docs.phpvms.net/setup/installation)

View File

@@ -0,0 +1,50 @@
<?php
namespace App\Awards;
use App\Interfaces\Award;
/**
* Simple example of an awards class, where you can apply an award when a user
* has 100 flights. All award classes need to extend the AwardInterface
*/
class PilotFlightAwards extends Award
{
/**
* Set the name of this award class to make it easier to see when
* assigning to a specific award
*
* @var string
*/
public $name = 'Pilot Flights';
/**
* The description to show under the parameters field, so the admin knows
* what the parameter actually controls. You can leave this blank if there
* isn't a parameter.
*
* @var string
*/
public $param_description = 'The number of flights at which to give this award';
/**
* If the user has over N flights, then we can give them this award. This method
* only needs to return a true or false of whether it should be awarded or not.
*
* If no parameter is passed in, just default it to 100. You should check if there
* is a parameter or not. You can call it whatever you want, since that would make
* sense with the $param_description.
*
* @param int|null $number_of_flights The parameters passed in from the UI
*
* @return bool
*/
public function check($number_of_flights = null): bool
{
if (!$number_of_flights) {
$number_of_flights = 100;
}
return $this->user->flights >= $number_of_flights;
}
}

View File

@@ -2,36 +2,27 @@
namespace App\Bootstrap;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Config\Repository as RepositoryContract;
use Illuminate\Contracts\Foundation\Application;
/**
* Class LoadConfiguration
* @package App\Bootstrap
*
* I'm overriding this to take advantage of the configuration caching
* and not needing to read the files from disk every time.
*
* Hopefully it won't affect anything within core framework but this
* should be ok. Will just have to be cognizant of any changes to the
* LoadConfiguration parent class, or if the Kernel changes the boot
* order -NS
*/
class LoadConfiguration extends \Illuminate\Foundation\Bootstrap\LoadConfiguration
{
/**
* Load the configuration items from all of the files.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @param \Illuminate\Contracts\Config\Repository $repository
* @return void
* @param \Illuminate\Contracts\Foundation\Application $app
* @param \Illuminate\Contracts\Config\Repository $repository
*
* @throws \Exception
*/
protected function loadConfigurationFiles(Application $app, RepositoryContract $repository)
{
parent::loadConfigurationFiles($app, $repository);
/**
/*
* Read in the base config, only if it exists
*/
if (file_exists($app->basePath().'/config.php')) {

View File

@@ -1,65 +0,0 @@
<?php
namespace App\Console;
use Illuminate\Console\Command;
use Symfony\Component\Process\Process;
class BaseCommand extends Command
{
/**
* Streaming file read
* @param $filename
* @return \Generator
*/
public function readFile($filename)
{
$fp = fopen($filename, 'rb');
while (($line = fgets($fp)) !== false) {
$line = rtrim($line, "\r\n");
if ($line[0] === ';') {
continue;
}
yield $line;
}
fclose($fp);
}
/**
* @param $cmd
* @param bool $return
* @return string
*/
public function runCommand($cmd, $return=false, $verbose=true)
{
if (\is_array($cmd)) {
$cmd = join(' ', $cmd);
}
if($verbose) {
$this->info('Running "' . $cmd . '"');
}
$val = '';
$process = new Process($cmd);
$process->run(function ($type, $buffer) use ($return, $val) {
if ($return) {
$val .= $buffer;
} else {
echo $buffer;
}
/*if (Process::ERR === $type) {
echo $buffer;
} else {
echo $buffer;
}*/
});
return $val;
}
}

106
app/Console/Command.php Normal file
View File

@@ -0,0 +1,106 @@
<?php
namespace App\Console;
use Log;
use Symfony\Component\Process\Process;
/**
* Class BaseCommand
*/
abstract class Command extends \Illuminate\Console\Command
{
/**
* @return mixed
*/
abstract public function handle();
/**
* Splice the logger and replace the active handlers with
* the handlers from the "cron" stack in config/logging.php
*
* Close out any of the existing handlers so we don't leave
* file descriptors leaking around
*
* @param string $channel_name Channel name to grab the handlers from
*/
public function redirectLoggingToStdout($channel_name): void
{
$logger = app(\Illuminate\Log\Logger::class);
// Close the existing loggers
try {
$handlers = $logger->getHandlers();
foreach ($handlers as $handler) {
$handler->close();
}
} catch (\Exception $e) {
$this->error('Error closing handlers: '.$e->getMessage());
}
// Open the handlers for the channel name,
// and then set them to the main logger
try {
$logger->setHandlers(
Log::channel($channel_name)->getHandlers()
);
} catch (\Exception $e) {
$this->error('Couldn\'t splice the logger: '.$e->getMessage());
}
}
/**
* Streaming file reader
*
* @param $filename
*
* @return \Generator
*/
public function readFile($filename): ?\Generator
{
$fp = fopen($filename, 'rb');
while (($line = fgets($fp)) !== false) {
$line = rtrim($line, "\r\n");
if ($line[0] === ';') {
continue;
}
yield $line;
}
fclose($fp);
}
/**
* @param $cmd
* @param bool $return
* @param mixed $verbose
*
* @throws \Symfony\Component\Process\Exception\RuntimeException
* @throws \Symfony\Component\Process\Exception\LogicException
*
* @return string
*/
public function runCommand($cmd, $return = false, $verbose = true): string
{
if (\is_array($cmd)) {
$cmd = implode(' ', $cmd);
}
if ($verbose) {
$this->info('Running "'.$cmd.'"');
}
$val = '';
$process = new Process($cmd);
$process->run(function ($type, $buffer) use ($return, &$val) {
if ($return) {
$val .= $buffer;
} else {
echo $buffer;
}
});
return $val;
}
}

View File

@@ -2,25 +2,29 @@
namespace App\Console\Commands;
use Illuminate\Database\Eloquent\Collection;
use GuzzleHttp\Client;
use App\Console\BaseCommand;
use App\Console\Command;
use App\Facades\Utils;
use GuzzleHttp\Client;
use Illuminate\Database\Eloquent\Collection;
class AcarsReplay extends BaseCommand
/**
* Class AcarsReplay
*/
class AcarsReplay extends Command
{
protected $signature = 'phpvms:replay {files} {--manual} {--write-all} {--no-submit}';
protected $description = 'Replay an ACARS file';
/**
* API Key to post as
*
* @var string
*/
protected $apiKey = 'testadminapikey';
/**
* For automatic updates, how many seconds to sleep between updates
*
* @var int
*/
protected $sleepTime = 10;
@@ -36,7 +40,6 @@ class AcarsReplay extends BaseCommand
*/
protected $httpClient;
/**
* Return an instance of an HTTP client all ready to post
*/
@@ -46,148 +49,159 @@ class AcarsReplay extends BaseCommand
$this->httpClient = new Client([
'base_uri' => config('app.url'),
'headers' => [
'headers' => [
'Authorization' => $this->apiKey,
]
],
]);
}
/*protected function getArguments()
{
return [
['--files', InputOption::VALUE_OPTIONAL]
];
}*/
/**
* Make a request to start a PIREP
*
* @param \stdClass $flight
*
* @throws \RuntimeException
*
* @return string
*/
protected function startPirep($flight): string
{
# convert the planned flight time to be completely in minutes
$pft = Utils::hoursToMinutes($flight->planned_hrsenroute,
$flight->planned_minenroute);
// convert the planned flight time to be completely in minutes
$pft = Utils::hoursToMinutes(
$flight->planned_hrsenroute,
$flight->planned_minenroute
);
$flight_number = substr($flight->callsign, 3);
$response = $this->httpClient->post('/api/pireps/prefile', [
'json' => [
'airline_id' => 1,
'flight_number' => $flight_number,
'aircraft_id' => 1,
'dpt_airport_id' => $flight->planned_depairport,
'arr_airport_id' => $flight->planned_destairport,
'level' => $flight->planned_altitude,
'planned_flight_time' => $pft,
'route' => $flight->planned_route,
]
'airline_id' => 1,
'flight_number' => $flight_number,
'aircraft_id' => 1,
'dpt_airport_id' => $flight->planned_depairport,
'arr_airport_id' => $flight->planned_destairport,
'level' => $flight->planned_altitude,
'planned_flight_time' => $pft,
'route' => $flight->planned_route,
],
]);
$body = \json_decode($response->getBody()->getContents());
return $body->id;
}
/**
* Mark the PIREP as filed
*
* @param $pirep_id
*
* @throws \RuntimeException
*
* @return mixed
*/
protected function filePirep($pirep_id)
{
$response = $this->httpClient->post('/api/pireps/'.$pirep_id.'/file', [
'json'=> []
'json' => [],
]);
$body = \json_decode($response->getBody()->getContents());
return $body;
}
/**
* @param $pirep_id
* @param $data
*
* @throws \RuntimeException
*
* @return array
*/
protected function postUpdate($pirep_id, $data)
{
$uri = '/api/pireps/' . $pirep_id . '/acars/position';
$uri = '/api/pireps/'.$pirep_id.'/acars/position';
$position = [
'log' => '',
'lat' => $data->latitude,
'lon' => $data->longitude,
'heading' => $data->heading,
'altitude' => $data->altitude,
'gs' => $data->groundspeed,
'log' => '',
'lat' => $data->latitude,
'lon' => $data->longitude,
'heading' => $data->heading,
'altitude' => $data->altitude,
'gs' => $data->groundspeed,
'transponder' => $data->transponder,
];
$upd = [
'positions' => [
$position
]
$position,
],
];
$this->info("Update: $data->callsign, $position[lat] x $position[lon] \t\t"
. "hdg: $position[heading]\t\talt: $position[altitude]\t\tgs: $position[gs]");
."hdg: $position[heading]\t\talt: $position[altitude]\t\tgs: $position[gs]");
$response = $this->httpClient->post($uri, [
'json' => $upd
'json' => $upd,
]);
$body = \json_decode($response->getBody()->getContents());
return [
$data->callsign,
$position['lat'],
$position['lon'],
$position['heading'],
$position['altitude'],
$position['gs']
$position['gs'],
];
}
/**
* Parse this file and run the updates
*
* @param array $files
*
* @throws \RuntimeException
*/
protected function updatesFromFile(array $files)
{
/**
* @var $flights Collection
*/
$flights = collect($files)->transform(function ($f)
{
$file = storage_path('/replay/' . $f . '.json');
$flights = collect($files)->transform(function ($f) {
$file = storage_path('/replay/'.$f.'.json');
if (file_exists($file)) {
$this->info('Loading ' . $file);
$this->info('Loading '.$file);
$contents = file_get_contents($file);
$contents = \json_decode($contents);
return collect($contents->updates);
} else {
$this->error($file . ' not found, skipping');
return false;
}
$this->error($file.' not found, skipping');
return false;
})
# remove any of errored file entries
// remove any of errored file entries
->filter(function ($value, $key) {
return $value !== false;
});
$this->info('Starting playback');
/**
/*
* File the initial pirep to get a "preflight" status
*/
$flights->each(function ($updates, $idx)
{
$flights->each(function ($updates, $idx) {
$update = $updates->first();
$pirep_id = $this->startPirep($update);
$this->pirepList[$update->callsign] = $pirep_id;
$this->info('Prefiled ' . $update->callsign . ', ID: ' . $pirep_id);
$this->info('Prefiled '.$update->callsign.', ID: '.$pirep_id);
});
/**
/*
* Iterate through all of the flights, retrieving the updates
* from each individual flight. Remove the update. Continue through
* until there are no updates left, at which point we remove the flight
@@ -202,15 +216,15 @@ class AcarsReplay extends BaseCommand
$this->postUpdate($pirep_id, $update);
# we're done and don't put the "no-submit" option
if($updates->count() === 0 && !$this->option('no-submit')) {
// we're done and don't put the "no-submit" option
if ($updates->count() === 0 && !$this->option('no-submit')) {
$this->filePirep($pirep_id);
}
})->filter(function ($updates, $idx) {
return $updates->count() > 0;
});
if(!$this->option('write-all')) {
if (!$this->option('write-all')) {
if (!$this->option('manual')) {
sleep($this->sleepTime);
} else {
@@ -223,9 +237,11 @@ class AcarsReplay extends BaseCommand
/**
* Execute the console command.
*
* @throws \RuntimeException
*
* @return mixed
*/
public function handle()
public function handle(): void
{
$files = $this->argument('files');
$manual_mode = $this->option('manual');
@@ -233,6 +249,7 @@ class AcarsReplay extends BaseCommand
if ($this->option('write-all')) {
$this->info('In "dump-all" mode, just writing it all in');
} else {
/* @noinspection NestedPositiveIfStatementsInspection */
if (!$manual_mode) {
$this->info('Going to send updates every 10s');
} else {

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Console\Commands;
use App\Console\Command;
use Artisan;
/**
* Class ComposerCommand
*/
class ComposerCommand extends Command
{
protected $signature = 'phpvms:composer {cmd}';
protected $description = 'Composer related tasks';
/**
* Run composer update related commands
*/
public function handle()
{
switch (trim($this->argument('cmd'))) {
case 'post-update':
$this->postUpdate();
break;
default:
$this->error('Command exists');
}
}
/**
* Any composer post update tasks
*/
protected function postUpdate(): void
{
if (config('app.env') === 'dev') {
/* @noinspection NestedPositiveIfStatementsInspection */
if (class_exists(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class)) {
Artisan::call('ide-helper:generate');
Artisan::call('ide-helper:meta');
}
}
}
}

View File

@@ -2,16 +2,21 @@
namespace App\Console\Commands;
use App\Console\Command;
use Log;
use App\Console\BaseCommand;
class CreateDatabase extends BaseCommand
/**
* Class CreateDatabase
*/
class CreateDatabase extends Command
{
protected $signature = 'database:create {--reset} {--conn=?}';
protected $description = 'Create a database';
protected $os;
/**
* CreateDatabase constructor.
*/
public function __construct()
{
parent::__construct();
@@ -20,31 +25,35 @@ class CreateDatabase extends BaseCommand
/**
* Create the mysql database
*
* @param $dbkey
*
* @return bool
*/
protected function create_mysql($dbkey)
{
$host = config($dbkey . 'host');
$port = config($dbkey . 'port');
$name = config($dbkey . 'database');
$user = config($dbkey . 'username');
$pass = config($dbkey . 'password');
$host = config($dbkey.'host');
$port = config($dbkey.'port');
$name = config($dbkey.'database');
$user = config($dbkey.'username');
$pass = config($dbkey.'password');
$dbSvc = new \App\Console\Services\Database();
$dsn = $dbSvc->createDsn($host, $port);
Log::info('Connection string: ' . $dsn);
Log::info('Connection string: '.$dsn);
try {
$conn = $dbSvc->createPDO($dsn, $user, $pass);
} catch (\PDOException $e) {
Log::error($e);
return false;
}
if ($this->option('reset') === true) {
$sql = "DROP DATABASE IF EXISTS `$name`";
try {
Log::info('Dropping database: '.$sql);
$conn->exec($sql);
@@ -60,12 +69,14 @@ class CreateDatabase extends BaseCommand
$conn->exec($sql);
} catch (\PDOException $e) {
Log::error($e);
return false;
}
}
/**
* Create the sqlite database
*
* @param $dbkey
*/
protected function create_sqlite($dbkey)
@@ -76,14 +87,14 @@ class CreateDatabase extends BaseCommand
}
if ($this->option('reset') === true) {
$cmd = ['rm', '-rf', config($dbkey . 'database')];
$cmd = ['rm', '-rf', config($dbkey.'database')];
$this->runCommand($cmd);
}
if (!file_exists(config($dbkey . 'database'))) {
if (!file_exists(config($dbkey.'database'))) {
$cmd = [
$exec,
config($dbkey . 'database'),
config($dbkey.'database'),
'""',
];
@@ -109,21 +120,17 @@ class CreateDatabase extends BaseCommand
}
}*/
$this->info('Using connection "' . config('database.default') . '"');
$this->info('Using connection "'.config('database.default').'"');
$conn = config('database.default');
$dbkey = 'database.connections.' . $conn . '.';
$dbkey = 'database.connections.'.$conn.'.';
if (config($dbkey . 'driver') === 'mysql') {
if (config($dbkey.'driver') === 'mysql') {
$this->create_mysql($dbkey);
}
elseif (config($dbkey . 'driver') === 'sqlite') {
} elseif (config($dbkey.'driver') === 'sqlite') {
$this->create_sqlite($dbkey);
}
// TODO: Eventually
elseif (config($dbkey . 'driver') === 'postgres') {
} // TODO: Eventually
elseif (config($dbkey.'driver') === 'postgres') {
$this->create_postgres($dbkey);
}
}

View File

@@ -2,20 +2,36 @@
namespace App\Console\Commands;
use App\Console\Command;
use App\Models\Acars;
use App\Models\Airline;
use App\Models\Pirep;
use App\Models\User;
use App\Services\AwardService;
use App\Services\DatabaseService;
use DB;
use PDO;
use Symfony\Component\Yaml\Yaml;
use App\Models\Airline;
use App\Models\User;
use App\Console\BaseCommand;
use App\Models\Acars;
use App\Models\Pirep;
class DevCommands extends BaseCommand
/**
* Class DevCommands
*/
class DevCommands extends Command
{
protected $signature = 'phpvms {cmd}';
protected $signature = 'phpvms {cmd} {param?}';
protected $description = 'Developer commands';
protected $dbSvc;
/**
* DevCommands constructor.
*
* @param DatabaseService $dbSvc
*/
public function __construct(DatabaseService $dbSvc)
{
parent::__construct();
$this->dbSvc = $dbSvc;
}
/**
* Run dev related commands
@@ -30,13 +46,16 @@ class DevCommands extends BaseCommand
}
$commands = [
'clear-acars' => 'clearAcars',
'clear-users' => 'clearUsers',
'list-awards' => 'listAwardClasses',
'clear-acars' => 'clearAcars',
'clear-users' => 'clearUsers',
'compile-assets' => 'compileAssets',
'db-attrs' => 'dbAttrs',
'db-attrs' => 'dbAttrs',
'manual-insert' => 'manualInsert',
'xml-to-yaml' => 'xmlToYaml',
];
if(!array_key_exists($command, $commands)) {
if (!array_key_exists($command, $commands)) {
$this->error('Command not found!');
exit();
}
@@ -44,12 +63,29 @@ class DevCommands extends BaseCommand
$this->{$commands[$command]}();
}
/**
* List all award classes
*/
protected function listAwardClasses()
{
$awardSvc = app(AwardService::class);
$awards = $awardSvc->findAllAwardClasses();
$headers = ['Award Name', 'Class'];
$formatted_awards = [];
foreach ($awards as $award) {
$formatted_awards[] = [$award->name, \get_class($award)];
}
$this->table($headers, $formatted_awards);
}
/**
* Delete all the data from the ACARS and PIREP tables
*/
protected function clearAcars()
{
if(config('database.default') === 'mysql') {
if (config('database.default') === 'mysql') {
DB::statement('SET foreign_key_checks=0');
}
@@ -103,9 +139,77 @@ class DevCommands extends BaseCommand
$server_version = $pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
$emulate_prepares = version_compare($server_version, $emulate_prepares_below_version, '<');
$this->info('Server Version: '. $server_version);
$this->info('Server Version: '.$server_version);
$this->info('Emulate Prepares: '.$emulate_prepares);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $emulate_prepares);
}
/**
* Convert the sequelpro xml export to yaml
*/
protected function xmlToYaml()
{
$file = $this->argument('param');
$this->info('Reading '.$file);
$xml_str = file_get_contents($file);
$xml = new \SimpleXMLElement($xml_str);
$yaml = [];
$table_name = (string) $xml->database->table_data['name'];
$this->info('Writing table "'.$table_name.'"');
$count = 0;
$yaml[$table_name] = [];
foreach ($xml->database->table_data->row as $row) {
$yaml_row = [];
foreach ($row->field as $field) {
$fname = (string) $field['name'];
$fvalue = (string) $field;
$yaml_row[$fname] = $fvalue;
}
$yaml[$table_name][] = $yaml_row;
$count++;
}
$this->info('Exporting '.$count.' rows');
$file_name = $table_name.'.yml';
file_put_contents(storage_path($file_name), Yaml::dump($yaml, 4, 2));
$this->info('Writing yaml to storage: '.$file_name);
}
/**
* Insert the rows from the file, manually advancing each row
*/
protected function manualInsert(): void
{
$file = $this->argument('param');
$this->info('Reading '.$file);
if (!file_exists($file)) {
$this->error('File '.$file.' doesn\'t exist');
exit;
}
$yml = Yaml::parse(file_get_contents($file));
foreach ($yml as $table => $rows) {
$this->info('Importing table '.$table);
$this->info('Number of rows: '.\count($rows));
foreach ($rows as $row) {
try {
$this->dbSvc->insert_row($table, $row);
} catch (\Exception $e) {
$this->error($e);
}
$this->confirm('Insert next row?', true);
}
}
}
}

View File

@@ -0,0 +1,98 @@
<?php
namespace App\Console\Commands;
use App\Console\Command;
use Modules\Installer\Services\ConfigService;
/**
* Create a fresh development install
*/
class DevInstall extends Command
{
protected $signature = 'phpvms:dev-install {--reset-db} {--reset-configs}';
protected $description = 'Run a developer install and run the sample migration';
/**
* The YAML files with sample data to import
*/
protected $yaml_imports = [
'sample.yml',
'acars.yml',
];
/**
* Run dev related commands
*
* @throws \Symfony\Component\HttpFoundation\File\Exception\FileException
*/
public function handle()
{
if ($this->option('reset-configs')) {
$this->rewriteConfigs();
}
// Reload the configuration
\App::boot();
$this->info('Recreating database');
$this->call('database:create', [
'--reset' => true,
]);
$this->info('Running migrations');
$this->call('migrate:fresh', [
'--seed' => true,
]);
//
//
$this->info('Importing sample data');
foreach ($this->yaml_imports as $yml) {
$this->call('phpvms:yaml-import', [
'files' => ['app/Database/seeds/'.$yml],
]);
}
$this->info('Done!');
}
/**
* Rewrite the configuration files
*
* @throws \Symfony\Component\HttpFoundation\File\Exception\FileException
*/
protected function rewriteConfigs()
{
$cfgSvc = app(ConfigService::class);
$this->info('Removing the old config files');
// Remove the old files
$config_file = base_path('config.php');
if (file_exists($config_file)) {
unlink($config_file);
}
$env_file = base_path('env.php');
if (file_exists($env_file)) {
unlink($env_file);
}
$this->info('Removing the sqlite db');
$db_file = storage_path('db.sqlite');
if (file_exists($db_file)) {
unlink($db_file);
}
$this->info('Regenerating the config files');
$cfgSvc->createConfigFiles([
'APP_ENV' => 'dev',
'SITE_NAME' => 'phpvms test',
'DB_CONN' => 'sqlite',
]);
$this->info('Config files generated!');
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Console\Commands;
use App\Console\Command;
use App\Services\ImportService;
/**
* Class ImportCsv
*/
class ImportCsv extends Command
{
protected $signature = 'phpvms:csv-import {type} {file}';
protected $description = 'Import from a CSV file';
private $importer;
/**
* Import constructor.
*
* @param ImportService $importer
*/
public function __construct(ImportService $importer)
{
parent::__construct();
$this->importer = $importer;
}
/**
* @throws \Illuminate\Validation\ValidationException
*
* @return mixed|void
*/
public function handle()
{
$type = $this->argument('type');
$file = $this->argument('file');
if (\in_array($type, ['flight', 'flights'])) {
$status = $this->importer->importFlights($file);
} elseif ($type === 'aircraft') {
$status = $this->importer->importAircraft($file);
} elseif (\in_array($type, ['airport', 'airports'])) {
$status = $this->importer->importAirports($file);
} elseif ($type === 'subfleet') {
$status = $this->importer->importSubfleets($file);
}
foreach ($status['success'] as $line) {
$this->info($line);
}
foreach ($status['errors'] as $line) {
$this->error($line);
}
}
}

View File

@@ -2,10 +2,9 @@
namespace App\Console\Commands;
use DB;
use App\Console\BaseCommand;
use App\Console\Command;
class Importer extends BaseCommand
class ImportFromClassic extends Command
{
protected $signature = 'phpvms:importer {db_host} {db_name} {db_user} {db_pass?} {table_prefix=phpvms_}';
protected $description = 'Import from an older version of phpVMS';
@@ -16,11 +15,11 @@ class Importer extends BaseCommand
public function handle()
{
$db_creds = [
'host' => $this->argument('db_host'),
'name' => $this->argument('db_name'),
'user' => $this->argument('db_user'),
'pass' => $this->argument('db_pass'),
'table_prefix' => $this->argument('table_prefix')
'host' => $this->argument('db_host'),
'name' => $this->argument('db_name'),
'user' => $this->argument('db_user'),
'pass' => $this->argument('db_pass'),
'table_prefix' => $this->argument('table_prefix'),
];
$importerSvc = new \App\Console\Services\Importer($db_creds);

View File

@@ -1,77 +0,0 @@
<?php
namespace App\Console\Commands;
use App\Console\BaseCommand;
class Install extends BaseCommand
{
protected $signature = 'phpvms:install
{--update}
{--airline-name?}
{--airline-code?}';
protected $description = 'Install or update phpVMS';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$this->info('Installing phpVMS...');
$this->setupDatabase();
# Only run these if we're doing an initial install
if(!$this->option('update')) {
$this->writeLocalConfig();
$this->initialData();
}
}
/**
* Setup the database and run the migrations
* Only call the database creation if we're not
* explicitly trying to upgrade
*/
protected function setupDatabase()
{
if(!$this->option('update')) {
$this->call('database:create');
}
$this->info('Running database migrations...');
$this->call('migrate');
# TODO: Call initial seed data, for the groups and other supporting data
}
/**
* Write a local config file
*/
protected function writeLocalConfig()
{
}
/**
* Set an initial airline and admin user/password
*/
protected function initialData()
{
# TODO: Prompt for initial airline info
$airline_name = $this->option('airline-name');
if(!$airline_name) {
$airline_name = $this->ask('Enter your airline name');
}
$airline_code = $this->option('airline-code');
if(!$airline_code) {
$airline_code = $this->ask('Enter your airline code');
}
# TODO: Prompt for admin user/password
}
}

View File

@@ -2,21 +2,41 @@
namespace App\Console\Commands;
use App\Console\BaseCommand;
use App\Models\Navdata;
use App\Console\Command;
use App\Models\Enums\NavaidType;
use App\Models\Navdata;
class NavdataCommand extends BaseCommand
/**
* Class NavdataImport
*/
class NavdataImport extends Command
{
protected $signature = 'phpvms:navdata';
protected $description = '';
/**
* Read and parse in the navaid file
* @throws \League\Geotools\Exception\InvalidArgumentException
*
* @return void
*/
public function read_wp_nav_aid()
public function handle()
{
$this->info('Emptying the current navdata...');
Navdata::query()->truncate();
$this->info('Looking for nav files...');
$this->read_wp_nav_aid();
$this->read_wp_nav_fix();
}
/**
* Read and parse in the navaid file
*
* @throws \League\Geotools\Exception\InvalidArgumentException
*
* @return void
*/
public function read_wp_nav_aid(): void
{
/*
* ....,....1....,....2....,....3....,....4....,....5....,....6..
@@ -50,7 +70,7 @@ class NavdataCommand extends BaseCommand
$file_path = storage_path('/navdata/WPNAVAID.txt');
if (!file_exists($file_path)) {
$this->error('WPNAVAID.txt not found in storage/navdata');
return false;
return;
}
$this->info('Importing navaids (WPNAVAID.txt) ...');
@@ -58,10 +78,9 @@ class NavdataCommand extends BaseCommand
$imported = 0;
foreach($generator as $line) {
foreach ($generator as $line) {
$navaid = [
'id' => trim(substr($line, 24, 4)), // ident column
'id' => trim(substr($line, 24, 4)), // ident column
'name' => trim(substr($line, 0, 24)),
'type' => trim(substr($line, 29, 4)),
'lat' => trim(substr($line, 33, 9)),
@@ -70,9 +89,8 @@ class NavdataCommand extends BaseCommand
'class' => trim($line[60]),
];
# Map to the Navaid enum
switch($navaid['type'])
{
// Map to the Navaid enum
switch ($navaid['type']) {
case 'ILS':
$navaid['type'] = NavaidType::LOC;
break;
@@ -101,22 +119,22 @@ class NavdataCommand extends BaseCommand
}*/
Navdata::updateOrCreate([
'id' => $navaid['id'], 'name' => $navaid['name']
'id' => $navaid['id'], 'name' => $navaid['name'],
], $navaid);
$imported++;
if($imported % 100 === 0) {
$this->info('Imported ' . $imported . ' entries...');
if ($imported % 100 === 0) {
$this->info('Imported '.$imported.' entries...');
}
}
$this->info('Imported a total of ' . $imported . ' nav aids');
$this->info('Imported a total of '.$imported.' nav aids');
}
/**
*
* @return void
*/
public function read_wp_nav_fix()
public function read_wp_nav_fix(): void
{
/*
* ....,....1....,....2....,...3....,....4....,....
@@ -138,9 +156,9 @@ class NavdataCommand extends BaseCommand
*/
$file_path = storage_path('/navdata/WPNAVFIX.txt');
if(!file_exists($file_path)) {
if (!file_exists($file_path)) {
$this->error('WPNAVFIX.txt not found in storage/navdata');
return false;
return;
}
$this->info('Importing navaids (WPNAVFIX.txt) ...');
@@ -149,37 +167,23 @@ class NavdataCommand extends BaseCommand
$imported = 0;
foreach ($generator as $line) {
$navfix = [
'id' => trim(substr($line, 0, 4)), // ident column
'id' => trim(substr($line, 0, 4)), // ident column
'name' => trim(substr($line, 24, 6)),
'type' => NavaidType::FIX,
'lat' => trim(substr($line, 30, 10)),
'lon' => trim(substr($line, 40, 11)),
'lat' => trim(substr($line, 30, 10)),
'lon' => trim(substr($line, 40, 11)),
];
switch ($navfix['type']) {
default:
$navfix['type'] = NavaidType::UNKNOWN;
break;
}
Navdata::updateOrCreate(['id' => $navfix['id']], $navfix);
Navdata::updateOrCreate([
'id' => $navfix['id'], 'name' => $navfix['name'],
], $navfix);
$imported++;
if ($imported % 100 === 0) {
$this->info('Imported ' . $imported . ' entries...');
$this->info('Imported '.$imported.' entries...');
}
}
$this->info('Imported a total of ' . $imported . ' nav fixes');
}
public function handle()
{
$this->info('Emptying the current navdata...');
Navdata::query()->truncate();
$this->info('Looking for nav files...');
$this->read_wp_nav_aid();
$this->read_wp_nav_fix();
$this->info('Imported a total of '.$imported.' nav fixes');
}
}

View File

@@ -2,13 +2,15 @@
namespace App\Console\Commands;
use App\Console\Command;
use GuzzleHttp\Client;
use App\Console\BaseCommand;
class TestApi extends BaseCommand
/**
* Class TestApi
*/
class TestApi extends Command
{
protected $signature = 'phpvms:test-api {apikey} {url}';
protected $httpClient;
/**
@@ -17,11 +19,11 @@ class TestApi extends BaseCommand
public function handle()
{
$this->httpClient = new Client([
'headers' => [
'Authorization' => $this->argument('apikey'),
'Content-type' => 'application/json',
'X-API-Key' => $this->argument('apikey'),
]
'headers' => [
'Authorization' => $this->argument('apikey'),
'Content-type' => 'application/json',
'X-API-Key' => $this->argument('apikey'),
],
]);
$result = $this->httpClient->get($this->argument('url'));

View File

@@ -2,24 +2,30 @@
namespace App\Console\Commands;
use App\Console\BaseCommand;
use App\Console\Command;
use Symfony\Component\Yaml\Yaml;
class Version extends BaseCommand
/**
* Class Version
*/
class Version extends Command
{
protected $signature = 'phpvms:version {--write} {--base-only}';
/**
* Create the version number that gets written out
*
* @param mixed $cfg
*
* @return bool|string
*/
protected function createVersionNumber($cfg)
{
exec($cfg['git']['git-local'], $version);
$version = substr($version[0], 0, $cfg['build']['length']);
# prefix with the date in YYMMDD format
// prefix with the date in YYMMDD format
$date = date('ymd');
$version = $date.'-'.$version;
return $version;
@@ -27,6 +33,7 @@ class Version extends BaseCommand
/**
* Run dev related commands
*
* @throws \Symfony\Component\Yaml\Exception\ParseException
*/
public function handle()
@@ -34,24 +41,24 @@ class Version extends BaseCommand
$version_file = config_path('version.yml');
$cfg = Yaml::parse(file_get_contents($version_file));
if($this->option('write')) {
$version = $this->createVersionNumber($cfg);
$cfg['build']['number'] = $version;
// Get the current build id
$build_number = $this->createVersionNumber($cfg);
$cfg['build']['number'] = $build_number;
$c = $cfg['current'];
$version = "v{$c['major']}.{$c['minor']}.{$c['patch']}-{$build_number}";
if ($this->option('write')) {
file_put_contents($version_file, Yaml::dump($cfg, 4, 2));
}
# Only show the major.minor.patch version
if($this->option('base-only')) {
$version = 'v'.$cfg['current']['major'] . '.'
.$cfg['current']['minor'] . '.'
.$cfg['current']['patch'];
print $version;
} else {
$this->call('version:show', [
'--format' => 'compact',
'--suppress-app-name' => true
]);
// Only show the major.minor.patch version
if ($this->option('base-only')) {
$version = 'v'.$cfg['current']['major'].'.'
.$cfg['current']['minor'].'.'
.$cfg['current']['patch'];
}
echo $version."\n";
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace App\Console\Commands;
use App\Console\Command;
use App\Services\DatabaseService;
use DB;
use Symfony\Component\Yaml\Yaml;
/**
* Class YamlExport
*/
class YamlExport extends Command
{
protected $signature = 'phpvms:yaml-export {tables*}';
protected $description = 'YAML table export';
/**
* YamlExport constructor.
*
* @param DatabaseService $dbSvc
*/
public function __construct(DatabaseService $dbSvc)
{
parent::__construct();
}
/**
* Run dev related commands
*/
public function handle()
{
$tables = $this->argument('tables');
if (empty($tables)) {
$this->error('No tables specified');
exit();
}
$export_tables = [];
foreach ($tables as $table) {
$export_tables[$table] = [];
$rows = DB::table($table)->get();
foreach ($rows as $row) {
$export_tables[$table][] = (array) $row;
}
}
$yaml = Yaml::dump($export_tables, 4, 2);
echo $yaml;
}
}

View File

@@ -2,17 +2,23 @@
namespace App\Console\Commands;
use DB;
use App\Console\BaseCommand;
use App\Console\Command;
use App\Services\DatabaseService;
class ImportCommand extends BaseCommand
/**
* Class YamlImport
*/
class YamlImport extends Command
{
protected $signature = 'phpvms:import {files*}';
protected $signature = 'phpvms:yaml-import {files*}';
protected $description = 'Developer commands';
protected $dbSvc;
/**
* YamlImport constructor.
*
* @param DatabaseService $dbSvc
*/
public function __construct(DatabaseService $dbSvc)
{
parent::__construct();
@@ -21,31 +27,29 @@ class ImportCommand extends BaseCommand
/**
* Run dev related commands
*
* @throws \Exception
*/
public function handle()
{
$files = $this->argument('files');
if(empty($files)) {
if (empty($files)) {
$this->error('No files to import specified!');
exit();
}
$ignore_errors = true;
/*$ignore_errors = $this->option('ignore_errors');
if(!$ignore_errors) {
$ignore_errors = false;
}*/
foreach($files as $file) {
if(!file_exists($file)) {
$this->error('File ' . $file .' doesn\'t exist');
foreach ($files as $file) {
if (!file_exists($file)) {
$this->error('File '.$file.' doesn\'t exist');
exit;
}
$this->info('Importing ' . $file);
$this->info('Importing '.$file);
$imported = $this->dbSvc->seed_from_yaml_file($file, $ignore_errors);
foreach($imported as $table => $count) {
foreach ($imported as $table => $count) {
$this->info('Imported '.$count.' records from "'.$table.'"');
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Console\Cron;
use App\Console\Command;
use App\Events\CronHourly;
/**
* This just calls the CronHourly event, so all of the
* listeners, etc can just be called to run those tasks
*/
class Hourly extends Command
{
protected $signature = 'cron:hourly';
protected $description = 'Run the hourly cron tasks';
protected $schedule;
public function handle(): void
{
$this->redirectLoggingToStdout('cron');
event(new CronHourly());
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace App\Console\Cron;
use App\Console\Command;
use App\Events\CronMonthly;
/**
* This just calls the CronMonthly event, so all of the
* listeners, etc can just be called to run those tasks
*
* The actual cron tasks are in app/Cron
*/
class Monthly extends Command
{
protected $signature = 'cron:monthly';
protected $description = 'Run the monthly cron tasks';
protected $schedule;
public function handle(): void
{
$this->redirectLoggingToStdout('cron');
event(new CronMonthly());
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace App\Console\Cron;
use App\Console\Command;
use App\Events\CronNightly;
/**
* This just calls the CronNightly event, so all of the
* listeners, etc can just be called to run those tasks
*
* The actual cron tasks are in app/Cron
*/
class Nightly extends Command
{
protected $signature = 'cron:nightly';
protected $description = 'Run the nightly cron tasks';
protected $schedule;
public function handle(): void
{
$this->redirectLoggingToStdout('cron');
event(new CronNightly());
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace App\Console\Cron;
use App\Console\Command;
use App\Events\CronWeekly;
/**
* This just calls the CronWeekly event, so all of the
* listeners, etc can just be called to run those tasks.
*
* The actual cron tasks are in app/Cron
*/
class Weekly extends Command
{
protected $signature = 'cron:weekly';
protected $description = 'Run the weekly cron tasks';
protected $schedule;
public function handle(): void
{
$this->redirectLoggingToStdout('cron');
event(new CronWeekly());
}
}

View File

@@ -2,37 +2,31 @@
namespace App\Console;
use App\Console\Cron\Hourly;
use App\Console\Cron\Monthly;
use App\Console\Cron\Nightly;
use App\Console\Cron\Weekly;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
/**
* Class Kernel
*/
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
Commands\AcarsReplay::class,
Commands\CreateDatabase::class,
Commands\DevCommands::class,
Commands\ImportCommand::class,
Commands\Importer::class,
Commands\Install::class,
Commands\NavdataCommand::class,
Commands\TestApi::class,
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @param \Illuminate\Console\Scheduling\Schedule $schedule
*
* @return void
*/
protected function schedule(Schedule $schedule)
protected function schedule(Schedule $schedule): void
{
// $schedule->command('inspire')
// ->hourly();
$schedule->command(Nightly::class)->dailyAt('01:00');
$schedule->command(Weekly::class)->weeklyOn(0);
$schedule->command(Monthly::class)->monthlyOn(1);
$schedule->command(Hourly::class)->hourly();
}
/**
@@ -40,9 +34,10 @@ class Kernel extends ConsoleKernel
*
* @return void
*/
protected function commands()
protected function commands(): void
{
require app_path('Routes/console.php');
$this->load(__DIR__ . '/Commands');
$this->load(__DIR__.'/Commands');
$this->load(__DIR__.'/Cron');
}
}

23
app/Console/Logger.php Normal file
View File

@@ -0,0 +1,23 @@
<?php
namespace App\Console;
use Monolog\Handler\StreamHandler;
/**
* Just a simple custom logger that dumps to the console
*/
class Logger
{
public function __invoke(array $config)
{
$logger = new \Monolog\Logger('console');
try {
$logger->pushHandler(new StreamHandler('php://stdout'));
} catch (\Exception $e) {
}
return $logger;
}
}

View File

@@ -3,26 +3,26 @@
namespace App\Console\Services;
use PDO;
use Doctrine\DBAL\Driver\PDOException;
/**
* Class Database
* @package App\Console\Services
*/
class Database
{
/**
* Create the base connection DSN, optionally include the DB name
* @param $host
* @param $port
*
* @param $host
* @param $port
* @param null $name
*
* @return string
*/
public function createDsn($host, $port, $name=null)
public function createDsn($host, $port, $name = null)
{
$conn = config('database.default');
$dsn = "$conn:host=$host;port=$port";
if(filled($name)) {
if (filled($name)) {
$dsn .= ';dbname='.$name;
}
@@ -33,8 +33,10 @@ class Database
* @param $dsn
* @param $user
* @param $pass
* @return PDO
*
* @throws \PDOException
*
* @return PDO
*/
public function createPDO($dsn, $user, $pass)
{

View File

@@ -2,31 +2,29 @@
namespace App\Console\Services;
use PDO;
use Carbon\Carbon;
use Doctrine\DBAL\Driver\PDOException;
use Illuminate\Support\Str;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Hash;
use Symfony\Component\Console\Output\ConsoleOutput;
use App\Models\Enums\FlightType;
use App\Models\Enums\PirepSource;
use App\Models\Pirep;
use App\Facades\Utils;
use App\Models\Aircraft;
use App\Models\Airline;
use App\Models\Airport;
use App\Models\Enums\FlightType;
use App\Models\Enums\PirepSource;
use App\Models\Enums\UserState;
use App\Models\Flight;
use App\Models\Pirep;
use App\Models\Rank;
use App\Models\Subfleet;
use App\Models\User;
use App\Models\Enums\UserState;
use App\Facades\Utils;
use Carbon\Carbon;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use PDO;
use PDOException;
use Symfony\Component\Console\Output\ConsoleOutput;
/**
* Class Importer
* TODO: Batch import
* @package App\Console\Services
*/
class Importer
{
@@ -37,6 +35,7 @@ class Importer
/**
* Hold the PDO connection to the old database
*
* @var
*/
private $conn;
@@ -44,10 +43,11 @@ class Importer
/**
* @var array
*/
private $creds = [];
private $creds;
/**
* Hold the instance of the console logger
*
* @var
*/
private $log;
@@ -55,12 +55,12 @@ class Importer
/**
* CONSTANTS
*/
const BATCH_READ_ROWS = 300;
const SUBFLEET_NAME = 'Imported Aircraft';
public const BATCH_READ_ROWS = 300;
public const SUBFLEET_NAME = 'Imported Aircraft';
/**
* Importer constructor.
*
* @param $db_creds
*/
public function __construct($db_creds)
@@ -68,14 +68,14 @@ class Importer
// Setup the logger
$this->log = new ConsoleOutput();
# The db credentials
// The db credentials
$this->creds = array_merge([
'host' => '127.0.0.1',
'port' => 3306,
'name' => '',
'user' => '',
'pass' => '',
'table_prefix' => 'phpvms_'
'host' => '127.0.0.1',
'port' => 3306,
'name' => '',
'user' => '',
'pass' => '',
'table_prefix' => 'phpvms_',
], $db_creds);
}
@@ -86,7 +86,7 @@ class Importer
{
$this->reconnect();
# Import all the different parts
// Import all the different parts
$this->importRanks();
$this->importAirlines();
$this->importAircraft();
@@ -96,7 +96,7 @@ class Importer
$this->importFlights();
$this->importPireps();
# Finish up
// Finish up
$this->findLastPireps();
$this->recalculateRanks();
}
@@ -106,13 +106,13 @@ class Importer
*/
protected function reconnect()
{
$dsn = 'mysql:' . implode(';', [
'host=' . $this->creds['host'],
'port=' . $this->creds['port'],
'dbname=' . $this->creds['name']
$dsn = 'mysql:'.implode(';', [
'host='.$this->creds['host'],
'port='.$this->creds['port'],
'dbname='.$this->creds['name'],
]);
$this->info('Connection string: ' . $dsn);
$this->info('Connection string: '.$dsn);
try {
$this->conn = new PDO($dsn, $this->creds['user'], $this->creds['pass']);
@@ -128,37 +128,40 @@ class Importer
*/
protected function comment($message)
{
$this->log->writeln('<comment>' . $message . '</comment>');
$this->log->writeln('<comment>'.$message.'</comment>');
}
/**
* @param $message
*/
protected function error($message) {
$this->log->writeln('<error>' . $message . '</error>');
protected function error($message)
{
$this->log->writeln('<error>'.$message.'</error>');
}
/**
* @param string $message
* @param string|array $message
*/
protected function info($message)
{
if(\is_array($message)) {
if (\is_array($message)) {
/* @noinspection ForgottenDebugOutputInspection */
print_r($message);
}
else {
} else {
$this->log->writeln('<info>'.$message.'</info>');
}
}
/**
* Return the table name with the prefix
*
* @param $table
*
* @return string
*/
protected function tableName($table)
{
if($this->creds['table_prefix'] !== false) {
if ($this->creds['table_prefix'] !== false) {
return $this->creds['table_prefix'].$table;
}
@@ -166,17 +169,18 @@ class Importer
}
/**
*
* @param \Illuminate\Database\Eloquent\Model $model
*
* @return bool
*/
protected function saveModel($model)
{
try {
$model->save();
return true;
} catch (QueryException $e) {
if($e->getCode() !== '23000') {
if ($e->getCode() !== '23000') {
$this->error($e);
}
@@ -186,13 +190,14 @@ class Importer
/**
* Create a new mapping between an old ID and the new one
*
* @param $entity
* @param $old_id
* @param $new_id
*/
protected function addMapping($entity, $old_id, $new_id)
{
if(!array_key_exists($entity, $this->mappedEntities)) {
if (!array_key_exists($entity, $this->mappedEntities)) {
$this->mappedEntities[$entity] = [];
}
@@ -201,18 +206,20 @@ class Importer
/**
* Return the ID for a mapping
*
* @param $entity
* @param $old_id
*
* @return bool
*/
protected function getMapping($entity, $old_id)
{
if(!array_key_exists($entity, $this->mappedEntities)) {
if (!array_key_exists($entity, $this->mappedEntities)) {
return 0;
}
$entity = $this->mappedEntities[$entity];
if(array_key_exists($old_id, $entity)) {
if (array_key_exists($old_id, $entity)) {
return $entity[$old_id];
}
@@ -221,27 +228,31 @@ class Importer
/**
* @param $date
*
* @return Carbon
*/
protected function parseDate($date)
{
$carbon = Carbon::parse($date);
return $carbon;
}
/**
* Take a decimal duration and convert it to minutes
*
* @param $duration
*
* @return float|int
*/
protected function convertDuration($duration)
{
if(strpos($duration, '.') !== false) {
if (strpos($duration, '.') !== false) {
$delim = '.';
} elseif(strpos($duration, ':')) {
} elseif (strpos($duration, ':')) {
$delim = ':';
} else {
# no delimiter, assume it's just a straight hour
// no delimiter, assume it's just a straight hour
return (int) $duration * 60;
}
@@ -254,58 +265,61 @@ class Importer
/**
* @param $table
*
* @return mixed
*/
protected function getTotalRows($table)
{
$table = $this->tableName($table);
$sql = 'SELECT COUNT(*) FROM ' . $table;
$sql = 'SELECT COUNT(*) FROM '.$table;
$rows = $this->conn->query($sql)->fetchColumn();
$this->info('Found '.$rows.' rows in '.$table);
return (int) $rows;
}
/**
* Read all the rows in a table, but read them in a batched manner
* @param string $table The name of the table
* @param null $read_rows Number of rows to read
*
* @param string $table The name of the table
* @param null $read_rows Number of rows to read
*
* @return \Generator
*/
protected function readRows($table, $read_rows=null)
protected function readRows($table, $read_rows = null)
{
// Set the table prefix if it has been entered
$this->tableName($table);
$offset = 0;
if($read_rows === null) {
if ($read_rows === null) {
$read_rows = self::BATCH_READ_ROWS;
}
$total_rows = $this->getTotalRows($table);
while($offset < $total_rows)
{
while ($offset < $total_rows) {
$rows_to_read = $offset + $read_rows;
if($rows_to_read > $total_rows) {
if ($rows_to_read > $total_rows) {
$rows_to_read = $total_rows;
}
$this->info('Reading '.$offset.' to '.$rows_to_read.' of '.$total_rows);
$sql = 'SELECT * FROM ' . $this->tableName($table)
. ' LIMIT ' . self::BATCH_READ_ROWS . ' OFFSET ' . $offset;
$sql = 'SELECT * FROM '.$this->tableName($table)
.' LIMIT '.self::BATCH_READ_ROWS.' OFFSET '.$offset;
try {
foreach ($this->conn->query($sql) as $row) {
yield $row;
}
} catch(PDOException $e) {
} catch (PDOException $e) {
// Without incrementing the offset, it should re-run the same query
$this->error($e);
if(strpos($e->getMessage(), 'server has gone away') !== false) {
if (strpos($e->getMessage(), 'server has gone away') !== false) {
$this->reconnect();
continue;
}
@@ -317,6 +331,7 @@ class Importer
/**
* Return the subfleet
*
* @return mixed
*/
protected function getSubfleet()
@@ -331,10 +346,8 @@ class Importer
}
/**
*
* All the individual importers, done on a per-table basis
* Some tables get saved locally for tables that use FK refs
*
*/
/**
@@ -345,22 +358,21 @@ class Importer
$this->comment('--- RANK IMPORT ---');
$count = 0;
foreach ($this->readRows('ranks') as $row)
{
foreach ($this->readRows('ranks') as $row) {
$rank = Rank::firstOrCreate(
['name' => $row->rank],
['image_link' => $row->rankimage, 'hours'=>$row->minhours]
['image_url' => $row->rankimage, 'hours' => $row->minhours]
);
$this->addMapping('ranks', $row->rankid, $rank->id);
$this->addMapping('ranks', $row->rank, $rank->id);
if($rank->wasRecentlyCreated) {
++$count;
if ($rank->wasRecentlyCreated) {
$count++;
}
}
$this->info('Imported ' . $count . ' ranks');
$this->info('Imported '.$count.' ranks');
}
/**
@@ -372,8 +384,7 @@ class Importer
$this->comment('--- AIRLINE IMPORT ---');
$count = 0;
foreach ($this->readRows('airlines') as $row)
{
foreach ($this->readRows('airlines') as $row) {
$airline = Airline::firstOrCreate(
['icao' => $row->code],
['iata' => $row->code, 'name' => $row->name, 'active' => $row->enabled]
@@ -383,11 +394,11 @@ class Importer
$this->addMapping('airlines', $row->code, $airline->id);
if ($airline->wasRecentlyCreated) {
++$count;
$count++;
}
}
$this->info('Imported '. $count.' airlines');
$this->info('Imported '.$count.' airlines');
}
/**
@@ -402,23 +413,22 @@ class Importer
$this->info('Subfleet ID is '.$subfleet->id);
$count = 0;
foreach($this->readRows('aircraft') as $row)
{
foreach ($this->readRows('aircraft') as $row) {
$aircraft = Aircraft::firstOrCreate(
['name' => $row->fullname, 'registration' => $row->registration],
['icao' => $row->icao,
['icao' => $row->icao,
'subfleet_id' => $subfleet->id,
'active' => $row->enabled
'active' => $row->enabled,
]);
$this->addMapping('aircraft', $row->id, $aircraft->id);
if($aircraft->wasRecentlyCreated) {
++$count;
if ($aircraft->wasRecentlyCreated) {
$count++;
}
}
$this->info('Imported ' . $count . ' aircraft');
$this->info('Imported '.$count.' aircraft');
}
/**
@@ -429,16 +439,15 @@ class Importer
$this->comment('--- AIRPORT IMPORT ---');
$count = 0;
foreach ($this->readRows('airports') as $row)
{
foreach ($this->readRows('airports') as $row) {
$attrs = [
'id' => trim($row->icao),
'icao' => trim($row->icao),
'name' => $row->name,
'id' => trim($row->icao),
'icao' => trim($row->icao),
'name' => $row->name,
'country' => $row->country,
'lat' => $row->lat,
'lon' => $row->lng,
'hub' => $row->hub,
'lat' => $row->lat,
'lon' => $row->lng,
'hub' => $row->hub,
];
$airport = Airport::updateOrCreate(
@@ -446,12 +455,12 @@ class Importer
$attrs
);
if($airport->wasRecentlyCreated) {
++$count;
if ($airport->wasRecentlyCreated) {
$count++;
}
}
$this->info('Imported ' . $count . ' airports');
$this->info('Imported '.$count.' airports');
}
/**
@@ -462,8 +471,7 @@ class Importer
$this->comment('--- FLIGHT SCHEDULE IMPORT ---');
$count = 0;
foreach ($this->readRows('schedules') as $row)
{
foreach ($this->readRows('schedules') as $row) {
$airline_id = $this->getMapping('airlines', $row->code);
$flight_num = trim($row->flightnum);
@@ -471,14 +479,14 @@ class Importer
$attrs = [
'dpt_airport_id' => $row->depicao,
'arr_airport_id' => $row->arricao,
'route' => $row->route ?: '',
'distance' => round($row->distance ?: 0, 2),
'level' => $row->flightlevel ?: 0,
'dpt_time' => $row->deptime ?: '',
'arr_time' => $row->arrtime ?: '',
'flight_time' => $this->convertDuration($row->flighttime) ?: '',
'notes' => $row->notes ?: '',
'active' => $row->enabled ?: true,
'route' => $row->route ?: '',
'distance' => round($row->distance ?: 0, 2),
'level' => $row->flightlevel ?: 0,
'dpt_time' => $row->deptime ?: '',
'arr_time' => $row->arrtime ?: '',
'flight_time' => $this->convertDuration($row->flighttime) ?: '',
'notes' => $row->notes ?: '',
'active' => $row->enabled ?: true,
];
try {
@@ -487,19 +495,19 @@ class Importer
$attrs
);
} catch (\Exception $e) {
#$this->error($e);
//$this->error($e);
}
$this->addMapping('flights', $row->id, $flight->id);
// TODO: deserialize route_details into ACARS table
if($flight->wasRecentlyCreated) {
++$count;
if ($flight->wasRecentlyCreated) {
$count++;
}
}
$this->info('Imported ' . $count . ' flights');
$this->info('Imported '.$count.' flights');
}
/**
@@ -510,57 +518,56 @@ class Importer
$this->comment('--- PIREP IMPORT ---');
$count = 0;
foreach ($this->readRows('pireps') as $row)
{
foreach ($this->readRows('pireps') as $row) {
$pirep_id = $row->pirepid;
$user_id = $this->getMapping('users', $row->pilotid);
$airline_id = $this->getMapping('airlines', $row->code);
$aircraft_id = $this->getMapping('aircraft', $row->aircraft);
$attrs = [
#'id' => $pirep_id,
'user_id' => $user_id,
'airline_id' => $airline_id,
'aircraft_id' => $aircraft_id,
'flight_number' => $row->flightnum ?: '',
//'id' => $pirep_id,
'user_id' => $user_id,
'airline_id' => $airline_id,
'aircraft_id' => $aircraft_id,
'flight_number' => $row->flightnum ?: '',
'dpt_airport_id' => $row->depicao,
'arr_airport_id' => $row->arricao,
'block_fuel' => $row->fuelused,
'route' => $row->route ?: '',
'source_name' => $row->source,
'created_at' => $this->parseDate($row->submitdate),
'updated_at' => $this->parseDate($row->modifieddate),
'block_fuel' => $row->fuelused,
'route' => $row->route ?: '',
'source_name' => $row->source,
'created_at' => $this->parseDate($row->submitdate),
'updated_at' => $this->parseDate($row->modifieddate),
];
# Set the distance
// Set the distance
$distance = round($row->distance ?: 0, 2);
$attrs['distance'] = $distance;
$attrs['planned_distance'] = $distance;
# Set the flight time properly
// Set the flight time properly
$duration = $this->convertDuration($row->flighttime_stamp);
$attrs['flight_time'] = $duration;
$attrs['planned_flight_time'] = $duration;
# Set how it was filed
if(strtoupper($row->source) === 'MANUAL') {
// Set how it was filed
if (strtoupper($row->source) === 'MANUAL') {
$attrs['source'] = PirepSource::MANUAL;
} else {
$attrs['source'] = PirepSource::ACARS;
}
# Set the flight type
// Set the flight type
$row->flighttype = strtoupper($row->flighttype);
if($row->flighttype === 'P') {
$attrs['flight_type'] = FlightType::PASSENGER;
} elseif($row->flighttype === 'C') {
$attrs['flight_type'] = FlightType::CARGO;
if ($row->flighttype === 'P') {
$attrs['flight_type'] = FlightType::SCHED_PAX;
} elseif ($row->flighttype === 'C') {
$attrs['flight_type'] = FlightType::SCHED_CARGO;
} else {
$attrs['flight_type'] = FlightType::CHARTER;
$attrs['flight_type'] = FlightType::CHARTER_PAX_ONLY;
}
# Set the flight level of the PIREP is set
if(property_exists($row, 'flightlevel')) {
// Set the flight level of the PIREP is set
if (property_exists($row, 'flightlevel')) {
$attrs['level'] = $row->flightlevel;
} else {
$attrs['level'] = 0;
@@ -572,23 +579,23 @@ class Importer
);
$source = strtoupper($row->source);
if($source === 'SMARTCARS') {
# TODO: Parse smartcars log into the acars table
} elseif($source === 'KACARS') {
# TODO: Parse kACARS log into acars table
} elseif($source === 'XACARS') {
# TODO: Parse XACARS log into acars table
if ($source === 'SMARTCARS') {
// TODO: Parse smartcars log into the acars table
} elseif ($source === 'KACARS') {
// TODO: Parse kACARS log into acars table
} elseif ($source === 'XACARS') {
// TODO: Parse XACARS log into acars table
}
# TODO: Add extra fields in as PIREP fields
// TODO: Add extra fields in as PIREP fields
$this->addMapping('pireps', $row->pirepid, $pirep->id);
if ($pirep->wasRecentlyCreated) {
++$count;
$count++;
}
}
$this->info('Imported ' . $count . ' pireps');
$this->info('Imported '.$count.' pireps');
}
protected function importUsers()
@@ -597,10 +604,9 @@ class Importer
$count = 0;
foreach ($this->readRows('pilots', 50) as $row) {
// TODO: What to do about pilot ids
# TODO: What to do about pilot ids
$name = $row->firstname . ' ' . $row->lastname;
$name = $row->firstname.' '.$row->lastname;
$airline_id = $this->getMapping('airlines', $row->code);
$rank_id = $this->getMapping('ranks', $row->rank);
@@ -609,17 +615,17 @@ class Importer
$new_password = Str::random(60);
$attrs = [
'name' => $name,
'password' => Hash::make($new_password),
'api_key' => Utils::generateApiKey(),
'airline_id' => $airline_id,
'rank_id' => $rank_id,
'name' => $name,
'password' => Hash::make($new_password),
'api_key' => Utils::generateApiKey(),
'airline_id' => $airline_id,
'rank_id' => $rank_id,
'home_airport_id' => $row->hub,
'curr_airport_id' => $row->hub,
'flights' => (int)$row->totalflights,
'flight_time' => Utils::hoursToMinutes($row->totalhours),
'state' => $state,
'created_at' => $this->parseDate($row->joindate),
'flights' => (int) $row->totalflights,
'flight_time' => Utils::hoursToMinutes($row->totalhours),
'state' => $state,
'created_at' => $this->parseDate($row->joindate),
];
$user = User::updateOrCreate(
@@ -630,11 +636,11 @@ class Importer
$this->addMapping('users', $row->pilotid, $user->id);
if ($user->wasRecentlyCreated) {
++$count;
$count++;
}
}
$this->info('Imported ' . $count . ' users');
$this->info('Imported '.$count.' users');
}
/**
@@ -642,7 +648,6 @@ class Importer
*/
protected function findLastPireps()
{
}
/**
@@ -655,7 +660,9 @@ class Importer
/**
* Get the user's new state from their original state
*
* @param $state
*
* @return int
*/
protected function getUserState($state)
@@ -666,24 +673,23 @@ class Importer
// Declare array of classic states
$phpvms_classic_states = [
'ACTIVE' => 0,
'ACTIVE' => 0,
'INACTIVE' => 1,
'BANNED' => 2,
'ON_LEAVE' => 3
'BANNED' => 2,
'ON_LEAVE' => 3,
];
// Decide which state they will be in accordance with v7
if ($state === $phpvms_classic_states['ACTIVE']) {
return UserState::ACTIVE;
} elseif ($state === $phpvms_classic_states['INACTIVE']) {
# TODO: Make an inactive state?
// TODO: Make an inactive state?
return UserState::REJECTED;
} elseif ($state === $phpvms_classic_states['BANNED']) {
return UserState::SUSPENDED;
} elseif ($state === $phpvms_classic_states['ON_LEAVE']) {
return UserState::ON_LEAVE;
} else {
$this->error('Unknown status: '. $state);
}
$this->error('Unknown status: '.$state);
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Cron\Hourly;
use App\Events\CronHourly;
use App\Interfaces\Listener;
use App\Models\Bid;
use Carbon\Carbon;
/**
* Remove expired bids
*/
class RemoveExpiredBids extends Listener
{
/**
* Remove expired bids
*
* @param CronHourly $event
*
* @throws \Exception
*/
public function handle(CronHourly $event): void
{
if (setting('bids.expire_time') === 0) {
return;
}
$date = Carbon::now()->subHours(setting('bids.expire_time'));
Bid::whereDate('created_at', '<', $date)->delete();
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Cron\Hourly;
use App\Events\CronHourly;
use App\Interfaces\Listener;
use App\Models\Pirep;
use Carbon\Carbon;
/**
* Remove expired live flights
*/
class RemoveExpiredLiveFlights extends Listener
{
/**
* Remove expired live flights
*
* @param CronHourly $event
*
* @throws \Exception
*/
public function handle(CronHourly $event): void
{
if (setting('acars.live_time') === 0) {
return;
}
$date = Carbon::now()->subHours(setting('acars.live_time'));
Pirep::whereDate('created_at', '<', $date)
->where('state', PirepState::IN_PROGRESS)
->delete();
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Cron\Monthly;
use App\Events\CronMonthly;
use App\Interfaces\Listener;
use App\Models\Enums\ExpenseType;
use App\Services\Finance\RecurringFinanceService;
/**
* Go through and apply any finances that are daily
*/
class ApplyExpenses extends Listener
{
private $financeSvc;
/**
* ApplyExpenses constructor.
*
* @param RecurringFinanceService $financeSvc
*/
public function __construct(RecurringFinanceService $financeSvc)
{
$this->financeSvc = $financeSvc;
}
/**
* Apply all of the expenses for a month
*
* @param CronMonthly $event
*
* @throws \UnexpectedValueException
* @throws \InvalidArgumentException
* @throws \Prettus\Validator\Exceptions\ValidatorException
*/
public function handle(CronMonthly $event): void
{
$this->financeSvc->processExpenses(ExpenseType::MONTHLY);
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Cron\Nightly;
use App\Events\CronNightly;
use App\Interfaces\Listener;
use App\Models\Enums\ExpenseType;
use App\Services\Finance\RecurringFinanceService;
/**
* Go through and apply any finances that are daily
*/
class ApplyExpenses extends Listener
{
private $financeSvc;
/**
* ApplyExpenses constructor.
*
* @param RecurringFinanceService $financeSvc
*/
public function __construct(RecurringFinanceService $financeSvc)
{
$this->financeSvc = $financeSvc;
}
/**
* Apply all of the expenses for a day
*
* @param CronNightly $event
*
* @throws \UnexpectedValueException
* @throws \InvalidArgumentException
* @throws \Prettus\Validator\Exceptions\ValidatorException
*/
public function handle(CronNightly $event): void
{
$this->financeSvc->processExpenses(ExpenseType::DAILY);
}
}

View File

@@ -0,0 +1,50 @@
<?php
namespace App\Cron\Nightly;
use App\Events\CronNightly;
use App\Interfaces\Listener;
use App\Models\Enums\UserState;
use App\Models\User;
use App\Services\UserService;
use Carbon\Carbon;
/**
* Determine if any pilots should be set to ON LEAVE status
*/
class PilotLeave extends Listener
{
private $userSvc;
/**
* PilotLeave constructor.
*/
public function __construct(UserService $userSvc)
{
$this->userSvc = $userSvc;
}
/**
* Set any users to being on leave after X days
*
* @param CronNightly $event
*
* @throws \UnexpectedValueException
* @throws \InvalidArgumentException
*/
public function handle(CronNightly $event): void
{
if (setting('pilots.auto_leave_days') === 0) {
return;
}
$date = Carbon::now()->subDay(setting('pilots.auto_leave_days'));
$users = User::where('status', UserState::ACTIVE)
->whereDate('updated_at', '<', $date);
foreach ($users as $user) {
Log::info('Setting user '.$user->ident.' to ON LEAVE status');
$this->userSvc->setStatusOnLeave($user);
}
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace App\Cron\Nightly;
use App\Events\CronNightly;
use App\Interfaces\Listener;
use App\Models\Journal;
use App\Repositories\JournalRepository;
use Log;
/**
* This recalculates the balances on all of the journals
*/
class RecalculateBalances extends Listener
{
private $journalRepo;
/**
* Nightly constructor.
*
* @param JournalRepository $journalRepo
*/
public function __construct(JournalRepository $journalRepo)
{
$this->journalRepo = $journalRepo;
}
/**
* Recalculate all the balances for the different ledgers
*
* @param CronNightly $event
*
* @throws \UnexpectedValueException
* @throws \InvalidArgumentException
*/
public function handle(CronNightly $event): void
{
Log::info('Recalculating balances');
$journals = Journal::all();
foreach ($journals as $journal) {
$old_balance = $journal->balance;
$this->journalRepo->recalculateBalance($journal);
$journal->refresh();
Log::info('Adjusting balance on '.
$journal->morphed_type.':'.$journal->morphed_id
.' from '.$old_balance.' to '.$journal->balance);
}
Log::info('Done calculating balances');
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace App\Cron\Nightly;
use App\Events\CronNightly;
use App\Interfaces\Listener;
use App\Models\Enums\UserState;
use App\Repositories\UserRepository;
use App\Services\UserService;
use Log;
/**
* This recalculates the balances on all of the journals
*/
class RecalculateStats extends Listener
{
private $userRepo;
private $userSvc;
public function __construct(UserRepository $userRepo, UserService $userService)
{
$this->userRepo = $userRepo;
$this->userSvc = $userService;
}
/**
* Recalculate the stats for active users
*
* @param CronNightly $event
*
* @throws \UnexpectedValueException
* @throws \InvalidArgumentException
*/
public function handle(CronNightly $event): void
{
Log::info('Recalculating balances');
$w = [
['state', '!=', UserState::REJECTED],
];
$users = $this->userRepo->findWhere($w, ['id', 'name', 'airline_id']);
foreach ($users as $user) {
$this->userSvc->recalculateStats($user);
}
Log::info('Done recalculating stats');
}
}

View File

@@ -0,0 +1,97 @@
<?php
namespace App\Cron\Nightly;
use App\Events\CronNightly;
use App\Interfaces\Listener;
use App\Models\Enums\Days;
use App\Models\Flight;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
/**
* Figure out what flights need to be active for today
*/
class SetActiveFlights extends Listener
{
/**
* @param CronNightly $event
*/
public function handle(CronNightly $event): void
{
$this->checkFlights();
}
/**
* Look through every single flight, check the start/end dates,
* as well of the days of week if this flight is active on this day
*
* TODO: Option to check the flight active/inactive against departure TZ
* TODO: Move to FlightService
*/
public function checkFlights(): void
{
$today = Carbon::now('UTC');
$flights = Flight::all();
/**
* @var Flight $flight
*/
foreach ($flights as $flight) {
if (!$flight->active) {
continue;
}
// dates aren't set, so just save if there were any changes above
// and move onto the next one
if ($flight->start_date === null || $flight->end_date === null) {
if ($flight->days !== null && $flight->days > 0) {
$visible = Days::isToday($flight->days);
if ($flight->visible !== $visible) {
Log::info('Flight '.$flight->ident.' to '.($visible ? 'shown' : 'hidden'));
$flight->visible = $visible;
if ($visible === false) {
Log::info('Today='.date('N').', start=no, mask='.$flight->days.', in='
.Days::in($flight->days, Days::$isoDayMap[(int) date('N')]));
}
}
} else {
Log::info('Toggling flight '.$flight->ident.' to visible');
$flight->visible = true;
}
$flight->save();
continue;
}
// Check the day of week now first
// Start/end date is set, so make sure today is valid for it to be alive
// and then make sure if days of the week are specified, check that too
if ($today->gte($flight->start_date) && $today->lte($flight->end_date)) {
if ($flight->days !== null && $flight->days > 0) {
$visible = Days::isToday($flight->days);
if ($flight->visible !== $visible) {
Log::info('Toggling flight '.$flight->ident.' to '.($visible ? 'shown' : 'hidden').'');
$flight->visible = $visible;
if ($visible === false) {
Log::info('Today='.date('N').', start='.$flight->start_date
.', end='.$flight->end_date.', mask='.$flight->days.', in='
.Days::in($flight->days, Days::$isoDayMap[(int) date('N')]));
}
}
} else {
Log::info('Toggling flight '.$flight->ident.' to visible');
$flight->visible = true;
}
} else {
$flight->visible = false;
Log::info('Toggling flight '.$flight->ident.' to hidden, outside of start/end boundary');
}
$flight->save();
}
}
}

View File

@@ -4,18 +4,20 @@ use Faker\Generator as Faker;
$factory->define(App\Models\Acars::class, function (Faker $faker) {
return [
'id' => null,
'pirep_id' => null,
'log' => $faker->text(100),
'lat' => $faker->latitude,
'lon' => $faker->longitude,
'heading' => $faker->numberBetween(0, 359),
'altitude' => $faker->numberBetween(20, 400),
'vs' => $faker->numberBetween(-5000, 5000),
'gs' => $faker->numberBetween(300, 500),
'id' => null,
'pirep_id' => null,
'log' => $faker->text(100),
'lat' => $faker->latitude,
'lon' => $faker->longitude,
'distance' => $faker->randomFloat(2, 0, 6000),
'heading' => $faker->numberBetween(0, 359),
'altitude' => $faker->numberBetween(20, 400),
'vs' => $faker->numberBetween(-5000, 5000),
'gs' => $faker->numberBetween(300, 500),
'transponder' => $faker->numberBetween(200, 9999),
'autopilot' => $faker->text(10),
'fuel_flow' => $faker->randomFloat(2, 100, 1000),
'sim_time' => $faker->dateTime('now', 'UTC'),
'autopilot' => $faker->text(10),
'fuel' => $faker->randomFloat(2, 100, 1000),
'fuel_flow' => $faker->randomFloat(2, 100, 1000),
'sim_time' => $faker->dateTime('now', 'UTC'),
];
});

View File

@@ -4,20 +4,23 @@ use Faker\Generator as Faker;
$factory->define(App\Models\Aircraft::class, function (Faker $faker) {
return [
#'id' => $faker->unique()->numberBetween(10, 100000),
'subfleet_id' => function() {
'id' => null,
'subfleet_id' => function () {
return factory(App\Models\Subfleet::class)->create()->id;
},
'airport_id' => function () {
return factory(App\Models\Airport::class)->create()->id;
},
'icao' => $faker->unique()->text(5),
'name' => $faker->unique()->text(50),
'iata' => $faker->unique()->text(5),
'icao' => $faker->unique()->text(5),
'name' => $faker->text(50),
'registration' => $faker->unique()->text(10),
'tail_number' => $faker->unique()->text(10),
'active' => true,
'created_at' => $faker->dateTimeBetween('-1 week', 'now'),
'updated_at' => function (array $pirep) {
'hex_code' => \App\Support\ICAO::createHexCode(),
'zfw' => $faker->randomFloat(2, 0, 50000),
'status' => \App\Models\Enums\AircraftStatus::ACTIVE,
'state' => \App\Models\Enums\AircraftState::PARKED,
'created_at' => $faker->dateTimeBetween('-1 week', 'now'),
'updated_at' => function (array $pirep) {
return $pirep['created_at'];
},
];

View File

@@ -3,20 +3,23 @@
use Faker\Generator as Faker;
use Hashids\Hashids;
/**
/*
* Add any number of airports. Don't really care if they're real or not
*/
$factory->define(App\Models\Airline::class, function (Faker $faker) {
return [
#'id' => $faker->unique()->numberBetween(10, 10000),
'id' => null,
'icao' => function (array $apt) use ($faker) {
$hashids = new Hashids(microtime(), 5);
$mt = str_replace('.', '', microtime(true));
return $hashids->encode($mt);
},
'iata' => function (array $apt) { return $apt['icao']; },
'name' => $faker->sentence(3),
'iata' => function (array $apt) {
return $apt['icao'];
},
'name' => $faker->sentence(3),
'country' => $faker->country,
'active' => 1
'active' => 1,
];
});

View File

@@ -1,37 +1,55 @@
<?php
use Hashids\Hashids;
use Faker\Generator as Faker;
/**
/*
* Create an ICAO for use in the factory.
*/
if (!function_exists('createFactoryICAO')) {
function createFactoryICAO(): string
{
$characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$max = strlen($characters) - 1;
$string = '';
for ($i = 0; $i < 4; $i++) {
try {
$string .= $characters[random_int(0, $max)];
} catch (Exception $e) {
}
}
return $string;
}
}
/*
* Add any number of airports. Don't really care if they're real or not
*/
$factory->define(App\Models\Airport::class, function (Faker $faker) {
$used = [];
return [
'id' => function(array $apt) use ($faker) {
$characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$string = '';
$max = strlen($characters) - 1;
for ($i = 0; $i < 5; $i++) {
$string .= $characters[random_int(0, $max)];
}
'id' => function () use ($used) {
do {
$string = createFactoryICAO();
} while (in_array($string, $used, true));
return $string;
#return $faker->unique()->text(5);
/*$hashids = new Hashids(microtime(), 5);
$mt = str_replace('.', '', microtime(true));
return $hashids->encode($mt);*/
},
'icao' => function(array $apt) { return $apt['id']; },
'iata' => function (array $apt) { return $apt['id']; },
'name' => $faker->sentence(3),
'country' => $faker->country,
'tz' => $faker->timezone,
'lat' => $faker->latitude,
'lon' => $faker->longitude,
'fuel_100ll_cost' => $faker->randomFloat(2),
'fuel_jeta_cost' => $faker->randomFloat(2),
'fuel_mogas_cost' => $faker->randomFloat(2),
'icao' => function (array $apt) {
return $apt['id'];
},
'iata' => function (array $apt) {
return $apt['id'];
},
'name' => $faker->sentence(3),
'country' => $faker->country,
'timezone' => $faker->timezone,
'lat' => $faker->latitude,
'lon' => $faker->longitude,
'hub' => false,
'ground_handling_cost' => $faker->randomFloat(2, 0, 500),
'fuel_100ll_cost' => $faker->randomFloat(2, 0, 100),
'fuel_jeta_cost' => $faker->randomFloat(2, 0, 100),
'fuel_mogas_cost' => $faker->randomFloat(2, 0, 100),
];
});

View File

@@ -0,0 +1,13 @@
<?php
use Faker\Generator as Faker;
$factory->define(App\Models\Award::class, function (Faker $faker) {
return [
'id' => null,
'name' => $faker->name,
'description' => $faker->text(10),
'ref_model' => null,
'ref_model_params' => null,
];
});

View File

@@ -0,0 +1,18 @@
<?php
use App\Models\Enums\ExpenseType;
use Faker\Generator as Faker;
$factory->define(App\Models\Expense::class, function (Faker $faker) {
return [
'id' => null,
'airline_id' => null,
'name' => $faker->text(20),
'amount' => $faker->randomFloat(2, 100, 1000),
'type' => ExpenseType::FLIGHT,
'multiplier' => false,
'ref_model' => \App\Models\Expense::class,
'ref_model_id' => null,
'active' => true,
];
});

View File

@@ -4,10 +4,13 @@ use Faker\Generator as Faker;
$factory->define(App\Models\Fare::class, function (Faker $faker) {
return [
#'id' => $faker->unique()->numberBetween(10, 10000),
'code' => $faker->text(5),
'name' => $faker->text(20),
'id' => null,
'code' => $faker->unique()->text(50),
'name' => $faker->text(50),
'price' => $faker->randomFloat(2, 100, 1000),
'cost' => function (array $fare) {
return round($fare['price'] / 2);
},
'capacity' => $faker->randomFloat(0, 20, 500),
];
});

View File

@@ -1,19 +1,19 @@
<?php
/**
* Create flights
*/
use Faker\Generator as Faker;
# Match the list available in tests/data/*.yml
$airlinesAvailable = [1];
$factory->define(App\Models\Flight::class, function (Faker $faker) use ($airlinesAvailable) {
$factory->define(App\Models\Flight::class, function (Faker $faker) {
return [
'id' => substr($faker->unique()->sha1, 28, 12),
'airline_id' => $faker->randomElement($airlinesAvailable),
'flight_number' => $faker->unique()->numberBetween(10, 1000000),
'route_code' => $faker->randomElement(['', $faker->text(5)]),
'route_leg' => $faker->randomElement(['', $faker->text(5)]),
'dpt_airport_id' => function() {
'id' => $faker->unique()->numberBetween(10, 10000000),
'airline_id' => function () {
return factory(App\Models\Airline::class)->create()->id;
},
'flight_number' => $faker->unique()->numberBetween(10, 1000000),
'route_code' => $faker->randomElement(['', $faker->text(5)]),
'route_leg' => $faker->randomElement(['', $faker->numberBetween(0, 1000)]),
'dpt_airport_id' => function () {
return factory(App\Models\Airport::class)->create()->id;
},
'arr_airport_id' => function () {
@@ -22,15 +22,21 @@ $factory->define(App\Models\Flight::class, function (Faker $faker) use ($airline
'alt_airport_id' => function () {
return factory(App\Models\Airport::class)->create()->id;
},
'route' => $faker->randomElement(['', $faker->text(5)]),
'dpt_time' => $faker->time(),
'arr_time' => $faker->time(),
'flight_time' => $faker->randomFloat(2),
'has_bid' => false,
'active' => true,
'created_at' => $faker->dateTimeBetween('-1 week', 'now'),
'updated_at' => function (array $pirep) {
return $pirep['created_at'];
'distance' => $faker->numberBetween(0, 3000),
'route' => null,
'level' => 0,
'dpt_time' => $faker->time(),
'arr_time' => $faker->time(),
'flight_time' => $faker->numberBetween(60, 360),
'has_bid' => false,
'active' => true,
'visible' => true,
'days' => 0,
'start_date' => null,
'end_date' => null,
'created_at' => $faker->dateTimeBetween('-1 week', 'now'),
'updated_at' => function (array $flight) {
return $flight['created_at'];
},
];
});

View File

@@ -0,0 +1,9 @@
<?php
use Faker\Generator as Faker;
$factory->define(App\Models\Journal::class, function (Faker $faker) {
return [
'currency' => 'USD',
];
});

View File

@@ -0,0 +1,17 @@
<?php
use Faker\Generator as Faker;
$factory->define(App\Models\JournalTransactions::class, function (Faker $faker) {
return [
'transaction_group' => \Ramsey\Uuid\Uuid::uuid4()->toString(),
'journal_id' => function () {
return factory(App\Models\Journal::class)->create()->id;
},
'credit' => $faker->numberBetween(100, 10000),
'debit' => $faker->numberBetween(100, 10000),
'currency' => 'USD',
'memo' => $faker->sentence(6),
'post_date' => \Carbon\Carbon::now(),
];
});

View File

@@ -1,15 +1,15 @@
<?php
use App\Models\Enums\NavaidType;
use Faker\Generator as Faker;
use \App\Models\Enums\NavaidType;
$factory->define(App\Models\Navdata::class, function (Faker $faker) {
return [
'id' => str_replace(' ', '', str_replace('.', '', $faker->unique()->text(5))),
'name' => $faker->unique()->text(10),
'id' => str_replace(' ', '', str_replace('.', '', $faker->unique()->text(5))),
'name' => str_replace('.', '', $faker->unique()->word),
'type' => $faker->randomElement([NavaidType::VOR, NavaidType::NDB]),
'lat' => $faker->latitude,
'lon' => $faker->longitude,
'lat' => $faker->latitude,
'lon' => $faker->longitude,
'freq' => $faker->randomFloat(2, 100, 1000),
];
});

View File

@@ -0,0 +1,14 @@
<?php
use Faker\Generator as Faker;
$factory->define(App\Models\News::class, function (Faker $faker) {
return [
'id' => null,
'user_id' => function () {
return factory(App\Models\User::class)->create()->id;
},
'subject' => $faker->text(),
'body' => $faker->sentence,
];
});

View File

@@ -3,56 +3,55 @@
use Carbon\Carbon;
use Faker\Generator as Faker;
/**
/*
* Create a new PIREP
*/
$factory->define(App\Models\Pirep::class, function (Faker $faker) {
static $raw_data;
return [
'id' => null,
'airline_id' => function () { # OVERRIDE THIS IF NEEDED
'id' => $faker->unique()->numberBetween(10, 10000000),
'airline_id' => function () {
return factory(App\Models\Airline::class)->create()->id;
},
'user_id' => function () { # OVERRIDE THIS IF NEEDED
'user_id' => function () {
return factory(App\Models\User::class)->create()->id;
},
'aircraft_id' => function () {
return factory(App\Models\Aircraft::class)->create()->id;
},
'flight_number' => function () {
return factory(App\Models\Flight::class)->create()->flight_number;
},
'route_code' => function(array $pirep) {
//return App\Models\Flight::where(['flight_number' => $pirep['flight_number']])->first()->route_code;
},
'route_leg' => function (array $pirep) {
//return App\Models\Flight::where('flight_number', $pirep['flight_number'])->first()->route_leg;
'flight_number' => function (array $pirep) {
return factory(App\Models\Flight::class)->create([
'airline_id' => $pirep['airline_id'],
])->flight_number;
},
'route_code' => null,
'route_leg' => null,
'dpt_airport_id' => function () {
return factory(App\Models\Airport::class)->create()->id;
},
'arr_airport_id' => function () {
return factory(App\Models\Airport::class)->create()->id;
},
'level' => $faker->numberBetween(20, 400),
'distance' => $faker->randomFloat(2),
'planned_distance' => $faker->randomFloat(2),
'flight_time' => $faker->randomFloat(2),
'planned_flight_time' => $faker->randomFloat(2),
'zfw' => $faker->randomFloat(2),
'block_fuel' => $faker->randomFloat(2),
'fuel_used' => $faker->randomFloat(2),
'route' => $faker->text(200),
'notes' => $faker->text(200),
'source' => $faker->randomElement([PirepSource::MANUAL, PirepSource::ACARS]),
'source_name' => 'Test Factory',
'state' => PirepState::PENDING,
'status' => PirepStatus::SCHEDULED,
'raw_data' => $raw_data ?: $raw_data = json_encode(['key' => 'value']),
'created_at' => Carbon::now()->toDateTimeString(),
'updated_at' => function(array $pirep) {
'level' => $faker->numberBetween(20, 400),
'distance' => $faker->randomFloat(2, 0, 6000),
'planned_distance' => $faker->randomFloat(2, 0, 6000),
'flight_time' => $faker->numberBetween(60, 360),
'planned_flight_time' => $faker->numberBetween(60, 360),
'zfw' => $faker->randomFloat(2),
'block_fuel' => $faker->randomFloat(2, 0, 30000),
'fuel_used' => $faker->randomFloat(2, 0, 30000),
'block_on_time' => Carbon::now('UTC'),
'block_off_time' => function (array $pirep) {
return $pirep['block_on_time']->subMinutes($pirep['flight_time']);
},
'route' => $faker->text(200),
'notes' => $faker->text(200),
'source' => $faker->randomElement([PirepSource::MANUAL, PirepSource::ACARS]),
'source_name' => 'Test Factory',
'state' => PirepState::PENDING,
'status' => PirepStatus::SCHEDULED,
'submitted_at' => Carbon::now('UTC')->toDateTimeString(),
'created_at' => Carbon::now('UTC')->toDateTimeString(),
'updated_at' => function (array $pirep) {
return $pirep['created_at'];
},
];

View File

@@ -11,11 +11,13 @@ use Faker\Generator as Faker;
*/
$factory->define(App\Models\Rank::class, function (Faker $faker) {
return [
#'id' => $faker->unique()->numberBetween(10, 10000),
'name' => $faker->unique()->text(50),
'hours' => $faker->numberBetween(10, 50),
'auto_approve_acars' => 0,
'auto_approve_manual' => 0,
'auto_promote' => 0,
'id' => null,
'name' => $faker->unique()->text(50),
'hours' => $faker->numberBetween(10, 50),
'acars_base_pay_rate' => $faker->numberBetween(10, 100),
'manual_base_pay_rate' => $faker->numberBetween(10, 100),
'auto_approve_acars' => 0,
'auto_approve_manual' => 0,
'auto_promote' => 0,
];
});

View File

@@ -4,9 +4,12 @@ use Faker\Generator as Faker;
$factory->define(App\Models\Subfleet::class, function (Faker $faker) {
return [
#'id' => $faker->unique()->numberBetween(10, 10000),
'airline_id' => 1,
'name' => $faker->unique()->text(50),
'type' => $faker->unique()->text(7),
'id' => null,
'airline_id' => function () {
return factory(App\Models\Airline::class)->create()->id;
},
'name' => $faker->unique()->text(50),
'type' => $faker->unique()->text(7),
'ground_handling_multiplier' => $faker->numberBetween(50, 200),
];
});

View File

@@ -1,26 +1,25 @@
<?php
use Faker\Generator as Faker;
use App\Models\Enums\UserState;
use Faker\Generator as Faker;
$factory->define(App\Models\User::class, function (Faker $faker)
{
$factory->define(App\Models\User::class, function (Faker $faker) {
static $password;
return [
#'id' => $faker->unique()->numberBetween(10, 10000),
'name' => $faker->name,
'email' => $faker->safeEmail,
'password' => $password ?: $password = Hash::make('secret'),
'api_key' => $faker->sha1,
'id' => null,
'name' => $faker->name,
'email' => $faker->safeEmail,
'password' => $password ?: $password = Hash::make('secret'),
'api_key' => $faker->sha1,
'airline_id' => function () {
return factory(App\Models\Airline::class)->create()->id;
},
'rank_id' => 1,
'flights' => $faker->numberBetween(0, 1000),
'flight_time' => $faker->numberBetween(0, 10000),
'transfer_time' => $faker->numberBetween(0, 10000),
'state' => UserState::ACTIVE,
'rank_id' => 1,
'flights' => $faker->numberBetween(0, 1000),
'flight_time' => $faker->numberBetween(0, 10000),
'transfer_time' => $faker->numberBetween(0, 10000),
'state' => UserState::ACTIVE,
'remember_token' => $faker->unique()->text(5),
];
});

View File

@@ -1,10 +1,17 @@
<?php
use App\Models\Migrations\Migration;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateSettingsTable extends Migration
{
private $migrationSvc;
public function __construct()
{
$this->migrationSvc = new \Modules\Installer\Services\MigrationService();
}
/**
* Run the migrations.
*
@@ -14,229 +21,23 @@ class CreateSettingsTable extends Migration
{
Schema::create('settings', function (Blueprint $table) {
$table->string('id');
$table->unsignedInteger('offset')->default(0);
$table->unsignedInteger('order')->default(99);
$table->string('key');
$table->string('name');
$table->string('value');
$table->string('default')->nullable();
$table->string('group')->nullable();
$table->string('type')->nullable();
$table->string('options')->nullable();
$table->text('options')->nullable();
$table->string('description')->nullable();
$table->primary('id');
$table->index('key');
$table->timestamps();
});
$this->addCounterGroups([
'general' => 1,
'flights' => 20,
'finances' => 40,
'bids' => 60,
'pireps' => 80,
'pilots' => 100,
]);
/**
* Initial default settings
*/
$settings = [
[
'id' => $this->formatSettingId('general.start_date'),
'order' => $this->getNextOrderNumber('general'),
'name' => 'Start Date',
'group' => 'general',
'value' => '',
'type' => 'date',
'description' => 'The date your VA started',
],
[
'id' => $this->formatSettingId('general.admin_email'),
'order' => $this->getNextOrderNumber('general'),
'name' => 'Admin Email',
'group' => 'general',
'value' => '',
'type' => 'text',
'description' => 'Email where notices, etc are sent',
],
[
'id' => $this->formatSettingId('general.currency'),
'order' => $this->getNextOrderNumber('general'),
'name' => 'Currency to Use',
'group' => 'general',
'value' => 'dollar',
'type' => 'select',
'options' => 'dollar,euro,gbp,yen,jpy,rupee,ruble',
'description' => 'Currency to show in the interface',
],
[
'id' => $this->formatSettingId('general.distance_unit'),
'order' => $this->getNextOrderNumber('general'),
'name' => 'Distance Units',
'group' => 'general',
'value' => 'nm',
'type' => 'select',
'options' => 'km,mi,nm',
'description' => 'The distance unit to show',
],
[
'id' => $this->formatSettingId('general.weight_unit'),
'order' => $this->getNextOrderNumber('general'),
'name' => 'Weight Units',
'group' => 'general',
'value' => 'kg',
'type' => 'select',
'options' => 'lbs, kg',
'description' => 'The weight unit',
],
[
'id' => $this->formatSettingId('general.speed_unit'),
'order' => $this->getNextOrderNumber('general'),
'name' => 'Speed Units',
'group' => 'general',
'value' => 'Km/H',
'type' => 'select',
'options' => 'Km/H,kts',
'description' => 'The speed unit',
],
[
'id' => $this->formatSettingId('general.altitude_unit'),
'order' => $this->getNextOrderNumber('general'),
'name' => 'Altitude Units',
'group' => 'general',
'value' => 'ft',
'type' => 'select',
'options' => 'ft,m',
'description' => 'The altitude units',
],
[
'id' => $this->formatSettingId('general.liquid_unit'),
'order' => $this->getNextOrderNumber('general'),
'name' => 'Liquid Units',
'group' => 'general',
'value' => 'lbs',
'type' => 'select',
'options' => 'liters,gal,kg,lbs',
'description' => 'The liquid units',
],
/**
* BIDS
*/
[
'id' => $this->formatSettingId('bids.disable_flight_on_bid'),
'order' => $this->getNextOrderNumber('bids'),
'name' => 'Disable flight on bid',
'group' => 'bids',
'value' => true,
'type' => 'boolean',
'description' => 'When a flight is bid on, no one else can bid on it',
],
[
'id' => $this->formatSettingId('bids.allow_multiple_bids'),
'order' => $this->getNextOrderNumber('bids'),
'name' => 'Allow multiple bids',
'group' => 'bids',
'value' => true,
'type' => 'boolean',
'description' => 'Whether or not someone can bid on multiple flights',
],
/**
* FINANCES
*/
/**
* PIREPS
*/
[
'id' => $this->formatSettingId('pireps.duplicate_check_time'),
'order' => $this->getNextOrderNumber('pireps'),
'name' => 'PIREP duplicate time check',
'group' => 'pireps',
'value' => 10,
'default' => 10,
'type' => 'int',
'description' => 'The time in minutes to check for a duplicate PIREP',
],
[
'id' => $this->formatSettingId('pireps.hide_cancelled_pireps'),
'order' => $this->getNextOrderNumber('pireps'),
'name' => 'Hide Cancelled PIREPs',
'group' => 'pireps',
'value' => true,
'default' => true,
'type' => 'boolean',
'description' => 'Hide any cancelled PIREPs in the front-end',
],
[
'id' => $this->formatSettingId('pireps.restrict_aircraft_to_rank'),
'order' => $this->getNextOrderNumber('pireps'),
'name' => 'Restrict Aircraft to Ranks',
'group' => 'pireps',
'value' => true,
'default' => true,
'type' => 'boolean',
'description' => 'Aircraft that can be flown are restricted to a user\'s rank',
],
/**
* PILOTS
*/
[
'id' => $this->formatSettingId('pilots.id_length'),
'order' => $this->getNextOrderNumber('pilots'),
'name' => 'Pilot ID Length',
'group' => 'pilots',
'value' => 4,
'default' => 4,
'type' => 'int',
'description' => 'The length of a pilot\'s ID',
],
[
'id' => $this->formatSettingId('pilot.auto_accept'),
'order' => $this->getNextOrderNumber('pilots'),
'name' => 'Auto Accept New Pilot',
'group' => 'pilots',
'value' => true,
'type' => 'boolean',
'description' => 'Automatically accept a pilot when they register',
],
[
'id' => $this->formatSettingId('pilots.only_flights_from_current'),
'order' => $this->getNextOrderNumber('pilots'),
'name' => 'Flights from Current',
'group' => 'pilots',
'value' => false,
'type' => 'boolean',
'description' => 'Only show/allow flights from their current location',
],
[
'id' => $this->formatSettingId('pilot.auto_leave_days'),
'order' => $this->getNextOrderNumber('pilots'),
'name' => 'Pilot to ON LEAVE days',
'group' => 'pilots',
'value' => 30,
'default' => 30,
'type' => 'int',
'description' => 'Automatically set a pilot to ON LEAVE status after N days of no activity',
],
[
'id' => $this->formatSettingId('pilots.hide_inactive'),
'order' => $this->getNextOrderNumber('pilots'),
'name' => 'Hide Inactive Pilots',
'group' => 'pilots',
'value' => true,
'type' => 'boolean',
'description' => 'Don\'t show inactive pilots in the public view',
],
];
$this->addData('settings', $settings);
$this->migrationSvc->updateAllSettings();
}
/**

View File

@@ -1,8 +1,8 @@
<?php
use App\Models\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
@@ -24,14 +24,16 @@ class CreateUsersTable extends Migration
$table->string('country', 2)->nullable();
$table->string('home_airport_id', 5)->nullable();
$table->string('curr_airport_id', 5)->nullable();
$table->string('last_pirep_id', 12)->nullable();
$table->string('last_pirep_id', \App\Models\Pirep::ID_MAX_LENGTH)->nullable();
$table->unsignedBigInteger('flights')->default(0);
$table->unsignedBigInteger('flight_time')->nullable()->default(0);
$table->unsignedBigInteger('transfer_time')->nullable()->default(0);
$table->decimal('balance', 19)->nullable();
$table->string('avatar')->nullable();
$table->string('timezone', 64)->nullable();
$table->unsignedTinyInteger('status')->nullable()->default(0);
$table->unsignedTinyInteger('state')->nullable()->default(0);
$table->boolean('toc_accepted')->nullable();
$table->boolean('opt_in')->nullable();
$table->boolean('active')->nullable();
$table->ipAddress('last_ip')->nullable();
$table->rememberToken();

View File

@@ -1,6 +1,6 @@
<?php
use App\Models\Migrations\Migration;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
class RolesPermissionsTables extends Migration
@@ -8,7 +8,7 @@ class RolesPermissionsTables extends Migration
/**
* Run the migrations.
*
* @return void
* @return void
*/
public function up()
{
@@ -67,28 +67,27 @@ class RolesPermissionsTables extends Migration
$table->primary(['permission_id', 'role_id']);
});
# create a default user/role
// create a default user/role
$roles = [
[
'id' => 1,
'name' => 'admin',
'id' => 1,
'name' => 'admin',
'display_name' => 'Administrators',
],
[
'id' => 2,
'name' => 'user',
'display_name' => 'Pilot'
'id' => 2,
'name' => 'user',
'display_name' => 'Pilot',
],
];
$this->addData('roles', $roles);
}
/**
* Reverse the migrations.
*
* @return void
* @return void
*/
public function down()
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
class CreatePasswordResetsTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
class CreateSessionsTable extends Migration
{

View File

@@ -1,11 +1,10 @@
<?php
use Illuminate\Database\Migrations\Migration;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateAirlinesTable extends Migration
{
/**
* Run the migrations.
*

View File

@@ -1,8 +1,8 @@
<?php
use \App\Models\Enums\AircraftState;
use Illuminate\Database\Migrations\Migration;
use App\Interfaces\Migration;
use App\Models\Enums\AircraftState;
use App\Models\Enums\AircraftStatus;
use Illuminate\Database\Schema\Blueprint;
class CreateAircraftsTable extends Migration
@@ -13,22 +13,21 @@ class CreateAircraftsTable extends Migration
$table->increments('id');
$table->unsignedInteger('subfleet_id');
$table->string('icao', 4)->nullable();
$table->string('iata', 4)->nullable();
$table->string('airport_id', 5)->nullable();
$table->timestamp('landing_time')->nullable();
$table->string('hex_code', 10)->nullable();
$table->string('name', 50);
$table->string('registration', 10)->nullable();
$table->string('tail_number', 10)->nullable();
$table->unsignedDecimal('zfw', 12)->nullable()->default(0);
$table->string('hex_code', 10)->nullable();
$table->unsignedDecimal('zfw')->nullable()->default(0);
$table->unsignedBigInteger('flight_time')->nullable()->default(0);
$table->boolean('active')->default(true);
$table->char('status', 1)->default(AircraftStatus::ACTIVE);
$table->unsignedTinyInteger('state')->default(AircraftState::PARKED);
$table->timestamps();
$table->unique('registration');
$table->index('airport_id');
});
}
public function down()

View File

@@ -1,11 +1,10 @@
<?php
use Illuminate\Database\Migrations\Migration;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateFaresTable extends Migration
{
/**
* Run the migrations.
*
@@ -15,10 +14,10 @@ class CreateFaresTable extends Migration
{
Schema::create('fares', function (Blueprint $table) {
$table->increments('id');
$table->string('code', 50);
$table->string('code', 50)->unique();
$table->string('name', 50);
$table->unsignedDecimal('price', 19)->nullable()->default(0.00);
$table->unsignedDecimal('cost', 19)->nullable()->default(0.00);
$table->unsignedDecimal('price')->nullable()->default(0.00);
$table->unsignedDecimal('cost')->nullable()->default(0.00);
$table->unsignedInteger('capacity')->nullable()->default(0);
$table->string('notes')->nullable();
$table->boolean('active')->default(true);

View File

@@ -1,6 +1,6 @@
<?php
use Illuminate\Database\Migrations\Migration;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateAirportsTable extends Migration
@@ -8,19 +8,24 @@ class CreateAirportsTable extends Migration
public function up()
{
Schema::create('airports', function (Blueprint $table) {
$table->string('id', 5)->primary();
$table->string('iata', 5)->nullable();
$table->string('icao', 5);
$table->string('id', 4)->primary();
$table->string('iata', 4)->nullable();
$table->string('icao', 4);
$table->string('name', 100);
$table->string('location', 100)->nullable();
$table->string('country', 64)->nullable();
$table->string('tz', 64)->nullable();
$table->string('timezone', 64)->nullable();
$table->boolean('hub')->default(false);
$table->unsignedDecimal('fuel_100ll_cost', 8)->nullable()->default(0);
$table->unsignedDecimal('fuel_jeta_cost', 8)->nullable()->default(0);
$table->unsignedDecimal('fuel_mogas_cost', 8)->nullable()->default(0);
$table->float('lat', 7, 4)->nullable()->default(0.0);
$table->float('lon', 7, 4)->nullable()->default(0.0);
$table->unsignedDecimal('ground_handling_cost')->nullable()->default(0);
$table->unsignedDecimal('fuel_100ll_cost')->nullable()->default(0);
$table->unsignedDecimal('fuel_jeta_cost')->nullable()->default(0);
$table->unsignedDecimal('fuel_mogas_cost')->nullable()->default(0);
$table->index('icao');
$table->index('iata');
$table->index('hub');
});
}

View File

@@ -1,13 +1,11 @@
<?php
use App\Interfaces\Migration;
use App\Models\Enums\FlightType;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateFlightTables extends Migration
{
/**
* Run the migrations.
*
@@ -16,37 +14,40 @@ class CreateFlightTables extends Migration
public function up()
{
Schema::create('flights', function (Blueprint $table) {
$table->string('id', 12);
$table->string('id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->unsignedInteger('airline_id');
$table->string('flight_number', 10);
$table->unsignedInteger('flight_number');
$table->string('route_code', 5)->nullable();
$table->string('route_leg', 5)->nullable();
$table->string('dpt_airport_id', 5);
$table->string('arr_airport_id', 5);
$table->string('alt_airport_id', 5)->nullable();
$table->unsignedInteger('route_leg')->nullable();
$table->string('dpt_airport_id', 4);
$table->string('arr_airport_id', 4);
$table->string('alt_airport_id', 4)->nullable();
$table->string('dpt_time', 10)->nullable();
$table->string('arr_time', 10)->nullable();
$table->unsignedInteger('level')->nullable()->default(0);
$table->unsignedDecimal('distance', 19)->nullable()->default(0.0);
$table->unsignedDecimal('flight_time', 19)->nullable();
$table->tinyInteger('flight_type')->default(FlightType::PASSENGER);
$table->unsignedDecimal('distance')->nullable()->default(0.0);
$table->unsignedInteger('flight_time')->nullable();
$table->char('flight_type', 1)->default(FlightType::SCHED_PAX);
$table->text('route')->nullable();
$table->text('notes')->nullable();
$table->boolean('scheduled')->default(false)->nullable();
$table->unsignedTinyInteger('days')->nullable();
$table->date('start_date')->nullable();
$table->date('end_date')->nullable();
$table->boolean('has_bid')->default(false);
$table->boolean('active')->default(true);
$table->boolean('visible')->default(true); // used by the cron
$table->timestamps();
$table->primary('id');
#$table->unique('flight_number');
$table->index('flight_number');
$table->index('dpt_airport_id');
$table->index('arr_airport_id');
});
Schema::create('flight_fare', function (Blueprint $table) {
$table->string('flight_id', 12);
$table->string('flight_id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->unsignedInteger('fare_id');
$table->string('price', 10)->nullable();
$table->string('cost', 10)->nullable();
@@ -56,15 +57,37 @@ class CreateFlightTables extends Migration
$table->primary(['flight_id', 'fare_id']);
});
/*
* Hold a master list of fields
*/
Schema::create('flight_fields', function (Blueprint $table) {
$table->increments('id');
$table->string('flight_id', 12);
$table->string('name', 50);
$table->string('slug', 50)->nullable();
});
/*
* The values for the actual fields
*/
Schema::create('flight_field_values', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('flight_id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->string('name', 50);
$table->string('slug', 50)->nullable();
$table->text('value');
$table->timestamps();
$table->index('flight_id');
});
Schema::create('flight_subfleet', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedInteger('subfleet_id');
$table->string('flight_id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->index(['subfleet_id', 'flight_id']);
$table->index(['flight_id', 'subfleet_id']);
});
}
/**
@@ -76,6 +99,7 @@ class CreateFlightTables extends Migration
{
Schema::drop('flight_fields');
Schema::drop('flight_fare');
Schema::drop('flight_subfleet');
Schema::drop('flights');
}
}

View File

@@ -1,11 +1,10 @@
<?php
use App\Models\Migrations\Migration;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateRanksTable extends Migration
{
/**
* Run the migrations.
*
@@ -16,11 +15,15 @@ class CreateRanksTable extends Migration
Schema::create('ranks', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 50);
$table->string('image_link')->nullable();
$table->string('image_url')->nullable();
$table->unsignedInteger('hours')->default(0);
$table->unsignedDecimal('acars_base_pay_rate')->nullable()->default(0);
$table->unsignedDecimal('manual_base_pay_rate')->nullable()->default(0);
$table->boolean('auto_approve_acars')->nullable()->default(false);
$table->boolean('auto_approve_manual')->nullable()->default(false);
$table->boolean('auto_promote')->nullable()->default(true);
$table->boolean('auto_approve_above_score')->nullable()->default(false);
$table->smallInteger('auto_approve_score')->nullable();
$table->timestamps();
$table->unique('name');
@@ -31,10 +34,12 @@ class CreateRanksTable extends Migration
*/
$ranks = [
[
'id' => 1,
'name' => 'New Pilot',
'hours' => 0,
]
'id' => 1,
'name' => 'New Pilot',
'hours' => 0,
'acars_base_pay_rate' => 50,
'manual_base_pay_rate' => 25,
],
];
$this->addData('ranks', $ranks);

View File

@@ -1,63 +1,47 @@
<?php
use Illuminate\Database\Migrations\Migration;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
/**
* Class CreateSubfleetTables
*/
class CreateSubfleetTables extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('subfleets', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('airline_id')->nullable();
$table->string('type', 50)->unique();
$table->string('name', 50);
$table->string('type', 50);
$table->unsignedDecimal('cost_block_hour')->default(0)->nullable();
$table->unsignedDecimal('cost_delay_minute')->default(0)->nullable();
$table->unsignedTinyInteger('fuel_type')->nullable();
$table->unsignedDecimal('cargo_capacity', 19)->nullable();
$table->unsignedDecimal('fuel_capacity', 19)->nullable();
$table->unsignedDecimal('gross_weight', 19)->nullable();
$table->unsignedDecimal('ground_handling_multiplier')->nullable()->default(100);
$table->unsignedDecimal('cargo_capacity')->nullable();
$table->unsignedDecimal('fuel_capacity')->nullable();
$table->unsignedDecimal('gross_weight')->nullable();
$table->timestamps();
});
Schema::create('subfleet_expenses', function(Blueprint $table) {
$table->unsignedBigInteger('subfleet_id');
$table->string('name', 50);
$table->unsignedDecimal('cost', 19);
$table->primary(['subfleet_id', 'name']);
});
Schema::create('subfleet_fare', function (Blueprint $table) {
$table->unsignedInteger('subfleet_id');
$table->unsignedInteger('fare_id');
$table->unsignedDecimal('price', 19)->nullable();
$table->unsignedDecimal('cost', 19)->nullable();
$table->unsignedInteger('capacity')->nullable();
$table->string('price')->nullable();
$table->string('cost')->nullable();
$table->string('capacity')->nullable();
$table->timestamps();
$table->primary(['subfleet_id', 'fare_id']);
$table->index(['fare_id', 'subfleet_id']);
});
Schema::create('subfleet_flight', function(Blueprint $table) {
$table->unsignedInteger('subfleet_id');
$table->string('flight_id', 12);
$table->primary(['subfleet_id', 'flight_id']);
$table->index(['flight_id', 'subfleet_id']);
});
Schema::create('subfleet_rank', function(Blueprint $table) {
Schema::create('subfleet_rank', function (Blueprint $table) {
$table->unsignedInteger('rank_id');
$table->unsignedInteger('subfleet_id');
$table->unsignedDecimal('acars_pay', 19)->nullable();
$table->unsignedDecimal('manual_pay', 19)->nullable();
$table->string('acars_pay')->nullable();
$table->string('manual_pay')->nullable();
$table->primary(['rank_id', 'subfleet_id']);
$table->index(['subfleet_id', 'rank_id']);
@@ -72,9 +56,7 @@ class CreateSubfleetTables extends Migration
public function down()
{
Schema::dropIfExists('subfleets');
Schema::dropIfExists('subfleet_expenses');
Schema::dropIfExists('subfleet_fare');
Schema::dropIfExists('subfleet_flight');
Schema::dropIfExists('subfleet_rank');
}
}

View File

@@ -1,15 +1,13 @@
<?php
use App\Interfaces\Migration;
use App\Models\Enums\FlightType;
use App\Models\Enums\PirepState;
use App\Models\Enums\PirepStatus;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreatePirepTables extends Migration
{
/**
* Run the migrations.
*
@@ -18,76 +16,64 @@ class CreatePirepTables extends Migration
public function up()
{
Schema::create('pireps', function (Blueprint $table) {
$table->string('id', 12);
$table->string('id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->unsignedInteger('user_id');
$table->unsignedInteger('airline_id');
$table->unsignedInteger('aircraft_id')->nullable();
$table->string('flight_id', 12)->nullable();
$table->string('flight_number', 10)->nullable();
$table->string('route_code', 5)->nullable();
$table->string('route_leg', 5)->nullable();
$table->string('dpt_airport_id', 5);
$table->string('arr_airport_id', 5);
$table->char('flight_type', 1)->default(FlightType::SCHED_PAX);
$table->string('dpt_airport_id', 4);
$table->string('arr_airport_id', 4);
$table->string('alt_airport_id', 4)->nullable();
$table->unsignedInteger('level')->nullable();
$table->unsignedDecimal('distance')->nullable();
$table->unsignedDecimal('planned_distance')->nullable();
$table->unsignedDecimal('flight_time', 19)->nullable();
$table->unsignedDecimal('planned_flight_time', 19)->nullable();
$table->unsignedDecimal('zfw', 19)->nullable();
$table->unsignedDecimal('block_fuel', 19)->nullable();
$table->unsignedDecimal('fuel_used', 19)->nullable();
$table->decimal('landing_rate', 8)->nullable();
$table->unsignedInteger('flight_time')->nullable();
$table->unsignedInteger('planned_flight_time')->nullable();
$table->unsignedDecimal('zfw')->nullable();
$table->unsignedDecimal('block_fuel')->nullable();
$table->unsignedDecimal('fuel_used')->nullable();
$table->decimal('landing_rate')->nullable();
$table->smallInteger('score')->nullable();
$table->text('route')->nullable();
$table->text('notes')->nullable();
$table->unsignedTinyInteger('source')->nullable()->default(0);
$table->string('source_name', 25)->nullable();
$table->tinyInteger('flight_type')->default(FlightType::PASSENGER);
$table->string('source_name', 50)->nullable();
$table->tinyInteger('state')->default(PirepState::PENDING);
$table->tinyInteger('status')->default(PirepStatus::SCHEDULED);
$table->longText('raw_data')->nullable();
$table->char('status', 3)->default(PirepStatus::SCHEDULED);
$table->dateTime('submitted_at')->nullable();
$table->dateTime('block_off_time')->nullable();
$table->dateTime('block_on_time')->nullable();
$table->timestamps();
$table->primary('id');
$table->index('user_id');
$table->index('flight_id');
$table->index('flight_number');
$table->index('dpt_airport_id');
$table->index('arr_airport_id');
});
Schema::create('pirep_comments', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('pirep_id', 12);
$table->string('pirep_id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->unsignedInteger('user_id');
$table->text('comment');
$table->timestamps();
});
/*
* Financial tables/fields
*/
Schema::create('pirep_expenses', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('pirep_id', 12);
$table->string('name');
$table->double('value', 19, 2)->nullable();
$table->index('pirep_id');
});
Schema::create('pirep_fares', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('pirep_id', 12);
$table->unsignedBigInteger('fare_id');
$table->unsignedInteger('count')->nullable();
$table->string('pirep_id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->unsignedInteger('fare_id');
$table->unsignedInteger('count')->nullable()->default(0);
$table->index('pirep_id');
});
/*
* Additional PIREP data
*/
Schema::create('pirep_fields', function (Blueprint $table) {
$table->bigIncrements('id');
$table->increments('id');
$table->string('name', 50);
$table->string('slug', 50)->nullable();
$table->boolean('required')->nullable()->default(false);
@@ -95,10 +81,11 @@ class CreatePirepTables extends Migration
Schema::create('pirep_field_values', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('pirep_id', 12);
$table->string('pirep_id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->string('name', 50);
$table->string('slug', 50)->nullable();
$table->string('value')->nullable();
$table->string('source')->nullable();
$table->unsignedTinyInteger('source');
$table->timestamps();
$table->index('pirep_id');
@@ -114,7 +101,6 @@ class CreatePirepTables extends Migration
{
Schema::dropIfExists('pireps');
Schema::dropIfExists('pirep_comments');
Schema::dropIfExists('pirep_expenses');
Schema::dropIfExists('pirep_fares');
Schema::dropIfExists('pirep_fields');
Schema::dropIfExists('pirep_field_values');

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
class CreateBidsTable extends Migration
{
@@ -13,10 +13,10 @@ class CreateBidsTable extends Migration
*/
public function up()
{
Schema::create('user_bids', function (Blueprint $table) {
Schema::create('bids', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id');
$table->string('flight_id', 12);
$table->string('flight_id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->timestamps();
$table->index('user_id');
@@ -31,6 +31,6 @@ class CreateBidsTable extends Migration
*/
public function down()
{
Schema::dropIfExists('user_bids');
Schema::dropIfExists('bids');
}
}

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
class CreateJobsTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
class CreateFailedJobsTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
class CreateNavdataTables extends Migration
{
@@ -13,7 +13,7 @@ class CreateNavdataTables extends Migration
*/
public function up()
{
/**
/*
* See for defs, modify/update based on this
* https://github.com/skiselkov/openfmc/blob/master/airac.h
*/

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
class CreateAcarsTables extends Migration
{
@@ -15,20 +15,23 @@ class CreateAcarsTables extends Migration
{
Schema::create('acars', function (Blueprint $table) {
$table->string('id', 12);
$table->string('pirep_id', 12);
$table->string('pirep_id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->unsignedTinyInteger('type');
$table->unsignedInteger('nav_type')->nullable();
$table->unsignedInteger('order')->default(0);
$table->string('name')->nullable();
$table->char('status', 3)->default(PirepStatus::SCHEDULED);
$table->string('log')->nullable();
$table->float('lat', 7, 4)->nullable()->default(0.0);
$table->float('lon', 7, 4)->nullable()->default(0.0);
$table->unsignedInteger('distance')->nullable();
$table->unsignedInteger('heading')->nullable();
$table->unsignedInteger('altitude')->nullable();
$table->integer('vs')->nullable();
$table->unsignedInteger('gs')->nullable();
$table->unsignedInteger('transponder')->nullable();
$table->string('autopilot')->nullable();
$table->decimal('fuel')->nullable();
$table->decimal('fuel_flow')->nullable();
$table->string('sim_time')->nullable();

View File

@@ -1,6 +1,6 @@
<?php
use App\Models\Migrations\Migration;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateStatsTable extends Migration
@@ -22,14 +22,10 @@ class CreateStatsTable extends Migration
$table->primary('id');
$table->timestamps();
});
$this->addCounterGroups([
/*$this->addCounterGroups([
'flights' => 1,
]);
/**
* Initial default settings
*/
$stats = [
[
'id' => $this->formatSettingId('flights.total_flights'),
@@ -47,7 +43,7 @@ class CreateStatsTable extends Migration
],
];
$this->addData('stats', $stats);
$this->addData('stats', $stats);*/
}
/**

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
class CreateNewsTable extends Migration
{

View File

@@ -0,0 +1,53 @@
<?php
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAwardsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('awards', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->text('description')->nullable();
$table->text('image_url')->nullable();
// ref fields are expenses tied to some model object
// EG, the airports has an internal expense for gate costs
$table->string('ref_model')->nullable();
$table->text('ref_model_params')->nullable();
//$table->string('ref_model_id', 36)->nullable();
$table->timestamps();
$table->index(['ref_model']);
});
Schema::create('user_awards', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id');
$table->unsignedInteger('award_id');
$table->timestamps();
$table->index(['user_id', 'award_id']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('awards');
Schema::dropIfExists('user_awards');
}
}

View File

@@ -0,0 +1,37 @@
<?php
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateExpensesTable extends Migration
{
public function up()
{
Schema::create('expenses', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('airline_id')->nullable();
$table->string('name');
$table->unsignedInteger('amount');
$table->char('type');
$table->boolean('charge_to_user')->nullable()->default(false);
$table->boolean('multiplier')->nullable()->default(0);
$table->boolean('active')->nullable()->default(true);
// ref fields are expenses tied to some model object
// EG, the airports has an internal expense for gate costs
$table->string('ref_model')->nullable();
$table->string('ref_model_id', 36)->nullable();
$table->timestamps();
$table->index(['ref_model', 'ref_model_id']);
});
}
public function down()
{
Schema::dropIfExists('expenses');
}
}

View File

@@ -0,0 +1,46 @@
<?php
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateJournalTransactionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('journal_transactions', function (Blueprint $table) {
$table->char('id', 36)->unique();
$table->string('transaction_group')->nullable();
$table->integer('journal_id');
$table->unsignedBigInteger('credit')->nullable();
$table->unsignedBigInteger('debit')->nullable();
$table->char('currency', 5);
$table->text('memo')->nullable();
$table->string('tags')->nullable();
$table->string('ref_model', 50)->nullable();
$table->string('ref_model_id', 36)->nullable();
$table->timestamps();
$table->date('post_date');
$table->primary('id');
$table->index('journal_id');
$table->index('transaction_group');
$table->index(['ref_model', 'ref_model_id']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('journal_transactions');
}
}

View File

@@ -0,0 +1,36 @@
<?php
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateJournalsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('journals', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('ledger_id')->nullable();
$table->unsignedTinyInteger('type')->default(0);
$table->bigInteger('balance')->default(0);
$table->string('currency', 5);
$table->nullableMorphs('morphed');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('journals');
}
}

View File

@@ -0,0 +1,33 @@
<?php
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateLedgersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('ledgers', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->enum('type', ['asset', 'liability', 'equity', 'income', 'expense']);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('ledgers');
}
}

View File

@@ -0,0 +1,42 @@
<?php
use App\Interfaces\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFilesTable extends Migration
{
/**
* Create the files table. Acts as a morphable
*
* @return void
*/
public function up()
{
Schema::create('files', function (Blueprint $table) {
$table->string('id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->string('name');
$table->string('description')->nullable();
$table->string('disk')->nullable();
$table->string('path');
$table->boolean('public')->default(true);
$table->unsignedInteger('download_count')->default(0);
$table->string('ref_model', 50)->nullable();
$table->string('ref_model_id', 36)->nullable();
$table->timestamps();
$table->primary('id');
$table->index(['ref_model', 'ref_model_id']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('files');
}
}

View File

@@ -1,36 +1,40 @@
<?php
use App\Services\DatabaseService;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Map these other environments to a specific seed file
*
* @var array
*/
public static $seed_mapper = [
'local' => 'dev',
'qa' => 'dev',
'staging' => 'dev',
'local' => 'dev',
'qa' => 'dev',
'staging' => 'dev',
];
/**
* Run the database seeds.
*
* @throws Exception
*/
public function run()
{
$env = App::environment();
if(array_key_exists($env, self::$seed_mapper)) {
if (array_key_exists($env, self::$seed_mapper)) {
$env = self::$seed_mapper[$env];
}
$path = database_path('seeds/'.$env.'.yml');
if(!file_exists($path)) {
if (!file_exists($path)) {
$path = database_path('seeds/prod.yml');
}
$svc = app('App\Services\DatabaseService');
$svc = app(DatabaseService::class);
$svc->seed_from_yaml_file($path);
}
}

View File

@@ -0,0 +1,49 @@
acars:
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: TNV
lat: 30.28852
lon: -96.058239
created_at: now
updated_at: now
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: IAH
lat: 29.95691
lon: -95.345719
created_at: now
updated_at: now
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: LCH
lat: 30.14151
lon: -93.105569
created_at: now
updated_at: now
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: MEI
lat: 32.37843
lon: -88.804267
created_at: now
updated_at: now
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: ATL
lat: 33.62907
lon: -84.435064
created_at: now
updated_at: now
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: SIE
lat: 39.0955
lon: -74.800344
created_at: now
updated_at: now

View File

@@ -10,7 +10,7 @@ airports:
name: Austin-Bergstrom
location: Austin, Texas, USA
country: United States
timezone: America/Chicago
lat: 30.1945278
lon: -97.6698889
hub: 1
tz: America/Chicago

View File

@@ -0,0 +1,723 @@
acars:
- id: aM8QpMPEB15e
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.934117958358'
lon: '-76.77856721815'
heading: '124'
altitude: '8.1663703232199'
vs: '0'
gs: '0.0064996252497234'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: eZ6VJ3xj8vge
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.934117498661'
lon: '-76.778566516289'
heading: '124'
altitude: '8.1664622222087'
vs: '0'
gs: '0'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: bo2QqDLl2lLa
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.933884143334'
lon: '-76.778210172233'
heading: '124'
altitude: '8.1707802663933'
vs: '0'
gs: '14.419195209695'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: aM8QpM4qV2Be
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.933705349611'
lon: '-76.777936938059'
heading: '124'
altitude: '8.170089899507'
vs: '0'
gs: '15.392330039049'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: dR6oxR9qjoOd
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.933130691906'
lon: '-76.777152737985'
heading: '158'
altitude: '8.1683570286331'
vs: '0'
gs: '10.450467475023'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: erkRwJODRvEa
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.932580370289'
lon: '-76.777450200122'
heading: '221'
altitude: '8.1695896791822'
vs: '0'
gs: '12.932334300694'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: b2kv53VMy7Ad
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.932012550651'
lon: '-76.778009113329'
heading: '296'
altitude: '8.1683852467213'
vs: '0'
gs: '10.502719192825'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: eXDoE14JxAve
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.932052237309'
lon: '-76.778111495187'
heading: '290'
altitude: '8.1719753739837'
vs: '0'
gs: '12.643743277153'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: b68R5gZ5YyOe
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.932664026837'
lon: '-76.779705339967'
heading: '293'
altitude: '8.2203963962548'
vs: '0'
gs: '64.870244840054'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: bqxYvGNN5N0a
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.934300220408'
lon: '-76.783954914814'
heading: '293'
altitude: '8.3302468103811'
vs: '0'
gs: '122.78529244208'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: en5rpBKw514d
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.935736496556'
lon: '-76.78765616448'
heading: '293'
altitude: '49.554739665916'
vs: '21'
gs: '146.79677958636'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: erkRwJA29l2a
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '17.976972983585'
lon: '-76.896548114872'
heading: '297'
altitude: '6228.684012199'
vs: '62'
gs: '281.03976876098'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: dR6oxR3r5nwd
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.061360208405'
lon: '-77.056156629983'
heading: '301'
altitude: '12522.331716891'
vs: '25'
gs: '371.70833265547'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: e1wr82J877Zb
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.17373613295'
lon: '-77.260347185993'
heading: '301'
altitude: '16802.15636323'
vs: '43'
gs: '421.37353688139'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: bqxYvGyExN2a
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.193907285814'
lon: '-77.29810465405'
heading: '297'
altitude: '17395.953175647'
vs: '40'
gs: '425.98105291451'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: aQW0wQDQk5Md
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.648921231143'
lon: '-78.014696613517'
heading: '323'
altitude: '37108.124381987'
vs: '22'
gs: '438.52028383384'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: e9rQ5lk3p63a
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.796585259338'
lon: '-78.194734005052'
heading: '260'
altitude: '39718.178225504'
vs: '19'
gs: '432.41969107334'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: aQW0wQP8vZqd
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.660552760063'
lon: '-78.407597067994'
heading: '242'
altitude: '40998.775690971'
vs: '-25'
gs: '449.51695639627'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: bqxYvGKgp32a
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.592775999582'
lon: '-78.638711340118'
heading: '298'
altitude: '41060.297106821'
vs: '0'
gs: '427.14806185954'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: bqxYvGg2r02a
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.718367591656'
lon: '-78.840980459275'
heading: '284'
altitude: '41065.55293844'
vs: '1'
gs: '424.89060056552'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: e0RV61wPj53b
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.77448809677'
lon: '-79.082727467209'
heading: '283'
altitude: '41069.809333539'
vs: '0'
gs: '425.02780492483'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: dwpmBOo3wWwe
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.813031600863'
lon: '-79.249543355636'
heading: '283'
altitude: '41072.545805172'
vs: '0'
gs: '425.04687332464'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: ejRqlxXoZPle
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.840653974635'
lon: '-79.370042672541'
heading: '283'
altitude: '40396.200981621'
vs: '-16'
gs: '428.08364925851'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: eVOPBYw4q9Xa
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.868358744495'
lon: '-79.491434926253'
heading: '283'
altitude: '39399.093383161'
vs: '-16'
gs: '427.57826037174'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: aOYyrOmVPzEd
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.896191929474'
lon: '-79.613169477385'
heading: '284'
altitude: '36491.730092364'
vs: '-55'
gs: '429.74732238829'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: dL98oLQgyzje
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.9242378342'
lon: '-79.736368411294'
heading: '284'
altitude: '32998.644142986'
vs: '-61'
gs: '434.90864533098'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: e9rQ5lqD2o8a
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.952608029755'
lon: '-79.861339775352'
heading: '284'
altitude: '29069.168636089'
vs: '-68'
gs: '441.90475491564'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: av2oANWY1vma
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '18.981670375928'
lon: '-79.987960713131'
heading: '283'
altitude: '24954.890708875'
vs: '-56'
gs: '447.81957529674'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: 9aAN4mxlK9zb
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '19.01074931075'
lon: '-80.116947122245'
heading: '283'
altitude: '21483.90439337'
vs: '-57'
gs: '450.05461228268'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: e1wr82gp8zGb
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '19.039021032617'
lon: '-80.242584645189'
heading: '283'
altitude: '18000.954967422'
vs: '-58'
gs: '431.5690825604'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: dG65jDL2gK0b
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '19.066116186076'
lon: '-80.36338355333'
heading: '284'
altitude: '14630.153058153'
vs: '-55'
gs: '414.70845758094'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: epYQ0ENmyvXa
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '19.091238961633'
lon: '-80.475901417309'
heading: '284'
altitude: '11927.379697397'
vs: '-17'
gs: '381.57664353055'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: erkRwJPrVoEa
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '19.10261633392'
lon: '-80.527021151647'
heading: '284'
altitude: '11424.525210898'
vs: '-17'
gs: '337.58307680654'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: e1wr82gZXqZb
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '19.112886513796'
lon: '-80.57297038027'
heading: '284'
altitude: '10919.983208888'
vs: '-16'
gs: '307.28164751381'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: eER95AJ4XLga
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '19.122449020305'
lon: '-80.615560002642'
heading: '284'
altitude: '10418.227268525'
vs: '-16'
gs: '292.97011599774'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: dPNZvP0O0Gza
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '19.131746364354'
lon: '-80.657133675868'
heading: '284'
altitude: '9921.6695218175'
vs: '-16'
gs: '293.10586428433'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: aQW0wQYVm2Yd
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '19.141074988147'
lon: '-80.698952940579'
heading: '284'
altitude: '9423.0799985721'
vs: '-16'
gs: '291.77956791503'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'
- id: eXDoE11x32We
pirep_id: b68R5gwVzpVe
type: '0'
nav_type: null
order: '0'
name: null
log: null
lat: '19.150291803457'
lon: '-80.740363792336'
heading: '284'
altitude: '8921.7506913567'
vs: '-16'
gs: '289.03760297791'
transponder: null
autopilot: null
fuel_flow: null
sim_time: now
created_at: 'now'
updated_at: 'now'

View File

@@ -10,7 +10,7 @@ airports:
name: Austin-Bergstrom
location: Austin, Texas, USA
country: United States
timezone: America/Chicago
lat: 30.1945278
lon: -97.6698889
hub: 1
tz: America/Chicago

View File

@@ -4,6 +4,7 @@ airlines:
icao: VMS
iata: VM
name: phpvms airlines
country: us
active: 1
created_at: now
updated_at: now
@@ -24,6 +25,8 @@ users:
flight_time: 0
timezone: America/Chicago
state: 1
opt_in: 1
toc_accepted: 1
created_at: now
updated_at: now
- id: 2
@@ -40,6 +43,8 @@ users:
created_at: now
updated_at: now
state: 0
opt_in: 1
toc_accepted: 1
- id: 3
name: Raymond Pearson
email: raymond.pearson56@example.com
@@ -54,6 +59,8 @@ users:
created_at: now
updated_at: now
state: 1
opt_in: 0
toc_accepted: 1
role_user:
- user_id: 1
@@ -74,18 +81,34 @@ ranks:
- id: 2
name: Junior First Officer
hours: 10
acars_base_pay_rate: 100
manual_base_pay_rate: 90
- id: 3
name: First Officer
hours: 15
acars_base_pay_rate: 250
manual_base_pay_rate: 200
auto_approve_acars: 1
auto_approve_manual: 1
- id: 4
name: Senior Captain
hours: 20
acars_base_pay_rate: 500
manual_base_pay_rate: 400
auto_approve_acars: 1
auto_approve_manual: 1
auto_promote: 0
awards:
- id: 1
name: Pilot 50 flights
description: When a pilot has 50 flights, give this award
image_url:
ref_model: App\Awards\PilotFlightAwards
ref_model_params: 50
created_at: now
updated_at: now
news:
- id: 1
user_id: 1
@@ -110,91 +133,162 @@ airports:
name: Austin-Bergstrom
location: Austin, Texas, USA
country: United States
timezone: America/Chicago
lat: 30.1945278
lon: -97.6698889
hub: 1
tz: America/Chicago
ground_handling_cost: 100
- id: KJFK
iata: JFK
icao: KJFK
name: John F Kennedy
location: New York, New York, USA
country: United States
timezone: America/New_York
lat: 40.6399257
lon: -73.7786950
hub: 1
tz: America/New_York
- id: KBWI
iata: BWI
icao: KBWI
name: Baltimore/Washington International Thurgood Marshall Airport
location: Baltimore, MD
ground_handling_cost: 250
- id: KPAE
iata: PAE
icao: KPAE
name: Snohomish County (Paine Field) Airport
location: Everett
country: United States
lat: 39.1754
lon: -76.6683
tz: America/New_York
- id: KIAH
iata: IAH
icao: KIAH
name: George Bush Intercontinental Houston Airport
location: Houston, TX
timezone: America/Los_Angeles
lat: 47.9063
lon: -122.282
hub: 0
- id: KSEA
iata: SEA
icao: KSEA
name: Seattle Tacoma International Airport
location: Seattle
country: United States
lat: 29.9844
lon: -95.3414
tz: America/Chicago
- id: KORD
iata: ORD
icao: KORD
name: Chicago O'Hare International Airport
location: Chicago, IL
country: United States
lat: 41.9786
lon: -87.9048
tz: America/Chicago
- id: KDFW
iata: DFW
icao: KDFW
name: Dallas Fort Worth International Airport
location: Dallas, TX
country: United States
lat: 32.8968
lon: -97.038
tz: America/Chicago
- id: EFHK
iata: HEL
icao: EFHK
name: Helsinki Vantaa Airport
location: Helsinki
country: Finland
lat: 60.3172
lon: 24.9633
tz: Europe/Helsinki
timezone: America/Los_Angeles
lat: 47.449
lon: -122.309
hub: 0
- id: EGLL
iata: LHR
icao: EGLL
name: London Heathrow
location: London, England
timezone: Europe/London
lat: 51.4775
lon: -0.4614
tz: Europe/London
ground_handling_cost: 500
- id: MKJP
iata: KIN
icao: MKJP
name: Norman Manley International Airport
location: Kingston, Jamaica
country:
timezone: America/Jamaica
lat: 17.9357
lon: -76.7875
ground_handling_cost: 50
- id: MWCR
iata: GCM
icao: MWCR
name: Owen Roberts International Airport
location: Georgetown
country: Cayman
timezone: America/Cayman
lat: 19.2928
lon: -81.3577
ground_handling_cost: 50
- id: OMDB
iata: DXB
icao: OMDB
name: Dubai International Airport
location: Dubai, UAE
country:
timezone: Asia/Dubai
lat: 25.2528
lon: 55.3644
ground_handling_cost: 50
#
aircraft:
- id: 1
subfleet_id: 1
name: Boeing 747-400
registration: NC17
tail_number: 17
airport_id: KJFK
name: Boeing 747-438
registration: 001Z
status: A
- id: 2
subfleet_id: 2
airport_id: LGRP
name: Boeing 777-200
registration: NC20
tail_number: 20
registration: C202
status: A
- id: 3
subfleet_id: 1
airport_id: KAUS
name: Boeing 747-412
registration: NS233
tail_number: 1233
registration: S2333
status: A
- id: 4
subfleet_id: 1
airport_id: KAUS
name: Boeing 747-436 RETIRED
registration:
status: R
expenses:
- name: Per-Flight (no muliplier)
amount: 100
type: F
active: 1
ref_model: App\Models\Expense
- name: Per-Flight (multiplier)
amount: 100
type: F
multiplier: 1
active: 1
ref_model: App\Models\Expense
- name: Per-Flight (multiplier, on airline)
airline_id: 1
amount: 200
type: F
multiplier: 1
active: 1
ref_model: App\Models\Expense
- name: A daily fee
amount: 800
type: D
active: 1
ref_model: App\Models\Expense
- name: A monthly fee
amount: 5000
type: M
active: 1
ref_model: App\Models\Expense
- name: Catering
amount: 1000
type: F
active: 1
ref_model: App\Models\Subfleet
ref_model_id: 1
created_at: now
updated_at: now
- name: Catering Staff
amount: 1000
type: D
active: 1
ref_model: App\Models\Subfleet
ref_model_id: 1
created_at: now
updated_at: now
- name: Maintenance
amount: 1000
type: D
active: 1
ref_model: App\Models\Aircraft
ref_model_id: 1
created_at: now
updated_at: now
fares:
- id: 1
@@ -216,12 +310,22 @@ fares:
subfleets:
- id: 1
airline_id: 1
name: 747-400 Winglets
type: 744W
name: 747-43X RB211-524G
type: 744-3X-RB211
cost_block_hour: 1000
ground_handling_multiplier: 200
- id: 2
airline_id: 1
name: 777-200 LR
type: 772-LR
name: 777-222ER GE90-76B
type: 772-22ER-GE90-76B
cost_block_hour: 500
ground_handling_multiplier: 150
- id: 3
airline_id: 1
name: 777-367 ER GE90-115B
type: 772-36ER-GE90-115B
cost_block_hour: 100
ground_handling_multiplier: 150
# add a few mods to aircraft and fares
subfleet_fare:
@@ -233,11 +337,11 @@ subfleet_fare:
capacity: 400
- subfleet_id: 1
fare_id: 2
capacity: 20
price: 120%
- subfleet_id: 1
fare_id: 3
price: 1000
capacity: 10
capacity: 110%
# Fare classes on the 777
- subfleet_id: 2
@@ -246,10 +350,6 @@ subfleet_fare:
fare_id: 3
capacity: 10
subfleet_flight:
- subfleet_id: 1
flight_id: flightid_1
subfleet_rank:
- rank_id: 1
subfleet_id: 1
@@ -265,17 +365,8 @@ flights:
level: 360
dpt_time: 6PM CST
arr_time: 11PM EST
created_at: NOW
updated_at: NOW
- id: flightid_2
airline_id: 1
flight_number: 6028
route_code: A
dpt_airport_id: KIAH
arr_airport_id: KAUS
dpt_time: 9AM CST
arr_time: 1030AM CST
route: PITZZ4 MNURE WLEEE4
flight_time: 240
flight_type: J
created_at: NOW
updated_at: NOW
- id: flightid_3
@@ -283,25 +374,59 @@ flights:
flight_number: 6028
route_code: A
route_leg: 1
dpt_airport_id: KIAH
arr_airport_id: KAUS
dpt_airport_id: EGLL
arr_airport_id: KJFK
flight_time: 480
flight_type: J
dpt_time: 9AM CST
arr_time: 1030AM CST
route: PITZZ4 MNURE WLEEE4
created_at: NOW
updated_at: NOW
- id: flightid_4
airline_id: 1
flight_number: 99
route_code:
route_leg:
dpt_airport_id: MKJP
arr_airport_id: MWCR
flight_time: 70
flight_type: J
dpt_time: 0800
arr_time: 0900
route: MLY5 KEMBO UG442 SIA UG633 OTEKO UR640 NALRO GUBEL3
created_at: NOW
updated_at: NOW
flight_fields:
- name: Departure Terminal
slug: departure-terminal
- name: Arrival Terminal
slug: arrival-terminal
flight_field_values:
- id: 1
flight_id: flightid_1
name: cost index
slug: cost-index
value: 80
- id: 2
flight_id: flightid_2
name: cost index
slug: cost-index
value: 100
user_bids:
flight_subfleet:
- subfleet_id: 1
flight_id: flightid_1
- subfleet_id: 1
flight_id: flightid_2
- subfleet_id: 1
flight_id: flightid_3
- subfleet_id: 1
flight_id: flightid_4
bids:
- id: 100
user_id: 1
flight_id: flightid_1
@@ -309,116 +434,145 @@ user_bids:
user_id: 1
flight_id: flightid_3
acars:
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: TNV
lat: 30.28852
lon: -96.058239
created_at: now
updated_at: now
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: IAH
lat: 29.95691
lon: -95.345719
created_at: now
updated_at: now
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: LCH
lat: 30.14151
lon: -93.105569
created_at: now
updated_at: now
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: MEI
lat: 32.37843
lon: -88.804267
created_at: now
updated_at: now
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: ATL
lat: 33.62907
lon: -84.435064
created_at: now
updated_at: now
- pirep_id: pirepid_1
type: 1
nav_type: 2
name: SIE
lat: 39.0955
lon: -74.800344
created_at: now
updated_at: now
pireps:
- id: pirepid_1
user_id: 1
airline_id: 1
flight_id: flightid_1
flight_number: 100
aircraft_id: 1
dpt_airport_id: KAUS
arr_airport_id: KJFK
block_off_time: 2018-04-04T12:42:36+00:00
block_on_time: 2018-04-04T16:42:36+00:00
flight_time: 180 # 6 hours
state: 1
state: 1 # accepted
status: 0
source: 1
flight_type: J
route: KAUS SID TNV J87 IAH J2 LCH J22 MEI J239 ATL J52 AJFEB J14 BYJAC Q60 JAXSN J14 COLIN J61 HUBBS J55 SIE STAR KJFK
notes: just a pilot report
created_at: NOW
updated_at: NOW
submitted_at: 2018-04-04T16:50:36+00:00
created_at: 2018-04-04T16:50:36+00:00
updated_at: 2018-04-04T17:00:36+00:00
- id: pirepid_2
user_id: 1
airline_id: 1
flight_id: flightid_2
flight_number: 101
aircraft_id: 1
flight_number: 300
aircraft_id: 3
dpt_airport_id: KJFK
arr_airport_id: KAUS
flight_time: 180 # 6 hours
state: 1
state: 5 # draft
source: 0 # manual
flight_type: J
route: PLMMR2 SPA Q22 BEARI FAK PHLBO3
notes: just a pilot report
submitted_at: NOW
created_at: NOW
updated_at: NOW
- id: pirepid_3
- id: b68R5gwVzpVe
user_id: '1'
airline_id: '1'
aircraft_id: '1'
flight_number: '13'
route_code: null
route_leg: null
flight_type: J
dpt_airport_id: MKJP
arr_airport_id: MWCR
level: '320'
distance: '249.63'
planned_distance: '273.09'
block_time: null
flight_time: '0'
planned_flight_time: '0'
zfw: null
block_fuel: '21500.25390625'
fuel_used: null
landing_rate: '0'
score: '0'
route: ''
notes: null
source: '1'
source_name: vmsacars
state: 0
status: ENR
submitted_at: null
block_off_time: now
block_on_time: null
created_at: now
updated_at: now
- id: pirepid_4
user_id: 1
airline_id: 1
flight_id: flightid_2
flight_number: 101
aircraft_id: 1
dpt_airport_id: KJFK
arr_airport_id: KAUS
block_off_time: 2018-04-04T12:42:36+00:00
block_on_time: 2018-04-04T16:42:36+00:00
flight_time: 180 # 6 hours
state: 1
route: PLMMR2 SPA Q22 BEARI FAK PHLBO3
state: 0
status: 0
source: 1
flight_type: J
route: KAUS SID TNV J87 IAH J2 LCH J22 MEI J239 ATL J52 AJFEB J14 BYJAC Q60 JAXSN J14 COLIN J61 HUBBS J55 SIE STAR KJFK
notes: just a pilot report
created_at: NOW
updated_at: NOW
submitted_at: 2018-04-04T16:50:36+00:00
created_at: 2018-04-04T16:50:36+00:00
updated_at: 2018-04-04T17:00:36+00:00
pirep_fares:
- id: 1
pirep_id: pirepid_1
fare_id: 1
count: 300
- id: 2
pirep_id: pirepid_1
fare_id: 2
count: 25
- id: 3
pirep_id: pirepid_1
fare_id: 3
count: 10
- id: 4
pirep_id: pirepid_2
fare_id: 1
count: 200
- id: 5
pirep_id: pirepid_2
fare_id: 3
count: 15
pirep_fields:
- id: 1
name: departure gate
slug: departure_gate
name: departure terminal
slug: departure-terminal
required: 1
- id: 2
name: arrival gate
slug: arrival_gate
name: arrival terminal
slug: arrival-terminal
required: 0
pirep_field_values:
- id: 1
pirep_id: pirepid_1
name: arrival gate
value: B14
source: manual
name: arrival terminal
slug: arrival-terminal
value: 10
source: 0
- id: 2
pirep_id: pirepid_1
name: departure terminal
slug: departure-terminal
value: 4
source: 0
- id: 3
pirep_id: pirepid_1
name: Landing Rate
slug: landing-rate
value: -225.3
source: 1
pirep_comments:
- id: 1
@@ -433,3 +587,182 @@ pirep_comments:
comment: Another comment
created_at: now
updated_at: now
journals:
-
id: 1
ledger_id: null
type: 0
balance: 7870000
currency: USD
morphed_type: App\Models\Airline
morphed_id: 1
created_at: '2018-03-06 12:33:45'
updated_at: '2018-03-06 12:34:15'
-
id: 2
ledger_id: null
type: 1
balance: 15000
currency: USD
morphed_type: App\Models\User
morphed_id: 1
created_at: '2018-03-06 12:33:45'
updated_at: '2018-03-06 12:34:15'
journal_transactions:
-
id: 2cbb5990-c70c-40a8-8381-05b6402a96b4
transaction_group: 'Pilot Pay'
journal_id: 2
credit: 15000
debit: null
currency: USD
memo: 'Pilot Payment @ 50'
tags: "pilot_pay"
ref_model: App\Models\Pirep
ref_model_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: 3471fb16-0afd-4815-8b0c-f92771274063
transaction_group: 'Expense: Per-Flight (no muliplier)'
journal_id: 1
credit: null
debit: 10000
currency: USD
memo: 'Expense: Per-Flight (no muliplier)'
tags: "expense"
ref_model: App\Models\Pirep
ref_model_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: 37f21468-ebad-4850-8557-db310ca45eb4
transaction_group: Fares
journal_id: 1
credit: 6000000
debit: 0
currency: USD
memo: 'Fares Y300; price: 200, cost: 0'
tags: "fare"
ref_model: App\Models\Pirep
ref_model_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: 3e933972-07ef-4bb2-b1e1-90ef7e8871c6
transaction_group: 'Expense: Per-Flight (multiplier, on airline)'
journal_id: 1
credit: null
debit: 20000
currency: USD
memo: 'Expense: Per-Flight (multiplier, on airline)'
tags: "expense"
ref_model: App\Models\Pirep
ref_model_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: 522d8032-4ca0-4d6d-b7af-613be4bf281c
transaction_group: 'Expense: Per-Flight (multiplier)'
journal_id: 1
credit: null
debit: 10000
currency: USD
memo: 'Expense: Per-Flight (multiplier)'
tags: "expense"
ref_model: App\Models\Pirep
ref_model_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: a9bca611-c251-4fde-9f28-206d4debeb01
transaction_group: 'Subfleet: Catering (747-43X RB211-524G)'
journal_id: 1
credit: null
debit: 100000
currency: USD
memo: 'Subfleet Expense: Catering (747-43X RB211-524G)'
tags: "subfleet"
ref_model: App\Models\Pirep
ref_model_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: c3ff6a6d-03d0-4744-8678-e27329462dcb
transaction_group: Fares
journal_id: 1
credit: 1000000
debit: 0
currency: USD
memo: 'Fares F10; price: 1000, cost: 0'
tags: "fare"
ref_model: App\Models\Pirep
ref_model_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: c4e05ec1-530f-4897-92e8-787bdec8a0a1
transaction_group: 'Pilot Pay'
journal_id: 1
credit: null
debit: 15000
currency: USD
memo: 'Pilot Payment @ 50'
tags: "pilot_pay"
ref_model: App\Models\Pirep
ref_model_id: pirepid_1
created_at: now
updated_at: now
post_date: now
-
id: ed516367-eeb9-4a09-bfb7-531ec4be2f93
transaction_group: Fares
journal_id: 1
credit: 1100000
debit: 0
currency: USD
memo: 'Fares B10; price: 1100, cost: 0'
tags: "fare"
ref_model: App\Models\Pirep
ref_model_id: pirepid_1
created_at: now
updated_at: now
post_date: now
-
id: f3f8585e-894c-4491-b19b-d07b6ad20208
transaction_group: 'Ground Handling'
journal_id: 1
credit: null
debit: 75000
currency: USD
memo: 'Ground Handling'
tags: "ground_handling"
ref_model: App\Models\Pirep
ref_model_id: pirepid_1
created_at: now
updated_at: now
post_date: now
-
id: 1bd1616c-eaa4-4ab9-b5c1-441004ceef14
transaction_group: 'Subfleet 744-3X-RB211'
journal_id: 1
credit: null
debit: 300000
currency: USD
memo: 'Subfleet 744-3X-RB211: Block Time Cost'
tags: "subfleet"
ref_model: App\Models\Pirep
ref_model_id: pirepid_1
created_at: now
updated_at: now
post_date: now

View File

@@ -0,0 +1,189 @@
- key: general.start_date
name: 'Start Date'
group: general
value: ''
options: ''
type: date
description: 'The date your VA started'
- key: general.admin_email
name: 'Admin Email'
group: general
value: ''
options: ''
type: text
description: 'Email where notices, etc are sent'
- key: units.distance
name: 'Distance Units'
group: units
value: nmi
options: 'km=kilometers,mi=miles,nmi=nautical miles'
type: select
description: 'The distance unit for display'
- key: units.weight
name: 'Weight Units'
group: units
value: lbs
options: 'lbs,kg'
type: select
description: 'The weight unit for display'
- key: units.speed
name: 'Speed Units'
group: units
value: knot
options: 'km/h,knot'
type: select
description: 'The speed unit for display'
- key: units.altitude
name: 'Altitude Units'
group: units
value: ft
options: 'ft=feet,m=meters'
type: select
description: 'The altitude unit for display'
- key: units.fuel
name: 'Fuel Units'
group: units
value: lbs
options: 'lbs,kg'
type: select
description: 'The units for fuel for display'
- key: units.volume
name: 'Volume Units'
group: units
value: gallons
options: 'gallons,l=liters'
type: select
description: 'The units for fuel for display'
- key: units.temperature
name: 'Temperature Units'
group: units
value: F
options: 'F=Fahrenheit,C=Celsius'
type: select
description: 'The units for temperature'
- key: acars.live_time
name: 'Live Time'
group: acars
value: 12
options: ''
type: int
description: 'Age of flights to show on the map in hours. Set to 0 to show only all in-progress flights'
- key: acars.center_coords
name: 'Center Coords'
group: acars
value: '30.1945,-97.6699'
options: ''
type: text
description: 'Where to center the map; enter as LAT,LON'
- key: acars.default_zoom
name: 'Default Zoom'
group: acars
value: 5
options: ''
type: int
description: 'Initial zoom level on the map'
- key: bids.disable_flight_on_bid
name: 'Disable flight on bid'
group: bids
value: true
options: ''
type: boolean
description: 'When a flight is bid on, no one else can bid on it'
- key: bids.allow_multiple_bids
name: 'Allow multiple bids'
group: bids
value: true
options: ''
type: boolean
description: 'Whether or not someone can bid on multiple flights'
- key: bids.expire_time
name: 'Expire Time'
group: bids
value: 48
options: ''
type: int
description: 'Number of hours to expire bids after'
- key: pireps.duplicate_check_time
name: 'PIREP duplicate time check'
group: pireps
value: 10
options: ''
type: int
description: 'The time in minutes to check for a duplicate PIREP'
- key: pireps.restrict_aircraft_to_rank
name: 'Restrict Aircraft to Ranks'
group: pireps
value: true
options: ''
type: boolean
description: 'Aircraft that can be flown are restricted to a user''s rank'
- key: pireps.only_aircraft_at_dpt_airport
name: 'Restrict Aircraft At Departure'
group: pireps
value: false
options: ''
type: boolean
description: 'Only allow aircraft that are at the departure airport'
- key: pireps.remove_bid_on_accept
name: 'Remove bid on accept'
group: pireps
value: false
options: ''
type: boolean
description: 'When a PIREP is accepted, remove the bid, if it exists'
- key: pilots.id_length
name: 'Pilot ID Length'
group: pilots
value: 4
options: ''
type: int
description: 'The length of a pilot''s ID'
- key: pilots.auto_accept
name: 'Auto Accept New Pilot'
group: pilots
value: true
options: ''
type: boolean
description: 'Automatically accept a pilot when they register'
- key: pilots.home_hubs_only
name: 'Hubs as home airport'
group: pilots
value: false
options: ''
type: boolean
description: 'Pilots can only select hubs as their home airport'
- key: pilots.only_flights_from_current
name: 'Flights from Current'
group: pilots
value: false
options: ''
type: boolean
description: 'Only show/allow flights from their current location'
- key: pilots.auto_leave_days
name: 'Pilot to ON LEAVE days'
group: pilots
value: 30
options: ''
type: int
description: 'Automatically set a pilot to ON LEAVE status after N days of no activity'
- key: pilots.hide_inactive
name: 'Hide Inactive Pilots'
group: pilots
value: true
options: ''
type: boolean
description: 'Don''t show inactive pilots in the public view'
- key: pilots.restrict_to_company
name: 'Restrict the flights to company'
group: pilots
value: false
options: ''
type: boolean
description: 'Restrict flights to the user''s airline'
- key: pilots.allow_transfer_hours
name: 'Allow transfer hours'
group: pilots
value: true
options: ''
type: boolean
description: 'Allow specifying transfer hours on registration page and displayed on profile page'

21
app/Events/CronHourly.php Normal file
View File

@@ -0,0 +1,21 @@
<?php
namespace App\Events;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
/**
* This event is dispatched when the hourly cron is run
*/
class CronHourly
{
use Dispatchable, SerializesModels;
/**
* CronHourly constructor.
*/
public function __construct()
{
}
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Events;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
/**
* This event is dispatched when the monthly cron is run
* It happens after all of the default nightly tasks
*/
class CronMonthly
{
use Dispatchable, SerializesModels;
/**
* CronMonthly constructor.
*/
public function __construct()
{
}
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Events;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
/**
* This event is dispatched when the daily cron is run
* It happens after all of the default nightly tasks
*/
class CronNightly
{
use Dispatchable, SerializesModels;
/**
* CronNightly constructor.
*/
public function __construct()
{
}
}

22
app/Events/CronWeekly.php Normal file
View File

@@ -0,0 +1,22 @@
<?php
namespace App\Events;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
/**
* This event is dispatched when the weekly cron is run
* It happens after all of the default nightly tasks
*/
class CronWeekly
{
use Dispatchable, SerializesModels;
/**
* CronWeekly constructor.
*/
public function __construct()
{
}
}

42
app/Events/Expenses.php Normal file
View File

@@ -0,0 +1,42 @@
<?php
namespace App\Events;
use App\Models\Pirep;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
/**
* This event is dispatched when the expenses for a flight report
* are collected. Your listeners should return a list of Expense
* models. Don't call save on the model!
*
* Example return:
*
* [
* new Expense([
* 'airline_id': '', # < optional field
* 'name': '',
* 'amount': [DECIMAL],
* 'type': int from ExpenseType enum class
* ]),
* ]
*
* The event caller will check the 'type' to make sure that it
* will filter out expenses that only apply to the current process
*
* The event will have a copy of the PIREP model, if it's applicable
*/
class Expenses
{
use Dispatchable, SerializesModels;
public $pirep;
/**
* @param Pirep|null $pirep
*/
public function __construct(Pirep $pirep = null)
{
$this->pirep = $pirep;
}
}

Some files were not shown because too many files have changed in this diff Show More