Compare commits

...

378 Commits

Author SHA1 Message Date
41b78a0599 moon rentals again 2021-05-30 16:47:25 +09:00
f3dc18b8ac moon rentals again 2021-05-30 16:42:08 +09:00
427fc40edb moon rentals again 2021-05-30 16:41:03 +09:00
90218eafe0 moon rentals again 2021-05-30 16:40:19 +09:00
751a412185 moon rentals again 2021-05-30 16:19:12 +09:00
c3becc324b modified the mining tax invoice job 2021-05-28 18:35:54 +09:00
43ad853b60 added modify invoice framework 2021-05-25 20:53:04 +09:00
955a5581a3 new mining tax invoice job 2021-05-25 02:08:05 +09:00
f1be291c1c new mining taxes invoice job 2021-05-25 02:02:27 +09:00
aeee78a888 new mining taxes invoice job 2021-05-25 02:01:42 +09:00
98db7a3ec2 testing new mining tax 2021-05-25 01:57:39 +09:00
c0d65d55d1 testing new mining tax 2021-05-25 01:55:10 +09:00
7c14c15841 testing new mining tax 2021-05-25 01:53:06 +09:00
1c46ef4161 testing new mining tax 2021-05-25 01:52:40 +09:00
39f7fbbb99 testing new mining tax 2021-05-25 01:52:05 +09:00
da95ee481d testing new mining tax 2021-05-25 01:42:48 +09:00
8153235f1f testing new mining tax 2021-05-25 01:38:58 +09:00
00f814152d testing new mining tax 2021-05-25 01:38:11 +09:00
f28fa7d0e2 testing new mining tax 2021-05-25 01:37:24 +09:00
2361f5dc1c testing new mining tax 2021-05-25 01:26:10 +09:00
e75fd81e27 testing new mining tax 2021-05-25 01:24:00 +09:00
265336ef3d testing new mining tax 2021-05-25 01:23:21 +09:00
7c9b0caded testing new mining tax 2021-05-25 01:21:59 +09:00
a59d9bf6a9 testing new mining tax 2021-05-25 01:19:54 +09:00
657b96dadf testing new mining tax 2021-05-25 01:19:17 +09:00
c8ee950fd0 testing new mining tax 2021-05-25 01:18:44 +09:00
da7f69adae testing new mining tax 2021-05-25 01:18:02 +09:00
da4457eba6 testing new mining tax 2021-05-25 01:17:17 +09:00
b149a1f492 updated with new send mining taxes invoice job in the old job space 2021-05-25 01:05:27 +09:00
ee7e149c35 updated with new send mining taxes invoice job in the old job space 2021-05-25 01:04:55 +09:00
adee63564d updated with new send mining taxes invoice job in the old job space 2021-05-25 00:58:07 +09:00
b00a1eb082 created simplified mining tax invoice 2021-05-25 00:55:20 +09:00
56e2c3fa9c created simplified mining tax invoice 2021-05-25 00:54:52 +09:00
6ea56238a8 created simplified mining tax invoice 2021-05-25 00:54:36 +09:00
678f066a97 created simplified mining tax invoice 2021-05-25 00:53:24 +09:00
20d1c5f027 created simplified mining tax invoice 2021-05-25 00:46:29 +09:00
9a797a159d created simplified mining tax invoice 2021-05-25 00:45:07 +09:00
63a06e78e1 created simplified mining tax invoice 2021-05-25 00:42:32 +09:00
96d068307f created simplified mining tax invoice 2021-05-25 00:41:44 +09:00
1f18d21069 created simplified mining tax invoice 2021-05-25 00:40:13 +09:00
cb9fdaeb63 created simplified mining tax invoice 2021-05-25 00:39:13 +09:00
b82fbd3ce3 created simplified mining tax invoice 2021-05-25 00:37:36 +09:00
a3c07b2a84 created simplified mining tax invoice 2021-05-25 00:36:46 +09:00
772f149e81 created simplified mining tax invoice 2021-05-25 00:36:01 +09:00
75a72826fd created simplified mining tax invoice 2021-05-25 00:33:02 +09:00
ec50817657 created simplified mining tax invoice 2021-05-25 00:29:59 +09:00
d9d447bf54 created simplified mining tax invoice 2021-05-25 00:29:42 +09:00
9293564235 created simplified mining tax invoice 2021-05-25 00:29:00 +09:00
211d463288 created simplified mining tax invoice 2021-05-25 00:28:05 +09:00
c3a8393c84 created simplified mining tax invoice 2021-05-25 00:27:33 +09:00
50e69755eb created simplified mining tax invoice 2021-05-25 00:26:18 +09:00
2cf1f7ff72 created simplified mining tax invoice 2021-05-25 00:22:42 +09:00
af7c7344b4 tests 2021-05-24 23:11:29 +09:00
58258a070e tests 2021-05-24 22:23:06 +09:00
75a91c93e8 tests 2021-05-24 22:20:55 +09:00
7a46e8684f tests 2021-05-24 22:20:09 +09:00
1052c6241e tests 2021-05-24 22:13:03 +09:00
0107f24de8 tests 2021-05-24 22:12:37 +09:00
fbcd7dd957 tests 2021-05-24 22:01:00 +09:00
3e8bd39737 tests 2021-05-24 22:00:36 +09:00
e61aed425c tests 2021-05-24 21:51:04 +09:00
0847e03b27 tests 2021-05-24 21:46:57 +09:00
05626aac35 tests 2021-05-24 21:43:03 +09:00
77818e9431 tests 2021-05-24 21:36:25 +09:00
abde239ff7 tests 2021-05-24 21:30:12 +09:00
872afe444f tests 2021-05-24 21:29:37 +09:00
4bd57ccd0b tests 2021-05-24 21:28:54 +09:00
2191dadf47 tests 2021-05-24 21:28:06 +09:00
b48b118032 tests 2021-05-24 21:24:17 +09:00
8d5ba9c42e test mining taxes 2021-05-24 19:53:53 +09:00
565f51e81c process mining taxes ledgers update to disregard updating previously saved ledgers to prevent future errors 2021-05-24 18:52:23 +09:00
0872d2f61a process alliance assets 2021-05-22 00:14:10 +09:00
63a54c78e2 prevented main users from being registered as alts in a strange oddity. 2021-05-21 03:41:41 +09:00
7d31892c57 updated mail queue and invoice id for mining taxes 2021-05-19 19:50:24 +09:00
33df24e1af added Jump Bridge Fuel page to General navigation section 2021-05-19 19:09:40 +09:00
fe9547f78d process assets job fix 2021-05-19 09:10:06 +09:00
e24f431893 assets job 2021-05-19 01:23:11 +09:00
11ac571abb added assets queue 2021-05-19 01:05:17 +09:00
9c9575396b queue default to construct of job 2021-05-19 00:57:22 +09:00
817ae1a452 job kernel 2021-05-19 00:52:06 +09:00
32716cc81c issue with a job 2021-05-19 00:50:36 +09:00
e949b1d717 added queue to horizon schedule in the kernel for console commands and scheduler 2021-05-19 00:46:22 +09:00
c089beae10 horizon rebalance 2021-05-19 00:08:55 +09:00
3332d6a36c horizon rebalance 2021-05-19 00:02:12 +09:00
4f1ae7fad8 memory change for horizon 2021-05-18 23:55:40 +09:00
12970c3830 horizon back to 10 jobs each process 2021-05-18 23:53:06 +09:00
6b5f51eed7 horizon back to 10 jobs each process 2021-05-18 23:50:14 +09:00
88f46d8dec assets 2021-05-18 22:52:23 +09:00
5abbe10cf9 assets 2021-05-18 22:50:26 +09:00
ba92152daa updated composer 2021-05-18 13:47:03 +00:00
e248cd036c setting retries and timeouts for jobs' 2021-05-18 22:08:04 +09:00
f5531ac121 queue 2021-05-18 21:41:13 +09:00
13c4f5ea3a redis 2021-05-18 21:30:17 +09:00
cd96aa8377 redis 2021-05-18 21:20:08 +09:00
13f3e8e8f9 decode date in updating structures 2021-05-18 20:59:22 +09:00
8c580827b4 removed command helper junk 2021-05-18 20:48:12 +09:00
0093b8d841 horizon 2021-05-18 20:37:31 +09:00
2071021cdd FetchAllianceAssets 2021-05-18 20:18:20 +09:00
34cf203c01 migration 2021-05-18 20:06:40 +09:00
9aa8c53b23 job stuff 2021-05-18 19:56:47 +09:00
5973a5deda job stuff 2021-05-18 19:54:39 +09:00
3237e80fb4 assets and structures 2021-05-18 19:52:02 +09:00
da97d9b85c process alliance structures 2021-05-18 18:44:12 +09:00
562093f22c new stuff 2021-05-18 18:40:01 +09:00
65314bad77 more commands for artisan 2021-05-18 18:37:07 +09:00
31fbeee1cf database migrations 2021-05-18 18:35:06 +09:00
5085ef140b database migrations 2021-05-18 18:33:23 +09:00
1c4406a6eb fetchminingtaxesobservers 2021-05-18 18:28:36 +09:00
d815c15176 fetchminingtaxesobservers 2021-05-18 18:23:52 +09:00
a3a3cc1b7c fetchminingtaxesobservers 2021-05-18 18:23:37 +09:00
f266d781ac fetchminingtaxesobservers 2021-05-18 18:21:28 +09:00
f0962b0779 fetchminingtaxesobservers 2021-05-18 18:16:55 +09:00
d9cbd4ef93 fetchminingtaxesobservers 2021-05-18 18:09:42 +09:00
6c90f9f642 fetchminingtaxesobservers 2021-05-18 18:08:46 +09:00
c341d21bbe lookup helper removed from fetch mining taxes observers 2021-05-18 18:02:24 +09:00
91ebc9972c observer name fixed maybe in fetchminingtaxobservers 2021-05-18 06:26:27 +09:00
3fe6be6a57 observer name fixed maybe in fetchminingtaxobservers 2021-05-18 06:25:47 +09:00
de0071734b added backend functions for jump bridge fuel display with the new way we are doing jobs 2021-05-17 06:08:05 +09:00
a0c0186337 jump bridge rework 2021-05-15 07:12:56 +09:00
f3c317b505 invoice update 2021-05-13 04:58:15 +09:00
09d0d57630 invoice update 2021-05-13 04:58:05 +09:00
b44ebfc0b6 invoice update 2021-05-13 04:55:06 +09:00
3d054535db invoice update 2021-05-13 04:49:25 +09:00
c5b8c50923 invoice update 2021-05-13 04:47:44 +09:00
de60682f40 invoice update 2021-05-13 04:46:58 +09:00
3d5b224e20 invoice update 2021-05-13 04:36:38 +09:00
d447f6f34d send mining taxes invoice 2021-05-12 09:51:43 +09:00
44e969d24b minimum 1 job in horizon queue 2021-05-12 01:48:27 +09:00
ec933737cf send mail for mining taxes 2021-05-12 01:41:31 +09:00
97109cfd08 send mail for mining taxes 2021-05-12 01:37:40 +09:00
96507b7d7e config mining tax added to send mining taxes invoice command where necessary 2021-05-12 01:36:05 +09:00
9c5f9e3844 setup min and max processes for horizon 2021-05-12 01:13:16 +09:00
cee7f07d76 update to queues to have less queues 2021-05-12 01:05:48 +09:00
87951b5ca6 update horizon 2021-05-12 00:52:23 +09:00
6a3c69393e mining taxes update 2021-05-12 00:38:00 +09:00
b75d554cd7 update queue stuff 2021-05-12 00:29:45 +09:00
fb029dd813 invoice id number 2021-05-10 02:59:49 +09:00
bb5df086de mining tax stuff 2021-05-09 03:57:01 +09:00
a83131ba5e update alliance wallet journal page fix 2021-04-29 01:25:13 +09:00
655b1a3a94 updated job 2021-04-27 02:58:59 +09:00
976e220859 updated send mining taxes invoices 2021-04-27 02:33:17 +09:00
ae4436d3f1 added tagging to jobs 2021-04-27 00:49:49 +09:00
fdbc7ddf1b changed queue for new functionality to correct queue 2021-04-24 02:06:11 +09:00
266aa3387c alliance update wallet journal 2021-04-24 02:03:54 +09:00
adbf3297c4 modified update wallet journal job to dispatch multiple jobs 2021-04-24 02:03:01 +09:00
9aae7e44ec modified update wallet journal job to dispatch multiple jobs 2021-04-24 02:01:23 +09:00
d3d27cf251 modified update wallet journal job to dispatch multiple jobs 2021-04-24 01:59:46 +09:00
229aa84426 modified update wallet journal job to dispatch multiple jobs 2021-04-24 01:56:04 +09:00
19447c6a11 added new job for updating alliance wallet journal
created new functions in finance helper
2021-04-24 01:41:41 +09:00
bd86e1ab05 miningt axes payemnts command 2021-04-24 01:31:45 +09:00
6f97f0927c miningt axes payemnts command 2021-04-24 01:31:05 +09:00
21d1a566f3 miningt axes payemnts command 2021-04-24 01:28:53 +09:00
ec73828eea miningt axes payemnts command 2021-04-24 01:27:56 +09:00
d62b4b3790 process mining payments 2021-04-24 01:01:48 +09:00
c77b7e3821 mining tax invoices 2021-04-20 18:17:28 +09:00
9cce52b8ba payments namespaces 2021-04-19 20:38:59 +09:00
5f2ba4133d jobs 2021-04-19 19:50:50 +09:00
4539056ec5 ledgers job prefetch 2021-04-19 19:49:42 +09:00
19b837a993 jobs 2021-04-19 19:44:47 +09:00
87891ac059 jobs 2021-04-19 19:43:22 +09:00
e92c9d304d namespace 2021-04-19 19:41:19 +09:00
26c484d30c commands 2021-04-19 19:39:48 +09:00
e21fcd784c commands 2021-04-19 19:37:10 +09:00
75544ef6bb file name error 2021-04-19 19:33:03 +09:00
a084072f98 file name error 2021-04-19 19:32:22 +09:00
70fea18829 file name error 2021-04-19 19:16:29 +09:00
0b65005f9d added commands for jobs 2021-04-19 18:53:32 +09:00
54b25480e2 added missing libraries 2021-04-19 18:13:53 +09:00
86783a0b56 jobs 2021-04-13 01:23:31 +09:00
8a2efb21a0 changed schedule for late invoices to 1, and 15th of the month 2021-04-13 01:20:03 +09:00
cab5a4b2ed mining taxes invoices 2021-04-13 01:16:49 +09:00
9bd0f3a296 new way to do mining tax invoices 2021-04-12 20:06:34 +09:00
febe377eec roles selection 2021-04-11 06:39:27 +09:00
a497a8bb16 roles selection 2021-04-11 06:38:49 +09:00
b667348f5d roles selection 2021-04-11 06:36:58 +09:00
e67e90c96c roles selection 2021-04-11 06:35:09 +09:00
aff5831350 roles selection 2021-04-11 06:33:11 +09:00
dcf214b324 resources updates 2021-04-11 06:23:34 +09:00
701b449517 resources updates 2021-04-11 06:22:19 +09:00
c1782cacfe kernel update 2021-04-11 06:15:44 +09:00
b0aa5e3fec modified searched user blade 2021-04-11 06:02:31 +09:00
f06675dd2b added stuff for late invoices.
updated all jobs to not include the wording Job in the file.
2021-04-07 01:44:31 +09:00
bd8872a785 unpaid search 2021-04-02 21:01:18 +09:00
fbf48ef906 unpaid searches 2021-04-02 20:59:39 +09:00
51f7d3990f routes edits 2021-04-02 20:13:39 +09:00
cd99acb61b search unpaid 2021-04-02 20:07:23 +09:00
1884ada219 unpaid search attempt 2021-04-02 18:53:58 +09:00
3991ce3e9a updated paid payments from the wallet journal 2021-04-01 20:43:29 +09:00
eb8c84b0c5 added date due to unpaid invoices on admin page 2021-04-01 20:22:42 +09:00
c8f85b0ccd journal entries 2021-04-01 18:49:38 +09:00
a1e1ae261a journal entries 2021-04-01 18:32:48 +09:00
f9b4e9a898 moved links on unpaid invoices page 2021-03-30 21:20:21 +09:00
2fd7a805eb moved links on unpaid invoices page 2021-03-30 21:19:52 +09:00
1a443a4ab8 inspire removed from scheduled tasks 2021-03-30 21:11:30 +09:00
c5b8957253 schedule stuff 2021-03-30 20:48:24 +09:00
4b554f97ae schedule stuff 2021-03-30 20:47:48 +09:00
38176274ff connection stuff 2021-03-30 20:44:29 +09:00
3c1278db82 schedule monitor 2021-03-30 20:39:30 +09:00
0e4f9b91e5 schedule monitor 2021-03-30 20:38:28 +09:00
7a658b7bfa schedule monitor config 2021-03-30 11:36:30 +00:00
4667b31dd8 psr-4 2021-03-30 20:35:47 +09:00
39b0a8c372 schedule monitor 2021-03-30 11:31:10 +00:00
40ed5dd5a5 artisan jobs schedule 2021-03-30 19:54:26 +09:00
e6022ded9c modified schedule 2021-03-30 18:08:48 +09:00
6ad975e199 updating kernel for commands 2021-03-30 01:46:02 +09:00
59cda8d129 redis db updates 2021-03-30 01:38:46 +09:00
311aec7847 redis db updates 2021-03-30 01:37:56 +09:00
2d7e1ec7bf redis updates 2021-03-30 01:36:11 +09:00
ecd7b08b27 removed ->connection from jobs 2021-03-30 01:15:19 +09:00
e2b94eea77 vendor publish 2021-03-29 16:03:34 +00:00
04e7a78575 vendor publish 2021-03-29 16:02:41 +00:00
e232e03ef7 redis stuff 2021-03-30 00:38:32 +09:00
7f718555ac changed redis client default to phpredis rather than predis 2021-03-30 00:35:06 +09:00
b74c513271 updated redis default database 2021-03-30 00:32:30 +09:00
794f358353 updated schedule for mining tax invoices
updated process send eve mail job
updated horizon configuration
2021-03-30 00:30:17 +09:00
49aab1b97a removed some overlapping stuff from console command schedule 2021-03-29 01:28:10 +09:00
374181c82c updated config for esi.php to include new environmental variables 2021-03-26 23:18:13 +09:00
6b0f805adc added scopes for sending mails more efficiently on base login and account registration. 2021-03-26 23:14:38 +09:00
4730bea74c modified mail job 2021-03-26 23:08:57 +09:00
49b9093f1b mail update 2021-03-25 00:59:51 +09:00
906fabe23f mail update 2021-03-25 00:00:23 +09:00
d65adb904d test data 2021-03-24 22:31:11 +09:00
5f91bcb221 test data 2021-03-24 22:27:34 +09:00
b37767f30d test data 2021-03-24 22:24:46 +09:00
6613c985cd test data 2021-03-24 22:22:16 +09:00
60d511d3c1 test data 2021-03-24 22:21:53 +09:00
f12e298298 test data 2021-03-24 22:20:17 +09:00
0772488a50 new invoice testing 2021-03-24 22:04:45 +09:00
2ff1897f60 want to use the same data set for new stuff to work on. 2021-03-24 22:00:40 +09:00
bd0170e094 modified .env 2021-03-24 18:49:51 +09:00
8609b55797 modified connection name in middleware for process eve mails RL 2021-03-24 18:16:04 +09:00
31d4267d9f modified connection name in middleware for process eve mails RL 2021-03-24 18:15:44 +09:00
c176c32668 modified new mining taxes invoices to only send mail to myself 2021-03-23 19:56:49 +09:00
d3a9f33769 made a command to deal with late invoices 2021-03-23 00:22:37 +09:00
89ffa516c5 new mining tax invoices command work 2021-03-23 00:21:35 +09:00
82aa1f88b4 removed connection from mail 2021-03-22 19:35:22 +09:00
c51b1a72a9 string length in invoices 2021-03-22 19:33:49 +09:00
fa7889d7d5 testing 2021-03-22 00:43:36 +09:00
3271200312 testing 2021-03-22 00:43:05 +09:00
33719f8456 testing 2021-03-22 00:41:35 +09:00
92ea143a92 testing 2021-03-22 00:41:04 +09:00
8178af420a testing 2021-03-22 00:40:36 +09:00
c964fd1485 process ledgers 2021-03-22 00:31:06 +09:00
039fa1d44e esi update for observers 2021-03-21 22:33:32 +09:00
78c05aadd3 esi update for observers 2021-03-21 22:30:55 +09:00
6fd6db2d1d esi update for observers 2021-03-21 22:30:33 +09:00
b7600757a0 esi update for observers 2021-03-21 22:29:21 +09:00
1527201bdb esi update for observers 2021-03-21 22:28:08 +09:00
cf7848b966 esi update for observers 2021-03-21 22:27:26 +09:00
ea855611e3 esi update for observers 2021-03-21 22:26:51 +09:00
9b1140b8f9 esi update for observers 2021-03-21 22:25:58 +09:00
4298a1f53e esi update for observers 2021-03-21 22:25:29 +09:00
3623fd636b esi update for observers 2021-03-21 22:24:28 +09:00
482b65e026 esi update for observers 2021-03-21 21:56:07 +09:00
ff6fed66ef esi update for observers 2021-03-21 21:55:21 +09:00
40de3073f6 esi update for observers 2021-03-21 21:54:29 +09:00
69892f4a6e esi update for observers 2021-03-21 21:52:40 +09:00
5a68c84430 esi update for observers 2021-03-21 21:41:18 +09:00
24a76fb092 esi update for observers 2021-03-21 21:40:45 +09:00
2cd41593a5 esi update for observers 2021-03-21 21:40:25 +09:00
a2a9b31a25 esi update for observers 2021-03-21 21:39:23 +09:00
45b2269920 esi update for observers 2021-03-21 21:38:18 +09:00
4c99703290 esi update for observers 2021-03-21 21:37:29 +09:00
e39bcab748 esi update for observers 2021-03-21 21:36:43 +09:00
c2d06472e3 observer update and invoices creation 2021-03-21 21:33:34 +09:00
12cd0c7d74 personal ledgers 2021-03-21 02:34:41 +09:00
0a22ba67c5 ledger stuff for users 2021-03-21 01:25:56 +09:00
223a457f93 ledger stuff for users 2021-03-21 01:25:20 +09:00
9c773bc635 ledger stuff for users 2021-03-21 01:24:08 +09:00
d0529330e5 ledger stuff for users 2021-03-21 01:23:30 +09:00
c7bc18c9aa ledger stuff for users 2021-03-21 01:22:41 +09:00
0694940507 ledger stuff for users 2021-03-21 01:11:46 +09:00
c6b5f01c55 ledger stuff for users 2021-03-21 01:09:40 +09:00
0a0d6bc998 ledger stuff for users 2021-03-21 01:08:23 +09:00
c3df293ddf ledger stuff for users 2021-03-21 01:06:58 +09:00
71071d61ce ledger stuff for users 2021-03-21 01:06:14 +09:00
356cee060a ledger stuff for users 2021-03-21 01:04:58 +09:00
f662bb7cb2 ledger stuff for users 2021-03-21 01:03:57 +09:00
431ef40793 ledger stuff for users 2021-03-21 01:03:14 +09:00
690203d818 ledger stuff for users 2021-03-21 01:00:08 +09:00
6372a89d30 users page updated 2021-03-21 00:33:28 +09:00
ddae475a6c users page updated 2021-03-21 00:32:57 +09:00
ac617e8795 users page updated 2021-03-21 00:32:27 +09:00
fc1efa8d61 users page updated 2021-03-21 00:31:07 +09:00
c7fbb2ae0e users page updated 2021-03-21 00:29:52 +09:00
abc34b315a users page updated 2021-03-20 23:36:53 +09:00
e2289f1727 users page updated 2021-03-20 18:22:25 +09:00
1a61f7939b users page updated 2021-03-20 18:21:54 +09:00
aa7e170aaf row counts for mining tax invoices 2021-03-20 18:02:25 +09:00
da619f261e update to user's profile page 2021-03-19 21:43:31 +09:00
ded58ea79a namespace 2021-03-19 21:41:51 +09:00
2da297facd namespace 2021-03-19 21:39:45 +09:00
a253bb1aaf namespace 2021-03-19 21:38:05 +09:00
dcfbfe4801 namespace 2021-03-19 21:37:30 +09:00
cf6c601bcf namespace 2021-03-19 21:36:13 +09:00
3e24f71987 namespace 2021-03-19 21:35:45 +09:00
b68bcfec03 namespace 2021-03-19 21:34:59 +09:00
dd64010236 after action reports 2021-03-19 21:31:14 +09:00
d7d98b5195 taxes page 2021-03-18 23:02:21 +09:00
9798f8296b taxes page 2021-03-18 22:55:35 +09:00
68aafab377 taxes page 2021-03-18 22:54:05 +09:00
e4115b64ff taxes page 2021-03-18 22:51:10 +09:00
3be42738d7 payment testing 2021-03-18 21:02:23 +09:00
da08630a1f payment testing 2021-03-18 21:01:56 +09:00
001ff9e4e3 payment testing 2021-03-18 20:57:25 +09:00
a69e09efeb payment testing 2021-03-18 20:56:35 +09:00
0a4090650d payment testing 2021-03-18 20:56:12 +09:00
671da7e617 payment testing 2021-03-18 20:55:35 +09:00
3f8bcfd588 mining tax payments 2021-03-18 20:51:17 +09:00
f036aa61f7 namespace change 2021-03-18 20:47:42 +09:00
d926a0fd98 namespace change 2021-03-18 20:46:49 +09:00
21c73270fe namespace change 2021-03-18 20:46:18 +09:00
97e4eb46eb number formatting 2021-03-18 20:43:52 +09:00
ad36ee9441 added total unpaid amount to unpaid admin mining tax report 2021-03-18 20:43:00 +09:00
c6557bab38 change of invoice blade 2021-03-18 20:37:47 +09:00
30cd115050 invoices for characters 2021-03-18 20:06:40 +09:00
3dc10f41c8 invoices for characters 2021-03-18 20:05:22 +09:00
466a1750bd tweaked some jobs 2021-03-18 19:31:26 +09:00
7aee591a2c cleanup stale data in mining tax observers 2021-03-18 18:29:27 +09:00
8ee98c06c2 updated mail things 2021-03-18 18:28:13 +09:00
b91925a3f6 added retries back to mail functionality 2021-03-18 18:25:26 +09:00
c27a9c3f85 invoice stuff 2021-03-18 00:15:10 +09:00
ec9a2a2ce0 invoice stuff 2021-03-18 00:14:18 +09:00
42ba7f3036 invoice stuff 2021-03-18 00:12:10 +09:00
db11b6255b invoice stuff 2021-03-18 00:11:40 +09:00
ce99ad9cf9 invoice stuff 2021-03-18 00:08:40 +09:00
36ae8f27bb invoice stuff 2021-03-18 00:08:14 +09:00
3fcceb0649 invoice stuff 2021-03-18 00:07:40 +09:00
d607f403ec correct the invoice mail 2021-03-18 00:04:32 +09:00
4005b0f90c invoice amount for admin controller 2021-03-17 23:45:20 +09:00
87bbc1a8e4 modified catch request to release mail processing job back to the queue to be tried again. 2021-03-17 22:25:00 +09:00
79c3e3382a increased approved cost for mails 2021-03-17 22:23:34 +09:00
2e178c8b16 added reprocessing rate to process mining taxes ledgers job 2021-03-17 22:20:49 +09:00
62e159c1f2 process send eve mail job 2021-03-17 18:40:11 +09:00
2e57663f7c removed observers job from firing currently 2021-03-17 18:20:46 +09:00
403cbfb6bb added some stuff for mail releases 2021-03-16 01:42:54 +09:00
466751c13f data test 2021-03-16 01:35:23 +09:00
2d6e6e4537 data test 2021-03-16 01:33:58 +09:00
7231d54fa2 test data 2021-03-16 01:02:11 +09:00
61224e5611 updated process send eve mail job
updated test command to work on resposne codes
2021-03-16 01:00:02 +09:00
85d39b867b mining taxes invoice 2021-03-15 23:39:50 +09:00
8f30c3a42d process mining taxes ledgers job 2021-03-15 21:57:42 +09:00
011e53054d process mining taxes ledgers job 2021-03-15 21:42:13 +09:00
2972b9a301 process mining taxes ledgers job 2021-03-15 21:01:46 +09:00
e9c78c7e77 process mining taxes ledgers job 2021-03-15 21:00:46 +09:00
341117dfe9 fetch mining taxes ledger job cleanup 2021-03-15 20:56:28 +09:00
3efa2138c5 job issue'
git push
2021-03-15 20:51:47 +09:00
a5c6ad343b added job 2021-03-15 20:49:45 +09:00
f282ade0b3 modified git ignore 2021-03-15 20:48:04 +09:00
252deff4c2 commands 2021-03-15 20:47:25 +09:00
f7312a97b0 command helper 2021-03-15 20:45:19 +09:00
ade9da5be7 item price update issue 2021-03-15 20:44:27 +09:00
0c5b9aeb19 fixed invoice 2021-03-15 19:57:23 +09:00
f306ee161c fixed mining invoices 2021-03-15 19:46:25 +09:00
0ee3699b44 added jobs back in for the fetching and processing the mining ledgers
those jobs were taking extremely long times to complete, and jobs are better suited for them.
2021-03-15 19:38:06 +09:00
4c281934ff added some time functions into the mining ledger fetcher 2021-03-15 18:44:44 +09:00
507f4f8a73 added some time functions into the mining ledger fetcher 2021-03-15 18:43:18 +09:00
a158bad0bf fixed spelling mistake in routes 2021-03-15 18:28:11 +09:00
a3e9bf9aab tax helper correction 2021-03-15 00:58:34 +09:00
b23d7195c5 after action reports 2021-03-15 00:52:39 +09:00
0af6824866 updated taxes helper functions for the new model 2021-03-14 22:18:34 +09:00
d66fa052fb found error in contract checker 2021-03-14 07:22:19 +09:00
adadd7994e added to the after action report controller 2021-03-12 00:28:12 +09:00
aae582344e added after action report models 2021-03-10 23:30:28 +09:00
4db6dac439 added primary keys to all models 2021-03-10 23:29:30 +09:00
91bde37441 redirectTo when not logged in. 2021-03-10 22:48:41 +09:00
044450e448 redirectTo when not logged in. 2021-03-10 22:47:35 +09:00
56ebd398ab redirectTo when not logged in. 2021-03-10 22:46:56 +09:00
6d5eb98614 redirectTo when not logged in. 2021-03-10 22:46:26 +09:00
434179ba18 redirectTo when not logged in. 2021-03-10 22:45:54 +09:00
9e4b8deb78 redirectTo when not logged in. 2021-03-10 22:43:10 +09:00
4688af0cb4 redirectTo when not logged in. 2021-03-10 22:40:05 +09:00
d44edffa1b redirectTo when not logged in. 2021-03-10 22:36:31 +09:00
ceb7ed4949 modified git ignore 2021-03-10 22:30:04 +09:00
4b94ed2a51 modified kernel for commands 2021-03-10 22:24:55 +09:00
9feba2916a modified redirect when not logged in 2021-03-10 22:21:57 +09:00
4f15afb3ce enabled invoices and payment checking for mining taxes 2021-03-10 21:52:39 +09:00
eb54b7ba0a enabled invoices and payment checking for mining taxes 2021-03-10 21:48:48 +09:00
1383 changed files with 32175 additions and 24105 deletions

