aa-ledger 0.9.8__py3-none-any.whl → 0.9.9.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. {aa_ledger-0.9.8.dist-info → aa_ledger-0.9.9.1.dist-info}/METADATA +3 -1
  2. {aa_ledger-0.9.8.dist-info → aa_ledger-0.9.9.1.dist-info}/RECORD +78 -76
  3. ledger/__init__.py +9 -9
  4. ledger/api/api_helper/billboard_helper.py +55 -26
  5. ledger/api/ledger/admin.py +1 -1
  6. ledger/app_settings.py +18 -11
  7. ledger/constants.py +5 -0
  8. ledger/decorators.py +92 -11
  9. ledger/helpers/alliance.py +119 -91
  10. ledger/helpers/character.py +260 -252
  11. ledger/helpers/core.py +565 -565
  12. ledger/helpers/corporation.py +237 -187
  13. ledger/helpers/etag.py +2 -1
  14. ledger/helpers/ref_type.py +475 -475
  15. ledger/locale/cs_CZ/LC_MESSAGES/django.po +942 -932
  16. ledger/locale/de/LC_MESSAGES/django.mo +0 -0
  17. ledger/locale/de/LC_MESSAGES/django.po +961 -945
  18. ledger/locale/django.pot +942 -932
  19. ledger/locale/es/LC_MESSAGES/django.po +943 -933
  20. ledger/locale/fr_FR/LC_MESSAGES/django.po +942 -932
  21. ledger/locale/it_IT/LC_MESSAGES/django.po +942 -932
  22. ledger/locale/ja/LC_MESSAGES/django.po +943 -933
  23. ledger/locale/ko_KR/LC_MESSAGES/django.po +942 -932
  24. ledger/locale/nl_NL/LC_MESSAGES/django.po +942 -932
  25. ledger/locale/pl_PL/LC_MESSAGES/django.po +942 -932
  26. ledger/locale/ru/LC_MESSAGES/django.po +945 -935
  27. ledger/locale/sk/LC_MESSAGES/django.po +944 -934
  28. ledger/locale/uk/LC_MESSAGES/django.po +946 -936
  29. ledger/locale/zh_Hans/LC_MESSAGES/django.po +943 -933
  30. ledger/managers/character_mining_manager.py +66 -19
  31. ledger/managers/character_planetary_manager.py +1 -1
  32. ledger/migrations/0016_characterminingledger_price_per_unit.py +21 -0
  33. ledger/models/characteraudit.py +32 -1
  34. ledger/static/ledger/css/cards.css +1 -1
  35. ledger/static/ledger/css/table.css +1 -1
  36. ledger/static/ledger/js/charts.js +7 -227
  37. ledger/static/ledger/js/planetary.js +1 -0
  38. ledger/tasks.py +1 -8
  39. ledger/templates/ledger/allyledger/admin/alliance_administration.html +17 -8
  40. ledger/templates/ledger/allyledger/admin/alliance_overview.html +75 -89
  41. ledger/templates/ledger/allyledger/alliance_ledger.html +8 -10
  42. ledger/templates/ledger/bundles/ally-administration-bundles.html +2 -0
  43. ledger/templates/ledger/bundles/char-administration-bundles.html +2 -0
  44. ledger/templates/ledger/bundles/character-ledger-bundles.html +66 -64
  45. ledger/templates/ledger/bundles/corp-administration-bundles.html +2 -0
  46. ledger/templates/ledger/bundles/corporation-ledger-bundles.html +75 -73
  47. ledger/templates/ledger/charledger/admin/character_administration.html +10 -8
  48. ledger/templates/ledger/charledger/admin/character_overview.html +69 -86
  49. ledger/templates/ledger/charledger/character_ledger.html +11 -15
  50. ledger/templates/ledger/charledger/planetary/planetary_ledger.html +2 -6
  51. ledger/templates/ledger/corpledger/admin/corporation_administration.html +10 -8
  52. ledger/templates/ledger/corpledger/admin/corporation_overview.html +71 -83
  53. ledger/templates/ledger/corpledger/corporation_ledger.html +55 -14
  54. ledger/templates/ledger/partials/administration/alliance.html +28 -49
  55. ledger/templates/ledger/partials/administration/alliance_corporations.html +58 -0
  56. ledger/templates/ledger/partials/administration/corporation_characters.html +26 -28
  57. ledger/templates/ledger/partials/information/daily.html +1 -1
  58. ledger/templates/ledger/partials/information/day.html +1 -7
  59. ledger/templates/ledger/partials/information/hourly.html +1 -7
  60. ledger/templates/ledger/partials/information/summary.html +88 -84
  61. ledger/templates/ledger/partials/information/view_character_content.html +35 -35
  62. ledger/templates/ledger/partials/table/char-ledger.html +14 -5
  63. ledger/templates/ledger/partials/table/corp-ledger.html +3 -3
  64. ledger/templates/ledger/partials/view/card.html +2 -2
  65. ledger/tests/test_decarators.py +102 -17
  66. ledger/tests/test_helpers/test_etag.py +7 -6
  67. ledger/tests/test_managers/test_character_mining_manager.py +2 -1
  68. ledger/tests/test_models/test_characterminingledger.py +38 -2
  69. ledger/tests/test_tasks.py +4 -4
  70. ledger/tests/test_templatetags.py +5 -2
  71. ledger/tests/test_views/test_access.py +852 -852
  72. ledger/tests/testdata/esi.json +1 -2
  73. ledger/tests/testdata/eveuniverse.json +90 -48
  74. ledger/urls.py +66 -21
  75. ledger/views/alliance/alliance_ledger.py +4 -3
  76. ledger/views/corporation/corporation_ledger.py +25 -9
  77. {aa_ledger-0.9.8.dist-info → aa_ledger-0.9.9.1.dist-info}/WHEEL +0 -0
  78. {aa_ledger-0.9.8.dist-info → aa_ledger-0.9.9.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,475 +1,475 @@
1
- """Helpers for wallet journals."""
2
-
3
- # Standard Library
4
- import enum
5
- from typing import TYPE_CHECKING
6
-
7
- # Django
8
- from django.utils.translation import gettext as _
9
-
10
- # Alliance Auth
11
- from allianceauth.services.hooks import get_extension_logger
12
-
13
- # Alliance Auth (External Libs)
14
- from app_utils.logging import LoggerAddTag
15
-
16
- # AA Ledger
17
- from ledger import __title__
18
-
19
- if TYPE_CHECKING:
20
- # AA Ledger
21
- from ledger.helpers.core import LedgerEntity
22
-
23
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
24
-
25
-
26
- # Unified Journal Reference Type Enum - All ref types in one place
27
- class JournalRefType(enum.Enum):
28
- """All wallet journal reference types unified."""
29
-
30
- # Original ref types
31
- PLAYER_TRADING = 1
32
- MARKET_TRANSACTION = 2
33
- GM_CASH_TRANSFER = 3
34
- MISSION_REWARD = 7
35
- CLONE_ACTIVATION = 8
36
- INHERITANCE = 9
37
- PLAYER_DONATION = 10
38
- CORPORATION_PAYMENT = 11
39
- DOCKING_FEE = 12
40
- OFFICE_RENTAL_FEE = 13
41
- FACTORY_SLOT_RENTAL_FEE = 14
42
- REPAIR_BILL = 15
43
- BOUNTY = 16
44
- BOUNTY_PRIZE = 17
45
- INSURANCE = 19
46
- MISSION_EXPIRATION = 20
47
- MISSION_COMPLETION = 21
48
- SHARES = 22
49
- COURIER_MISSION_ESCROW = 23
50
- MISSION_COST = 24
51
- AGENT_MISCELLANEOUS = 25
52
- LP_STORE = 26
53
- AGENT_LOCATION_SERVICES = 27
54
- AGENT_DONATION = 28
55
- AGENT_SECURITY_SERVICES = 29
56
- AGENT_MISSION_COLLATERAL_PAID = 30
57
- AGENT_MISSION_COLLATERAL_REFUNDED = 31
58
- AGENTS_PREWARD = 32
59
- AGENT_MISSION_REWARD = 33
60
- AGENT_MISSION_TIME_BONUS_REWARD = 34
61
- CSPA = 35
62
- CSPAOFFLINEREFUND = 36
63
- CORPORATION_ACCOUNT_WITHDRAWAL = 37
64
- CORPORATION_DIVIDEND_PAYMENT = 38
65
- CORPORATION_REGISTRATION_FEE = 39
66
- CORPORATION_LOGO_CHANGE_COST = 40
67
- RELEASE_OF_IMPOUNDED_PROPERTY = 41
68
- MARKET_ESCROW = 42
69
- AGENT_SERVICES_RENDERED = 43
70
- MARKET_FINE_PAID = 44
71
- CORPORATION_LIQUIDATION = 45
72
- BROKERS_FEE = 46
73
- CORPORATION_BULK_PAYMENT = 47
74
- ALLIANCE_REGISTRATION_FEE = 48
75
- WAR_FEE = 49
76
- ALLIANCE_MAINTAINANCE_FEE = 50
77
- CONTRABAND_FINE = 51
78
- CLONE_TRANSFER = 52
79
- ACCELERATION_GATE_FEE = 53
80
- TRANSACTION_TAX = 54
81
- JUMP_CLONE_INSTALLATION_FEE = 55
82
- MANUFACTURING = 56
83
- RESEARCHING_TECHNOLOGY = 57
84
- RESEARCHING_TIME_PRODUCTIVITY = 58
85
- RESEARCHING_MATERIAL_PRODUCTIVITY = 59
86
- COPYING = 60
87
- REVERSE_ENGINEERING = 62
88
- CONTRACT_AUCTION_BID = 63
89
- CONTRACT_AUCTION_BID_REFUND = 64
90
- CONTRACT_COLLATERAL = 65
91
- CONTRACT_REWARD_REFUND = 66
92
- CONTRACT_AUCTION_SOLD = 67
93
- CONTRACT_REWARD = 68
94
- CONTRACT_COLLATERAL_REFUND = 69
95
- CONTRACT_COLLATERAL_PAYOUT = 70
96
- CONTRACT_PRICE = 71
97
- CONTRACT_BROKERS_FEE = 72
98
- CONTRACT_SALES_TAX = 73
99
- CONTRACT_DEPOSIT = 74
100
- CONTRACT_DEPOSIT_SALES_TAX = 75
101
- CONTRACT_AUCTION_BID_CORP = 77
102
- CONTRACT_COLLATERAL_DEPOSITED_CORP = 78
103
- CONTRACT_PRICE_PAYMENT_CORP = 79
104
- CONTRACT_BROKERS_FEE_CORP = 80
105
- CONTRACT_DEPOSIT_CORP = 81
106
- CONTRACT_DEPOSIT_REFUND = 82
107
- CONTRACT_REWARD_DEPOSITED = 83
108
- CONTRACT_REWARD_DEPOSITED_CORP = 84
109
- BOUNTY_PRIZES = 85
110
- ADVERTISEMENT_LISTING_FEE = 86
111
- MEDAL_CREATION = 87
112
- MEDAL_ISSUED = 88
113
- DNA_MODIFICATION_FEE = 90
114
- SOVEREIGNITY_BILL = 91
115
- BOUNTY_PRIZE_CORPORATION_TAX = 92
116
- AGENT_MISSION_REWARD_CORPORATION_TAX = 93
117
- AGENT_MISSION_TIME_BONUS_REWARD_CORPORATION_TAX = 94
118
- UPKEEP_ADJUSTMENT_FEE = 95
119
- PLANETARY_IMPORT_TAX = 96
120
- PLANETARY_EXPORT_TAX = 97
121
- PLANETARY_CONSTRUCTION = 98
122
- CORPORATE_REWARD_PAYOUT = 99
123
- BOUNTY_SURCHARGE = 101
124
- CONTRACT_REVERSAL = 102
125
- CORPORATE_REWARD_TAX = 103
126
- STORE_PURCHASE = 106
127
- STORE_PURCHASE_REFUND = 107
128
- DATACORE_FEE = 112
129
- WAR_FEE_SURRENDER = 113
130
- WAR_ALLY_CONTRACT = 114
131
- BOUNTY_REIMBURSEMENT = 115
132
- KILL_RIGHT_FEE = 116
133
- SECURITY_PROCESSING_FEE = 117
134
- INDUSTRY_JOB_TAX = 120
135
- INFRASTRUCTURE_HUB_MAINTENANCE = 122
136
- ASSET_SAFETY_RECOVERY_TAX = 123
137
- OPPORTUNITY_REWARD = 124
138
- PROJECT_DISCOVERY_REWARD = 125
139
- PROJECT_DISCOVERY_TAX = 126
140
- REPROCESSING_TAX = 127
141
- JUMP_CLONE_ACTIVATION_FEE = 128
142
- OPERATION_BONUS = 129
143
- RESOURCE_WARS_REWARD = 131
144
- DUEL_WAGER_ESCROW = 132
145
- DUEL_WAGER_PAYMENT = 133
146
- DUEL_WAGER_REFUND = 134
147
- REACTION = 135
148
-
149
- # V3 additions
150
- STRUCTURE_GATE_JUMP = 140
151
-
152
- # V4 additions
153
- EXTERNAL_TRADE_FREEZE = 136
154
- EXTERNAL_TRADE_THAW = 137
155
- EXTERNAL_TRADE_DELIVERY = 138
156
- SEASON_CHALLENGE_REWARD = 139
157
- SKILL_PURCHASE = 141
158
- ITEM_TRADER_PAYMENT = 142
159
- FLUX_TICKET_SALE = 143
160
- FLUX_PAYOUT = 144
161
- FLUX_TAX = 145
162
- FLUX_TICKET_REPAYMENT = 146
163
- REDEEMED_ISK_TOKEN = 147
164
- DAILY_CHALLENGE_REWARD = 148
165
- MARKET_PROVIDER_TAX = 149
166
- ESS_ESCROW_TRANSFER = 155
167
- MILESTONE_REWARD_PAYMENT = 156
168
- UNDER_CONSTRUCTION = 166
169
- ALLIGNMENT_BASED_GATE_TOLL = 168
170
- PROJECT_PAYOUTS = 170
171
- INSURGENCY_CORRUPTION_CONTRIBUTION_REWARD = 172
172
- INSURGENCY_SUPPRESSION_CONTRIBUTION_REWARD = 173
173
- DAILY_GOAL_PAYOUTS = 174
174
- DAILY_GOAL_PAYOUTS_TAX = 175
175
- COSMETIC_MARKET_COMPONENT_ITEM_PURCHASE = 178
176
- COSMETIC_MARKET_SKIN_SALE_BROKER_FEE = 179
177
- COSMETIC_MARKET_SKIN_PURCHASE = 180
178
- COSMETIC_MARKET_SKIN_SALE = 181
179
- COSMETIC_MARKET_SKIN_SALE_TAX = 182
180
- COSMETIC_MARKET_SKIN_TRANSACTION = 183
181
- SKYHOOK_CLAIM_FEE = 184
182
- AIR_CAREER_PROGRAM_REWARD = 185
183
- FREELANCE_JOBS_DURATION_FEE = 186
184
- FREELANCE_JOBS_BROADCASTING_FEE = 187
185
- FREELANCE_JOBS_REWARD_ESCROW = 188
186
- FREELANCE_JOBS_REWARD = 189
187
- FREELANCE_JOBS_ESCROW_REFUND = 190
188
- FREELANCE_JOBS_REWARD_CORPORATION_TAX = 191
189
- GM_PLEX_FEE_REFUND = 192
190
-
191
-
192
- class RefTypeManager:
193
- """Categories for wallet journal reference types."""
194
-
195
- # Translations for reference types
196
- _("Corporation Contract")
197
- _("Corporation Withdrawal")
198
- _("Mission Reward")
199
- _("Market")
200
- _("Daily Goal Reward")
201
- _("Structure Rental")
202
-
203
- # Assets/Items
204
- ASSETS = [
205
- JournalRefType.REPAIR_BILL.name.lower(),
206
- JournalRefType.ASSET_SAFETY_RECOVERY_TAX.name.lower(),
207
- JournalRefType.REPROCESSING_TAX.name.lower(),
208
- JournalRefType.ITEM_TRADER_PAYMENT.name.lower(),
209
- ]
210
-
211
- # PVE Income
212
- BOUNTY_PRIZES = [
213
- JournalRefType.BOUNTY.name.lower(),
214
- JournalRefType.BOUNTY_PRIZE.name.lower(),
215
- JournalRefType.BOUNTY_PRIZES.name.lower(),
216
- JournalRefType.BOUNTY_REIMBURSEMENT.name.lower(),
217
- JournalRefType.BOUNTY_SURCHARGE.name.lower(),
218
- ]
219
-
220
- CONTRACT = [
221
- JournalRefType.CONTRACT_AUCTION_BID.name.lower(),
222
- JournalRefType.CONTRACT_AUCTION_BID_REFUND.name.lower(),
223
- JournalRefType.CONTRACT_COLLATERAL.name.lower(),
224
- JournalRefType.CONTRACT_REWARD_REFUND.name.lower(),
225
- JournalRefType.CONTRACT_AUCTION_SOLD.name.lower(),
226
- JournalRefType.CONTRACT_REWARD.name.lower(),
227
- JournalRefType.CONTRACT_COLLATERAL_REFUND.name.lower(),
228
- JournalRefType.CONTRACT_COLLATERAL_PAYOUT.name.lower(),
229
- JournalRefType.CONTRACT_PRICE.name.lower(),
230
- JournalRefType.CONTRACT_BROKERS_FEE.name.lower(),
231
- JournalRefType.CONTRACT_SALES_TAX.name.lower(),
232
- JournalRefType.CONTRACT_DEPOSIT.name.lower(),
233
- JournalRefType.CONTRACT_DEPOSIT_SALES_TAX.name.lower(),
234
- JournalRefType.CONTRACT_AUCTION_BID_CORP.name.lower(),
235
- JournalRefType.CONTRACT_COLLATERAL_DEPOSITED_CORP.name.lower(),
236
- JournalRefType.CONTRACT_DEPOSIT_CORP.name.lower(),
237
- JournalRefType.CONTRACT_DEPOSIT_REFUND.name.lower(),
238
- JournalRefType.CONTRACT_REWARD_DEPOSITED.name.lower(),
239
- JournalRefType.CONTRACT_REWARD_DEPOSITED_CORP.name.lower(),
240
- JournalRefType.CONTRACT_REVERSAL.name.lower(),
241
- ]
242
-
243
- CORPORATION_ADMINISTRATION = [
244
- JournalRefType.CORPORATION_DIVIDEND_PAYMENT.name.lower(),
245
- JournalRefType.CORPORATION_REGISTRATION_FEE.name.lower(),
246
- JournalRefType.CORPORATION_LOGO_CHANGE_COST.name.lower(),
247
- JournalRefType.CORPORATION_BULK_PAYMENT.name.lower(),
248
- JournalRefType.ADVERTISEMENT_LISTING_FEE.name.lower(),
249
- ]
250
-
251
- CORPORATION_CONTRACT = [
252
- JournalRefType.CONTRACT_PRICE_PAYMENT_CORP.name.lower(),
253
- ]
254
-
255
- CORPORATION_DONATION = [
256
- JournalRefType.CORPORATION_ACCOUNT_WITHDRAWAL.name.lower(),
257
- ]
258
-
259
- DAILY_GOAL_REWARD = [
260
- JournalRefType.DAILY_GOAL_PAYOUTS.name.lower(),
261
- JournalRefType.DAILY_CHALLENGE_REWARD.name.lower(),
262
- JournalRefType.SEASON_CHALLENGE_REWARD.name.lower(),
263
- JournalRefType.OPPORTUNITY_REWARD.name.lower(),
264
- JournalRefType.AIR_CAREER_PROGRAM_REWARD.name.lower(),
265
- ]
266
-
267
- DONATION = [
268
- JournalRefType.PLAYER_DONATION.name.lower(),
269
- JournalRefType.AGENT_DONATION.name.lower(),
270
- ]
271
-
272
- ESS_TRANSFER = [
273
- JournalRefType.ESS_ESCROW_TRANSFER.name.lower(),
274
- ]
275
-
276
- FREELANCE_JOBS = [
277
- JournalRefType.FREELANCE_JOBS_DURATION_FEE.name.lower(),
278
- JournalRefType.FREELANCE_JOBS_BROADCASTING_FEE.name.lower(),
279
- JournalRefType.FREELANCE_JOBS_REWARD_ESCROW.name.lower(),
280
- JournalRefType.FREELANCE_JOBS_REWARD.name.lower(),
281
- JournalRefType.FREELANCE_JOBS_ESCROW_REFUND.name.lower(),
282
- JournalRefType.FREELANCE_JOBS_REWARD_CORPORATION_TAX.name.lower(),
283
- ]
284
-
285
- INCURSION = [
286
- JournalRefType.RESOURCE_WARS_REWARD.name.lower(),
287
- JournalRefType.INSURGENCY_CORRUPTION_CONTRIBUTION_REWARD.name.lower(),
288
- JournalRefType.INSURGENCY_SUPPRESSION_CONTRIBUTION_REWARD.name.lower(),
289
- JournalRefType.CORPORATE_REWARD_PAYOUT.name.lower(),
290
- ]
291
-
292
- INSURANCE = [
293
- JournalRefType.INSURANCE.name.lower(),
294
- ]
295
-
296
- LP = [
297
- JournalRefType.LP_STORE.name.lower(),
298
- ]
299
-
300
- MARKET = [
301
- JournalRefType.MARKET_TRANSACTION.name.lower(),
302
- JournalRefType.MARKET_ESCROW.name.lower(),
303
- JournalRefType.BROKERS_FEE.name.lower(),
304
- JournalRefType.TRANSACTION_TAX.name.lower(),
305
- JournalRefType.MARKET_FINE_PAID.name.lower(),
306
- JournalRefType.MARKET_PROVIDER_TAX.name.lower(),
307
- ]
308
-
309
- MILESTONE_REWARD = [
310
- JournalRefType.MILESTONE_REWARD_PAYMENT.name.lower(),
311
- JournalRefType.PROJECT_DISCOVERY_REWARD.name.lower(),
312
- JournalRefType.PROJECT_PAYOUTS.name.lower(),
313
- ]
314
-
315
- MISSION_REWARD = [
316
- JournalRefType.MISSION_REWARD.name.lower(),
317
- JournalRefType.MISSION_COMPLETION.name.lower(),
318
- JournalRefType.AGENT_MISSION_REWARD.name.lower(),
319
- JournalRefType.AGENT_MISSION_TIME_BONUS_REWARD.name.lower(),
320
- JournalRefType.AGENTS_PREWARD.name.lower(),
321
- ]
322
-
323
- PLANETARY = [
324
- JournalRefType.PLANETARY_IMPORT_TAX.name.lower(),
325
- JournalRefType.PLANETARY_EXPORT_TAX.name.lower(),
326
- JournalRefType.PLANETARY_CONSTRUCTION.name.lower(),
327
- ]
328
-
329
- PRODUCTION = [
330
- JournalRefType.MANUFACTURING.name.lower(),
331
- JournalRefType.RESEARCHING_TECHNOLOGY.name.lower(),
332
- JournalRefType.RESEARCHING_TIME_PRODUCTIVITY.name.lower(),
333
- JournalRefType.RESEARCHING_MATERIAL_PRODUCTIVITY.name.lower(),
334
- JournalRefType.COPYING.name.lower(),
335
- JournalRefType.REVERSE_ENGINEERING.name.lower(),
336
- JournalRefType.INDUSTRY_JOB_TAX.name.lower(),
337
- JournalRefType.REACTION.name.lower(),
338
- ]
339
-
340
- STRUCTURE_RENTAL = [
341
- JournalRefType.OFFICE_RENTAL_FEE.name.lower(),
342
- JournalRefType.FACTORY_SLOT_RENTAL_FEE.name.lower(),
343
- JournalRefType.SOVEREIGNITY_BILL.name.lower(),
344
- JournalRefType.INFRASTRUCTURE_HUB_MAINTENANCE.name.lower(),
345
- ]
346
-
347
- SKILL = [
348
- JournalRefType.SKILL_PURCHASE.name.lower(),
349
- JournalRefType.DATACORE_FEE.name.lower(),
350
- ]
351
-
352
- TRAVELING = [
353
- JournalRefType.DOCKING_FEE.name.lower(),
354
- JournalRefType.ACCELERATION_GATE_FEE.name.lower(),
355
- JournalRefType.JUMP_CLONE_INSTALLATION_FEE.name.lower(),
356
- JournalRefType.JUMP_CLONE_ACTIVATION_FEE.name.lower(),
357
- JournalRefType.CLONE_ACTIVATION.name.lower(),
358
- JournalRefType.CLONE_TRANSFER.name.lower(),
359
- JournalRefType.STRUCTURE_GATE_JUMP.name.lower(),
360
- JournalRefType.ALLIGNMENT_BASED_GATE_TOLL.name.lower(),
361
- ]
362
-
363
- @classmethod
364
- def get_ref_types_from_category(cls, category: str) -> list[str]:
365
- """Get all ref types from a specific category."""
366
- if hasattr(cls, category):
367
- return getattr(cls, category)
368
- logger.debug(f"Category '{category}' does not exist in RefTypeCategories.")
369
- return []
370
-
371
- @classmethod
372
- def get_all_categories(cls) -> dict[str, list[str]]:
373
- """Get all categories and their ref types, sorted alphabetically by key in the dict literal. Add NO_CATEGORY for missing JournalRefType."""
374
- categories = {
375
- "ASSETS": cls.ASSETS,
376
- "CONTRACT": cls.CONTRACT,
377
- "CORPORATION_ADMINISTRATION": cls.CORPORATION_ADMINISTRATION,
378
- "CORPORATION_CONTRACT": cls.CORPORATION_CONTRACT,
379
- "CORPORATION_WITHDRAWAL": cls.CORPORATION_DONATION,
380
- "DAILY_GOAL_REWARD": cls.DAILY_GOAL_REWARD,
381
- "DONATION": cls.DONATION,
382
- "FREELANCE_JOBS": cls.FREELANCE_JOBS,
383
- "INCURSION": cls.INCURSION,
384
- "INSURANCE": cls.INSURANCE,
385
- "LP": cls.LP,
386
- "MARKET": cls.MARKET,
387
- "MISSION_REWARD": cls.MISSION_REWARD,
388
- "PLANETARY": cls.PLANETARY,
389
- "PRODUCTION": cls.PRODUCTION,
390
- "SKILL": cls.SKILL,
391
- "STRUCTURE_RENTAL": cls.STRUCTURE_RENTAL,
392
- "TRAVELING": cls.TRAVELING,
393
- }
394
-
395
- # Alle zugeordneten ref_types sammeln
396
- assigned = set()
397
- for ref_types in categories.values():
398
- assigned.update(ref_types)
399
-
400
- # Alle JournalRefType-Namen in Kleinbuchstaben
401
- all_types = {jt.name.lower() for jt in JournalRefType}
402
-
403
- # Exclude Bounty and ESS
404
- pve = set()
405
- # Bounty-Prizes
406
- if hasattr(cls, "BOUNTY_PRIZES"):
407
- pve.update(cls.BOUNTY_PRIZES)
408
- # ESS Transfer
409
- if hasattr(cls, "ESS_TRANSFER"):
410
- pve.update(cls.ESS_TRANSFER)
411
-
412
- # Nicht zugeordnete Typen bestimmen, aber special auslassen
413
- not_defined = sorted((all_types - assigned) - pve)
414
- if not_defined:
415
- categories["NOT_DEFINED_CATEGORY"] = not_defined
416
-
417
- return categories
418
-
419
- @classmethod
420
- def all_ref_types(cls) -> list[str]:
421
- """Get all ref types from all categories."""
422
- all_ref_types = cls.get_all_categories()
423
- ref_types_items = []
424
- for __, ref_types in all_ref_types.items():
425
- ref_types_items.extend(ref_types)
426
- return ref_types_items
427
-
428
- @staticmethod
429
- def special_cases(row: dict, ids: set[int], account_char_ids: set[int]) -> bool:
430
- """Handle special cases in Ledger."""
431
- if isinstance(row, dict) is False:
432
- logger.debug("Row is not a dictionary, skipping special case checks.")
433
- return False
434
-
435
- # Skip Market Transactions from buyer between the corporation and its members (only count transactions from creator)
436
- if row["ref_type"] == "market_transaction" and row["first_party_id"] in ids:
437
- return True
438
-
439
- # Skip Contract if Contract Creator is Registered as a Member of the Corporation (only count the contract creator)
440
- if (
441
- row["ref_type"] == "contract_price_payment_corp"
442
- and row["first_party_id"] in account_char_ids
443
- and row["second_party_id"] in ids
444
- ):
445
- return True
446
- return False
447
-
448
- @staticmethod
449
- def special_cases_details(
450
- value: list,
451
- entity: "LedgerEntity",
452
- kwargs: dict[str, int],
453
- journal_type: str,
454
- char_ids: set[int] = None,
455
- ) -> bool:
456
- """Handle special cases in Ledger for Details View."""
457
- # Skip Contract if Contract Creator is Registered as a Member of the Corporation (only count the contract creator)
458
- if (
459
- "contract_price_payment_corp" in value
460
- and entity.type == "character"
461
- and journal_type == "corporation"
462
- ): # Only Count Contract Creator
463
- kwargs["first_party"] = entity.entity_id
464
- return kwargs
465
-
466
- # Skip Player Donation if it is to own alts
467
- if (
468
- "player_donation" in value
469
- and entity.is_eve_character
470
- and journal_type == "character"
471
- ):
472
- if char_ids is None:
473
- return kwargs
474
- kwargs["exclude"] = char_ids
475
- return kwargs
1
+ """Helpers for wallet journals."""
2
+
3
+ # Standard Library
4
+ import enum
5
+ from typing import TYPE_CHECKING
6
+
7
+ # Django
8
+ from django.utils.translation import gettext as _
9
+
10
+ # Alliance Auth
11
+ from allianceauth.services.hooks import get_extension_logger
12
+
13
+ # Alliance Auth (External Libs)
14
+ from app_utils.logging import LoggerAddTag
15
+
16
+ # AA Ledger
17
+ from ledger import __title__
18
+
19
+ if TYPE_CHECKING:
20
+ # AA Ledger
21
+ from ledger.helpers.core import LedgerEntity
22
+
23
+ logger = LoggerAddTag(get_extension_logger(__name__), __title__)
24
+
25
+
26
+ # Unified Journal Reference Type Enum - All ref types in one place
27
+ class JournalRefType(enum.Enum):
28
+ """All wallet journal reference types unified."""
29
+
30
+ # Original ref types
31
+ PLAYER_TRADING = 1
32
+ MARKET_TRANSACTION = 2
33
+ GM_CASH_TRANSFER = 3
34
+ MISSION_REWARD = 7
35
+ CLONE_ACTIVATION = 8
36
+ INHERITANCE = 9
37
+ PLAYER_DONATION = 10
38
+ CORPORATION_PAYMENT = 11
39
+ DOCKING_FEE = 12
40
+ OFFICE_RENTAL_FEE = 13
41
+ FACTORY_SLOT_RENTAL_FEE = 14
42
+ REPAIR_BILL = 15
43
+ BOUNTY = 16
44
+ BOUNTY_PRIZE = 17
45
+ INSURANCE = 19
46
+ MISSION_EXPIRATION = 20
47
+ MISSION_COMPLETION = 21
48
+ SHARES = 22
49
+ COURIER_MISSION_ESCROW = 23
50
+ MISSION_COST = 24
51
+ AGENT_MISCELLANEOUS = 25
52
+ LP_STORE = 26
53
+ AGENT_LOCATION_SERVICES = 27
54
+ AGENT_DONATION = 28
55
+ AGENT_SECURITY_SERVICES = 29
56
+ AGENT_MISSION_COLLATERAL_PAID = 30
57
+ AGENT_MISSION_COLLATERAL_REFUNDED = 31
58
+ AGENTS_PREWARD = 32
59
+ AGENT_MISSION_REWARD = 33
60
+ AGENT_MISSION_TIME_BONUS_REWARD = 34
61
+ CSPA = 35
62
+ CSPAOFFLINEREFUND = 36
63
+ CORPORATION_ACCOUNT_WITHDRAWAL = 37
64
+ CORPORATION_DIVIDEND_PAYMENT = 38
65
+ CORPORATION_REGISTRATION_FEE = 39
66
+ CORPORATION_LOGO_CHANGE_COST = 40
67
+ RELEASE_OF_IMPOUNDED_PROPERTY = 41
68
+ MARKET_ESCROW = 42
69
+ AGENT_SERVICES_RENDERED = 43
70
+ MARKET_FINE_PAID = 44
71
+ CORPORATION_LIQUIDATION = 45
72
+ BROKERS_FEE = 46
73
+ CORPORATION_BULK_PAYMENT = 47
74
+ ALLIANCE_REGISTRATION_FEE = 48
75
+ WAR_FEE = 49
76
+ ALLIANCE_MAINTAINANCE_FEE = 50
77
+ CONTRABAND_FINE = 51
78
+ CLONE_TRANSFER = 52
79
+ ACCELERATION_GATE_FEE = 53
80
+ TRANSACTION_TAX = 54
81
+ JUMP_CLONE_INSTALLATION_FEE = 55
82
+ MANUFACTURING = 56
83
+ RESEARCHING_TECHNOLOGY = 57
84
+ RESEARCHING_TIME_PRODUCTIVITY = 58
85
+ RESEARCHING_MATERIAL_PRODUCTIVITY = 59
86
+ COPYING = 60
87
+ REVERSE_ENGINEERING = 62
88
+ CONTRACT_AUCTION_BID = 63
89
+ CONTRACT_AUCTION_BID_REFUND = 64
90
+ CONTRACT_COLLATERAL = 65
91
+ CONTRACT_REWARD_REFUND = 66
92
+ CONTRACT_AUCTION_SOLD = 67
93
+ CONTRACT_REWARD = 68
94
+ CONTRACT_COLLATERAL_REFUND = 69
95
+ CONTRACT_COLLATERAL_PAYOUT = 70
96
+ CONTRACT_PRICE = 71
97
+ CONTRACT_BROKERS_FEE = 72
98
+ CONTRACT_SALES_TAX = 73
99
+ CONTRACT_DEPOSIT = 74
100
+ CONTRACT_DEPOSIT_SALES_TAX = 75
101
+ CONTRACT_AUCTION_BID_CORP = 77
102
+ CONTRACT_COLLATERAL_DEPOSITED_CORP = 78
103
+ CONTRACT_PRICE_PAYMENT_CORP = 79
104
+ CONTRACT_BROKERS_FEE_CORP = 80
105
+ CONTRACT_DEPOSIT_CORP = 81
106
+ CONTRACT_DEPOSIT_REFUND = 82
107
+ CONTRACT_REWARD_DEPOSITED = 83
108
+ CONTRACT_REWARD_DEPOSITED_CORP = 84
109
+ BOUNTY_PRIZES = 85
110
+ ADVERTISEMENT_LISTING_FEE = 86
111
+ MEDAL_CREATION = 87
112
+ MEDAL_ISSUED = 88
113
+ DNA_MODIFICATION_FEE = 90
114
+ SOVEREIGNITY_BILL = 91
115
+ BOUNTY_PRIZE_CORPORATION_TAX = 92
116
+ AGENT_MISSION_REWARD_CORPORATION_TAX = 93
117
+ AGENT_MISSION_TIME_BONUS_REWARD_CORPORATION_TAX = 94
118
+ UPKEEP_ADJUSTMENT_FEE = 95
119
+ PLANETARY_IMPORT_TAX = 96
120
+ PLANETARY_EXPORT_TAX = 97
121
+ PLANETARY_CONSTRUCTION = 98
122
+ CORPORATE_REWARD_PAYOUT = 99
123
+ BOUNTY_SURCHARGE = 101
124
+ CONTRACT_REVERSAL = 102
125
+ CORPORATE_REWARD_TAX = 103
126
+ STORE_PURCHASE = 106
127
+ STORE_PURCHASE_REFUND = 107
128
+ DATACORE_FEE = 112
129
+ WAR_FEE_SURRENDER = 113
130
+ WAR_ALLY_CONTRACT = 114
131
+ BOUNTY_REIMBURSEMENT = 115
132
+ KILL_RIGHT_FEE = 116
133
+ SECURITY_PROCESSING_FEE = 117
134
+ INDUSTRY_JOB_TAX = 120
135
+ INFRASTRUCTURE_HUB_MAINTENANCE = 122
136
+ ASSET_SAFETY_RECOVERY_TAX = 123
137
+ OPPORTUNITY_REWARD = 124
138
+ PROJECT_DISCOVERY_REWARD = 125
139
+ PROJECT_DISCOVERY_TAX = 126
140
+ REPROCESSING_TAX = 127
141
+ JUMP_CLONE_ACTIVATION_FEE = 128
142
+ OPERATION_BONUS = 129
143
+ RESOURCE_WARS_REWARD = 131
144
+ DUEL_WAGER_ESCROW = 132
145
+ DUEL_WAGER_PAYMENT = 133
146
+ DUEL_WAGER_REFUND = 134
147
+ REACTION = 135
148
+
149
+ # V3 additions
150
+ STRUCTURE_GATE_JUMP = 140
151
+
152
+ # V4 additions
153
+ EXTERNAL_TRADE_FREEZE = 136
154
+ EXTERNAL_TRADE_THAW = 137
155
+ EXTERNAL_TRADE_DELIVERY = 138
156
+ SEASON_CHALLENGE_REWARD = 139
157
+ SKILL_PURCHASE = 141
158
+ ITEM_TRADER_PAYMENT = 142
159
+ FLUX_TICKET_SALE = 143
160
+ FLUX_PAYOUT = 144
161
+ FLUX_TAX = 145
162
+ FLUX_TICKET_REPAYMENT = 146
163
+ REDEEMED_ISK_TOKEN = 147
164
+ DAILY_CHALLENGE_REWARD = 148
165
+ MARKET_PROVIDER_TAX = 149
166
+ ESS_ESCROW_TRANSFER = 155
167
+ MILESTONE_REWARD_PAYMENT = 156
168
+ UNDER_CONSTRUCTION = 166
169
+ ALLIGNMENT_BASED_GATE_TOLL = 168
170
+ PROJECT_PAYOUTS = 170
171
+ INSURGENCY_CORRUPTION_CONTRIBUTION_REWARD = 172
172
+ INSURGENCY_SUPPRESSION_CONTRIBUTION_REWARD = 173
173
+ DAILY_GOAL_PAYOUTS = 174
174
+ DAILY_GOAL_PAYOUTS_TAX = 175
175
+ COSMETIC_MARKET_COMPONENT_ITEM_PURCHASE = 178
176
+ COSMETIC_MARKET_SKIN_SALE_BROKER_FEE = 179
177
+ COSMETIC_MARKET_SKIN_PURCHASE = 180
178
+ COSMETIC_MARKET_SKIN_SALE = 181
179
+ COSMETIC_MARKET_SKIN_SALE_TAX = 182
180
+ COSMETIC_MARKET_SKIN_TRANSACTION = 183
181
+ SKYHOOK_CLAIM_FEE = 184
182
+ AIR_CAREER_PROGRAM_REWARD = 185
183
+ FREELANCE_JOBS_DURATION_FEE = 186
184
+ FREELANCE_JOBS_BROADCASTING_FEE = 187
185
+ FREELANCE_JOBS_REWARD_ESCROW = 188
186
+ FREELANCE_JOBS_REWARD = 189
187
+ FREELANCE_JOBS_ESCROW_REFUND = 190
188
+ FREELANCE_JOBS_REWARD_CORPORATION_TAX = 191
189
+ GM_PLEX_FEE_REFUND = 192
190
+
191
+
192
+ class RefTypeManager:
193
+ """Categories for wallet journal reference types."""
194
+
195
+ # Translations for reference types
196
+ _("Corporation Contract")
197
+ _("Corporation Withdrawal")
198
+ _("Mission Reward")
199
+ _("Market")
200
+ _("Daily Goal Reward")
201
+ _("Structure Rental")
202
+
203
+ # Assets/Items
204
+ ASSETS = [
205
+ JournalRefType.REPAIR_BILL.name.lower(),
206
+ JournalRefType.ASSET_SAFETY_RECOVERY_TAX.name.lower(),
207
+ JournalRefType.REPROCESSING_TAX.name.lower(),
208
+ JournalRefType.ITEM_TRADER_PAYMENT.name.lower(),
209
+ ]
210
+
211
+ # PVE Income
212
+ BOUNTY_PRIZES = [
213
+ JournalRefType.BOUNTY.name.lower(),
214
+ JournalRefType.BOUNTY_PRIZE.name.lower(),
215
+ JournalRefType.BOUNTY_PRIZES.name.lower(),
216
+ JournalRefType.BOUNTY_REIMBURSEMENT.name.lower(),
217
+ JournalRefType.BOUNTY_SURCHARGE.name.lower(),
218
+ ]
219
+
220
+ CONTRACT = [
221
+ JournalRefType.CONTRACT_AUCTION_BID.name.lower(),
222
+ JournalRefType.CONTRACT_AUCTION_BID_REFUND.name.lower(),
223
+ JournalRefType.CONTRACT_COLLATERAL.name.lower(),
224
+ JournalRefType.CONTRACT_REWARD_REFUND.name.lower(),
225
+ JournalRefType.CONTRACT_AUCTION_SOLD.name.lower(),
226
+ JournalRefType.CONTRACT_REWARD.name.lower(),
227
+ JournalRefType.CONTRACT_COLLATERAL_REFUND.name.lower(),
228
+ JournalRefType.CONTRACT_COLLATERAL_PAYOUT.name.lower(),
229
+ JournalRefType.CONTRACT_PRICE.name.lower(),
230
+ JournalRefType.CONTRACT_BROKERS_FEE.name.lower(),
231
+ JournalRefType.CONTRACT_SALES_TAX.name.lower(),
232
+ JournalRefType.CONTRACT_DEPOSIT.name.lower(),
233
+ JournalRefType.CONTRACT_DEPOSIT_SALES_TAX.name.lower(),
234
+ JournalRefType.CONTRACT_AUCTION_BID_CORP.name.lower(),
235
+ JournalRefType.CONTRACT_COLLATERAL_DEPOSITED_CORP.name.lower(),
236
+ JournalRefType.CONTRACT_DEPOSIT_CORP.name.lower(),
237
+ JournalRefType.CONTRACT_DEPOSIT_REFUND.name.lower(),
238
+ JournalRefType.CONTRACT_REWARD_DEPOSITED.name.lower(),
239
+ JournalRefType.CONTRACT_REWARD_DEPOSITED_CORP.name.lower(),
240
+ JournalRefType.CONTRACT_REVERSAL.name.lower(),
241
+ ]
242
+
243
+ CORPORATION_ADMINISTRATION = [
244
+ JournalRefType.CORPORATION_DIVIDEND_PAYMENT.name.lower(),
245
+ JournalRefType.CORPORATION_REGISTRATION_FEE.name.lower(),
246
+ JournalRefType.CORPORATION_LOGO_CHANGE_COST.name.lower(),
247
+ JournalRefType.CORPORATION_BULK_PAYMENT.name.lower(),
248
+ JournalRefType.ADVERTISEMENT_LISTING_FEE.name.lower(),
249
+ ]
250
+
251
+ CORPORATION_CONTRACT = [
252
+ JournalRefType.CONTRACT_PRICE_PAYMENT_CORP.name.lower(),
253
+ ]
254
+
255
+ CORPORATION_DONATION = [
256
+ JournalRefType.CORPORATION_ACCOUNT_WITHDRAWAL.name.lower(),
257
+ ]
258
+
259
+ DAILY_GOAL_REWARD = [
260
+ JournalRefType.DAILY_GOAL_PAYOUTS.name.lower(),
261
+ JournalRefType.DAILY_CHALLENGE_REWARD.name.lower(),
262
+ JournalRefType.SEASON_CHALLENGE_REWARD.name.lower(),
263
+ JournalRefType.OPPORTUNITY_REWARD.name.lower(),
264
+ JournalRefType.AIR_CAREER_PROGRAM_REWARD.name.lower(),
265
+ ]
266
+
267
+ DONATION = [
268
+ JournalRefType.PLAYER_DONATION.name.lower(),
269
+ JournalRefType.AGENT_DONATION.name.lower(),
270
+ ]
271
+
272
+ ESS_TRANSFER = [
273
+ JournalRefType.ESS_ESCROW_TRANSFER.name.lower(),
274
+ ]
275
+
276
+ FREELANCE_JOBS = [
277
+ JournalRefType.FREELANCE_JOBS_DURATION_FEE.name.lower(),
278
+ JournalRefType.FREELANCE_JOBS_BROADCASTING_FEE.name.lower(),
279
+ JournalRefType.FREELANCE_JOBS_REWARD_ESCROW.name.lower(),
280
+ JournalRefType.FREELANCE_JOBS_REWARD.name.lower(),
281
+ JournalRefType.FREELANCE_JOBS_ESCROW_REFUND.name.lower(),
282
+ JournalRefType.FREELANCE_JOBS_REWARD_CORPORATION_TAX.name.lower(),
283
+ ]
284
+
285
+ INCURSION = [
286
+ JournalRefType.RESOURCE_WARS_REWARD.name.lower(),
287
+ JournalRefType.INSURGENCY_CORRUPTION_CONTRIBUTION_REWARD.name.lower(),
288
+ JournalRefType.INSURGENCY_SUPPRESSION_CONTRIBUTION_REWARD.name.lower(),
289
+ JournalRefType.CORPORATE_REWARD_PAYOUT.name.lower(),
290
+ ]
291
+
292
+ INSURANCE = [
293
+ JournalRefType.INSURANCE.name.lower(),
294
+ ]
295
+
296
+ LP = [
297
+ JournalRefType.LP_STORE.name.lower(),
298
+ ]
299
+
300
+ MARKET = [
301
+ JournalRefType.MARKET_TRANSACTION.name.lower(),
302
+ JournalRefType.MARKET_ESCROW.name.lower(),
303
+ JournalRefType.BROKERS_FEE.name.lower(),
304
+ JournalRefType.TRANSACTION_TAX.name.lower(),
305
+ JournalRefType.MARKET_FINE_PAID.name.lower(),
306
+ JournalRefType.MARKET_PROVIDER_TAX.name.lower(),
307
+ ]
308
+
309
+ MILESTONE_REWARD = [
310
+ JournalRefType.MILESTONE_REWARD_PAYMENT.name.lower(),
311
+ JournalRefType.PROJECT_DISCOVERY_REWARD.name.lower(),
312
+ JournalRefType.PROJECT_PAYOUTS.name.lower(),
313
+ ]
314
+
315
+ MISSION_REWARD = [
316
+ JournalRefType.MISSION_REWARD.name.lower(),
317
+ JournalRefType.MISSION_COMPLETION.name.lower(),
318
+ JournalRefType.AGENT_MISSION_REWARD.name.lower(),
319
+ JournalRefType.AGENT_MISSION_TIME_BONUS_REWARD.name.lower(),
320
+ JournalRefType.AGENTS_PREWARD.name.lower(),
321
+ ]
322
+
323
+ PLANETARY = [
324
+ JournalRefType.PLANETARY_IMPORT_TAX.name.lower(),
325
+ JournalRefType.PLANETARY_EXPORT_TAX.name.lower(),
326
+ JournalRefType.PLANETARY_CONSTRUCTION.name.lower(),
327
+ ]
328
+
329
+ PRODUCTION = [
330
+ JournalRefType.MANUFACTURING.name.lower(),
331
+ JournalRefType.RESEARCHING_TECHNOLOGY.name.lower(),
332
+ JournalRefType.RESEARCHING_TIME_PRODUCTIVITY.name.lower(),
333
+ JournalRefType.RESEARCHING_MATERIAL_PRODUCTIVITY.name.lower(),
334
+ JournalRefType.COPYING.name.lower(),
335
+ JournalRefType.REVERSE_ENGINEERING.name.lower(),
336
+ JournalRefType.INDUSTRY_JOB_TAX.name.lower(),
337
+ JournalRefType.REACTION.name.lower(),
338
+ ]
339
+
340
+ STRUCTURE_RENTAL = [
341
+ JournalRefType.OFFICE_RENTAL_FEE.name.lower(),
342
+ JournalRefType.FACTORY_SLOT_RENTAL_FEE.name.lower(),
343
+ JournalRefType.SOVEREIGNITY_BILL.name.lower(),
344
+ JournalRefType.INFRASTRUCTURE_HUB_MAINTENANCE.name.lower(),
345
+ ]
346
+
347
+ SKILL = [
348
+ JournalRefType.SKILL_PURCHASE.name.lower(),
349
+ JournalRefType.DATACORE_FEE.name.lower(),
350
+ ]
351
+
352
+ TRAVELING = [
353
+ JournalRefType.DOCKING_FEE.name.lower(),
354
+ JournalRefType.ACCELERATION_GATE_FEE.name.lower(),
355
+ JournalRefType.JUMP_CLONE_INSTALLATION_FEE.name.lower(),
356
+ JournalRefType.JUMP_CLONE_ACTIVATION_FEE.name.lower(),
357
+ JournalRefType.CLONE_ACTIVATION.name.lower(),
358
+ JournalRefType.CLONE_TRANSFER.name.lower(),
359
+ JournalRefType.STRUCTURE_GATE_JUMP.name.lower(),
360
+ JournalRefType.ALLIGNMENT_BASED_GATE_TOLL.name.lower(),
361
+ ]
362
+
363
+ @classmethod
364
+ def get_ref_types_from_category(cls, category: str) -> list[str]:
365
+ """Get all ref types from a specific category."""
366
+ if hasattr(cls, category):
367
+ return getattr(cls, category)
368
+ logger.debug(f"Category '{category}' does not exist in RefTypeCategories.")
369
+ return []
370
+
371
+ @classmethod
372
+ def get_all_categories(cls) -> dict[str, list[str]]:
373
+ """Get all categories and their ref types, sorted alphabetically by key in the dict literal. Add NO_CATEGORY for missing JournalRefType."""
374
+ categories = {
375
+ "ASSETS": cls.ASSETS,
376
+ "CONTRACT": cls.CONTRACT,
377
+ "CORPORATION_ADMINISTRATION": cls.CORPORATION_ADMINISTRATION,
378
+ "CORPORATION_CONTRACT": cls.CORPORATION_CONTRACT,
379
+ "CORPORATION_WITHDRAWAL": cls.CORPORATION_DONATION,
380
+ "DAILY_GOAL_REWARD": cls.DAILY_GOAL_REWARD,
381
+ "DONATION": cls.DONATION,
382
+ "FREELANCE_JOBS": cls.FREELANCE_JOBS,
383
+ "INCURSION": cls.INCURSION,
384
+ "INSURANCE": cls.INSURANCE,
385
+ "LP": cls.LP,
386
+ "MARKET": cls.MARKET,
387
+ "MISSION_REWARD": cls.MISSION_REWARD,
388
+ "PLANETARY": cls.PLANETARY,
389
+ "PRODUCTION": cls.PRODUCTION,
390
+ "SKILL": cls.SKILL,
391
+ "STRUCTURE_RENTAL": cls.STRUCTURE_RENTAL,
392
+ "TRAVELING": cls.TRAVELING,
393
+ }
394
+
395
+ # Alle zugeordneten ref_types sammeln
396
+ assigned = set()
397
+ for ref_types in categories.values():
398
+ assigned.update(ref_types)
399
+
400
+ # Alle JournalRefType-Namen in Kleinbuchstaben
401
+ all_types = {jt.name.lower() for jt in JournalRefType}
402
+
403
+ # Exclude Bounty and ESS
404
+ pve = set()
405
+ # Bounty-Prizes
406
+ if hasattr(cls, "BOUNTY_PRIZES"):
407
+ pve.update(cls.BOUNTY_PRIZES)
408
+ # ESS Transfer
409
+ if hasattr(cls, "ESS_TRANSFER"):
410
+ pve.update(cls.ESS_TRANSFER)
411
+
412
+ # Nicht zugeordnete Typen bestimmen, aber special auslassen
413
+ not_defined = sorted((all_types - assigned) - pve)
414
+ if not_defined:
415
+ categories["NOT_DEFINED_CATEGORY"] = not_defined
416
+
417
+ return categories
418
+
419
+ @classmethod
420
+ def all_ref_types(cls) -> list[str]:
421
+ """Get all ref types from all categories."""
422
+ all_ref_types = cls.get_all_categories()
423
+ ref_types_items = []
424
+ for __, ref_types in all_ref_types.items():
425
+ ref_types_items.extend(ref_types)
426
+ return ref_types_items
427
+
428
+ @staticmethod
429
+ def special_cases(row: dict, ids: set[int], account_char_ids: set[int]) -> bool:
430
+ """Handle special cases in Ledger."""
431
+ if isinstance(row, dict) is False:
432
+ logger.debug("Row is not a dictionary, skipping special case checks.")
433
+ return False
434
+
435
+ # Skip Market Transactions from buyer between the corporation and its members (only count transactions from creator)
436
+ if row["ref_type"] == "market_transaction" and row["first_party_id"] in ids:
437
+ return True
438
+
439
+ # Skip Contract if Contract Creator is Registered as a Member of the Corporation (only count the contract creator)
440
+ if (
441
+ row["ref_type"] == "contract_price_payment_corp"
442
+ and row["first_party_id"] in account_char_ids
443
+ and row["second_party_id"] in ids
444
+ ):
445
+ return True
446
+ return False
447
+
448
+ @staticmethod
449
+ def special_cases_details(
450
+ value: list,
451
+ entity: "LedgerEntity",
452
+ kwargs: dict[str, int],
453
+ journal_type: str,
454
+ char_ids: set[int] = None,
455
+ ) -> bool:
456
+ """Handle special cases in Ledger for Details View."""
457
+ # Skip Contract if Contract Creator is Registered as a Member of the Corporation (only count the contract creator)
458
+ if (
459
+ "contract_price_payment_corp" in value
460
+ and entity.type == "character"
461
+ and journal_type == "corporation"
462
+ ): # Only Count Contract Creator
463
+ kwargs["first_party"] = entity.entity_id
464
+ return kwargs
465
+
466
+ # Skip Player Donation if it is to own alts
467
+ if (
468
+ "player_donation" in value
469
+ and entity.is_eve_character
470
+ and journal_type == "character"
471
+ ):
472
+ if char_ids is None:
473
+ return kwargs
474
+ kwargs["exclude"] = char_ids
475
+ return kwargs