24
.env
View File

@@ -2,7 +2,7 @@ APP_NAME='W4RP Services'
APP_ENV=local
APP_KEY=base64:PBOxrGFJAtwj9SDF4F0DZ1J+6MjrJmRiPZJQwRdy3XQ=
APP_DEBUG=true
APP_URL=http://localhost
APP_URL=https://services.w4rp.space
LOG_CHANNEL=daily
@@ -10,14 +10,16 @@ DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=w4rpservices2
DB_USERNAME=
DB_PASSWORD=
DB_USERNAME=minerva
DB_PASSWORD=FuckingShit12
BROADCAST_DRIVER=log
CACHE_DRIVER=file
CACHE_DRIVER=redis
CACHE_PREFIX=w4rpservices_cache
QUEUE_DRIVER=redis
QUEUE_CONNECTION=sync
QUEUE_CONNECTION=redis
QUEUE_PREFIX=w4rpservices_queue
SESSION_DRIVER=file
SESSION_LIFETIME=120
@@ -25,6 +27,8 @@ SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_DATABASE=0
REDIS_CACHE_DB=1
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
@@ -33,9 +37,11 @@ MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
ESI_CLIENT_ID=
ESI_SECRET_KEY=
ESI_USERAGENT=
ESI_CALLBACK_URI=
ESI_CLIENT_ID=91a051aea72742068b51801042397c38
ESI_SECRET_KEY=1co6qRMoXyx1dG2iBbAZ1z6NUOoaJWyQnqEnsqoj
ESI_USERAGENT='W4RP Services'
ESI_CALLBACK_URI=https://services.w4rp.space/callback/
ESI_PRIMARY_CHAR=93738489
ESI_ALLIANCE=99004116
HORIZON_PREFIX=w4rpservices_horizon

6
.gitignore vendored
View File

@@ -5,5 +5,7 @@
/public/logs/*
worker.log
/public/cache/*
/.env
.vscode
.env
.vscode
/storage/logs
worker.log

View File

@@ -7,9 +7,6 @@ use Illuminate\Console\Command;
use Carbon\Carbon;
use Log;
//Library
use Commands\Library\CommandHelper;
//Models
use App\Models\Lookups\AllianceLookup;
use App\Models\Lookups\CharacterLookup;
@@ -57,9 +54,6 @@ class CleanStaleDataCommand extends Command
*/
public function handle()
{
$command = new CommandHelper;
$command->CleanJobStatusTable();
//Empty the item lookup table
ItemLookup::truncate();

View File

@@ -8,6 +8,7 @@ use Carbon\Carbon;
//Models
use App\Models\ScheduledTask\ScheduleJob;
use App\Jobs\Commands\Eve\SendEveMail;
//Library
use Seat\Eseye\Exceptions\RequestFailedException;
@@ -49,11 +50,39 @@ class Test extends Command
*/
public function handle()
{
$helper = new FinanceHelper;
$esiHelper = new Esi;
$config = config('esi');
$startTime = time();
$receipt = $helper->GetApiWalletJournal(1, $config['primary']);
$endTime = time();
var_dump($endTime - $startTime);
$refreshToken = $esiHelper->GetRefreshToken($config['primary']);
$esi = $esiHelper->SetupEsiAuthentication($refreshToken);
$recipient = $config['primary'];
$recipientType = 'character';
$subject = "Just A Test for Eseye";
$sender = $config['primary'];
$body = "F0KlvSA9vrXWYK0IuMhSAbfaOAMmQO5U2CD69Dn0JOk26B8HnSPPkhSG3JzlawHjbBd16HAIbaawbv9304EaoTRctpu5cnZo0GoHINi3R7pNGi0IZTWKG4EArwWbSujwX9KPvMqGNbcSorrIEslw6neXWW1kcDN0GMcvV6SeoM23cSkK33cAbR4DTeqUXZ9ULuFy31UPXfEcaNzKREbqKPlgChYcGdCyHG1J25qrEmPlOTPI1NQQkh71HvHJTVA7bmTgLEJMdFYHbc3ZzGOB9RFLfhdkGEGl2f3OQNyDAJIKW2mNQVlRVGc3Emvm42czpsH8ojn3BX5nuEFxNfjgue8hhdBIZSKm232U2l0xsPGZOzHvQdYs8bLw7ZQX1drV9qOPnbhgzbFLxEvQoGDquhKAdlo7bhkgoCn5IiY3BbQ5qnKVodymb58gj9Pd67GxjJ8K0854c91KkrJNEOCyiVcqKYqNDtKkB7hgjBLZUKRtWUkOf9j1qIRARoGzTGdqK20yvfaVIWetVqjw5UvzQC2pynHkvIw2X3aD49ghY7UOzXUceKJ8taF4ZaMvW34r5OvyTrjVo4PKV9TylIODmzg1U0s4joxz58f1A6BNp2fCs1YzNOObuMaxGjek47jv2gDgyhQnmi5uaREcGn5AAwgMUc55GPY2jevRTHo9scMqm5amaJUBQ3TgXvFSfS33LxD8xJjdKw7KB06stDQzdjyVb52mAdm5WchOOpGy3EXntBSzsfUHc4XEqql7lKTPLgBzeYxt9EagGP96Li4dABg2MaLuU4i1CWdV49ZdPwOt1OjwNU4QtfR02C6Vw7raCFl3mqWBgLke9O5dC8Lh3ojg7FBATstSuur2n41Rn4YwzGaiWJ3qKwTsJGL3k8PaHEsvwvq56w4Qjt8CqJsmAV1nsfKMFZaVlcbK3PFN5oHaDbQwDh4IVdwA8UPPnrn2wSuugi8QlVyUA8z9iVYMW8OdzHFn98zl7a2Bua5M";
SendEveMail::dispatch($body, $recipient, $recipientType, $subject, $sender);
/*
try {
$response = $esi->setBody([
'approved_cost' => 100,
'body' => "Welcome to this test message.<br>" . $body,
'recipients' => [[
'recipient_id' => $config['primary'],
'recipient_type' => 'character',
]],
'subject' => 'Just a Test',
])->invoke('post', '/characters/{character_id}/mail/', [
'character_id' => $config['primary'],
]);
} catch(RequestFailedException $e) {
return null;
}
var_dump($response);
dd($response->getErrorCode());
*/
}
}

View File

@@ -6,7 +6,6 @@ use Illuminate\Console\Command;
//Library
use App\Library\Moons\MoonCalc;
use Comamnds\Library\CommandHelper;
//Job
use App\Jobs\Commands\Eve\ItemPricesUpdateJob;
@@ -46,17 +45,10 @@ class ItemPricesUpdateCommand extends Command
{
//Declare variables
$moonHelper = new MoonCalc;
$task = new CommandHelper('ItemPricesUpdateCommand');
//Set the task as started
$task->SetStartStatus();
//Fetch new prices from fuzzwork.co.uk for the item pricing schemes
$moonHelper->FetchNewPrices();
//Set the task as completed
$task->SetStopStatus();
return 0;
}
}

View File

@@ -0,0 +1,73 @@
<?php
//Namespace
namespace App\Console\Commands\Files;
//Internal Library
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\File;
use Carbon\Carbon;
use Log;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use DB;
//Application Library
use Seat\Eseye\Exceptions\RequestFailedException;
use App\Library\Esi\Esi;
use App\Library\Helpers\LookupHelper;
//Models
use App\Models\MoonRental\AllianceMoonOre;
use App\Models\MoonRental\AllianceMoon;
class ImportAllianceMoons extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'files:import:moons';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Import moons from tab-delimited text.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
//Declare variables
$lookup = new LookupHelper;
//Create the collection of lines for the input file.
$lines = new Collection;
///universe/moons/{moon_id}/
//Create the file handler
$data = Storage::get('public/alliance_moons.txt');
//Split the string into separate arrays based on the line
$data = preg_split("/\n\t/", $data);
var_dump($data);
dd();
}
}

View File

@@ -9,7 +9,9 @@ use Carbon\Carbon;
//Application Library
use App\Library\Helpers\FinanceHelper;
use Commands\Library\CommandHelper;
//Jobs
use App\Jobs\Commands\Finances\UpdateAllianceWalletJournalJob;
//Models
use App\Models\Finances\AllianceWalletJournal;
@@ -47,18 +49,6 @@ class UpdateAllianceWalletJournal extends Command
*/
public function handle()
{
//Declare variables
$fHelper = new FinanceHelper;
$config = config('esi');
$task = new CommandHelper('UpdateAllianceWalletJournal');
//Set the task as started
$task->SetStartStatus();
$fHelper->GetApiWalletJournal(1, $config['primary']);
//Set the task as stopped
$task->SetStopStatus();
return 0;
UpdateAllianceWalletJournalJob::dispatch()->onQueue('finances');
}
}

View File

@@ -1,48 +0,0 @@
<?php
namespace Commands\Library;
//Internal Libraries
use Carbon\Carbon;
//Models
use App\Models\ScheduledTask\ScheduleJob;
class CommandHelper {
private $job_name;
private $job_state;
private $system_time;
public function __construct($name) {
$this->job_name = $name;
$this->job_state = 'Starting';
$this->system_time = Carbon::now();
}
public function SetStartStatus() {
//Add an entry into the jobs table
$job = new ScheduleJob;
$job->job_name = $this->job_name;
$job->job_state = $this->job_state;
$job->system_time = $this->system_time;
$job->save();
}
public function SetStopStatus() {
//Mark the job as finished
ScheduleJob::where([
'system_time' => $this->system_time,
'job_name' => $this->job_name,
])->update([
'job_state' => 'Finished',
]);
}
public function CleanJobStatusTable() {
//Delete old jobs
ScheduleJob::where(['system_time', '<', Carbon::now()->subMonths(3)])->delete();
}
}
?>

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Console\Commands\MiningTaxes;
use Illuminate\Console\Command;
use App\Jobs\Commands\MiningTaxes\PreFetchMiningTaxesLedgers as PreFetch;
class ExecuteMiningTaxesLedgersCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mt:ledgers';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Execute mining taxes ledgers jobs.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
PreFetch::dispatch()->onQueue('miningtaxes');
return 0;
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Console\Commands\MiningTaxes;
use Illuminate\Console\Command;
use App\Jobs\Commands\MiningTaxes\FetchMiningTaxesObservers as FetchObservers;
class ExecuteMiningTaxesObserversCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mt:observer';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Dispatch a mining tax observer job.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
FetchObservers::dispatch()->onQueue('miningtaxes');
return 0;
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Console\Commands\MiningTaxes;
use Illuminate\Console\Command;
use App\Jobs\Commands\MiningTaxes\ProcessMiningTaxesPayments as PMTP;
class ExecuteProcesssMiningTaxesPaymentsCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mt:payments';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Process Mining Taxes payments from the console.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
PMTP::dispatch()->onQueue('miningtaxes');
return 0;
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Console\Commands\MiningTaxes;
use Illuminate\Console\Command;
use App\Jobs\Commands\MiningTaxes\SendMiningTaxesInvoices as SendInvoice;
class ExecuteSendMiningTaxesInvoiceCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mt:send';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Execute send mining tax invoices.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
SendInvoice::dispatch()->onQueue('miningtaxes');
return 0;
}
}

View File

@@ -1,155 +0,0 @@
<?php
namespace App\Console\Commands\MiningTaxes;
//Internal Library
use Illuminate\Console\Command;
use Log;
use Carbon\Carbon;
//Application Library
use Commands\Library\CommandHelper;
use App\Library\Helpers\LookupHelper;
//Models
use App\Models\MiningTax\Invoice;
use App\Models\MiningTax\Ledger;
//Jobs
use App\Jobs\Commands\Eve\ProcessSendEveMailJob;
class MiningTaxesInvoices extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'MiningTax:Invoice';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Mining Taxes Invoice Command';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
//Declare variables
$lookup = new LookupHelper;
$config = config('esi');
$body = null;
$task = new CommandHelper('MiningTaxesInvoices');
//Set the task as started
$task->SetStartStatus();
//Get the characters for each non-invoiced ledger entry
$charIds = Ledger::distinct('character_id')->pluck('character_id');
//Foreach character tally up the mining ledger.
foreach($charIds as $charId) {
//Declare some variables we need for each iteration of the loop
$invoice = array();
$ores = array();
$totalPrice = 0.00;
//Get the rows from the database for each character and the requirement of not been invoiced yet
$rows = Ledger::where([
'character_id' => $charId,
'invoiced' => 'No',
])->get()->toArray();
var_dump($rows);
//Taly up the item composition from each row and multiply by the quantity
foreach($rows as $row) {
if(!isset($ores[$row['type_id']])) {
$ores[$row['type_id']] = 0;
}
$ores[$row['type_id']] = $ores[$row['type_id']] + $row['quantity'];
//Add up the total price from the ledger rows for the report later
$totalPrice = $totalPrice + $row['amount'];
}
//Reduce the total price by the take percentage
$invoiceAmount = $totalPrice * 0.10;
$invoiceAmount = round($invoiceAmount, 2);
//Get the character name from the character id
$charName = $lookup->CharacterIdToName($charId);
//Generate a unique invoice id
$invoiceId = uniqid();
//Save the invoice model
$invoice = new Invoice;
$invoice->character_id = $charId;
$invoice->character_name = $charName;
$invoice->invoice_id = $invoiceId;
$invoice->invoice_amount = $invoiceAmount;
$invoice->date_issued = Carbon::now();
$invoice->date_due = Carbon::now()->addDays(7);
$invoice->status = 'Pending';
$invoice->save();
//Update the ledger entries
Ledger::where([
'character_id' => $charId,
'invoiced' => 'No',
])->update([
'invoiced' => 'Yes',
'invoice_id' => $invoiceId,
]);
//Create the mail body
$body .= "Dear Miner,<br><br>";
$body .= "Mining Taxes are due for the following ores mined from alliance moons: <br>";
foreach($ores as $ore => $quantity) {
$oreName = $lookup->ItemIdToName($ore);
$body .= $oreName . ": " . number_format(round($quantity * $config['mining_tax']), 0, ".", ",") . "<br>";
}
$body .= "Please remit " . number_format($totalPrice, 2, ".", ",") . " ISK to Spatial Forces by " . $invoice->date_due . "<br>";
$body .= "Set the reason for transfer as MMT: " . $invoice->invoice_id . "<br>";
$body .= "<br><br>";
$body .= "You can also send a contract with the following ores in the contract with the reason set as MMT: " . $invoice->invoice_id . "<br>";
foreach($ores as $ore => $quantity) {
$oreName = $lookup->ItemIdToName($ore);
$body .= $oreName . ": " . number_format(round($quantity * $config['mining_tax']), ".", ",") . "<br>";
}
$body .= "<br>";
$body .= "<br>Sincerely,<br>Warped Intentions Leadership<br>";
//Mail the invoice to the character if the character is in
//Warped Intentions or Legacy
$subject = 'Warped Intentions Mining Taxes';
$sender = $config['primary'];
$recipientType = 'character';
$recipient = $charId;
//Send the Eve Mail Job to the queue to be dispatched
ProcessSendEveMailJob::dispatch($body, $recipient, $recipientType, $subject, $sender)->onQueue('mail');
}
//Set the task as stopped
$task->SetStopStatus();
return 0;
}
}

View File

@@ -1,138 +0,0 @@
<?php
namespace App\Console\Commands\MiningTaxes;
//Internal Library
use Illuminate\Console\Command;
use Log;
use Carbon\Carbon;
//Application Library
use Commands\Library\CommandHelper;
use Seat\Eseye\Exceptions\RequestFailedException;
use App\Library\Esi\Esi;
use App\Library\Helpers\LookupHelper;
use App\Library\Moons\MoonCalc;
//Models
use App\Models\MiningTax\Observer;
use App\Models\MiningTax\Ledger;
use App\Models\Moon\MineralPrice;
use App\Models\Moon\ItemComposition;
use App\Models\Esi\EsiToken;
use App\Models\Esi\EsiScope;
//Jobs
//use App\Jobs\Commands\MiningTaxes\FetchMiningTaxesLedgersJob;
class MiningTaxesLedgers extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'MiningTax:Ledgers';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Start getting the mining ledgers.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
//Create the command helper container
$task = new CommandHelper('MiningTaxesLedger');
//Set the task as started
$task->SetStartStatus();
//Get the site configuration which holds some data we need
$config = config('esi');
//Get the observers from the database
$observers = Observer::all();
//Job Variables to be moved later
$esiHelper = new Esi;
$lookup = new LookupHelper;
$mHelper = new MoonCalc;
$esiHelper = new Esi;
/*
//For each of the observers, send a job to fetch the mining ledger
foreach($observers as $obs) {
//Dispatch the mining taxes ledger jobs
FetchMiningTaxesLedgersJob::dispatch($config['primary'], $config['corporation'], $obs->observer_id)->onQueue('miningtaxes');
}
*/
$refreshToken = $esiHelper->GetRefreshToken($config['primary']);
$esi = $esiHelper->SetupEsiAuthentication($refreshToken);
foreach($observers as $obs) {
try {
$response = $esi->invoke('get', '/corporation/{corporation_id}/mining/observers/{observer_id}/', [
'corporation_id' => $config['corporation'],
'observer_id' => $obs->observer_id,
]);
} catch(RequestFailedException $e) {
Log::warning('Failed to get the mining ledger in FetchMiningTaxesLedgersCommand for observer id: ' . $this->observerId);
return null;
}
$ledgers = json_decode($response->raw);
foreach($ledgers as $ledger) {
//Get some basic information we need to work with
$charName = $lookup->CharacterIdToName($ledger->character_id);
//Get the type name from the ledger ore stuff
$typeName = $lookup->ItemIdToName($ledger->type_id);
//Get the price from the helper function
$price = $mHelper->CalculateOrePrice($ledger->type_id);
//Calculate the total price based on the amount
$amount = $price * $ledger->quantity;
//Insert or update the entry in the database
$item = Ledger::updateOrCreate([
'character_id' => $ledger->character_id,
'character_name' => $charName,
'observer_id' => $obs->observer_id,
'last_updated' => $ledger->last_updated,
'type_id' => $ledger->type_id,
'ore_name' => $typeName,
'quantity' => $ledger->quantity,
'amount' => $amount,
], [
'character_id' => $ledger->character_id,
'character_name' => $charName,
'observer_id' => $obs->observer_id,
'last_updated' => $ledger->last_updated,
'type_id' => $ledger->type_id,
'ore_name' => $typeName,
'quantity' => $ledger->quantity,
'amount' => $amount,
]);
}
}
//Clean up old data
//Ledger::where(['updated_at', '<', Carbon::now()->subDays(120)])->delete();
//Return 0
return 0;
}
}

View File

@@ -1,119 +0,0 @@
<?php
namespace App\Console\Commands\MiningTaxes;
//Internal Library
use Illuminate\Console\Command;
use Log;
use Commands\Library\CommandHelper;
use Carbon\Carbon;
//Application Library
use Seat\Eseye\Exceptions\RequestFailedException;
use App\Library\Esi\Esi;
use App\Library\Helpers\LookupHelper;
//App Models
use App\Models\MiningTax\Observer;
//Jobs
use App\Jobs\Commands\MiningTaxes\FetchMiningTaxesObserversJob;
class MiningTaxesObservers extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'MiningTax:Observer';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Get mining tax observers.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
//Create the command helper container
$task = new CommandHelper('MiningTaxesObservers');
//Set the task as started
$task->SetStartStatus();
$startTime = time();
//Declare variables
$config = config('esi');
$lookup = new LookupHelper;
$esiHelper = new Esi;
//Check for the esi scope
if(!$esiHelper->HaveEsiScope($config['primary'], 'esi-industry.read_corporation_mining.v1')) {
Log::critical('Esi scopes were not found for FetchMiningTaxesObserversJob.');
print("Esi scopes not found.");
return;
}
$char = $lookup->GetCharacterInfo($config['primary']);
//Get the refresh token for the character
$refreshToken = $esiHelper->GetRefreshToken($config['primary']);
//Get the esi variable
$esi = $esiHelper->SetupEsiAuthentication($refreshToken);
try {
$response = $esi->invoke('get', '/corporation/{corporation_id}/mining/observers/', [
'corporation_id' => $char->corporation_id,
]);
} catch(RequestFailedException $e) {
Log::critical("Failed to get moon observers in FetchMiningTaxesObservers");
Log::critical($e);
dd($e);
}
$resp = json_decode($response->raw, false);
//Run through the mining observers, and add them to the database
foreach($resp as $observer) {
Observer::updateOrInsert([
'observer_id' => $observer->observer_id,
], [
'observer_id' => $observer->observer_id,
'observer_type' => $observer->observer_type,
'last_updated' => $observer->last_updated,
]);
}
/**
* Cleanup stale data that hasn't been updated in at least 1 week.
*/
$date = Carbon::now()->subDays(60);
Observer::where('last_updated', '<', $date)->delete();
$task->SetStopStatus();
$endTime = time();
printf("Time to complete: " . ($endTime - $startTime) . "\n\r");
//Return 0 saying everything is fine
return 0;
}
}

View File

@@ -1,152 +0,0 @@
<?php
namespace App\Console\Commands\MiningTaxes;
//Internal Library
use Illuminate\Console\Command;
use Log;
use Carbon\Carbon;
//Application Library
use Commands\Library\CommandHelper;
use App\Library\Lookup\LookupHelper;
use Seat\Eseye\Exceptions\RequestFailedException;
use App\Library\Esi\Esi;
//Models
use App\Models\MiningTaxes\Invoice;
use App\Models\MiningTaxes\Payment;
use App\Models\Finances\PlayerDonationJournal;
//Jobs
use App\Jobs\Commands\MiningTaxes\ProcessMiningTaxesPaymentsJob;
class MiningTaxesPayments extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'MiningTax:Payments';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Process mining tax payments';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
//Create the command helper container
$task = new CommandHelper('MiningTaxesPayments');
//Set the task as started
$task->SetStartStatus();
//Declare variables for the function
$lookup = new LookupHelper;
$currentTime = Carbon::now();
$config = config('esi');
$esiHelper = new Esi;
//Check for the esi scope
if(!$esiHelper->HaveEsiScope($config['primary'], 'esi-contracts.read_corporation_contracts.v1')) {
Log::critical('Esi scopes were not found for MiningTaxesPayments');
print("Esi scope not found.");
return;
}
//Get the refresh token
$refreshToken = $esiHelper->GetRefreshToken($config['primary']);
//Get the esi variable
$esi = $esiHelper->SetupEsiAuthentication($refreshToken);
//Get all of the contracts from esi
try {
$response = $esi->invoke('get', '/corporations/{corporation_id}/contracts/', [
'corporation_id' => $config['corporation'],
]);
} catch(RequestFailedException $e) {
Log::critical("Failed to get contrcts in MiningTaxesPayments command.");
Log::critical($e);
dd($e);
}
//Decode the contracts from the json response
$contracts = json_decode($response->raw, false);
//Get the outstanding invoices
$outstanding = Invoice::where([
'status' => 'Pending',
])->get();
//Use the player donation and the journal in order to check over the pending contracts to attempt
//to pay the contract
foreach($outstanding as $invoice) {
//See if we have a reason with the correct uniqid from the player donation journal
$found = PlayerDonationJournal::where([
'reason' => "MMT: " . $invoice->invoice_id,
])->count();
if($found == 1) {
//If the bill is paid on time, then update the invoice as such
if($currentTime->lessThanOrEqualTo($invoice->due_date)) {
Invoice::where([
'invoice_id' => $invoice->invoice_id,
])->update([
'status' => 'Paid',
]);
}
//If the bill is paid late, then update the invoice as such
if($currentTime->greaterThan($invoice->due_date)) {
Invoice::where([
'invoice_id' => $invoice->invoice_id,
])->update([
'status' => 'Paid Late',
]);
}
} else {
//If we didn't found a journal entry, then we shall check the contracts for a correct entry
foreach($contracts as $contract) {
if(($contract->title == ("MMT: " . $invoice->invoice_id)) && ($currentTime->lessThanOrEqualTo($invoice->due_date))) {
Invoice::where([
'invoice_i' => $invoice->invoice_id,
])->update([
'stauts' => 'Paid'
]);
}
if(($contract->title == ("MMT: " . $invoice_id)) && ($currentTime->greaterThan($invoice->due_date))) {
Invoice::where([
'invoice_id' => $invoice->invoice_id,
])->update([
'status' => 'Paid Late',
]);
}
}
}
}
//Set the task as stopped
$task->SetStopStatus();
return 0;
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Console\Commands\Structures;
use Illuminate\Console\Command;
use App\Jobs\Commands\Assets\FetchAllianceAssets as FAA;
class ExecuteFetchAllianceAssetsCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'structure:assets';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Execute fetch alliance command.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
FAA::dispatch();
return 0;
}
}

View File

@@ -4,24 +4,23 @@ namespace App\Console\Commands\Structures;
use Illuminate\Console\Command;
//Job
use App\Jobs\Commands\Structures\ProcessStructureJob;
use App\Jobs\Commands\Structures\FetchAllianceStructures as FAS;
class GetStructuresCommand extends Command
class ExecuteFetchAllianceStructuresCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'services:GetStructures';
protected $signature = 'structure:structure';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Get the list of structures ';
protected $description = 'Fetch alliance structures command.';
/**
* Create a new command instance.
@@ -36,18 +35,12 @@ class GetStructuresCommand extends Command
/**
* Execute the console command.
*
* @return mixed
* @return int
*/
public function handle()
{
//Get the esi config
$config = config('esi');
FAS::dispatch();
//Declare some variables
$charId = $config['primary'];
$corpId = 98287666;
//Dispatch the job to be done when the application has time
ProcessStructureJob::dispatch($charId, $corpId);
return 0;
}
}

View File

@@ -6,8 +6,20 @@ namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
//Library
use Commands\Library\CommandHelper;
//Jobs
use App\Jobs\Commands\MiningTaxes\PreFetchMiningTaxesLedgers;
use App\Jobs\Commands\MiningTaxes\FetchMiningTaxesObservers;
use App\Jobs\Commands\MiningTaxes\ProcessMiningTaxesPayments;
use App\Jobs\Commands\MiningTaxes\SendMiningTaxesInvoices;
use App\Jobs\Commands\MiningTaxes\UpdateMiningTaxesLateInvoices1st;
use App\Jobs\Commands\MiningTaxes\UpdateMiningTaxesLateInvoices15th;
use App\Jobs\Commands\Finances\UpdateAllianceWalletJournalJob;
use App\Jobs\Commands\Finances\UpdateItemPrices as UpdateItemPricesJob;
use App\Jobs\Commands\Data\PurgeUsers as PurgeUsersJob;
use App\Jobs\Commands\Structures\FetchAllianceStructures;
use App\Jobs\Commands\Structures\PurgeAllianceStructures;
use App\Jobs\Commands\Assets\FetchAllianceAssets;
use App\Jobs\Commands\Assets\PurgeAllianceAssets;
class Kernel extends ConsoleKernel
{
@@ -17,28 +29,17 @@ class Kernel extends ConsoleKernel
* @var array
*/
protected $commands = [
/**
* Data Commands
*/
Commands\Data\PurgeUsers::class,
Commands\Data\EmptyJumpBridges::class,
Commands\Data\CleanStaleDataCommand::class,
Commands\Data\Test::class,
/**
* Eve Commands
*/
Commands\Eve\ItemPricesUpdateCommand::class,
/**
* Finance Commands
*/
Commands\Finances\UpdateAllianceWalletJournal::class,
/**
* Mining Tax Commands
*/
Commands\MiningTaxes\MiningTaxesInvoices::class,
Commands\MiningTaxes\MiningTaxesLedgers::class,
Commands\MiningTaxes\MiningTaxesObservers::class,
Commands\MiningTaxes\MiningTaxesPayments::class,
Commands\MiningTaxes\ExecuteMiningTaxesObserversCommand::class,
Commands\MiningTaxes\ExecuteMiningTaxesLedgersCommand::class,
Commands\MiningTaxes\ExecuteSendMiningTaxesInvoiceCommand::class,
Commands\MiningTaxes\ExecuteProcesssMiningTaxesPaymentsCommand::class,
Commands\Structures\ExecuteFetchAllianceStructuresCommand::class,
Commands\Structures\ExecuteFetchAllianceAssetsCommand::class,
Commands\Files\ImportAllianceMoons::class,
];
/**
@@ -49,50 +50,71 @@ class Kernel extends ConsoleKernel
*/
protected function schedule(Schedule $schedule)
{
//Schedule Monitor Jobs
$schedule->command('schedule-monitor:sync')->dailyAt('04:56');
$schedule->command('schedule-monitor:clean')->daily();
//Horizon Graph Schedule
$schedule->command('horizon:snapshot')->everyFiveMinutes();
/**
* Purge Data Schedule
*/
$schedule->command('data:CleanData')
->weekly(7, '11:00');
$schedule->command('data:PurgeCorpLedgers')
->monthly();
$schedule->command('data:PurgeUsers')
->dailyAt('23:00');
$schedule->job(new PurgeUsersJob)
->weekly();
/**
* Finances Update Schedule
*/
$schedule->command('finances:UpdateJournals')
$schedule->job(new UpdateAllianceWalletJournalJob)
->hourlyAt('45')
->withoutOverlapping();
/**
* Item Update Schedule
*/
$schedule->command('services:ItemPriceUpdate')
->hourlyAt('30')
$schedule->job(new UpdateItemPricesJob)
->hourlyAT('30')
->withoutOverlapping();
/**
* Mining Tax Schedule
*/
$schedule->command('MiningTaxes:Observers')
$schedule->job(new FetchMiningTaxesObservers)
->dailyAt('22:00')
->withoutOverlapping();
$schedule->command('MiningTaxes:Ledgers')
$schedule->job(new PreFetchMiningTaxesLedgers)
->dailyAt('20:00')
->withoutOverlapping();
/*
$schedule->command('MiningTaxes:Invoices')
->weeklyOn(1, '8:00')
$schedule->job(new SendMiningTaxesInvoices)
->weeklyOn(1, '06:00')
->withoutOverlapping();
$schedule->command('MiningTaxes:Payments')
$schedule->job(new ProcessMiningTaxesPayments)
->hourlyAt('15')
->withoutOverlapping();
*/
$schedule->job(new UpdateMiningTaxesLateInvoices1st)
->monthlyOn(1, '16:00')
->withoutOverlapping();
$schedule->job(new UpdateMiningTaxesLateInvoices15th)
->monthlyOn(15, '16:00')
->withoutOverlapping();
/**
* Alliance Structure and Assets Schedule
*/
$schedule->job(new FetchAllianceStructures)
->dailyAt('21:00')
->withoutOverlapping();
$schedule->job(new FetchAllianceAssets)
->hourlyAt('15')
->withoutOverlapping();
$schedule->job(new PurgeAllianceStructures)
->monthlyOn(2, '14:00')
->withoutOverlapping();
$schedule->job(new PurgeAllianceAssets)
->monthlyOn(2, '15:00')
->withoutOverlapping();
}
/**
@@ -106,4 +128,14 @@ class Kernel extends ConsoleKernel
require base_path('routes/console.php');
}
/**
* Get the timezone that should be used by default for scheduled events.
*
* @return \DateTimeZone|string|null
*/
protected function scheduleTimezone()
{
return 'UTC';
}
}

View File

@@ -5,10 +5,11 @@ namespace App\Http\Controllers\AfterActionReports;
//Internal Library
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Carbon\Carbon;
//Models
use App\Models\AfterActionReports\Report;
use App\Models\AfterActionReports\Comment;
use App\Models\AfterActionReports\AfterActionReport;
use App\Models\AfterActionReports\AfterActionReportComment;
class AfterActionReportsController extends Controller
{
@@ -18,18 +19,69 @@ class AfterActionReportsController extends Controller
}
public function DisplayReportForm() {
//
return view('reports.user.form.report');
}
public function StoreReport() {
public function StoreReport(Request $request) {
$this->validate($request, [
'location' => 'required',
'time' => 'required',
'comms' => 'required',
'doctrine' => 'required',
'objective' => 'required',
'result' => 'required',
'summary' => 'required',
'improvements' => 'required',
'well' => 'required',
'comments' => 'required',
]);
$report = new Report;
$report->fc_id = auth()->user()->getId();
$report->fc_name = auth()->user()->getName();
$report->formup_time = $request->time;
$report->formup_location = $request->location;
$report->comms = $request->comms;
$report->doctrine = $request->doctrine;
$report->objective = $request->objective;
$report->objective_result = $request->result;
$report->summary = $request->summary;
$report->improvements = $request->improvements;
$report->worked_well = $request->well;
$report->additonal_comments = $request->comments;
$report->save();
return redirect('/reports/display/all')->with('success', 'Added report to the database.');
}
public function StoreComment() {
public function DisplayCommentForm($id) {
return view('reports.user.form.comment')->with('id', $id);
}
public function StoreComment(Request $request) {
$this->validate($request, [
'reportId' => 'required',
'comments' => 'required',
]);
$comment = new AfterActionReportComment;
$comment->report_id = $request->reportId;
$comment->character_id = auth()->user()->getId();
$comment->character_name = auth()->user()->getName();
$comment->comments = $required->comments;
$comment->save();
return redirect('/reports/display/all')->with('success', 'Added comemnt to the report.');
}
public function DisplayAllReports() {
//Grab all the reports
$reports = AfterActionReport::where('created_at', '>=', Carbon::now()->subDays(30));
$comments = AfterActionReportComment::where('created_at', '>=', Carbon::now()->subDays(30));
$reportCount = AfterActionReport::where('created_at', '>=', Carbon::now()->subDays(30))->count();
return view('reports.user.displayreports')->with('reports', $reports)
->with('comments', $comments)
->with('reportCount', $reportCount);
}
}

View File

@@ -77,7 +77,8 @@ class LoginController extends Controller
*/
public function redirectToProvider($profile = null, Socialite $social) {
//The default scope is public data for everyone due to OAuth2 Tokens
$scopes = ['publicData'];
//We also add the send mail scope in order to be able to send mails more efficiently through jobs when other scopes are required.
$scopes = ['publicData', 'esi-mail.send_mail.v1'];
//Collect any other scopes we need if we are logged in.
//If we are logged in we are linking another character to this one.
@@ -159,9 +160,14 @@ class LoginController extends Controller
* @param \Laravel\Socialite\Two\User $user
*/
private function createAlt($user, $orgCharacter) {
//Check to see if the alt is already in the database
$altCount = UserAlt::where(['character_id' => $user->id])->count();
$altCount = UserAlt::where('character_id', $user->id)->count();
if($altCount == 0) {
//Check to see if the new character being added is already a main character
$mainCount = User::where(['character_id' => $user->id])->count();
//If not already in the database, then add the new character
if($altCount == 0 && $mainCount == 0) {
//Create the new alt in the table
$newAlt = new UserAlt;
$newAlt->name = $user->getName();
@@ -174,7 +180,6 @@ class LoginController extends Controller
$newAlt->expires_in = $user->expiresIn;
$newAlt->save();
//Create the entry into the EsiToken table
//Create the entry into the EsiToken table
if(EsiToken::where(['character_id' => $user->id])->count() == 0) {
$this->SaveEsiToken($user);

View File

@@ -16,7 +16,7 @@ use App\Models\Contracts\SupplyChainBid;
use App\Models\Contracts\SupplyChainContract;
//Jobs
use App\Jobs\Commands\Eve\ProcessSendEveMailJob;
use App\Jobs\Commands\Eve\SendEveMail;
class SupplyChainController extends Controller
{
@@ -454,7 +454,7 @@ class SupplyChainController extends Controller
$body .= "Notes: " . $contract->body . "<br>";
$body .= "Delivery Date: " . $contract->delivery_date . "<br>";
$body .= "<br>Sincerely on behalf of,<br>" . $contract->issuer_name . "<br>";
ProcessSendEveMailJob::dispatch($body, 145223267, 'mailing_list', $subject, $config['primary'])->onQueue('mail')->delay(Carbon::now()->addSeconds(30));
SendEveMail::dispatch($body, 145223267, 'mailing_list', $subject, $config['primary'])->delay(Carbon::now()->addSeconds(30));
}
/**
@@ -469,7 +469,7 @@ class SupplyChainController extends Controller
$body .= "Contract: " . $contract->title . "<br>";
$body .= "Notes: " . $contract->note . "<br>";
$body .= "<br>Sincerely on behalf of,<br>" . $contract->issuer_name;
ProcessSendEveMailJob::dispatch($body, 145223267, 'mailing_list', $subject, $config['primary'])->onQueue('mail')->delay(Carbon::now()->addSeconds(30));
SendEveMail::dispatch($body, 145223267, 'mailing_list', $subject, $config['primary'])->delay(Carbon::now()->addSeconds(30));
}
/**

View File

@@ -1,335 +0,0 @@
<?php
namespace App\Http\Controllers\Dashboard;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use DB;
use Carbon\Carbon;
//Libraries
use App\Library\Helpers\TaxesHelper;
use App\Library\Helpers\LookupHelper;
use App\Library\Helpers\SRPHelper;
//Models
use App\Models\User\User;
use App\Models\User\UserRole;
use App\Models\User\UserPermission;
use App\Models\User\AvailableUserPermission;
use App\Models\User\AvailableUserRole;
use App\Models\Admin\AllowedLogin;
class AdminController extends Controller
{
public function __construct() {
$this->middleware('auth');
$this->middleware('role:Admin');
}
public function displayTestAdminDashboard() {
return view('admin.dashboards.testdashboard');
}
public function showJournalEntries() {
$dateInit = Carbon::now();
$date = $dateInit->subDays(30);
$journal = DB::select('SELECT amount,reason,description,date FROM `player_donation_journal` WHERE corporation_id=98287666 AND date >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MONTH) ORDER BY date DESC');
return view('admin.dashboards.walletjournal')->with('journal', $journal);
}
public function displayUsersPaginated() {
//Declare array variables
$user = array();
$permission = array();
$userArr = array();
$permString = null;
$usersArr = User::orderBy('name', 'asc')->paginate(50);
foreach($usersArr as $user) {
$user->role = $user->getRole();
$permCount = UserPermission::where([
'character_id' => $user->character_id,
])->count();
if($permCount > 0) {
$perms = UserPermission::where([
'character_id' => $user->character_id,
])->get('permission')->toArray();
foreach($perms as $perm) {
$permString .= $perm['permission'] . ', ';
}
$user->permission = $permString;
} else {
$user->permission = 'No Permissions';
}
}
return view('admin.dashboards.userspaged')->with('usersArr', $usersArr);
}
public function searchUsers(Request $request) {
//Declare array variables
$user = array();
$permission = array();
$userArr = array();
$permString = null;
//Validate the input from the form
$this->validate($request, [
'parameter' => 'required',
]);
$usersArr = User::where('name', 'like', $request->parameter . "%")->paginate(50);
foreach($usersArr as $user) {
$user->role = $user->getRole();
$permCount = UserPermission::where([
'character_id' => $user->character_id,
])->count();
if($permCount > 0) {
$perms = UserPermission::where([
'character_id' => $user->character_id,
])->get('permission')->toArray();
foreach($perms as $perm) {
$permString .= $perm['permission'] . ', ';
}
$user->permission = $permString;
} else {
$user->permission = 'No Permissions';
}
}
return view('admin.dashboards.users.searched')->with('usersArr', $usersArr);
}
public function displayAllowedLogins() {
//Declare array variables
$entities = array();
/** Entities for allowed logins */
$legacys = AllowedLogin::where(['login_type' => 'Legacy'])->pluck('entity_name')->toArray();
$renters = AllowedLogin::where(['login_type' => 'Renter'])->pluck('entity_name')->toArray();
//Compile a list of entities by their entity_id
foreach($legacys as $legacy) {
$entities[] = $legacy;
}
foreach($renters as $renter) {
$entities[] = $renter;
}
return view('admin.dashboards.allowed_logins')->with('entities', $entities);
}
public function displayTaxes() {
//Declare variables needed for displaying items on the page
$months = 3;
$pi = array();
$industry = array();
$reprocessing = array();
$office = array();
$corpId = 98287666;
$srpActual = array();
$srpLoss = array();
/** Taxes Pane */
//Declare classes needed for displaying items on the page
$tHelper = new TaxesHelper();
$srpHelper = new SRPHelper();
//Get the dates for the tab panes
$dates = $tHelper->GetTimeFrameInMonths($months);
//Get the data for the Taxes Pane
foreach($dates as $date) {
//Get the srp actual pay out for the date range
$srpActual[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($srpHelper->GetAllianceSRPActual($date['start'], $date['end']), 2, ".", ","),
];
//Get the srp loss value for the date range
$srpLoss[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($srpHelper->GetAllianceSRPLoss($date['start'], $date['end']), 2, ".", ","),
];
//Get the pi taxes for the date range
$pis[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetPIGross($date['start'], $date['end']), 2, ".", ","),
];
//Get the industry taxes for the date range
$industrys[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetIndustryGross($date['start'], $date['end']), 2, ".", ","),
];
//Get the reprocessing taxes for the date range
$reprocessings[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetReprocessingGross($date['start'], $date['end']), 2, ".", ","),
];
//Get the office taxes for the date range
$offices[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetOfficeGross($date['start'], $date['end']), 2, ".", ","),
];
//Get the market taxes for the date range
$markets[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetAllianceMarketGross($date['start'], $date['end']), 2, ".", ","),
];
//Get the jump gate taxes for the date range
$jumpgates[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetJumpGateGross($date['start'], $date['end']), 2, ".", ","),
];
}
return view('admin.dashboards.taxes')->with('pis', $pis)
->with('industrys', $industrys)
->with('offices', $offices)
->with('markets', $markets)
->with('jumpgates', $jumpgates)
->with('reprocessings', $reprocessings)
->with('srpActual', $srpActual)
->with('srpLoss', $srpLoss);
}
public function displayModifyUser(Request $request) {
$permissions = array();
$name = $request->user;
//Get the user information from the name
$user = User::where(['name' => $name])->first();
$perms = AvailableUserPermission::all();
foreach($perms as $p) {
$permissions[$p->permission] = $p->permission;
}
$roles = AvailableUserRole::all();
$role = $user->getRole();
//Pass the user information to the page for hidden text entries
return view('admin.user.modify')->with('user', $user)
->with('permissions', $permissions)
->with('role', $role)
->with('roles', $roles);
}
public function modifyRole(Request $request) {
$this->validate($request, [
'user' => 'required',
'role' => 'required|role!=None',
]);
UserRole::where(['character_id' => $user])->update([
'role' => $request->role,
]);
return redirect('/admin/dashboard/users')->with('success', "User: " . $user . " has been modified to a new role: " . $request->role . ".");
}
public function addPermission(Request $request) {
//Get the user and permission from the form
$character = $request->user;
$permission = $request->permission;
//Check to see if the character already has the permission
$check = UserPermission::where(['character_id' => $character, 'permission' => $permission])->get(['permission']);
if(!isset($check[0]->permission)) {
$perm = new UserPermission;
$perm->character_id = $character;
$perm->permission = $permission;
$perm->save();
return redirect('/admin/dashboard/users')->with('success', 'User udpated!');
} else {
return redirect('/admin/dashboard/users')->with('error', 'User not updated or already has the permission.');
}
}
public function removeUser(Request $request) {
//Get the user from the form to delete
$user = $request->user;
//Get the user data from the table
$data = User::where(['name' => $user])->get();
//Delete the user's ESI Scopes
DB::table('EsiScopes')->where(['character_id' => $data[0]->character_id])->delete();
//Delete the user's ESI Token
DB::table('EsiTokens')->where(['character_id' => $data[0]->character_id])->delete();
//Delete the user's role from the roles table
DB::table('user_roles')->where(['character_id' => $data[0]->character_id])->delete();
//Delete the user from the user table
DB::table('users')->where(['character_id' => $data[0]->character_id])->delete();
return redirect('/admin/dashboard/users')->with('success', 'User deleted from the site.');
}
public function addAllowedLogin(Request $request) {
//Set the parameters to validate the form
$this->validate($request, [
'allowedEntityId' => 'required',
'allowedEntityType' => 'required',
'allowedEntityName' => 'required',
'allowedLoginType' => 'required',
]);
//Check to see if the entity exists in the database already
$found = AllowedLogin::where([
'entity_type' => $request->allowedentityType,
'entity_name' => $request->allowedEntityName,
])->count();
if($found != 0) {
AllowedLogin::where([
'entity_type' => $request->allowedEntityType,
'entity_name' => $request->allowedEntityName,
])->update([
'entity_id' => $request->allowedEntityId,
'entity_type' => $request->allowedEntityType,
'entity_name' => $request->allowedEntityName,
'login_type' => $request->allowedLoginType,
]);
} else {
$login = new AllowedLogin;
$login->entity_id = $request->allowedEntityId;
$login->entity_name = $request->allowedEntityName;
$login->entity_type = $request->allowedEntityType;
$login->login_type = $request->allowedLoginType;
$login->save();
}
return redirect('/admin/dashboard')->with('success', 'Entity added to allowed login list.');
}
public function removeAllowedLogin(Request $request) {
//Set the parameters to validate the form
$this->validate($request, [
'removeAllowedLogin' => 'required',
]);
AllowedLogin::where([
'entity_name' => $request->removeAllowedLogin,
])->delete();
return redirect('/admin/dashboard')->with('success', 'Entity removed from allowed login list.');
}
}

View File

@@ -15,7 +15,13 @@ use App\Library\Helpers\LookupHelper;
use App\Library\Helpers\SRPHelper;
//Models
use App\Models\User\User;
use App\Models\User\UserRole;
use App\Models\User\UserPermission;
use App\Models\User\AvailableUserPermission;
use App\Models\User\AvailableUserRole;
use App\Models\Admin\AllowedLogin;
use App\Models\Finances\AllianceWalletJournal;
class AdminDashboardController extends Controller
{
@@ -27,7 +33,7 @@ class AdminDashboardController extends Controller
public function __construct()
{
$this->middleware('auth');
$this->middleware('role:User');
$this->middleware('role:Admin');
}
/**
@@ -43,4 +49,361 @@ class AdminDashboardController extends Controller
return view('admin.dashboards.dashboard');
}
/**
* Display users in a paginated format
*/
public function displayUsersPaginated() {
//Declare array variables
$user = array();
$permission = array();
$userArr = array();
$permString = null;
$usersArr = User::orderBy('name', 'asc')->paginate(50);
foreach($usersArr as $user) {
$user->role = $user->getRole();
$permCount = UserPermission::where([
'character_id' => $user->character_id,
])->count();
if($permCount > 0) {
$perms = UserPermission::where([
'character_id' => $user->character_id,
])->get('permission')->toArray();
foreach($perms as $perm) {
$permString .= $perm['permission'] . ', ';
}
$user->permission = $permString;
} else {
$user->permission = 'No Permissions';
}
}
return view('admin.dashboards.userspaged')->with('usersArr', $usersArr);
}
/**
* Search users for a specific user
*/
public function searchUsers(Request $request) {
//Declare array variables
$user = array();
$permission = array();
$userArr = array();
$permString = null;
//Validate the input from the form
$this->validate($request, [
'parameter' => 'required',
]);
$usersArr = User::where('name', 'like', $request->parameter . "%")->paginate(50);
foreach($usersArr as $user) {
$user->role = $user->getRole();
$permCount = UserPermission::where([
'character_id' => $user->character_id,
])->count();
if($permCount > 0) {
$perms = UserPermission::where([
'character_id' => $user->character_id,
])->get('permission')->toArray();
foreach($perms as $perm) {
$permString .= $perm['permission'] . ', ';
}
$user->permission = $permString;
} else {
$user->permission = 'No Permissions';
}
}
return view('admin.dashboards.users.searched')->with('usersArr', $usersArr);
}
/**
* Display the allowed logins
*/
public function displayAllowedLogins() {
//Declare array variables
$entities = array();
/** Entities for allowed logins */
$legacys = AllowedLogin::where(['login_type' => 'Legacy'])->pluck('entity_name')->toArray();
$renters = AllowedLogin::where(['login_type' => 'Renter'])->pluck('entity_name')->toArray();
//Compile a list of entities by their entity_id
foreach($legacys as $legacy) {
$entities[] = $legacy;
}
foreach($renters as $renter) {
$entities[] = $renter;
}
return view('admin.dashboards.allowed_logins')->with('entities', $entities);
}
/**
* Display the taxes for the alliance
*
*/
public function displayTaxes() {
//Declare variables needed for displaying items on the page
$months = 3;
$pi = array();
$industry = array();
$reprocessing = array();
$office = array();
$corpId = 98287666;
$srpActual = array();
$srpLoss = array();
$miningTaxes = array();
$miningTaxesLate = array();
/** Taxes Pane */
//Declare classes needed for displaying items on the page
$tHelper = new TaxesHelper();
$srpHelper = new SRPHelper();
//Get the dates for the tab panes
$dates = $tHelper->GetTimeFrameInMonths($months);
//Get the data for the Taxes Pane
foreach($dates as $date) {
//Get the srp actual pay out for the date range
$srpActual[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($srpHelper->GetAllianceSRPActual($date['start'], $date['end']), 2, ".", ","),
];
//Get the srp loss value for the date range
$srpLoss[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($srpHelper->GetAllianceSRPLoss($date['start'], $date['end']), 2, ".", ","),
];
//Get the pi taxes for the date range
$pis[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetPIGross($date['start'], $date['end']), 2, ".", ","),
];
//Get the industry taxes for the date range
$industrys[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetIndustryGross($date['start'], $date['end']), 2, ".", ","),
];
//Get the reprocessing taxes for the date range
$reprocessings[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetReprocessingGross($date['start'], $date['end']), 2, ".", ","),
];
//Get the office taxes for the date range
$offices[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetOfficeGross($date['start'], $date['end']), 2, ".", ","),
];
//Get the market taxes for the date range
$markets[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetAllianceMarketGross($date['start'], $date['end']), 2, ".", ","),
];
//Get the jump gate taxes for the date range
$jumpgates[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetJumpGateGross($date['start'], $date['end']), 2, ".", ","),
];
$miningTaxes[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetMoonMiningTaxesGross($date['start'], $date['end']), 2, ".", ","),
];
$miningTaxesLate[] = [
'date' => $date['start']->toFormattedDateString(),
'gross' => number_format($tHelper->GetMoonMiningTaxesLateGross($date['start'], $date['end']), 2, ".", ","),
];
}
return view('admin.dashboards.taxes')->with('pis', $pis)
->with('industrys', $industrys)
->with('offices', $offices)
->with('markets', $markets)
->with('jumpgates', $jumpgates)
->with('reprocessings', $reprocessings)
->with('srpActual', $srpActual)
->with('srpLoss', $srpLoss)
->with('miningTaxes', $miningTaxes)
->with('miningTaxesLate', $miningTaxesLate);
}
/**
* Display the modify user form
*/
public function displayModifyUser(Request $request) {
$permissions = array();
$roles = array();
$name = $request->user;
//Get the user information from the name
$user = User::where(['name' => $name])->first();
$perms = AvailableUserPermission::all();
foreach($perms as $p) {
$permissions[$p->permission] = $p->permission;
}
$tempRoles = AvailableUserRole::all();
foreach($tempRoles as $tempRole) {
array_push($roles, [
$tempRole['role'] => $tempRole['role']
]);
}
$role = $user->getRole();
//Pass the user information to the page for hidden text entries
return view('admin.user.modify')->with('user', $user)
->with('permissions', $permissions)
->with('role', $role)
->with('roles', $roles);
}
/**
* Modify a user's role
*/
public function modifyRole(Request $request) {
$this->validate($request, [
'user' => 'required',
'role' => 'required',
]);
UserRole::where(['character_id' => $request->user])->update([
'role' => $request->role,
]);
return redirect('/admin/dashboard/users')->with('success', "User: " . $request->user . " has been modified to a new role: " . $request->role . ".");
}
public function addPermission(Request $request) {
//Get the user and permission from the form
$character = $request->user;
$permission = $request->permission;
//Check to see if the character already has the permission
$check = UserPermission::where(['character_id' => $character, 'permission' => $permission])->get(['permission']);
if(!isset($check[0]->permission)) {
$perm = new UserPermission;
$perm->character_id = $character;
$perm->permission = $permission;
$perm->save();
return redirect('/admin/dashboard/users')->with('success', 'User udpated!');
} else {
return redirect('/admin/dashboard/users')->with('error', 'User not updated or already has the permission.');
}
}
/**
* Delete a user to reset their permissions
*/
public function removeUser(Request $request) {
//Get the user from the form to delete
$user = $request->user;
//Get the user data from the table
$data = User::where(['name' => $user])->get();
//Delete the user's ESI Scopes
DB::table('EsiScopes')->where(['character_id' => $data[0]->character_id])->delete();
//Delete the user's ESI Token
DB::table('EsiTokens')->where(['character_id' => $data[0]->character_id])->delete();
//Delete the user's role from the roles table
DB::table('user_roles')->where(['character_id' => $data[0]->character_id])->delete();
//Delete the user from the user table
DB::table('users')->where(['character_id' => $data[0]->character_id])->delete();
return redirect('/admin/dashboard/users')->with('success', 'User deleted from the site.');
}
/**
* Add an entity to the allowed login table
*/
public function addAllowedLogin(Request $request) {
//Set the parameters to validate the form
$this->validate($request, [
'allowedEntityId' => 'required',
'allowedEntityType' => 'required',
'allowedEntityName' => 'required',
'allowedLoginType' => 'required',
]);
//Check to see if the entity exists in the database already
$found = AllowedLogin::where([
'entity_type' => $request->allowedentityType,
'entity_name' => $request->allowedEntityName,
])->count();
if($found != 0) {
AllowedLogin::where([
'entity_type' => $request->allowedEntityType,
'entity_name' => $request->allowedEntityName,
])->update([
'entity_id' => $request->allowedEntityId,
'entity_type' => $request->allowedEntityType,
'entity_name' => $request->allowedEntityName,
'login_type' => $request->allowedLoginType,
]);
} else {
$login = new AllowedLogin;
$login->entity_id = $request->allowedEntityId;
$login->entity_name = $request->allowedEntityName;
$login->entity_type = $request->allowedEntityType;
$login->login_type = $request->allowedLoginType;
$login->save();
}
return redirect('/admin/dashboard')->with('success', 'Entity added to allowed login list.');
}
/**
* Remove an entity from the allowed login table
*/
public function removeAllowedLogin(Request $request) {
//Set the parameters to validate the form
$this->validate($request, [
'removeAllowedLogin' => 'required',
]);
AllowedLogin::where([
'entity_name' => $request->removeAllowedLogin,
])->delete();
return redirect('/admin/dashboard')->with('success', 'Entity removed from allowed login list.');
}
/**
* Show journal entries in a table for admins from alliance wallets
*/
public function displayJournalEntries() {
$date = Carbon::now()->subDays(60);
$journal = AllianceWalletJournal::where('date', '>=', $date)
->where([
'corporation_id' => 98287666,
'ref_type' => 'player_donation',
])->orderByDesc('date',)->get(['amount', 'reason', 'description', 'date']);
return view('admin.dashboards.walletjournal')->with('journal', $journal);
}
}

View File

@@ -83,6 +83,6 @@ class FuelController extends Controller
]);
return view('logistics.fuel')->with('jumpGates', $jumpGates)
->with('lava', $lava);
->with('lava', $lava);
}
}

View File

@@ -33,6 +33,27 @@ class MiningTaxesAdminController extends Controller
$this->middleware('role:Admin');
}
/**
* Display the page to setup the form for corporations to rent a moon
*/
public function DisplayMoonRentalForm() {
}
/**
* Store the details for the form for corporations renting a specific moon
*/
public function StoreMoonRentalForm() {
}
/**
* Remove a moon from being rented from a specific corporation
*/
public function DeleteMoonRental(Request $request) {
}
/**
* Display current unpaid invoices
*/
@@ -43,11 +64,51 @@ class MiningTaxesAdminController extends Controller
'status' => 'Late',
])->orWhere([
'status' => 'Deferred',
])->paginate(50);
])->orderByDesc('invoice_id')->paginate(50);
$totalAmount = Invoice::where([
'status' => 'Pending',
])->orWhere([
'status' => 'Late',
])->orWhere([
'status' => 'Deferred',
])->sum('invoice_amount');
return view('miningtax.admin.display.unpaid')->with('invoices', $invoices);
}
/**
* Search unpaid invoices
*/
public function SearchUnpaidInvoice(Request $request) {
$invoices = Invoice::where('invoice_id', 'LIKE', '%' . $request->q . '%')
->where(['status' => 'Pending'])
->orWhere(['status' => 'Late'])
->orWhere(['status' => 'Deferred'])
->orderByDesc('invoice_id')
->paginate(25);
if(count($invoices) > 0) {
return view('miningtax.admin.display.unpaid')->with('invoices', $invoices);
}
return view('miningtax.admin.display.unpaid')->with('error', 'No invoices found');
}
/**
* Display page to modify an unpaid invoice
*/
public function DisplayModifyInvoice() {
}
/**
* Modify an unpaid invoice
*/
public function ProcessModifyInvoice() {
}
/**
* Mark an invoice paid
*/
@@ -76,6 +137,13 @@ class MiningTaxesAdminController extends Controller
'status' => 'Paid Late',
])->paginate(50);
return view('miningtax.admin.display.paidinvoices')->with('invoices', $invoices);
$totalAmount = Invoice::where([
'status' => 'Paid',
])->orWhere([
'status' => 'Paid Late',
])->sum('invoice_amount');
return view('miningtax.admin.display.paidinvoices')->with('invoices', $invoices)
->with('totalAmount', $totalAmount);
}
}

View File

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\MiningTaxes;
//Internal Library
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use DB;
use Log;
use Carbon\Carbon;
use Khill\Lavacharts\Lavacharts;
@@ -39,6 +40,38 @@ class MiningTaxesController extends Controller
$this->middleware('role:User');
}
/**
* Display an invoice based on it's id
*
* @var $invoiceId
*/
public function DisplayInvoice($invoiceId) {
$ores = array();
$totalPrice = 0.00;
$invoice = Invoice::where([
'invoice_id' => $invoiceId,
])->first();
$items = Ledger::where([
'character_id' => auth()->user()->getId(),
'invoice_id' => $invoice,
])->get();
foreach($items as $item) {
if(!isset($ores[$item['ore_name']])) {
$ores[$item['ore_name']] = 0;
}
$ores[$item['ore_name']] = $ores[$item['ore_name']] + $item['quantity'];
$totalPrice += $item['amount'];
}
return view('miningtax.user.display.details.invoice')->with('ores', $ores)
->with('invoice', $invoice)
->with('totalPrice', $totalPrice);
}
/**
* Display the users invoices
*/
@@ -73,12 +106,12 @@ class MiningTaxesController extends Controller
//Total up the unpaid invoices
foreach($unpaid as $un) {
$unpaidAmount += $un->amount;
$unpaidAmount += $un->invoice_amount;
}
//Total up the paid invoices
foreach($paid as $p) {
$paidAmount += $p;
$paidAmount += $p->invoice_amount;
}
return view('miningtax.user.display.invoices')->with('unpaid', $unpaid)
@@ -212,7 +245,6 @@ class MiningTaxesController extends Controller
$esiHelper = new Esi;
$lookup = new LookupHelper;
$config = config('esi');
$sHelper = new StructureHelper($config['primary'], $config['corporation']);
//Check for the esi scope
if(!$esiHelper->HaveEsiScope($config['primary'], 'esi-industry.read_corporation_mining.v1')) {
@@ -228,46 +260,46 @@ class MiningTaxesController extends Controller
//Setup the esi container
$esi = $esiHelper->SetupEsiAuthentication($refreshToken);
//Declare the structure helper after the esi container has been created
$sHelper = new StructureHelper($config['primary'], $config['corporation'], $esi);
//Get the character data from the lookup table if possible or esi
$character = $lookup->GetCharacterInfo($config['primary']);
//Get the corporation information from the character id
$corpInfo = $lookup->GetCorporationInfo($character->corporation_id);
//Get the observers from the database
$observers = Observer::all();
$corpInfo = $lookup->GetCorporationInfo(auth()->user()->getId());
//Get the ledgers for each structure one at a time
foreach($observers as $obs) {
//Get the structure information
$structureInfo = $sHelper->GetStructureInfo($obs->observer_id);
//Add the name to the structures array
array_push($structures, $structureInfo->name);
/**
* Get the ledger from each observer.
* We don't care about observer type as it can only be an Athanor or Tatara
*/
$ledgers = Ledger::where([
'observer_id' => $obs->structure_id,
'observer_id' => $obs->observer_id,
'character_id' => auth()->user()->getId(),
])->where('last_updated', '>=', Carbon::now()->subDays(30))->get();
if($ledgers != null) {
if($ledgers->count() > 0) {
foreach($ledgers as $ledger) {
//Get the structure name from the database
$structure = $sHelper->GetStructureInfo($obs->observer_id);
//Foreach ledger add it to the array
array_push($miningLedgers, [
'structure' => $structure->name,
'structure' => $structureInfo->name,
'character' => auth()->user()->getName(),
'corpTicker' => $corpInfo->ticker,
'ore' => $ore,
'ore' => $ledger->ore_name,
'quantity' => $ledger->quantity,
'updated' => $ledger->last_updated,
]);
array_push($structures, [
'name' => $structure->name,
]);
}
} else {
redirect('/dashboard')->with('error', 'No available data for the mining ledger to be displayed.');
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Http\Controllers\MoonRental;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Carbon\Carbon;
use Log;
class MoonRentalAdminController extends Controller
{
//Constructor
public function __construct() {
$this->middleware('role:Admin');
$this->middleware('permission:moon.rental.manager');
}
/**
* Display rental requests
*/
public function displayRentalRequests() {
}
/**
* Create monthly moon rental
*/
public function storeRentalRequest() {
}
/**
* Delete / remove monthly moon rental
*/
public function updateRentalRequest() {
}
/**
* Display current monthly moon rentals
*/
public function displayCurrentRentals() {
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace App\Http\Controllers\MoonRental;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Carbon\Carbon;
use Log;
class MoonRentalController extends Controller
{
//Constructor
public function __construct() {
$this->middleware('role:user');
}
/**
* Display all of the available moons for rental
*/
public function displayMoons() {
$moons = AllianceMoon::where([
'rented' => 'No',
])->get();
return view('moon.rental.available.display')->with('moons', $moons);
}
/**
* Display moon rental request form
*/
public function displayMoonRentalRequestForm() {
}
/**
* Store moon rental from the request form
*/
public function storeMoonRentalRequest() {
}
/**
* Request a mail job be added to the mail queue to resend mining bill instantly
*/
public function requestMoonRentalBill() {
}
}

View File

@@ -2,10 +2,24 @@
namespace App\Http\Controllers\Test;
//Internal Library
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Log;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
//Application Library
use App\Library\Helpers\LookupHelper;
use App\Library\Esi\Esi;
//Models
use App\Models\MiningTax\Invoice;
use App\Models\MiningTax\Ledger;
use App\Models\MiningTax\Observer;
use App\Models\User\UserAlt;
use App\Models\User\User;
class TestController extends Controller
{
@@ -19,7 +33,149 @@ class TestController extends Controller
return view('test.char.display')->with('char', $char);
}
public function CharacterLookupTest(Request $request) {
public function DebugMiningTaxesInvoices() {
$lookup = new LookupHelper;
$ledgers = new Collection;
$perms = new Collection;
var_dump(auth()->user()->getAlts());
dd(auth()->user()->altCount());
//Get all of the users in the database
$users = User::all();
//Get a list of the alts for each character, then process the ledgers and combine them to send one mail out
//in this first part
foreach($users as $char) {
$altCount = $char->altCount();
if($altCount > 0) {
$alts = $char->getAlts();
foreach($alts as $alt) {
$perms->push([
'main_id' => $char->character_id,
'alt_id' => $alt->character_id,
'count' => $altCount,
]);
}
} else {
$perms->push([
'main_id' => $char->character_id,
'alt_id' => null,
'count' => 0,
]);
}
}
return view('test.miningtax.invoice')->with('perms', $perms);
}
public function DebugMiningObservers() {
//Declare variables
$mailDelay = 15;
$config = config('esi');
$mains = new Collection;
/**
* This section will determine if users are mains or alts of a main.
* If they are mains, we keep the key. If they are alts of a main, then we delete
* the key from the collection.
*/
//Pluck all the users from the database of ledgers to determine if they are mains or alts.
$tempMains = Ledger::where([
'invoiced' => 'Yes',
])->where('last_updated', '>', Carbon::now()->subMonths(3))->pluck('character_id');
//Get the unique character ids from the ledgers in the previous statement
$tempMains = $tempMains->unique()->values()->all();
for($i = 0; $i < sizeof($tempMains); $i++) {
if(UserAlt::where(['character_id' => $tempMains[$i]])->count() == 0) {
$mains->push($tempMains[$i]);
}
}
/**
* For each of the users, let's determine if there are any ledgers,
* then determine if there are any alts and ledgers associated with the alts.
*/
foreach($mains as $main) {
//Declare some variables for each run through the for loop
$mainLedgerCount = 0;
$ledgers = new Collection;
//Count the ledgers for the main
$mainLedgerCount = Ledger::where([
'character_id' => $main,
'invoiced' => 'Yes',
])->where('last_updated', '>', Carbon::now()->subMonths(3))->count();
//If there are ledgers for the main, then let's grab them
if($mainLedgerCount > 0) {
$mainLedgers = Ledger::where([
'character_id' => $main,
'invoiced' => 'Yes',
])->where('last_updated', '>', Carbon::now()->subMonths(3))->get();
//Cycle through the entries, and add them to the ledger to send with the invoice
foreach($mainLedgers as $row) {
$ledgers->push([
'character_id' => $row->character_id,
'character_name' => $row->character_name,
'observer_id' => $row->observer_id,
'type_id' => $row->type_id,
'ore_name' => $row->ore_name,
'quantity' => $row->quantity,
'amount' => (float)$row->amount,
'last_updated' => $row->last_updated,
]);
}
}
//Get the alt count for the main character
$altCount = UserAlt::where(['main_id' => $main])->count();
//If more than 0 alts, grab all the alts.
if($altCount > 0) {
$alts = UserAlt::where([
'main_id' => $main,
])->get();
//Cycle through the alts, and get the ledgers, and push onto the stack
foreach($alts as $alt) {
$altLedgerCount = Ledger::where([
'character_id' => $alt->character_id,
'invoiced' => 'Yes',
])->where('last_updated', '>', Carbon::now()->subMonths(3))->count();
if($altLedgerCount > 0) {
$altLedgers = Ledger::where([
'character_id' => $alt->character_id,
'invoiced' => 'Yes',
])->where('last_updated', '>', Carbon::now()->subMonths(3))->get();
foreach($altLedgers as $row) {
$ledgers->push([
'character_id' => $row->character_id,
'character_name' => $row->character_name,
'observer_id' => $row->observer_id,
'type_id' => $row->type_id,
'ore_name' => $row->ore_name,
'quantity' => $row->quantity,
'amount' => (float)$row->amount,
'last_updated' => $row->last_updated,
]);
}
}
}
}
if($ledgers->count() > 0) {
var_dump($ledgers);
var_dump(round(((float)$ledgers->sum('amount') * (float)$config['mining_tax']), 2));
}
}
}
}

View File

@@ -15,7 +15,7 @@ class Authenticate extends Middleware
protected function redirectTo($request)
{
if(!$this->auth->check()){
return route('/');
return '/';
}
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
abstract class Request extends FormRequest
{
//
}

View File

@@ -0,0 +1,168 @@
<?php
namespace App\Jobs\Commands\Assets;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
//Application Library
use App\Library\Esi\Esi;
use App\Library\Helpers\LookupHelper;
use Seat\Eseye\Exceptions\RequestFailedException;
//Models
use App\Models\Structure\Asset;
class FetchAllianceAssets implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//Set the connection for the job
$this->connection = 'redis';
$this->onQueue('assets');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$config = config('esi');
$corpId = 98287666;
$esiHelper = new Esi;
//Get the refresh token from the database
$token = $esiHelper->GetRefreshToken($config['primary']);
//Create the esi authentication container
$esi = $esiHelper->SetupEsiAuthentication($token);
//Check the esi scope
if(!$esiHelper->HaveEsiScope($config['primary'], 'esi-assets.read_corporation_assets.v1')) {
Log::critical("Scope check failed in FetchAllianceAssets for esi-assets.read_corporation_assets.v1");
}
//Set the current page
$currentPage = 1;
//Set our default pages
$totalPages = 1;
do {
//Attempt to get the assets
$assets = $esi->page($currentPage)
->invoke('get', '/corporations/{corporation_id}/assets/', [
'corporation_id' => $corpId,
]);
//If on the first page, then update the total number of pages
if($currentPage == 1) {
$totalPages = $assets->pages;
}
//For each asset retrieved, let's process it.
foreach($assets as $a) {
ProcessAllianceAssets::dispatch($a);
}
//Increment the current page
$currentPage++;
} while($currentPage <= $totalPages);
}
/**
* The job failed to process
* @param Exception $exception
* @return void
*/
public function failed($exception) {
if(!exception instanceof RequestFailedException) {
//If not a failure due to ESI, then log it. Otherwise,
//deduce why the exception occurred.
Log::critical($exception);
}
if ((is_object($exception->getEsiResponse()) && (stristr($exception->getEsiResponse()->error, 'Too many errors') || stristr($exception->getEsiResponse()->error, 'This software has exceeded the error limit for ESI'))) ||
(is_string($exception->getEsiResponse()) && (stristr($exception->getEsiResponse(), 'Too many errors') || stristr($exception->getEsiResponse(), 'This software has exceeded the error limit for ESI')))) {
//We have hit the error rate limiter, wait 120 seconds before releasing the job back into the queue.
Log::info('FetchMiningTaxesObservers has hit the error rate limiter. Releasing the job back into the wild in 2 minutes.');
$this->release(120);
} else {
$errorCode = $exception->getEsiResponse()->getErrorCode();
switch($errorCode) {
case 400: //Bad Request
Log::critical("Bad request has occurred in FetchMiningTaxesObservers. Job has been discarded");
break;
case 401: //Unauthorized Request
Log::critical("Unauthorized request has occurred in FetchMiningTaxesObservers at " . Carbon::now()->toDateTimeString() . ".\r\nCancelling the job.");
break;
case 403: //Forbidden
Log::critical("FetchMiningTaxesObservers has incurred a forbidden error. Cancelling the job.");
break;
case 420: //Error Limited
Log::warning("Error rate limit occurred in FetchMiningTaxesObservers. Restarting job in 120 seconds.");
$this->release(120);
break;
case 500: //Internal Server Error
Log::critical("Internal Server Error for ESI in FetchMiningTaxesObservers. Attempting a restart in 120 seconds.");
$this->release(120);
break;
case 503: //Service Unavailable
Log::critical("Service Unavailabe for ESI in FetchMiningTaxesObservers. Releasing the job back to the queue in 30 seconds.");
$this->release(30);
break;
case 504: //Gateway Timeout
Log::critical("Gateway timeout in FetchMiningTaxesObservers. Releasing the job back to the queue in 30 seconds.");
$this->release(30);
break;
case 201: //Good response code
$this->delete();
break;
//If no code is given, then log and break out of switch.
default:
Log::warning("No response code received from esi call in FetchMiningTaxesObservers.\r\n");
$this->delete();
break;
}
}
}
/**
* Tags for jobs
*
* @var array
*/
public function tags() {
return ['FetchAllianceAssets', 'AllianceStructures', 'Assets'];
}
}

View File

@@ -0,0 +1,109 @@
<?php
namespace App\Jobs\Commands\Assets;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
//Models
use App\Models\Structure\Asset;
class ProcessAllianceAssets implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
//Private variable
private $asset;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($a)
{
//Set the connection for the job
$this->connection = 'redis';
$this->onQueue('assets');
$this->asset = $a;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
/**
* If the asset is not in the database, then let's save it to the database,
* otherwise, we just update the old asset
*/
$count = Asset::where([
'item_id' => $this->asset->item_id,
])->count();
if($count == 0) {
$as = new Asset;
if(isset($this->asset->is_blueprint_copy)) {
$as->is_blueprint_copy = $this->asset->is_blueprint_copy;
}
$as->is_singleton = $this->asset->is_singleton;
$as->item_id = $this->asset->item_id;
$as->location_flag = $this->asset->location_flag;
$as->location_id = $this->asset->location_id;
$as->location_type = $this->asset->location_type;
$as->quantity = $this->asset->quantity;
$as->type_id = $this->asset->type_id;
$as->save();
} else {
//Update the previously found asset
Asset::where([
'item_id' => $this->asset->item_id,
])->update([
'is_singleton' => $this->asset->is_singleton,
'location_flag' => $this->asset->location_flag,
'location_id' => $this->asset->location_id,
'location_type' => $this->asset->location_type,
'quantity' => $this->asset->quantity,
'type_id' => $this->asset->type_id,
]);
if(isset($this->asset->is_blueprint_copy)) {
Asset::where([
'item_id' => $this->asset->item_id,
])->update([
'is_blueprint_copy' => $this->asset->is_blueprint_copy,
]);
}
}
}
/**
* Tags for jobs
*
* @var array
*/
public function tags() {
return ['FetchAllianceAssets', 'AllianceStructures', 'Assets'];
}
}

View File

@@ -0,0 +1,59 @@
<?php
namespace App\Jobs\Commands\Assets;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
//Jobs
use App\Jobs\Commands\Assets\FetchAllianceAssets;
//Models
use App\Models\Structure\Asset;
class PurgeAllianceAssets implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//Set the connection for the job
$this->connection = 'redis';
$this->onQueue('assets');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Asset::truncate();
FetchAllianceAssets::dispatch();
}
}

View File

@@ -0,0 +1,203 @@
<?php
namespace App\Jobs\Commands\Data;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
use Carbon\Carbon;
//Libraries
use Seat\Eseye\Exceptions\RequestFailedException;
use App\Library\Esi\Esi;
//Models
use App\Models\User\User;
use App\Models\User\UserAlt;
use App\Models\Esi\EsiScope;
use App\Models\Esi\EsiToken;
use App\Models\User\UserPermission;
use App\Models\User\UserRole;
use App\Models\Admin\AllowedLogin;
class PurgeUsers implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Retries
*
* @var int
*/
public $retries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
$this->onQueue('default');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare some variables
$esiHelper = new Esi;
//Setup the esi variable
$esi = $esiHelper->SetupEsiAuthentication();
//Get all of the users from the database
$users = User::all();
//Get the allowed logins
$legacy = AllowedLogin::where(['login_type' => 'Legacy'])->pluck('entity_id')->toArray();
$renter = AllowedLogin::where(['login_type' => 'Renter'])->pluck('entity_id')->toArray();
//Cycle through all of the users, and either update their role, or delete them.
foreach($users as $user) {
//Set the fail bit to false for the next user to check
$failed = false;
//Note a screen entry for when doing cli stuff
printf("Processing character with id of " . $user->character_id . "\r\n");
//Get the character information
try {
$character_info = $esi->invoke('get', '/characters/{character_id}/', [
'character_id' => $user->character_id,
]);
$corp_info = $esi->invoke('get', '/corporations/{corporation_id}/', [
'corporation_id' => $character_info->corporation_id,
]);
} catch(RequestFailedException $e) {
Log::warning('Failed to get character information in purge user command for user ' . $user->character_id);
$failed = true;
}
//If the fail bit is still false, then continue
if($failed === false) {
//Get the user's role
$role = UserRole::where(['character_id' => $user->character_id])->first();
//We don't want to modify Admin and SuperUsers. Admins and SuperUsers are removed via a different process.
if($role->role != 'Admin') {
//Check if the user is allowed to login
if(isset($corp_info->alliance_id)) {
//Warped Intentions is allowed to login
if($corp_info->alliance_id == '99004116') {
//If the alliance is Warped Intentions, then modify the role if we need to
if($role->role != 'User') {
//Upate the role of the user
UserRole::where([
'character_id' => $user->character_id,
])->update([
'role' => 'User',
]);
//Update the user type
User::where([
'character_id' => $user->character_id,
])->update([
'user_type' => 'W4RP',
]);
}
} else if(in_array($corp_info->alliance_id, $legacy)) { //Legacy Users
if($role->role != 'User') {
//Update the role of the user
UserRole::where([
'character_id' => $user->character_id,
])->update([
'role' => 'User',
]);
//Update the user type
User::where([
'character_id' => $user->character_id,
])->update([
'user_type' => 'Legacy',
]);
}
} else if(in_array($corp_info->alliance_id, $renter)) { //Renter Users
if($role->role != 'Renter') {
//Update the role of the user
UserRole::where([
'character_id' => $user->character_id,
])->update([
'role' => 'Renter',
]);
//Update the user type
User::where([
'character_id' => $user->character_id,
])->update([
'user_type' => 'Renter',
]);
}
} else {
//If the user is part of no valid login group, then delete the user.
//Delete all of the permissions first
UserPermission::where([
'character_id' => $user->character_id,
])->delete();
//Delete the user's role
UserRole::where([
'character_id' => $user->character_id,
])->delete();
//Delete any alts the user might have registered.
$altCount = UserAlt::where(['main_id' => $user->character_id])->count();
if($altCount > 0) {
UserAlt::where([
'main_id' => $user->character_id,
])->delete();
}
//Delete the user from the user table
User::where([
'character_id' => $user->character_id,
])->delete();
EsiScope::where([
'character_id' => $user->character_id,
])->delete();
EsiToken::where([
'character_id' => $user->character_id,
])->delete();
}
}
}
}
}
}
/**
* Set the tags for Horzion
*
* @var array
*/
public function tags() {
return ['Data', 'PurgeUsers'];
}
}

View File

@@ -12,10 +12,24 @@ use Log;
//Library
use App\Library\Moons\MoonCalc;
class ItemPricesUpdateJob implements ShouldQueue
class ItemPricesUpdate implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
@@ -23,7 +37,8 @@ class ItemPricesUpdateJob implements ShouldQueue
*/
public function __construct()
{
//
$this->connection = 'redis';
$this->onQueue('default');
}
/**
@@ -37,4 +52,13 @@ class ItemPricesUpdateJob implements ShouldQueue
$moonHelper->FetchNewPrices();
}
/**
* Set the tags for Horzion
*
* @var array
*/
public function tags() {
return ['Eve', 'ItemPricesUpdate'];
}
}

View File

@@ -1,157 +0,0 @@
<?php
namespace App\Jobs\Commands\Eve;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Spatie\RateLimitedMiddleware\RateLimited;
use Log;
use Carbon\Carbon;
//Library
use App\Library\Esi\Esi;
use Seat\Eseye\Exceptions\RequestFailedException;
use Seat\Eseye\Cache\NullCache;
use Seat\Eseye\Configuration;
//Models
use App\Models\Esi\EsiScope;
use App\Models\Esi\EsiToken;
use App\Models\Jobs\JobStatus;
use App\Models\Mail\SentMail;
class ProcessSendEveMailJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
* With new rate limiting, we shouldn't use this timeout
* @var int
*/
//public $timeout = 3600;
/**
* Retries
* With new rate limiting, we shouldn't use this timeout
* @var int
*/
//public $retries = 3;
private $sender;
private $body;
private $recipient;
private $recipient_type;
private $subject;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($body, $recipient, $recipient_type, $subject, $sender) {
$this->body = $body;
$this->recipient = $recipient;
$this->recipient_type = $recipient_type;
$this->subject = $subject;
$this->sender = $sender;
$this->connection = 'redis';
}
/**
* Execute the job.
* Utilized by using ProcessSendEveMailJob::dispatch($mail);
* The model is passed into the dispatch function, then added to the queue
* for processing.
*
* @return void
*/
public function handle()
{
//Declare some variables
$esiHelper = new Esi;
//Get the esi configuration
$config = config('esi');
//Retrieve the token for main character to send mails from
$token = $esiHelper->GetRefreshToken($config['primary']);
//Create the ESI authentication container
$esi = $esiHelper->SetupEsiAuthentication($token);
//Attemp to send the mail
try {
$esi->setBody([
'approved_cost' => 100,
'body' => $this->body,
'recipients' => [[
'recipient_id' => $this->recipient,
'recipient_type' => $this->recipient_type,
]],
'subject' => $this->subject,
])->invoke('post', '/characters/{character_id}/mail/', [
'character_id'=> $this->sender,
]);
} catch(RequestFailedException $e) {
Log::warning($e);
return null;
}
$this->SaveSentRecord($this->sender, $this->subject, $this->body, $this->recipient, $this->recipient_type);
$this->delete();
}
/**
* Middleware to only allow 4 jobs to be run per minute
* After a failed job, the job is released back into the queue for at least 1 minute x the number of times attempted
*
*/
public function middleware() {
//Allow 4 jobs per minute, and implement a rate limited backoff on failed jobs
$rateLimitedMiddleware = (new RateLimited())
->allow(4)
->everySeconds(60)
->releaseAfterOneMinute()
->releaseAfterBackoff($this->attempts());
return [new RateLimited()];
}
/*
* Determine the time at which the job should timeout.
*
*/
public function retryUntil() : \DateTime
{
return Carbon::now()->addDay();
}
/**
* The job failed to process.
*
* @param Exception $exception
* @return void
*/
public function failed($exception)
{
Log::critical($exception);
}
private function SaveSentRecord($sender, $subject, $body, $recipient, $recipientType) {
$sentmail = new SentMail;
$sentmail->sender = $sender;
$sentmail->subject = $subject;
$sentmail->body = $body;
$sentmail->recipient = $recipient;
$sentmail->recipient_type = $recipientType;
$sentmail->save();
}
}

View File

@@ -0,0 +1,216 @@
<?php
namespace App\Jobs\Commands\Eve;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Spatie\RateLimitedMiddleware\RateLimited;
use Log;
use Carbon\Carbon;
//Library
use App\Library\Esi\Esi;
use Seat\Eseye\Exceptions\RequestFailedException;
use Seat\Eseye\Cache\NullCache;
use Seat\Eseye\Configuration;
//Models
use App\Models\Esi\EsiScope;
use App\Models\Esi\EsiToken;
use App\Models\Jobs\JobStatus;
use App\Models\Mail\SentMail;
use Seat\Eseye\Containers\EsiResponse;
class SendEveMail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Retries
* With new rate limiting, we need a retry basis versus timeout basis
* @var int
*/
public $retries = 1;
private $sender;
private $body;
private $recipient;
private $recipient_type;
private $subject;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($body, $recipient, $recipient_type, $subject, $sender) {
//Set the connection
$this->connection = 'redis';
$this->onQueue('mail');
//Set the middleware for the job
$this->middleware = $this->middleware();
//Private variables
$this->body = $body;
$this->recipient = $recipient;
$this->recipient_type = $recipient_type;
$this->subject = $subject;
$this->sender = $sender;
}
/**
* Execute the job.
* Utilized by using SendEveMail::dispatch($mail);
* The model is passed into the dispatch function, then added to the queue
* for processing.
*
* @return void
*/
public function handle()
{
//Declare some variables
$esiHelper = new Esi;
$errorCode = null;
//Get the esi configuration
$config = config('esi');
//Retrieve the token for main character to send mails from
$refreshToken = $esiHelper->GetRefreshToken($config['primary']);
//Create the ESI authentication container
$esi = $esiHelper->SetupEsiAuthentication($refreshToken);
//Check to see if the token is valid or not
if($esiHelper->TokenExpired($refreshToken)) {
$refreshToken = $esiHelper->GetRefreshToken($config['primary']);
$esi = $esiHelper->SetupEsiAuthentication($refreshToken);
}
$esi->setBody([
'approved_cost' => 10000,
'body' => $this->body,
'recipients' => [[
'recipient_id' => $this->recipient,
'recipient_type' => $this->recipient_type,
]],
'subject' => $this->subject,
])->invoke('post', '/characters/{character_id}/mail/', [
'character_id'=> $this->sender,
]);
}
/**
* Middleware to only allow 4 jobs to be run per minute
* After a failed job, the job is released back into the queue for at least 1 minute x the number of times attempted
*
*/
public function middleware() {
//Allow 4 jobs per minute, and implement a rate limited backoff on failed jobs
$rateLimitedMiddleware = (new RateLimited())
->enabled()
->key('psemj')
->connectionName('default')
->allow(4)
->everySeconds(60)
->releaseAfterOneMinute()
->releaseAfterBackoff($this->attempts());
return [$rateLimitedMiddleware];
}
/*
* Determine the time at which the job should timeout.
*
*/
public function retryUntil() : \DateTime
{
return Carbon::now()->addDay();
}
/**
* The job failed to process.
*
* @param Exception $exception
* @return void
*/
public function failed($exception)
{
if(!exception instanceof RequestFailedException) {
//If not a failure due to ESI, then log it. Otherwise,
//deduce why the exception occurred.
Log::critical($exception);
}
if ((is_object($exception->getEsiResponse()) && (stristr($exception->getEsiResponse()->error, 'Too many errors') || stristr($exception->getEsiResponse()->error, 'This software has exceeded the error limit for ESI'))) ||
(is_string($exception->getEsiResponse()) && (stristr($exception->getEsiResponse(), 'Too many errors') || stristr($exception->getEsiResponse(), 'This software has exceeded the error limit for ESI')))) {
//We have hit the error rate limiter, wait 120 seconds before releasing the job back into the queue.
Log::info('SendEveMail has hit the error rate limiter. Releasing the job back into the wild in 2 minutes.');
$this->release(120);
} else {
$errorCode = $exception->getEsiResponse()->getErrorCode();
switch($errorCode) {
case 400: //Bad Request
Log::critical("Bad request has occurred in SendEveMail. Job has been discarded");
break;
case 401: //Unauthorized Request
Log::critical("Unauthorized request has occurred in SendEveMail at " . Carbon::now()->toDateTimeString() . ".\r\nCancelling the job.");
break;
case 403: //Forbidden
Log::critical("SendEveMail has incurred a forbidden error. Cancelling the job.");
break;
case 420: //Error Limited
Log::warning("Error rate limit occurred in SendEveMail. Restarting job in 120 seconds.");
$this->release(120);
break;
case 500: //Internal Server Error
Log::critical("Internal Server Error for ESI in SendEveMail. Attempting a restart in 120 seconds.");
$this->release(120);
break;
case 503: //Service Unavailable
Log::critical("Service Unavailabe for ESI in SendEveMail. Releasing the job back to the queue in 30 seconds.");
$this->release(30);
break;
case 504: //Gateway Timeout
Log::critical("Gateway timeout in SendEveMail. Releasing the job back to the queue in 30 seconds.");
$this->release(30);
break;
case 520: //Internal Error -- Mostly comes when rate limited hit
Log::warning("Rate limit hit for SendEveMail. Releasing the job back to the queue in 30 seconds.");
$this->release(30);
break;
case 201: //Good response code
$this->SaveSentRecord($this->sender, $this->subject, $this->body, $this->recipient, $this->recipient_type);
$this->delete();
break;
//If no code is given, then log and break out of switch.
default:
Log::warning("No response code received from esi call in SendEveMail.\r\n");
$this->delete();
break;
}
}
}
public function tags() {
return ['ProcessEveMails'];
}
private function SaveSentRecord($sender, $subject, $body, $recipient, $recipientType) {
$sentmail = new SentMail;
$sentmail->sender = $sender;
$sentmail->subject = $subject;
$sentmail->body = $body;
$sentmail->recipient = $recipient;
$sentmail->recipient_type = $recipientType;
$sentmail->save();
}
}

View File

@@ -0,0 +1,74 @@
<?php
namespace App\Jobs\Commands\Finances;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
use Carbon\Carbon;
//Application Library
use App\Library\Helpers\FinanceHelper;
//Models
use App\Models\Finances\AllianceWalletJournal;
class UpdateAllianceWalletJournalJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 1800;
/**
* Retries
*
* @var int
*/
public $retries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
$this->onQueue('finances');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$fHelper = new FinanceHelper;
$config = config('esi');
$pages = $fHelper->GetAllianceWalletJournalPages(1, $config['primary']);
for($i = 1; $i <= $pages; $i++) {
UpdateAllianceWalletJournalPage::dispatch(1, $config['primary'], $i)->onQueue('journal');
}
}
/**
* Set the tags for Horzion
*
* @var array
*/
public function tags() {
return ['UpdateAllianceWalletJournal', 'Finances'];
}
}

View File

@@ -0,0 +1,170 @@
<?php
namespace App\Jobs\Commands\Finances;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Carbon\Carbon;
use Log;
//Application Library
use Seat\Eseye\Exceptions\RequestFailedException;
use Seat\Eseye\Cache\NullCache;
use Seat\Eseye\Configuration;
use App\Library\Esi\Esi;
use App\Library\Helpers\LookupHelper;
//Models
use App\Models\Finances\AllianceWalletJournal;
class UpdateAllianceWalletJournalPage implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
private $division;
private $charId;
private $page;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($division, $charId, $page)
{
$this->connection = 'redis';
$this->onQueue('finances');
$this->division = $division;
$this->charId = $charId;
$this->page = $page;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables in the handler
$lookup = new LookupHelper;
$esiHelper = new Esi;
//Setup the esi container.
$token = $esiHelper->GetRefreshToken($this->charId);
$esi = $esiHelper->SetupEsiAuthentication($token);
//Check the scope
if(!$esiHelper->HaveEsiScope($this->charId, 'esi-wallet.read_corporation_wallets.v1')) {
Log::critical('Scope check failed for esi-wallet.read_corporation_wallets.v1 for character id: ' . $charId);
return null;
}
if($esiHelper->TokenExpired($token)) {
$token = $esiHelper->GetRefreshToken($this->charId);
$esi = $esiHelper->SetupEsiAuthentication($token);
}
//Reference the character id to the corporation id
$char = $lookup->GetCharacterInfo($this->charId);
$corpId = $char->corporation_id;
/**
* Attempt to get the data from the esi api. If it fails, we skip the page, and go onto the next page, unless
* the failed page is the first page.
*/
try {
$journals = $esi->page($this->page)
->invoke('get', '/corporations/{corporation_id}/wallets/{division}/journal/', [
'corporation_id' => $corpId,
'division' => $this->division,
]);
} catch(RequestFailedException $e) {
Log::warning('Failed to get wallet journal page ' . $currentPage . ' for character id: ' . $charId);
Log::warning($e);
$this->delete();
}
//Decode the json data, and return it as an array
$wallet = json_decode($journals->raw, true);
//Foreach journal entry, add the journal entry to the table
foreach($wallet as $entry) {
//See if we find the entry id in the database already
$found = AllianceWalletJournal::where([
'id' => $entry['id'],
])->count();
if($found == 0) {
$awj = new AllianceWalletJournal;
$awj->id = $entry['id'];
$awj->corporation_id = $corpId;
$awj->division = $this->division;
if(isset($entry['amount'])) {
$awj->amount = $entry['amount'];
}
if(isset($entry['balance'])) {
$awj->balance = $entry['balance'];
}
if(isset($entry['context_id'])) {
$awj->context_id = $entry['context_id'];
}
if(isset($entry['date'])) {
$awj->date = $esiHelper->DecodeDate($entry['date']);
}
if(isset($entry['description'])) {
$awj->description = $entry['description'];
}
if(isset($entry['first_party_id'])) {
$awj->first_party_id = $entry['first_party_id'];
}
if(isset($entry['reason'])) {
$awj->reason = $entry['reason'];
}
if(isset($entry['ref_type'])) {
$awj->ref_type = $entry['ref_type'];
}
if(isset($entry['tax'])) {
$awj->tax = $entry['tax'];
}
if(isset($entry['tax_receiver_id'])) {
$awj->tax_receiver_id = $entry['tax_receiver_id'];
}
$awj->save();
}
}
//Return as completed
return 0;
}
/**
* Set the tags for Horzion
*
* @var array
*/
public function tags() {
return ['UpdateAllianceWalletJournalPage', 'Finances'];
}
}

View File

@@ -0,0 +1,66 @@
<?php
namespace App\Jobs\Commands\Finances;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
use Carbon\Carbon;
//Library Functions
use App\Library\Moons\MoonCalc;
class UpdateItemPrices implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 1800;
/**
* Retries
*
* @var int
*/
public $retries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
$this->onQueue('default');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$moonHelper = new MoonCalc;
//Fetch new prices from fuzzwork.co.uk for the item pricing schemes
$moonHelper->FetchNewPrices();
}
/**
* Set the tags for Horzion
*
* @var array
*/
public function tags() {
return ['UpdateItemPrices', 'Finances'];
}
}

View File

@@ -0,0 +1,65 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
//Application Library
use App\Library\Helpers\LookupHelper;
//Models
use App\Models\MiningTax\Invoice;
class CreateMiningTaxesInvoice implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
$this->onQueue('miningtaxes');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$lookup = new LookupHelper;
$mainAlts = array();
$mainIds = new Collection;
//Get all of the users in the database
$characters = User::all();
}
}

View File

@@ -0,0 +1,164 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Carbon\Carbon;
//App Library
use Seat\Eseye\Exceptions\RequestFailedException;
use App\Library\Esi\Esi;
use App\Library\Helpers\LookupHelper;
use App\Library\Moons\MoonCalc;
//Jobs
use App\Jobs\Commands\MiningTaxes\ProcessMiningTaxesLedgers;
//App Models
use App\Models\MiningTax\Observer;
use App\Models\MiningTax\Ledger;
use App\Models\Moon\MineralPrice;
use App\Models\Moon\ItemComposition;
use App\Models\Esi\EsiToken;
use App\Models\Esi\EsiScope;
class FetchMiningTaxesLedgers implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Job Variables
*/
private $charId;
private $corpId;
private $observerId;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($charId, $corpId, $observerId)
{
//Set the connection for the job
$this->connection = 'redis';
$this->onQueue('miningtaxes');
//Import the variables from the calling function
$this->charId = $charId;
$this->corpId = $corpId;
$this->observerId = $observerId;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$lookup = new LookupHelper;
$mHelper = new MoonCalc;
$esiHelper = new Esi;
$pageFailed = false;
$config = config('esi');
//Check for the correct scope
if(!$esiHelper->haveEsiScope($this->charId, 'esi-industry.read_corporation_mining.v1')) {
Log::critical('Character: ' . $this->charId . ' did not have the correct esi scope in FetchMiningTaxesLedgersJob.');
return null;
}
//Get the esi token in order to pull data from esi
$refreshToken = $esiHelper->GetRefreshToken($this->charId);
$esi = $esiHelper->SetupEsiAuthentication($refreshToken);
//Set the current page
$currentPage = 1;
$totalPages = 1;
//Setup a do-while loop to sort through the ledgers by pages
do {
/**
* During the course of the operation, we want to ensure our token stays valid.
* If the token, expires, then we want to refresh the token through the esi helper
* library functionality.
*/
if($esiHelper->TokenExpired($refreshToken)) {
$refreshToken = $esiHelper->GetRefreshToken($this->charId);
$esi = $esiHelper->SetupEsiAuthentication($refreshToken);
}
/**
* Attempt to get the data from the esi api. If it fails, we skip the page
*/
try {
$response = $esi->page($currentPage)
->invoke('get', '/corporation/{corporation_id}/mining/observers/{observer_id}/', [
'corporation_id' => $config['corporation'],
'observer_id' => $this->observerId,
]);
} catch(RequestFailedException $e) {
Log::warning('Failed to get the mining ledger in FetchMiningTaxesLedgersCommand for observer id: ' . $this->observerId);
$pageFailed = true;
}
/**
* If the current page is the first one and the page didn't fail, then update the total pages.
* If the first page failed, just return as we aren't going to be able to get the total amount of data needed.
*/
if($currentPage == 1 && $pageFailed == false) {
$totalPages = $response->pages;
} else if($currentPage == 1 && $pageFailed == true) {
return null;
}
if($pageFailed == true) {
//If the page failed, then reset the variable, and skip the current iteration
//of creating the jobs.
$pageFailed = false;
} else {
//Decode the json response from the ledgers
$ledgers = json_decode($response->raw);
//Dispatch jobs to process each of the mining ledger entries
foreach($ledgers as $ledger) {
ProcessMiningTaxesLedgers::dispatch($ledger, $this->observerId)->onQueue('miningtaxes');
}
}
//Increment the current pages
$currentPage++;
} while($currentPage <= $totalPages);
}
/**
* Set the tags for Horzion
*
* @var array
*/
public function tags() {
return ['FetchMiningTaxesLedgers', 'MiningTaxes', 'MiningTaxesLedgers'];
}
}

View File

@@ -1,142 +0,0 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Carbon\Carbon;
//App Library
use Seat\Eseye\Exceptions\RequestFailedException;
use App\Library\Esi\Esi;
use App\Library\Helpers\LookupHelper;
use App\Library\Moons\MoonCalc;
//App Models
use App\Models\MiningTax\Observer;
use App\Models\MiningTax\Ledger;
use App\Models\Moon\MineralPrice;
use App\Models\Moon\ItemComposition;
use App\Models\Esi\EsiToken;
use App\Models\Esi\EsiScope;
class FetchMiningTaxesLedgersJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Job Variables
*/
private $charId;
private $corpId;
private $observerId;
private $esi;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($charId, $corpId, $observerId)
{
//Set the connection for the job
$this->connection = 'redis';
//Import the variables from the calling function
$this->charId = $charId;
$this->corpId = $corpId;
$this->observerId = $observerId;
//Setup the ESI stuff
$esiHelper = new Esi;
//Setup the private esi variables
if(!$esiHelper->haveEsiScope($this->charId, 'esi-industry.read_corporation_mining.v1')) {
Log::critical('Character: ' . $this->charId . ' did not have the correct esi scope in FetchMiningTaxesLedgersJob.');
return null;
}
$refreshToken = $esiHelper->GetRefreshToken($this->charId);
$this->esi = $esiHelper->SetupEsiAuthentication($refreshToken);
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$lookup = new LookupHelper;
$mHelper = new MoonCalc;
$esiHelper = new Esi;
//Get the ledger from ESI
try {
$response = $this->esi->invoke('get', '/corporation/{corporation_id}/mining/observers/{observer_id}/', [
'corporation_id' => $this->corpId,
'observer_id' => $this->observerId,
]);
} catch(RequestFailedException $e) {
Log::warning('Failed to get the mining ledger in FetchMiningTaxesLedgersJob for observer id: ' . $this->observerId);
return null;
}
$ledgers = json_decode($response);
//Sort through the array, and create the variables needed for database entries
foreach($ledgers as $ledger) {
//Get some basic information we need to work with
$charName = $lookup->CharacterIdToName($ledger->character_id);
//Get the type name from the ledger ore stuff
$typeName = $lookup->ItemIdToName($ledger->type_id);
//Decode the date and store it.
//$updated = $esiHelper->DecodeDate($ledger->last_updated);
$price = $mHelper->CalculateOrePrice($ledger->type_id);
$amount = $price * $ledger->quantity;
//Insert or update the entry in the database
$item = Ledger::updateOrCreate([
'character_id' => $ledger->character_id,
'character_name' => $charName,
'observer_id' => $this->observerId,
'last_updated' => $ledger->last_updated,
'type_id' => $ledger->type_id,
'ore_name' => $typeName,
'quantity' => $ledger->quantity,
'price' => $amount,
], [
'character_id' => $ledger->character_id,
'character_name' => $charName,
'observer_id' => $this->observerId,
'last_updated' => $ledger->last_updated,
'type_id' => $ledger->type_id,
'ore_name' => $typeName,
'quantity' => $ledger->quantity,
'price' => $amount,
]);
}
//Clean up old data
Ledger::where(['updated_at', '<', Carbon::now()->subDays(120)])->delete();
}
}

View File

@@ -0,0 +1,200 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
use Carbon\Carbon;
//Application Library
use Seat\Eseye\Exceptions\RequestFailedException;
use App\Library\Esi\Esi;
use App\Library\Helpers\LookupHelper;
use App\Library\Helpers\StructureHelper;
//Models
use App\Models\MiningTax\Observer;
class FetchMiningTaxesObservers implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
$this->onQueue('miningtaxes');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$config = config('esi');
$lookup = new LookupHelper;
$sHelper = new StructureHelper($config['primary'], $config['corporation']);
$esiHelper = new Esi;
//Check for the ESI scope needed.
if(!$esiHelper->HaveEsiScope($config['primary'], 'esi-industry.read_corporation_mining.v1')) {
Log::critical('Esi scopes were not found for FetchMiningTaxesObserversJob.');
print("Esi scopes not found.");
return;
}
//Check for the other ESI scope needed.
if(!$esiHelper->HaveEsiScope($config['primary'], 'esi-universe.read_structures.v1')) {
Log::critical('Esi scope esi-universe.read_structures.v1 was not found for FetchMiningTaxesObserversJob.');
print("Esi scopes not found 2");
return;
}
//Get the refresh token for the character
$refreshToken = $esiHelper->GetRefreshToken($config['primary']);
//Get the esi variable
$esi = $esiHelper->SetupEsiAuthentication($refreshToken);
//Invoke the call to ESI API.
$response = $esi->invoke('get', '/corporation/{corporation_id}/mining/observers/', [
'corporation_id' => $config['corporation'],
]);
//Decode the json response, but leave it as objects rather than an array
$resp = json_decode($response->raw, false);
//Run through the mining observers, and add them to the database
foreach($resp as $observer) {
//See if the observer is found in the database
$found = Observer::where([
'observer_id' => $observer->observer_id,
])->count();
//Get the observer name from esi
$structureInfo = $sHelper->GetStructureInfo($observer->observer_id);
//If found, then update the structure
if($found > 0) {
//Update the existing structure in the database
Observer::where([
'observer_id' => $observer->observer_id,
])->update([
'observer_id' => $observer->observer_id,
'observer_name' => $structureInfo->name,
'last_updated' => $observer->last_updated,
]);
} else {
//Add a new observer into the observer table
$newObs = new Observer;
$newObs->observer_id = $observer->observer_id;
$newObs->observer_type = $observer->observer_type;
$newObs->observer_name = $structureInfo->name;
$newObs->last_updated = $observer->last_updated;
$newObs->solar_system_id = $structureInfo->solar_system_id;
$newObs->solar_system_name = $lookup->SystemIdToName($structureInfo->solar_system_id);
$newObs->save();
}
}
/**
* Cleanup stale data that hasn't been updated in at least 1 week.
*/
$date = Carbon::now()->subDays(7);
Observer::where('last_updated', '<', $date)->delete();
//Return 0 saying everything is fine
return 0;
}
/**
* The job failed to process
* @param Exception $exception
* @return void
*/
public function failed($exception) {
if(!exception instanceof RequestFailedException) {
//If not a failure due to ESI, then log it. Otherwise,
//deduce why the exception occurred.
Log::critical($exception);
}
if ((is_object($exception->getEsiResponse()) && (stristr($exception->getEsiResponse()->error, 'Too many errors') || stristr($exception->getEsiResponse()->error, 'This software has exceeded the error limit for ESI'))) ||
(is_string($exception->getEsiResponse()) && (stristr($exception->getEsiResponse(), 'Too many errors') || stristr($exception->getEsiResponse(), 'This software has exceeded the error limit for ESI')))) {
//We have hit the error rate limiter, wait 120 seconds before releasing the job back into the queue.
Log::info('FetchMiningTaxesObservers has hit the error rate limiter. Releasing the job back into the wild in 2 minutes.');
$this->release(120);
} else {
$errorCode = $exception->getEsiResponse()->getErrorCode();
switch($errorCode) {
case 400: //Bad Request
Log::critical("Bad request has occurred in FetchMiningTaxesObservers. Job has been discarded");
break;
case 401: //Unauthorized Request
Log::critical("Unauthorized request has occurred in FetchMiningTaxesObservers at " . Carbon::now()->toDateTimeString() . ".\r\nCancelling the job.");
break;
case 403: //Forbidden
Log::critical("FetchMiningTaxesObservers has incurred a forbidden error. Cancelling the job.");
break;
case 420: //Error Limited
Log::warning("Error rate limit occurred in FetchMiningTaxesObservers. Restarting job in 120 seconds.");
$this->release(120);
break;
case 500: //Internal Server Error
Log::critical("Internal Server Error for ESI in FetchMiningTaxesObservers. Attempting a restart in 120 seconds.");
$this->release(120);
break;
case 503: //Service Unavailable
Log::critical("Service Unavailabe for ESI in FetchMiningTaxesObservers. Releasing the job back to the queue in 30 seconds.");
$this->release(30);
break;
case 504: //Gateway Timeout
Log::critical("Gateway timeout in FetchMiningTaxesObservers. Releasing the job back to the queue in 30 seconds.");
$this->release(30);
break;
case 201: //Good response code
$this->delete();
break;
//If no code is given, then log and break out of switch.
default:
Log::warning("No response code received from esi call in FetchMiningTaxesObservers.\r\n");
$this->delete();
break;
}
}
}
/**
* Set the tags for Horizon
*
* @var array
*/
public function tags() {
return ['FetchMiningObservers', 'MiningTaxes'];
}
}

View File

@@ -0,0 +1,75 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
use Carbon\Carbon;
//Models
use App\Models\MiningTax\Observer;
//Jobs
use App\Jobs\Commands\MiningTaxes\FetchMiningTaxesLedgers;
class PreFetchMiningTaxesLedgers implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
$this->onQueue('miningtaxes');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Get the site configuration which holds some data we need
$config = config('esi');
//Get the observers from the database
$observers = Observer::all();
//For each of the observers, send a job to fetch the mining ledger
foreach($observers as $obs) {
//Dispatch the mining taxes ledger jobs
FetchMiningTaxesLedgers::dispatch($config['primary'], $config['corporation'], $obs->observer_id)->onQueue('miningtaxes');
}
}
/**
* Set the tags for Horzion
*
* @var array
*/
public function tags() {
return ['PreFetchMiningTaxesLedgers', 'MiningTaxes', 'MiningTaxesLedgers'];
}
}

View File

@@ -0,0 +1,120 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Carbon\Carbon;
//App Library
use App\Library\Helpers\LookupHelper;
use App\Library\Moons\MoonCalc;
//Models
use App\Models\MiningTax\Ledger;
use App\Models\Moon\MineralPrice;
use App\Models\Moon\ItemComposition;
class ProcessMiningTaxesLedgers implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Job Variables
*/
private $ledger;
private $observerId;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($ledger, $observerId)
{
//Set the connection for the job
$this->connection = 'redis';
$this->onQueue('miningtaxes');
//Import variables from the calling function
$this->ledger = $ledger;
$this->observerId = $observerId;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$lookup = new LookupHelper;
$mHelper = new MoonCalc;
$config = config('esi');
//Create a starting date for the ledger
$ledgerDate = Carbon::createFromFormat('Y-m-d', $this->ledger->last_updated);
//If the ledger is more than one day old, then process it, otherwise, we don't process it
//or add it to the database as it may still be updating.
if($ledgerDate->lessThan(Carbon::now()->subDay())) {
//Get some of the basic information we need to work with
$charName = $lookup->CharacterIdToName($this->ledger->character_id);
//Get the type name from the ledger ore
$typeName = $lookup->ItemIdToName($this->ledger->type_id);
//Get the price from the helper function
$price = $mHelper->CalculateOrePrice($this->ledger->type_id);
//Calculate the total price based on the amount
$amount = (($price * $this->ledger->quantity) * $config['refine_rate']);
$found = Ledger::where([
'character_id' => $this->ledger->character_id,
'observer_id' => $this->observerId,
'type_id' => $this->ledger->type_id,
'last_updated' => $this->ledger->last_updated,
])->count();
if($found == 0) {
$ledg = new Ledger;
$ledg->character_id = $this->ledger->character_id;
$ledg->character_name = $charName;
$ledg->observer_id = $this->observerId;
$ledg->last_updated = $this->ledger->last_updated;
$ledg->type_id = $this->ledger->type_id;
$ledg->ore_name = $typeName;
$ledg->quantity = $this->ledger->quantity;
$ledg->amount = $amount;
$ledg->save();
}
}
return 0;
}
/**
* Set the tags for Horzion
*
* @var array
*/
public function tags() {
return ['ProcessMiningTaxesLedgers', 'MiningTaxes', 'MiningTaxesLedgers'];
}
}

View File

@@ -0,0 +1,143 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Carbon\Carbon;
use Log;
//Library
use App\Library\Helpers\LookupHelper;
//Models
use App\Models\MiningTax\Invoice;
use App\Models\MiningTax\Payment;
use App\Models\Finances\AllianceWalletJournal;
class ProcessMiningTaxesPayments implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
$this->onQueue('miningtaxes');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare the variables we will need
$looup = new LookupHelper;
$currentTime = Carbon::now();
//Get the outstanding invoices
$outstanding = Invoice::where([
'status' => 'Pending',
])->get();
//Use the player donation journal from finances to see if the invoice_id is present
//as a reason
foreach($outstanding as $invoice) {
//See if we have a reason with the correct uniqid from the player donation journal
$found = AllianceWalletJournal::where([
'reason' => $invoice->invoice_id,
])->count();
//If we have received the invoice, then mark the invoice as paid
if($found > 0) {
//If we have the count, then grab the journal entry in order to do some things with it
$journal = AllianceWalletJournal::where([
'reason' => $invoice->invoice_id,
])->first();
//If the bill is paid on time, then update the invoice as such
if($currentTime->lessThanOrEqualTo($journal->inserted_at)) {
Invoice::where([
'invoice_id' => $invoice->invoice_id,
])->update([
'status' => 'Paid',
]);
}
if($currentTime->greaterThan($journal->inserted_at)) {
Invoice::where([
'invoice_id' => $invoice->invoice_id,
])->update([
'status' => 'Paid Late',
]);
}
} else {
$count = AllianceWalletJournal::where([
'reason' => $invoice->invoice_id,
])->count();
if($count > 0) {
//If we have the count, then grab the journal entry in order to do some things with it
$journal = AllianceWalletJournal::where([
'reason' => $invoice->invoice_id,
])->first();
//If the bill is paid on time, then update the invoice as such
if($currentTime->lessThanOrEqualTo($journal->inserted_at)) {
Invoice::where([
'invoice_id' => $invoice->invoice_id,
])->update([
'status' => 'Paid',
]);
}
if($currentTime->greaterThan($journal->inserted_at)) {
Invoice::where([
'invoice_id' => $invoice->invoice_id,
])->update([
'status' => 'Paid Late',
]);
}
}
}
}
//Use the contract descriptions from the esi to see if the invoice_id is present.
//If the invoice is present, then mark it off as sent in correctly
}
/**
* Set the tags for Horzion
*
* @var array
*/
public function tags() {
return ['ProcessMiningTaxesPayments', 'MiningTaxes', 'Payments'];
}
}

View File

@@ -1,87 +0,0 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Carbon\Carbon;
use Log;
//Library
use App\Library\Lookups\LookupHelper;
//Models
use App\Models\MiningTaxes\Invoice;
use App\Models\MiningTaxes\Payment;
use App\Models\Finances\PlayerDonationJournal;
class ProcessMiningTaxesPaymentsJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare the variables we will need
$looup = new LookupHelper;
$currentTime = Carbon::now();
//Get the outstanding invoices
$outstanding = Invoice::where([
'status' => 'Pending',
])->get();
//Use the player donation journal from finances to see if the invoice_id is present
//as a reason
foreach($outstanding as $invoice) {
//See if we have a reason with the correct uniqid from the player donation journal
$found = PlayerDonationJournal::where([
'reason' => "MMT: " . $invoice->invoice_id,
])->count();
//If we have received the invoice, then mark the invoice as paid
if($count > 0) {
//If we have the count, then grab the journal entry in order to do some things with it
$journal = PlayerDonationJournal::where([
'reason' => "MMT: " . $invoice->invoice_id,
])->first();
//If the bill is paid on time, then update the invoice as such
if($currentTime->lessThanOrEqualTo($journal->inserted_at)) {
Invoice::where([
'invoice_id' => $invoice->invoice_id,
])->update([
'status' => 'Paid',
]);
}
if($currentTime->greaterThan($journal->inserted_at)) {
Invoice::where([
'invoice_id' => $invoice->invoice_id,
])->update([
'status' => 'Paid Late',
]);
}
}
}
}
}

View File

@@ -0,0 +1,316 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
//Application Library
use App\Library\Helpers\LookupHelper;
//Models
use App\Models\MiningTax\Invoice;
use App\Models\MiningTax\Ledger;
use App\Models\User\UserAlt;
use App\Models\User\User;
//Jobs
use App\Jobs\Commands\Eve\SendEveMail;
class SendMiningTaxesInvoices implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
$this->onQueue('miningtaxes');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$mailDelay = 15;
$mains = new Collection;
/**
* This section will determine if users are mains or alts of a main.
* If they are mains, we keep the key. If they are alts of a main, then we delete
* the key from the collection.
*/
//Pluck all the users from the database of ledgers to determine if they are mains or alts.
$tempMains = Ledger::where([
'invoiced' => 'No',
])->where('last_updated', '>', Carbon::now()->subDays(7))->pluck('character_id');
//Get the unique character ids from the ledgers in the previous statement
$tempMains = $tempMains->unique()->values()->all();
//Cycle through the array of mains, and remove any characters which are in the User Alt table,
//as those characters will be grouped with their correct main later.
for($i = 0; $i < sizeof($tempMains); $i++) {
if(UserAlt::where(['character_id' => $tempMains[$i]])->count() == 0) {
$mains->push($tempMains[$i]);
}
}
/**
* For each of the users, let's determine if there are any ledgers,
* then determine if there are any alts and ledgers associated with the alts.
*/
foreach($mains as $main) {
//Declare some variables for each run through the for loop
$ledgers = new Collection;
//Count the ledgers for the main
$mainLedgerCount = Ledger::where([
'character_id' => $main,
'invoiced' => 'No',
])->where('last_updated', '>', Carbon::now()->subDays(7))->count();
//If there are ledgers for the main, then let's grab them
if($mainLedgerCount > 0) {
$mainLedgers = Ledger::where([
'character_id' => $main,
'invoiced' => 'No',
])->where('last_updated', '>', Carbon::now()->subDays(7))->get();
//Cycle through the entries, and add them to the ledger to send with the invoice
foreach($mainLedgers as $row) {
$ledgers->push([
'character_id' => $row->character_id,
'character_name' => $row->character_name,
'observer_id' => $row->observer_id,
'type_id' => $row->type_id,
'ore_name' => $row->ore_name,
'quantity' => (int)$row->quantity,
'amount' => (float)$row->amount,
'last_updated' => $row->last_updated,
]);
}
}
//Get the alt count for the main character
$altCount = UserAlt::where(['main_id' => $main])->count();
//If more than 0 alts, grab all the alts.
if($altCount > 0) {
$alts = UserAlt::where([
'main_id' => $main,
])->get();
//Cycle through the alts, and get the ledgers, and push onto the stack
foreach($alts as $alt) {
$altLedgerCount = Ledger::where([
'character_id' => $alt->character_id,
'invoiced' => 'No',
])->where('last_updated', '>', Carbon::now()->subDays(7))->count();
if($altLedgerCount > 0) {
$altLedgers = Ledger::where([
'character_id' => $alt->character_id,
'invoiced' => 'No',
])->where('last_updated', '>', Carbon::now()->subDays(7))->get();
foreach($altLedgers as $row) {
$ledgers->push([
'character_id' => $row->character_id,
'character_name' => $row->character_name,
'observer_id' => $row->observer_id,
'type_id' => $row->type_id,
'ore_name' => $row->ore_name,
'quantity' => (int)$row->quantity,
'amount' => (float)$row->amount,
'last_updated' => $row->last_updated,
]);
}
}
}
}
/**
* Send the collected information over to the function to send the actual mail
*/
if($ledgers->count() > 0) {
$this->CreateInvoice($main, $ledgers, $mailDelay);
}
}
}
/**
* Create the invoice to the mail out
*
* @var charId
* @var ledgers
* @var mailDelay
*/
private function CreateInvoice($charId, Collection $ledgers, int &$mailDelay) {
$ores = array();
$characters = array();
$characterIds = array();
$totalPrice = 0.00;
$body = null;
$lookup = new LookupHelper;
$config = config('esi');
//Create an invoice id
$invoiceId = "M" . uniqid();
//Get the sum of all the ledgers
$invoiceAmount = round(((float)$ledgers->sum('amount') * (float)$config['mining_tax']), 2);
//Get the character name from the lookup table
$charName = $lookup->CharacterIdToName($charId);
//Create the date due and the invoice date
$dateDue = Carbon::now()->addDays(7);
$invoiceDate = Carbon::now();
//Set the mining tax from the config file
$numberMiningTax = number_format(((float)$config['mining_tax'] * (float)100.00), 2, ".", ",");
//Create the list of ores to put in the mail
$temp = $ledgers->toArray();
foreach($temp as $t) {
//If the key isn't set, set it to the default of 0
if(!isset($ores[$t['type_id']])) {
$ores[$t['type_id']] = (int)0;
}
//Add the quantity into the ores array
$ores[$t['type_id']] += (int)$t['quantity'];
//Create a list of character names
if(!isset($characters[$t['character_name']])) {
$characters[$t['character_name']] = $t['character_name'];
}
//Create a list of character ids
if(!isset($characterIds[$t['character_id']])) {
$characterIds[$t['character_id']] = $t['character_id'];
}
}
/**
* Create the mail body to send to the main character
*/
$body .= "Dear " . $charName . ",<br><br>";
$body .= "Mining Taxes are due for the following ores mined from alliance moons: <br>";
foreach($ores as $ore => $quantity) {
$oreName = $lookup->ItemIdToName($ore);
$body .= $oreName . ": " . number_format($quantity, 0, ".", ",") . "<br>";
}
$body .= "Total Value of Ore Mined: " . number_format($totalPrice, 2, ".", ",") . " ISK.";
$body .= "<br><br>";
$body .= "Please remit " . number_format($invoiceAmount, 2, ".", ",") . " ISK to Spatial Forces by " . $dateDue . "<br>";
$body .= "Set the reason for transfer as " . $invoiceId . "<br>";
$body .= "The mining taxes are currently set to " . $numberMiningTax . "%.<br>";
$body .= "<br><br>";
$body .= "You can also send a contract with the following ores in the contract with the reason set as: " . $invoiceId . "<br>";
foreach($ores as $ore => $quantity) {
$oreName = $lookup->ItemIdToName($ore);
$body .= $oreName . ": " . number_format(round($quantity * $config['mining_tax']), 0, ".", ",") . "<br>";
}
$body .= "<br>";
$body .= "Characters Processed: <br>";
foreach($characters as $character) {
$body .= $character . "<br>";
}
$body .= "<br>";
$body .= "<br>Sincerely,<br>Warped Intentions Leadership<br>";
//Check if the mail body is greater than 2000 characters. If greater than 2,000 characters, then
if(strlen($body) > 2000) {
$body = "Dear " . $charName . "<br><br>";
$body .= "Total Value of Ore Mined: " . number_format($totalPrice, 2, ".", ",") . " ISK.";
$body .= "<br><br>";
$body .= "Please remit " . number_format($invoiceAmount, 2, ".", ",") . " ISK to Spatial Forces by " . $dateDue . "<br>";
$body .= "Set the reason for transfer as: " . $invoiceId . "<br>";
$body .= "The mining taxes are currently set to " . $numberMiningTax . "%.<br>";
$body .= "<br>";
$body .= "<br>Sincerely,<br>Warped Intentions Leadership<br>";
}
//Mail the invoice to the character if the character is in
//Warped Intentions or Legacy
$subject = 'Warped Intentions Mining Taxes';
$sender = $config['primary'];
$recipientType = 'character';
$recipient = $charId;
//Send the Eve Mail Job to the queue to be dispatched
SendEveMail::dispatch($body, $recipient, $recipientType, $subject, $sender)->delay(Carbon::now()->addSeconds($mailDelay));
/**
* Create a new invoice model, and save it to the database
*/
$invoice = new Invoice;
$invoice->character_id = $charId;
$invoice->character_name = $charName;
$invoice->invoice_id = $invoiceId;
$invoice->invoice_amount = $invoiceAmount;
$invoice->date_issued = $invoiceDate;
$invoice->date_due = $dateDue;
$invoice->status = 'Pending';
$invoice->mail_body = $body;
$invoice->save();
/**
* Mark the invoices as paid
*/
foreach($characterIds as $char) {
Ledger::where([
'character_id' => $char,
'invoiced' => 'No',
])->update([
'invoice' => $invoiceId,
'invoiced' => 'Yes',
]);
}
/**
* Increment the mail delay for the next cycle
*/
$mailDelay += 20;
}
/**
* Set the tags for Horizon
*
* @var array
*/
public function tags() {
return ['MiningTaxes', 'SendMiningTaxesInvoics', 'Invoices'];
}
}

View File

@@ -0,0 +1,316 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
//Application Library
use App\Library\Helpers\LookupHelper;
//Models
use App\Models\MiningTax\Invoice;
use App\Models\MiningTax\Ledger;
use App\Models\User\UserAlt;
use App\Models\User\User;
//Jobs
use App\Jobs\Commands\Eve\SendEveMail;
class SendMiningTaxesInvoicesOld implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
$this->onQueue('miningtaxes');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$mailDelay = 15;
$mains = new Collection;
/**
* This section will determine if users are mains or alts of a main.
* If they are mains, we keep the key. If they are alts of a main, then we delete
* the key from the collection.
*/
//Pluck all the users from the database of ledgers to determine if they are mains or alts.
$tempMains = Ledger::where([
'invoiced' => 'No',
])->where('last_updated', '>', Carbon::now()->subDays(7))->pluck('character_id');
//Get the unique character ids from the ledgers in the previous statement
$tempMains = $tempMains->unique()->values()->all();
//Cycle through the array of mains, and remove any characters which are in the User Alt table,
//as those characters will be grouped with their correct main later.
for($i = 0; $i < sizeof($tempMains); $i++) {
if(UserAlt::where(['character_id' => $tempMains[$i]])->count() == 0) {
$mains->push($tempMains[$i]);
}
}
/**
* For each of the users, let's determine if there are any ledgers,
* then determine if there are any alts and ledgers associated with the alts.
*/
foreach($mains as $main) {
//Declare some variables for each run through the for loop
$ledgers = new Collection;
//Count the ledgers for the main
$mainLedgerCount = Ledger::where([
'character_id' => $main,
'invoiced' => 'No',
])->where('last_updated', '>', Carbon::now()->subDays(7))->count();
//If there are ledgers for the main, then let's grab them
if($mainLedgerCount > 0) {
$mainLedgers = Ledger::where([
'character_id' => $main,
'invoiced' => 'No',
])->where('last_updated', '>', Carbon::now()->subDays(7))->get();
//Cycle through the entries, and add them to the ledger to send with the invoice
foreach($mainLedgers as $row) {
$ledgers->push([
'character_id' => $row->character_id,
'character_name' => $row->character_name,
'observer_id' => $row->observer_id,
'type_id' => $row->type_id,
'ore_name' => $row->ore_name,
'quantity' => (int)$row->quantity,
'amount' => (float)$row->amount,
'last_updated' => $row->last_updated,
]);
}
}
//Get the alt count for the main character
$altCount = UserAlt::where(['main_id' => $main])->count();
//If more than 0 alts, grab all the alts.
if($altCount > 0) {
$alts = UserAlt::where([
'main_id' => $main,
])->get();
//Cycle through the alts, and get the ledgers, and push onto the stack
foreach($alts as $alt) {
$altLedgerCount = Ledger::where([
'character_id' => $alt->character_id,
'invoiced' => 'No',
])->where('last_updated', '>', Carbon::now()->subDays(7))->count();
if($altLedgerCount > 0) {
$altLedgers = Ledger::where([
'character_id' => $alt->character_id,
'invoiced' => 'No',
])->where('last_updated', '>', Carbon::now()->subDays(7))->get();
foreach($altLedgers as $row) {
$ledgers->push([
'character_id' => $row->character_id,
'character_name' => $row->character_name,
'observer_id' => $row->observer_id,
'type_id' => $row->type_id,
'ore_name' => $row->ore_name,
'quantity' => (int)$row->quantity,
'amount' => (float)$row->amount,
'last_updated' => $row->last_updated,
]);
}
}
}
}
/**
* Send the collected information over to the function to send the actual mail
*/
if($ledgers->count() > 0) {
$this->CreateInvoice($main, $ledgers, $mailDelay);
}
}
}
/**
* Create the invoice to the mail out
*
* @var charId
* @var ledgers
* @var mailDelay
*/
private function CreateInvoice($charId, Collection $ledgers, int &$mailDelay) {
$ores = array();
$characters = array();
$characterIds = array();
$totalPrice = 0.00;
$body = null;
$lookup = new LookupHelper;
$config = config('esi');
//Create an invoice id
$invoiceId = "M" . uniqid();
//Get the sum of all the ledgers
$invoiceAmount = round(((float)$ledgers->sum('amount') * (float)$config['mining_tax']), 2);
//Get the character name from the lookup table
$charName = $lookup->CharacterIdToName($charId);
//Create the date due and the invoice date
$dateDue = Carbon::now()->addDays(7);
$invoiceDate = Carbon::now();
//Set the mining tax from the config file
$numberMiningTax = number_format(((float)$config['mining_tax'] * (float)100.00), 2, ".", ",");
//Create the list of ores to put in the mail
$temp = $ledgers->toArray();
foreach($temp as $t) {
//If the key isn't set, set it to the default of 0
if(!isset($ores[$t['type_id']])) {
$ores[$t['type_id']] = (int)0;
}
//Add the quantity into the ores array
$ores[$t['type_id']] += (int)$t['quantity'];
//Create a list of character names
if(!isset($characters[$t['character_name']])) {
$characters[$t['character_name']] = $t['character_name'];
}
//Create a list of character ids
if(!isset($characterIds[$t['character_id']])) {
$characterIds[$t['character_id']] = $t['character_id'];
}
}
/**
* Create the mail body to send to the main character
*/
$body .= "Dear " . $charName . ",<br><br>";
$body .= "Mining Taxes are due for the following ores mined from alliance moons: <br>";
foreach($ores as $ore => $quantity) {
$oreName = $lookup->ItemIdToName($ore);
$body .= $oreName . ": " . number_format($quantity, 0, ".", ",") . "<br>";
}
$body .= "Total Value of Ore Mined: " . number_format($totalPrice, 2, ".", ",") . " ISK.";
$body .= "<br><br>";
$body .= "Please remit " . number_format($invoiceAmount, 2, ".", ",") . " ISK to Spatial Forces by " . $dateDue . "<br>";
$body .= "Set the reason for transfer as " . $invoiceId . "<br>";
$body .= "The mining taxes are currently set to " . $numberMiningTax . "%.<br>";
$body .= "<br><br>";
$body .= "You can also send a contract with the following ores in the contract with the reason set as: " . $invoiceId . "<br>";
foreach($ores as $ore => $quantity) {
$oreName = $lookup->ItemIdToName($ore);
$body .= $oreName . ": " . number_format(round($quantity * $config['mining_tax']), 0, ".", ",") . "<br>";
}
$body .= "<br>";
$body .= "Characters Processed: <br>";
foreach($characters as $character) {
$body .= $character . "<br>";
}
$body .= "<br>";
$body .= "<br>Sincerely,<br>Warped Intentions Leadership<br>";
//Check if the mail body is greater than 2000 characters. If greater than 2,000 characters, then
if(strlen($body) > 2000) {
$body = "Dear " . $charName . "<br><br>";
$body .= "Total Value of Ore Mined: " . number_format($totalPrice, 2, ".", ",") . " ISK.";
$body .= "<br><br>";
$body .= "Please remit " . number_format($invoiceAmount, 2, ".", ",") . " ISK to Spatial Forces by " . $dateDue . "<br>";
$body .= "Set the reason for transfer as: " . $invoiceId . "<br>";
$body .= "The mining taxes are currently set to " . $numberMiningTax . "%.<br>";
$body .= "<br>";
$body .= "<br>Sincerely,<br>Warped Intentions Leadership<br>";
}
//Mail the invoice to the character if the character is in
//Warped Intentions or Legacy
$subject = 'Warped Intentions Mining Taxes';
$sender = $config['primary'];
$recipientType = 'character';
$recipient = $charId;
//Send the Eve Mail Job to the queue to be dispatched
SendEveMail::dispatch($body, $recipient, $recipientType, $subject, $sender)->delay(Carbon::now()->addSeconds($mailDelay));
/**
* Create a new invoice model, and save it to the database
*/
$invoice = new Invoice;
$invoice->character_id = $charId;
$invoice->character_name = $charName;
$invoice->invoice_id = $invoiceId;
$invoice->invoice_amount = $invoiceAmount;
$invoice->date_issued = $invoiceDate;
$invoice->date_due = $dateDue;
$invoice->status = 'Pending';
$invoice->mail_body = $body;
$invoice->save();
/**
* Mark the invoices as paid
*/
foreach($characterIds as $char) {
Ledger::where([
'character_id' => $char,
'invoiced' => 'No',
])->update([
'invoice' => $invoiceId,
'invoiced' => 'Yes',
]);
}
/**
* Increment the mail delay for the next cycle
*/
$mailDelay += 20;
}
/**
* Set the tags for Horizon
*
* @var array
*/
public function tags() {
return ['MiningTaxes', 'SendMiningTaxesInvoics', 'Invoices'];
}
}

View File

@@ -0,0 +1,108 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
use Carbon\Carbon;
//Application Library
use App\Library\Helpers\LookupHelper;
//Models
use App\Models\MiningTax\Invoice;
use App\Models\User\User;
use App\Models\User\UserAlt;
//Jobs
use App\Jobs\Commands\Eve\SendEveMail;
class UpdateMiningTaxesLateInvoices15th implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
$this->onQueue('miningtaxes');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$lookup = new LookupHelper;
$config = config('esi');
$mailDelay = 15;
$today = Carbon::now();
//Get all of the invoices that are still pending.
$invoices = Invoice::where([
'status' => 'Pending',
])->get();
//Cycle through the invoices, and see if they are late or not.
foreach($invoices as $invoice) {
$dueDate = Carbon::create($invoice->date_due);
if($dueDate->greaterThan($today->subDays(7))) {
//Update the invoice in the database
Invoice::where([
'invoice_id' => $invoice->invoice_id,
])->update([
'status' => 'Late',
]);
//Build the mail
$subject = 'Warped Intentions Mining Taxes - Invoice Late';
$sender = $config['primary'];
$recipientType = 'character';
$recipient = $invoice->character_id;
$body = "Dear " . $invoice->character_name . ",<br><br>";
$body .= "The Mining Invoice: " . $invoice->invoice_id . " is late.<br>";
$body .= "Please remite " . number_format($invoice->invoice_amount, 2, ".", ",") . "to Spatial Forces.<br>";
$body .= "<br>Sincerely,<br>Warped Intentions Leadership<br>";
//Send a reminder to the user through eve mail about the late invoice
SendEveMail::dispatch($body, $recipient, $recipientType, $subject, $sender)->delay(Carbon::now()->addSeconds($mailDelay));
}
}
}
/**
* Set the tags for Horzion
*
* @var array
*/
public function tags() {
return ['UpdateMiningTaxesLateInvoices', 'MiningTaxes', 'Invoices'];
}
}

View File

@@ -0,0 +1,108 @@
<?php
namespace App\Jobs\Commands\MiningTaxes;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
use Carbon\Carbon;
//Application Library
use App\Library\Helpers\LookupHelper;
//Models
use App\Models\MiningTax\Invoice;
use App\Models\User\User;
use App\Models\User\UserAlt;
//Jobs
use App\Jobs\Commands\Eve\SendEveMail;
class UpdateMiningTaxesLateInvoices1st implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
$this->connection = 'redis';
$this->onQueue('miningtaxes');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$lookup = new LookupHelper;
$config = config('esi');
$mailDelay = 15;
$today = Carbon::now();
//Get all of the invoices that are still pending.
$invoices = Invoice::where([
'status' => 'Pending',
])->get();
//Cycle through the invoices, and see if they are late or not.
foreach($invoices as $invoice) {
$dueDate = Carbon::create($invoice->date_due);
if($dueDate->greaterThan($today->subDays(7))) {
//Update the invoice in the database
Invoice::where([
'invoice_id' => $invoice->invoice_id,
])->update([
'status' => 'Late',
]);
//Build the mail
$subject = 'Warped Intentions Mining Taxes - Invoice Late';
$sender = $config['primary'];
$recipientType = 'character';
$recipient = $invoice->character_id;
$body = "Dear " . $invoice->character_name . ",<br><br>";
$body .= "The Mining Invoice: " . $invoice->invoice_id . " is late.<br>";
$body .= "Please remite " . number_format($invoice->invoice_amount, 2, ".", ",") . "to Spatial Forces.<br>";
$body .= "<br>Sincerely,<br>Warped Intentions Leadership<br>";
//Send a reminder to the user through eve mail about the late invoice
SendEveMail::dispatch($body, $recipient, $recipientType, $subject, $sender)->delay(Carbon::now()->addSeconds($mailDelay));
}
}
}
/**
* Set the tags for Horzion
*
* @var array
*/
public function tags() {
return ['UpdateMiningTaxesLateInvoices', 'MiningTaxes', 'Invoices'];
}
}

View File

@@ -0,0 +1,174 @@
<?php
namespace App\Jobs\Commands\Structures;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
//Application Library
use App\Library\Esi\Esi;
use Seat\Eseye\Exception\RequestFailedException;
use App\Library\Structures\StructureHelper;
//Models
use App\Models\Structure\Structure;
use App\Models\Structure\Service;
class FetchAllianceStructures implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//Set the connection for the job
$this->connection = 'redis';
$this->onQueue('structures');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//Declare variables
$config = config('esi');
$corpId = 98287666;
$esiHelper = new Esi;
$structureScope = $esiHelper->HaveEsiScope($config['primary'], 'esi-universe.read_structures.v1');
$corpStructureScope = $esiHelper->HaveEsiScope($config['primary'], 'esi-corporations.read_structures.v1');
//Check scopes
if($structureScope == false || $corpStructureScope == false) {
if($structureScope == false) {
Log::critical("Scope check for esi-universe.read_structures.v1 has failed.");
}
if($corpStructureScope == false) {
Log::critical("Scope check for esi-corporations.read_structures.v1 has failed.");
}
return -1;
}
//Get the refresh token from the database
$token = $esiHelper->GetRefreshToken($config['primary']);
//Create the esi authentication container
$esi = $esiHelper->SetupEsiAuthentication($token);
//Set the current page
$currentPage = 1;
//Set our default pages
$totalPages = 1;
do {
//Attempt to get the entire page worth of structures
$structures = $esi->page($currentPage)
->invoke('get', '/corporations/{corporation_id}/structures/', [
'corporation_id' => $corpId,
]);
//If on the first page, then update the total number of pages
if($currentPage == 1) {
$totalPages = $structures->pages;
}
//For each asset retrieved, let's process it.
foreach($structures as $s) {
ProcessAllianceStructures::dispatch($s)->onQueue('structures');
}
//Increment the current page
$currentPage++;
} while($currentPage <= $totalPages);
}
/**
* The job failed to process
* @param Exception $exception
* @return void
*/
public function failed($exception) {
if(!exception instanceof RequestFailedException) {
//If not a failure due to ESI, then log it. Otherwise,
//deduce why the exception occurred.
Log::critical($exception);
}
if ((is_object($exception->getEsiResponse()) && (stristr($exception->getEsiResponse()->error, 'Too many errors') || stristr($exception->getEsiResponse()->error, 'This software has exceeded the error limit for ESI'))) ||
(is_string($exception->getEsiResponse()) && (stristr($exception->getEsiResponse(), 'Too many errors') || stristr($exception->getEsiResponse(), 'This software has exceeded the error limit for ESI')))) {
//We have hit the error rate limiter, wait 120 seconds before releasing the job back into the queue.
Log::info('FetchMiningTaxesObservers has hit the error rate limiter. Releasing the job back into the wild in 2 minutes.');
$this->release(120);
} else {
$errorCode = $exception->getEsiResponse()->getErrorCode();
switch($errorCode) {
case 400: //Bad Request
Log::critical("Bad request has occurred in FetchMiningTaxesObservers. Job has been discarded");
break;
case 401: //Unauthorized Request
Log::critical("Unauthorized request has occurred in FetchMiningTaxesObservers at " . Carbon::now()->toDateTimeString() . ".\r\nCancelling the job.");
break;
case 403: //Forbidden
Log::critical("FetchMiningTaxesObservers has incurred a forbidden error. Cancelling the job.");
break;
case 420: //Error Limited
Log::warning("Error rate limit occurred in FetchMiningTaxesObservers. Restarting job in 120 seconds.");
$this->release(120);
break;
case 500: //Internal Server Error
Log::critical("Internal Server Error for ESI in FetchMiningTaxesObservers. Attempting a restart in 120 seconds.");
$this->release(120);
break;
case 503: //Service Unavailable
Log::critical("Service Unavailabe for ESI in FetchMiningTaxesObservers. Releasing the job back to the queue in 30 seconds.");
$this->release(30);
break;
case 504: //Gateway Timeout
Log::critical("Gateway timeout in FetchMiningTaxesObservers. Releasing the job back to the queue in 30 seconds.");
$this->release(30);
break;
case 201: //Good response code
$this->delete();
break;
//If no code is given, then log and break out of switch.
default:
Log::warning("No response code received from esi call in FetchMiningTaxesObservers.\r\n");
$this->delete();
break;
}
}
}
public function tags() {
return ['FetchAllianceStructures', 'AllianceStructures', 'Structures'];
}
}

View File

@@ -0,0 +1,216 @@
<?php
namespace App\Jobs\Commands\Structures;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
//Application Library
use App\Library\Helpers\LookupHelper;
use App\Library\Esi\Esi;
//Models
use App\Models\Structure\Structure;
use App\Models\Structure\Service;
class ProcessAllianceStructures implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
private $structure;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($s)
{
//Set the connection for the job
$this->connection = 'redis';
$this->onQueue('structures');
//Set variables
$this->structure = $s;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
/**
* Update the structure if it already exists, or add the structure if it doesn't exist in the database
*/
if(Structure::where(['structure_id' => $this->structure->structure_id])->count() > 0) {
$this->UpdateStructure($this->structure);
} else {
$this->SaveNewStructure($this->structure);
}
}
/**
* Set the tags for the job
*
* @var array
*/
public function tags() {
return ['ProcessAllianceStructures', 'AllianceStructures', 'Structures'];
}
private function SaveNewStructure($structure) {
//Declare variables
$lookup = new LookupHelper;
$esiHelper = new Esi;
//Get the solar system name
$solarName = $lookup->SystemIdToName($structure->system_id);
$s = new Structure;
$s->structure_id = $structure->structure_id;
$s->structure_name = $structure->name;
$s->solar_system_id = $structure->system_id;
$s->solar_system_name = $solarName;
$s->type_id = $structure->type_id;
$s->type_name = $lookup->StructureTypeIdToName($structure->type_id);
$s->corporation_id = $structure->corporation_id;
if(isset($structure->services)) {
$s->services = true;
foreach($structure->services as $service) {
$serv = new Service;
$serv->structure_id = $structure->structure_id;
$serv->name = $service->name;
$serv->state = $service->state;
}
} else {
$s->services = false;
}
$s->state = $structure->state;
if(isset($structre->state_timer_start)) {
$s->state_timer_start = $esiHelper->DecodeDate($structure->state_timer_start);
}
if(isset($structure->state_timer_end)) {
$s->state_timer_end = $esiHelper->DecodeDate($structure->state_timer_end);
}
if(isset($structure->fuel_expires)) {
$s->fuel_expires = $esiHelper->DecodeDate($structure->fuel_expires);
}
$s->profile_id = $structure->profile_id;
if(isset($structure->next_reinforce_apply)) {
$s->next_reinforce_apply = $structure->next_reinforce_apply;
}
if(isset($structure->next_reinforce_hour)) {
$s->next_reinforce_hour = $structure->next_reinforce_hour;
}
$s->reinforce_hour = $structure->reinforce_hour;
if(isset($structure->unanchors_at)) {
$s->unanchors_at = $esiHelper->DecodeDate($s->unanchors_at);
}
$s->save();
}
private function UpdateStructure($structure) {
$esiHelper = new Esi;
if(isset($structure->corporation_id)) {
Structure::where([
'structure_id' => $structure->structure_id,
])->update([
'corporation_id' => $structure->corporation_id,
]);
}
if(isset($structure->state)) {
Structure::where([
'structure_id' => $structure->structure_id,
])->update([
'state' => $structure->state,
]);
}
if(isset($structure->state_timer_start)) {
Structure::where([
'structure_id' => $structure->structure_id,
])->update([
'state_timer_start' => $esiHelper->DecodeDate($structure->state_timer_start),
]);
}
if(isset($structure->state_timer_end)) {
Structure::where([
'structure_id' => $structure->structure_id,
])->update([
'state_timer_end' => $esiHelper->DecodeDate($structure->state_timer_end),
]);
}
if(isset($structure->fuel_expires)) {
Structure::where([
'structure_id' => $structure->structure_id,
])->update([
'fuel_expires' => $esiHelper->DecodeDate($structure->fuel_expires),
]);
}
if(isset($structure->profile_id)) {
Structure::where([
'structure_id' => $structure->structure_id,
])->update([
'profile_id' => $structure->profile_id,
]);
}
if(isset($structure->next_reinforce_apply)) {
Structure::where([
'structure_id' => $structure->structure_id,
])->update([
'next_reinforce_apply' => $structure->next_reinforce_apply,
]);
}
if(isset($structure->next_reinforce_hour)) {
Structure::where([
'structure_id' => $structure->structure_id,
])->update([
'next_reinforce_hour' => $structure->next_reinforce_hour,
]);
}
if(isset($structure->reinforce_hour)) {
Structure::where([
'structure_id' => $structure->structure_id,
])->update([
'reinforce_hour' => $structure->reinforce_hour,
]);
}
if(isset($structure->unanchors_at)) {
Structure::where([
'structure_id' => $structure->structure_id,
])->update([
'unanchors_at' => $esiHelper->DecodeDate($structure->unanchors_at),
]);
}
if(Service::where(['structure_id' => $structure->structure_id])->count() > 0) {
foreach($structure->services as $service) {
Service::where([
'structure_id' => $structure->structure_id,
])->update([
'state' => $service->state,
]);
}
}
}
}

View File

@@ -0,0 +1,70 @@
<?php
namespace App\Jobs\Commands\Structures;
//Internal Library
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
//Jobs
use App\Jobs\Commands\FetchAllianceStructures;
//Models
use App\Models\Structure\Structure;
use App\Models\Structure\Service;
class PurgeAllianceStructures implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Timeout in seconds
*
* @var int
*/
public $timeout = 3600;
/**
* Number of job retries
*
* @var int
*/
public $tries = 3;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//Set the connection for the job
$this->connection = 'redis';
$this->onQueue('structures');
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Structure::truncate();
Service::truncate();
FetchAllianceStructures::dispatch();
}
/**
* Set the tags for the job
*
* @var array
*/
public function tags() {
return ['PurgeAllianceStructures', 'AllianceStructures', 'Structures'];
}
}

View File

@@ -18,7 +18,7 @@ use App\Models\Contracts\SupplyChainBid;
use App\Models\Contracts\SupplyChainContract;
//Jobs
use App\Jobs\Commands\Eve\ProcessSendEveMailJob;
use App\Jobs\Commands\Eve\SendEveMail;
class EndSupplyChainContractJob implements ShouldQueue
{

View File

@@ -13,7 +13,7 @@ use App\Models\Esi\EsiToken;
use App\Models\Esi\EsiScope;
//Jobs
use App\Jobs\Commands\Eve\ProcessSendEveMailJob;
use App\Jobs\Commands\Eve\SendEveMail;
//Seat Stuff
use Seat\Eseye\Cache\NullCache;
@@ -46,7 +46,7 @@ class Esi {
$subject = 'W4RP Services - Incorrect ESI Scope';
$body = "Please register on https://services.w4rp.space with the scope: " . $scope;
ProcessSendEveMailJob::dispatch($body, (int)$charId, 'character', $subject, $config['primary'])->onQueue('mail')->delay(Carbon::now()->addSeconds(5));
SendEveMail::dispatch($body, (int)$charId, 'character', $subject, $config['primary'])->delay(Carbon::now()->addSeconds(5));
return false;
}

View File

@@ -26,7 +26,6 @@ class FinanceHelper {
public function GetApiWalletJournal($division, $charId) {
//Declare class variables
$lookup = new LookupHelper;
$finance = new FinanceHelper;
$esiHelper = new Esi;
//Setup the esi container.
@@ -159,6 +158,47 @@ class FinanceHelper {
return 0;
}
/**
* Get the pages for the alliance wallet journal
*/
public function GetAllianceWalletJournalPages($division, $charId) {
$lookup = new LookupHelper;
$esiHelper = new Esi;
//Setup the esi container.
$token = $esiHelper->GetRefreshToken($charId);
$esi = $esiHelper->SetupEsiAuthentication($token);
//Check the scope
if(!$esiHelper->HaveEsiScope($charId, 'esi-wallet.read_corporation_wallets.v1')) {
Log::critical('Scope check failed for esi-wallet.read_corporation_wallets.v1 for character id: ' . $charId);
return null;
}
//Reference the character id to the corporation id
$char = $lookup->GetCharacterInfo($charId);
$corpId = $char->corporation_id;
/**
* Attempt to get the data from the esi api. If it fails, we skip the page, and go onto the next page, unless
* the failed page is the first page.
*/
try {
$journals = $esi->page(1)
->invoke('get', '/corporations/{corporation_id}/wallets/{division}/journal/', [
'corporation_id' => $corpId,
'division' => $division,
]);
} catch(RequestFailedException $e) {
Log::warning('Failed to get wallet journal pages for character id: ' . $charId);
Log::warning($e);
return 0;
}
//Return the total pages
return $journals->pages;
}
private function GetPIMaterialsArray() {
//Setup array for PI items
$pi_items = [

View File

@@ -19,6 +19,7 @@ use App\Models\Lookups\CorporationLookup;
use App\Models\Lookups\AllianceLookup;
use App\Models\Lookups\SolarSystem;
use App\Models\Lookups\ItemLookup;
use App\Models\Lookups\MoonLookup;
class LookupHelper {
@@ -29,10 +30,45 @@ class LookupHelper {
public function __construct() {
//Declare a variable for use by the construct
$esiHelper = new Esi;
$this->esi = $esiHelper->SetupEsiAuthentication();
}
public function StructureTypeIdToName($typeId) {
$structureTypes = [
35841 => 'Ansiblex Jump Gate',
35840 => 'Pharolux Cyno Beacon',
37534 => 'Tenebrex Cyno Jammer',
35834 => 'Keepstar',
35833 => 'Fortizar',
35832 => 'Astrahus',
35836 => 'Tatara',
35835 => 'Athanor',
35827 => 'Sotiyo',
35826 => 'Azbel',
35825 => 'Raitaru',
];
return $structureTypes[$typeId];
}
public function StructureNameToTypeId($name) {
$structureTypes = [
'Ansiblex Jump Gate' => 35841,
'Pharolux Cyno Beacon' => 35840,
'Tenebrex Cyno Jammer' => 37534,
'Keepstar' => 35834,
'Fortizar' => 35833,
'Astrahus' => 35832,
'Tatara' => 35836,
'Athanor' => 35835,
'Sotiyo' => 35827,
'Azbel' => 35826,
'Raitaru' => 35825,
];
return $structureTypes[$name];
}
public function ItemNameToId($itemName) {
$item = ItemLookup::where([
'name' => $itemName,
@@ -217,6 +253,58 @@ class LookupHelper {
}
}
/**
* Get moon information from the database, or store it in the database if it's not found
*/
public function GetMoonInfo($moonId) {
//Check our own database first
$moon = $this->LookupMoonInfo($moonId);
//If no data was found in the database, then save the data, and return what is found through esi
if( $moon == null) {
try {
$response = $this->esi->invoke('get', '/universe/moons/{moon_id}/', [
'moon_id' => $moonId,
]);
} catch(RequestFailedException $e) {
Log::critical("Failed to get moon information in LookupHelper.");
return null;
}
$this->SaveMoonInfo($response);
return $response;
} else {
//Return the moon info
return $moon;
}
}
/**
* Lookup moon info from the database
*/
private function LookupMoonInfo($moonId) {
$moon = MoonLookup::where([
'moon_id' => $moonId,
])->first();
return $moon;
}
/**
* Save moon info into the lookup database
*/
private function SaveMoonInfo($moon) {
$newMoon = new MoonLookup;
$newMoon->moon_id = $moon->id;
$newMoon->name = $moon->name;
$newMoon->position_x = $moon->position->x;
$newMoon->position_y = $moon->position->y;
$newMoon->position_z = $moon->position->z;
$newMoon->system_id = $moon->system_id;
$newMoon->save();
}
public function GetCharacterInfo($charId) {
//Check our own database first
$char = $this->LookupCharacter($charId, null);
@@ -247,7 +335,7 @@ class LookupHelper {
public function GetCorporationInfo($corpId) {
//Check our own database first
$corp = $this->LookupCorporation($corpId, null);
//If the corporation was not found in the database, then get the information and store it in our database for later
if($corp == null) {
try {

View File

@@ -0,0 +1,72 @@
<?php
namespace App\Library\Helpers;
//Internal Libraries
use Log;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
//Application Library
use App\Library\Helpers\LookupHelper;
//Models
use App\Models\MiningTax\Invoice;
use App\Models\MiningTax\Ledger;
//Jobs
use App\Jobs\Commands\Eve\SendEveMail;
class MiningTaxHelper {
/**
* Private variables
*/
/**
* Constructor
*/
public function __construct() {
}
/**
* Get the ledgers for a certain character and send back as a collection
*
* @var $charId
* @return collection $ledgers
*/
public function GetLedgers(int $charId) {
$ledgers = new Collection;
$rowCount = Ledger::where([
'character_id' => $charId,
'invoiced' => 'No',
])->count();
if($rowCount > 0) {
$rows = Ledger::where([
'character_id' => $charId,
'invoiced' => 'No',
])->get()->toArray();
foreach($rows as $row) {
$ledgers->push($row);
}
}
return $ledgers;
}
/**
* Create the invoice and mail it
*
* @var int $charId
* @var collection $ledgers
* @var int $mailDelay
*
*/
public function MailMiningInvoice(int $charId, collection $ledgers, int &$mailDelay) {
}
}

View File

@@ -14,7 +14,7 @@ use Log;
use App\Jobs\Library\JobHelper;
use Seat\Eseye\Exceptions\RequestFailedException;
use App\Library\Esi\Esi;
use App\Library\Lookups\LookupHelper;
use App\Library\Helpers\LookupHelper;
//App Models
use App\Models\Jobs\JobStatus;
@@ -73,24 +73,29 @@ class StructureHelper {
}
}
private function GetSolarSystemName($systemId) {
//Declare some variables
$esiHelper = new Esi;
$lookup = new LookupHelper;
public function GetStructureName($structureId) {
try {
$info = $this->esi->invoke('get', '/universe/structures/{structure_id}/', [
'structure_id' => $structureId,
]);
} catch(RequestFailedException $e) {
Log::warning("Failed to get structure information for structure with id " . $structureId);
Log::warning($e->getCode());
Log::warning($e->getMessage());
Log::warning($e->getEsiResponse());
$info = null;
}
$solar = $lookup->SystemIdToName($systemId);
$structure = json_decode($info->raw, true);
if($solar != null) {
return $solar;
} else {
if(!isset($structure['name'])) {
return null;
} else {
return (string)$structure['name'];
}
}
public function GetStructureInfo($structureId) {
//Declare some variables
$esiHelper = new Esi;
try {
$info = $this->esi->invoke('get', '/universe/structures/{structure_id}/', [
'structure_id' => $structureId,
@@ -107,6 +112,8 @@ class StructureHelper {
}
private function UpdateExistingStructure($structure, $info) {
$esi = new Esi;
//Update the structure id and name
Structure::where(['structure_id' => $structure->structure_id])->update([
'structure_id' => $structure->structure_id,
@@ -140,21 +147,21 @@ class StructureHelper {
//Update the state timer start
if(isset($structure->state_timer_start)) {
Structure::where(['structure_id' => $structure->structure_id])->update([
'state_timer_start' => $this->DecodeDate($structure->state_timer_start),
'state_timer_start' => $esi->DecodeDate($structure->state_timer_start),
]);
}
//Update the state timer end
if(isset($structure->state_timer_end)) {
Structure::where(['structure_id' => $structure->structure_id])->update([
'state_timer_end' => $this->DecodeDate($structure->state_timer_end),
'state_timer_end' => $esi->DecodeDate($structure->state_timer_end),
]);
}
//Update the fuel expires
if(isset($structure->fuel_expires)) {
Structure::where(['structure_id' => $structure->structure_id])->update([
'fuel_expires' => $this->DecodeDate($structure->fuel_expires),
'fuel_expires' => $esi->DecodeDate($structure->fuel_expires),
]);
}
@@ -169,7 +176,7 @@ class StructureHelper {
//Update the next reinforce apply
if(isset($structure->next_reinforce_apply)) {
Structure::where(['structure_id' => $structure->structure_id])->update([
'next_reinforce_apply' => $this->DecodeDate($structure->next_reinforce_apply),
'next_reinforce_apply' => $esi->DecodeDate($structure->next_reinforce_apply),
]);
}
@@ -204,7 +211,7 @@ class StructureHelper {
//Update the unanchors at field
if(isset($structure->unanchors_at)) {
//Decode the date / time
$daTi = $this->DecodeDate($structure->unanchors_at);
$daTi = $esi->DecodeDate($structure->unanchors_at);
Structure::where(['structure_id' => $structure->structure_id])->update([
'unanchors_at' => $daTi,
@@ -230,12 +237,14 @@ class StructureHelper {
}
private function SaveNewStructure($structure, $info) {
//Declare helper variable needed
$lookup = new LookupHelper;
$esi = new Esi;
if(isset($info->solar_system_id)) {
$solarName = $this->GetSolarSystemName($info->solar_system_id);
$solarName = $lookup->SolarSystemIdToName($info->solar_system_id);
} else {
Log::critical("Couldn't get solar system name for structure " . $structure->structure_id);
Log::critical("Check access lists.");
Log::critical("Couldn't get solar system name for structure " . $structure->structure_id . " in SaveNewStructure in StructureHelper.php");
$solarName = null;
}
@@ -260,20 +269,20 @@ class StructureHelper {
$st->state = 'None';
}
if(isset($structure->state_timer_start)) {
$st->state_timer_start = $this->DecodeDate($structure->state_timer_start);
$st->state_timer_start = $esi->DecodeDate($structure->state_timer_start);
}
if(isset($structure->state_timer_end)) {
$st->state_timer_end = $this->DecodeDate($structure->state_timer_end);
$st->state_timer_end = $esi->DecodeDate($structure->state_timer_end);
}
if(isset($structure->fuel_expires)) {
$st->fuel_expires = $this->DecodeDate($structure->fuel_expires);
$st->fuel_expires = $esi->DecodeDate($structure->fuel_expires);
}
$st->profile_id = $structure->profile_id;
$st->position_x = $info->position->x;
$st->position_y = $info->position->y;
$st->position_z = $info->position->z;
if(isset($structure->next_reinforce_apply)) {
$st->next_reinforce_apply = $this->DecodeDate($structure->next_reinforce_apply);
$st->next_reinforce_apply = $esi->DecodeDate($structure->next_reinforce_apply);
}
if(isset($structure->next_reinforce_hour)) {
$st->next_reinforce_hour = $structure->next_reinforce_hour;
@@ -286,7 +295,7 @@ class StructureHelper {
$st->reinforce_weekday = $structure->reinforce_weekday;
}
if(isset($structure->unanchors_at)) {
$daTi = $this->DecodeDate($structure->unanchors_at);
$daTi = $esi->DecodeDate($structure->unanchors_at);
$st->unanchors_at = $daTi;
}
@@ -304,7 +313,10 @@ class StructureHelper {
}
public function GetStructuresByType($type) {
$sType = $this->StructureTypeToId($type);
//Declare variable
$lookup = new LookupHelper;
$sType = $lookup->StructureNameToTypeId($type);
$structures = Structure::where([
'type_id' => $sType,
@@ -312,32 +324,6 @@ class StructureHelper {
return $structures;
}
private function StructureTypeToId($name) {
$structureTypes = [
'Ansiblex Jump Gate' => 35841,
'Pharolux Cyno Beacon' => 35840,
'Tenebrex Cyno Jammer' => 37534,
'Keepstar' => 35834,
'Fortizar' => 35833,
'Astrahus' => 35832,
'Tatara' => 35836,
'Athanor' => 35835,
'Sotiyo' => 35827,
'Azbel' => 35826,
'Raitaru' => 35825,
];
return $structureTypes[$name];
}
private function DecodeDate($date) {
$esiHelper = new Esi;
$dateTime = $esiHelper->DecodeDate($date);
return $dateTime;
}
}
?>

View File

@@ -9,15 +9,8 @@ use Carbon\Carbon;
use App\Models\User\User;
use App\Models\User\UserRole;
use App\Models\User\UserPermission;
use App\Models\Finances\ReprocessingTaxJournal;
use App\Models\Finances\StructureIndustryTaxJournal;
use App\Models\Finances\PlanetProductionTaxJournal;
use App\Models\Finances\OfficeFeesJournal;
use App\Models\Finances\JumpBridgeJournal;
use App\Models\Finances\PISaleJournal;
use App\Models\Finances\AllianceMarketJournal;
use App\Models\SRP\SRPShip;
use App\Models\Finances\AllianceWalletJournal;
use App\Models\MiningTax\Invoice;
class TaxesHelper {
@@ -33,11 +26,31 @@ class TaxesHelper {
$this->end = $en;
}
public function GetMoonMiningTaxesGross($start, $end) {
$revenue = 0.00;
$revenue = Invoice::where([
'status' => 'Paid',
])->whereBetween('date_issued', [$start, $end])
->sum('invoice_amount');
return $revenue;
}
public function GetMoonMiningTaxesLateGross($start, $end) {
$revenue = 0.00;
$revenue = Invoice::where([
'status' => 'Paid Late',
])->whereBetween('date_issued', [$start, $end])->sum('invoice_amount');
return $revenue;
}
public function GetAllianceMarketGross($start, $end) {
$revenue = 0.00;
$revenue = AllianceMarketJournal::where([
'second_party_id' => '98287666',
$revenue = AllianceWalletJournal::where([
'ref_type' => 'brokers_fee',
])->whereBetween('date', [$start, $end])
->sum('amount');
@@ -48,9 +61,8 @@ class TaxesHelper {
public function GetJumpGateGross($start, $end) {
$revenue = 0.00;
$revenue = JumpBridgeJournal::where([
$revenue = AllianceWalletJournal::where([
'ref_type' => 'structure_gate_jump',
'second_party_id' => '98287666',
])->whereBetween('date', [$start, $end])
->sum('amount');
@@ -60,9 +72,8 @@ class TaxesHelper {
public function GetIndustryGross($start, $end) {
$revenue = 0.00;
$revenue = StructureIndustryTaxJournal::where([
$revenue = AllianceWalletJournal::where([
'ref_type' => 'industry_job_tax',
'second_party_id' => '98287666',
])->whereBetween('date', [$start, $end])
->sum('amount');
@@ -72,9 +83,8 @@ class TaxesHelper {
public function GetReprocessingGross($start, $end) {
$revenue = 0.00;
$revenue = ReprocessingTaxJournal::where([
'ref_type' => 'reprocessing_tax',
'second_party_id' => '98287666',
$revenue = AllianceWalletJournal::where([
'ref_type' => 'reprocessing_tax',
])->whereBetween('date', [$start, $end])
->sum('amount');
@@ -86,16 +96,14 @@ class TaxesHelper {
$revenueExport = 0.00;
//Get the import revenue from the database
$revenueImport = PlanetProductionTaxJournal::where([
'ref_type' => 'planetary_import_tax',
'second_party_id' => '98287666',
$revenueImport = AllianceWalletJournal::where([
'ref_type' => 'planetary_import_tax',
])->whereBetween('date', [$start, $end])
->sum('amount');
//Get the export revenue from the database
$revenueExport = PlanetProductionTaxJournal::where([
'ref_type' => 'planetary_export_tax',
'second_party_id' => '98287666',
$revenueExport = AllianceWalletJournal::where([
'ref_type' => 'planetary_export_tax',
])->whereBetween('date', [$start, $end])
->sum('amount');
@@ -109,27 +117,14 @@ class TaxesHelper {
public function GetOfficeGross($start, $end) {
$revenue = 0.00;
$revenue = OfficeFeesJournal::where([
$revenue = AllianceWalletJournal::where([
'ref_type' => 'office_rental_fee',
'second_party_id' => '98287666',
])->whereBetween('date', [$start, $end])
->sum('amount');
return $revenue;
}
public function GetPiSalesGross($start, $end) {
$revenue = 0.00;
$grosses = PISaleJournal::whereBetween('date', [$start, $end])->get()->toArray();
foreach($grosses as $gross) {
$revenue += ($gross['quantity'] * $gross['unit_price']);
}
return $revenue;
}
/**
* Returns a set of dates from now until the amount of months has passed
*

View File

@@ -9,6 +9,9 @@ class AllowedLogin extends Model
//Table Name
public $table = 'allowed_logins';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = true;

View File

@@ -0,0 +1,41 @@
<?php
namespace App\Models\AfterActionReports;
use Illuminate\Database\Eloquent\Model;
class AfterActionReport extends Model
{
//Table Name
public $table = 'fc_after_action_reports';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = true;
/**
* The attributes that are mass assignable
*
* @var array
*/
protected $fillable = [
'fc_id',
'fc_name',
'formup_time',
'formup_location',
'comms',
'doctrine',
'objective',
'objective_result',
'summary',
'improvements',
'worked_well',
'additional_comments',
];
public function comments() {
return $this->hasMany(App\Models\AfterActionReports\AfterActionReportComment::class, 'report_id', 'id');
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Models\AfterActionReports;
use Illuminate\Database\Eloquent\Model;
class AfterActionReportComment extends Model
{
//Table Name
public $table = 'fc_aar_comments';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = true;
/**
* The attributes that are mass assignable
*
* @var array
*/
protected $fillable = [
'report_id',
'character_id',
'character_name',
'comments',
];
public function report() {
$this->belongsTo(App\Models\AfterActionReports\AfterActionReport::class, 'id', 'report_id');
}
}

View File

@@ -9,6 +9,9 @@ class BlacklistEntity extends Model
//Table Name
public $table = 'alliance_blacklist';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = true;

View File

@@ -9,6 +9,9 @@ class SupplyChainBid extends Model
//Table Name
public $table = 'supply_chain_bids';
//Primary Key
public $primaryKey = 'id';
// Timestamps
public $timestamps = true;
@@ -29,11 +32,11 @@ class SupplyChainBid extends Model
//Relationships
public function ContractId() {
return $this->hasOne('App\Models\Contracts\SupplyChainContract', 'contract_id', 'contract_id');
return $this->belongsTo(App\Models\Contracts\SupplyChainContract::class, 'contract_id', 'contract_id');
}
public function Contract() {
return $this->belongsTo(SupplyChainContract::class);
return $this->belongsTo(App\Models\Contracts\SupplyChainContract::class);
}
//Model functions

View File

@@ -9,6 +9,9 @@ class SupplyChainContract extends Model
//Table Name
public $table = 'supply_chain_contracts';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = true;

View File

@@ -9,6 +9,9 @@ class EsiScope extends Model
// Table Name
protected $table = 'EsiScopes';
//Primary Key
public $primaryKey = 'id';
// Timestamps
public $timestamps = true;
@@ -23,6 +26,6 @@ class EsiScope extends Model
];
public function user() {
return $this->belongsTo('App\Models\User\User', 'character_id', 'character_id');
return $this->belongsTo(App\Models\User\User::class, 'character_id', 'character_id');
}
}

View File

@@ -28,7 +28,11 @@ class EsiToken extends Model
'expires_in',
];
public function user() {
return $this->belongsTo(App\Models\User\User::class, 'character_id', 'character_id');
}
public function esiscopes() {
return $this->hasMany('App\Models\EsiScope', 'character_id', 'character_id');
return $this->hasMany(App\Models\EsiScope::class, 'character_id', 'character_id');
}
}

View File

@@ -11,6 +11,9 @@ class AllianceWalletJournal extends Model
*/
protected $table = 'alliance_wallet_journal';
//Primary Key
public $primaryKey = 'id';
/**
* Timestamps
*/

View File

@@ -9,6 +9,9 @@ class JobStatus extends Model
//Table Name
public $table = 'job_statuses';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestaps = true;

View File

@@ -9,6 +9,9 @@ class AllianceLookup extends Model
//Table Name
public $table = 'alliance_lookup';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = false;

View File

@@ -9,6 +9,9 @@ class CharacterLookup extends Model
//Table Name
public $table = 'character_lookup';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = false;

View File

@@ -9,6 +9,9 @@ class CorporationLookup extends Model
//Table Name
public $table = 'corporation_lookup';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = false;

View File

@@ -11,6 +11,9 @@ class ItemLookup extends Model
*/
public $table = 'item_lookup';
//Primary Key
public $primaryKey = 'id';
/**
* Timestamps
*/

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Models\Lookups;
use Illuminate\Database\Eloquent\Model;
class MoonLookup extends Model
{
/**
* Table Name
*/
public $table = 'moon_lookup';
/**
* Primary Key
*/
public $primaryKey = 'id';
/**
* Timestamps
*/
public $timestamps = false;
/**
* The attributes that are mass assignable
*
* @var array
*/
protected $fillable = [
'moon_id',
'name',
'position_x',
'position_y',
'position_z',
'system_id',
];
}

View File

@@ -9,6 +9,9 @@ class SolarSystem extends Model
//Table Name
public $table = 'solar_systems';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = false;

View File

@@ -9,6 +9,9 @@ class SentMail extends Model
//Table Name
protected $table = 'sent_mails';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = false;

View File

@@ -9,6 +9,9 @@ class Invoice extends Model
//Table Name
protected $table = 'alliance_mining_tax_invoices';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = true;
@@ -25,10 +28,11 @@ class Invoice extends Model
'date_issued',
'date_due',
'status',
'mail_body',
];
public function getPayment() {
return $this->hasMany('App\Models\MiningTax\Payment', 'invoice_id', 'invoice_id');
return $this->hasOne(App\Models\MiningTax\Payment::class, 'invoice_id', 'invoice_id');
}
public function getCharacterId() {
@@ -44,7 +48,7 @@ class Invoice extends Model
}
public function getLedgers() {
return $this->hasMany('App\Models\MiningTax\Ledger', 'invoice_id', 'invoice_id');
return $this->hasMany(App\Models\MiningTax\Ledger::class, 'invoice_id', 'invoice_id');
}
public function getInvoiceAmount() {

View File

@@ -9,6 +9,9 @@ class Ledger extends Model
//Table Name
protected $table = 'alliance_mining_tax_ledgers';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = false;
@@ -31,7 +34,7 @@ class Ledger extends Model
];
public function getInvoice() {
return $this->belongsTo('App\Models\MiningTax\Invoice', 'invoice_id', 'invoice_id');
return $this->belongsTo(App\Models\MiningTax\Invoice::class, 'invoice_id', 'invoice_id');
}

View File

@@ -9,6 +9,9 @@ class Observer extends Model
//Table Name
protected $table = 'alliance_mining_tax_observers';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = true;
@@ -21,11 +24,8 @@ class Observer extends Model
'last_updated',
'observer_id',
'observer_type',
];
public function getLedgers() {
return $this->hasMany('App\Models\MiningTax\Ledger', 'observer_id', 'observer_id');
}
'observer_name',
'solar_system_name',
'solar_system_id',
];
}

View File

@@ -9,6 +9,9 @@ class Payment extends Model
//Table Name
protected $table = 'alliance_mining_tax_payments';
//Primary Key
public $primaryKey = 'id';
//Timestamps
public $timestamps = true;
@@ -28,6 +31,6 @@ class Payment extends Model
];
public function getInvoice() {
return $this->belongsTo('App\Models\MiningTax\Invoice', 'invoice_id', 'invoice_id');
return $this->belongsTo(App\Models\MiningTax\Invoice::class, 'invoice_id', 'invoice_id');
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class RentalInvoice extends Model
{
//
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class RentalLedger extends Model
{
//
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class RentalPayment extends Model
{
//
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class RentalStructure extends Model
{
//
}

View File

@@ -9,6 +9,9 @@ class Config extends Model
// Table Name
protected $table = 'Config';
//Primary Key
public $primaryKey = 'id';
// Timestamps
public $timestamps = false;

View File

@@ -9,6 +9,9 @@ class ItemComposition extends Model
// Table Name
protected $table = 'ItemComposition';
//Primary Key
public $primaryKey = 'id';
// Timestamps
public $timestamps = false;
}

View File

@@ -0,0 +1,38 @@
<?php
namespace App\Models\MoonRental;
use Illuminate\Database\Eloquent\Model;
class AllianceMoon extends Model
{
/**
* Table Name
*/
public $table = 'alliance_moons';
/**
* Primary Key
*/
public $primaryKey = 'id';
/**
* Timestamps
*/
public $timestamps = true;
/**
* The attributes that are mass assignable
*
* @var array
*/
protected $fillable = [
'moon_id',
'name',
'system_id'
'system_name',
'worth_amount',
'rented',
'rental_amount',
];
}

View File

@@ -0,0 +1,35 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class AllianceMoonOre extends Model
{
/**
* Table Name
*/
public $table = 'alliance_moon_ores';
/**
* Primary Key
*/
public $primaryKey = 'id';
/**
* Timestamps
*/
public $timestamps = false;
/**
* The attributes that are mass assignable
*
* @var array
*/
protected $fillable = [
'moon_id',
'name',
'ore_type_id',
'ore_name',
];
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Models\MoonRental;
use Illuminate\Database\Eloquent\Model;
class AllianceMoonRental extends Model
{
/**
* Table Name
*/
public $table = 'alliance_moon_rentals';
/**
* Primary Key
*/
public $primaryKey = 'id';
/**
* Timestamps
*/
public $timestamps = true;
/**
* The attributes that are mass assignable
*
* @var array
*/
protected $fillable = [
'moon_id',
'moon_name',
'rental_amount',
'rental_start',
'rental_end',
'next_billing_date',
'entity_id',
'entity_name',
'entity_type',
];
}

View File

@@ -14,4 +14,14 @@ class SrpFleetType extends Model
//Timestamps
public $timestamps = false;
/**
* The attributes that are mass assignable
*
* @var array
*/
protected $fillable = [
'code',
'description',
];
}

View File

@@ -22,6 +22,6 @@ class SrpPayout extends Model
];
public function shipType() {
return $this->belongsTo(SrpShipType::class);
return $this->belongsTo(SrpShipType::class, 'code', 'code');
}
}

View File

@@ -22,6 +22,10 @@ class SrpShipType extends Model
];
public function costCode() {
return $this->hasOne('App\Models\SRP\SrpPayout', 'code', 'code');
return $this->hasOne(App\Models\SRP\SrpPayout::class, 'code', 'code');
}
public function fleetType() {
return $this->belongsTo(App\Models\SRP\SrpFleetType::class, 'code', 'code');
}
}

View File

@@ -6,10 +6,13 @@ use Illuminate\Database\Eloquent\Model;
class ScheduleJob extends Model
{
//Table Name
protected $table = 'schedule_jobs';
//Timestamps
public $timestamps = true;
//Primary Key
public $primaryKey = 'id';
protected $fillable = [

View File

@@ -34,6 +34,11 @@ class Asset extends Model
'location_type',
'quantity',
'type_id',
'created_at',
'updated_at',
];
public function structure() {
return $this->belongsTo(App\Models\Structure\Structure::class, 'structure_id', 'location_id');
}
}

View File

@@ -10,7 +10,7 @@ class Service extends Model
public $table = 'alliance_services';
//Timestamps
public $timestamps = false;
public $timestamps = true;
//Primary Key
public $primaryKey = 'id';
@@ -24,9 +24,11 @@ class Service extends Model
'structure_id',
'name',
'state',
'created_at',
'updated_at',
];
public function structure() {
return $this->hasOne('App\Models\Structure\Structure', 'structure_id', 'structure_id');
return $this->belongsTo(App\Models\Structure\Structure::class, 'structure_id', 'structure_id');
}
}

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