NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

transactionOverviewController.py (7693B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\neocom\wallet\transactionOverviewController.py
      2 import collections
      3 import evetypes
      4 from eve.common.lib import appConst
      5 from eve.common.script.util.eveFormat import FmtISK
      6 from localization import GetByLabel
      7 REFTYPEID_BLACKLIST = [appConst.refMarketTransaction, appConst.refMarketEscrow]
      8 NAME_BY_REFGROUPID = {appConst.refGroupCorpAlliance: 'UI/Wallet/WalletWindow/TransactionGroups/CorpAlliance',
      9  appConst.refGroupAgentsAndMissions: 'UI/Wallet/WalletWindow/TransactionGroups/AgentsAndMissions',
     10  appConst.refGroupTrade: 'UI/Wallet/WalletWindow/TransactionGroups/Trade',
     11  appConst.refGroupBounty: 'UI/Wallet/WalletWindow/TransactionGroups/Bounty',
     12  appConst.refGroupIndustry: 'UI/Wallet/WalletWindow/TransactionGroups/Industry',
     13  appConst.refGroupTransfer: 'UI/Wallet/WalletWindow/TransactionGroups/Transfers',
     14  appConst.refGroupMisc: 'UI/Wallet/WalletWindow/TransactionGroups/Miscellaneous',
     15  appConst.refGroupHypernetRelay: 'UI/HyperNet/WindowTitle'}
     16 Transaction = collections.namedtuple('Transaction', 'amount, refTypeID, refGroupID, name, groupName, categoryID')
     17 
     18 class TransactionOverviewController(object):
     19 
     20     def __init__(self, refGroupID = None):
     21         self.refGroupID = refGroupID
     22         self.incomeTransactions = []
     23         self.incomeTransactionGroups = []
     24         self.expenditureTransactions = []
     25         self.expenditureTransactionGroups = []
     26         self._Update()
     27 
     28     def GetIncomeTransactionGroups(self):
     29         return self.incomeTransactionGroups
     30 
     31     def GetExpenditureTransactionGroups(self):
     32         return self.expenditureTransactionGroups
     33 
     34     def GetIncomeGroupValues(self):
     35         return [ group.amount for group in self.incomeTransactionGroups ]
     36 
     37     def GetExpenditureGroupValues(self):
     38         return [ group.amount for group in self.expenditureTransactionGroups ]
     39 
     40     def GetTotalIncome(self):
     41         return sum(self.GetIncomeGroupValues())
     42 
     43     def GetTotalExpenses(self):
     44         return sum(self.GetExpenditureGroupValues())
     45 
     46     def _Update(self):
     47         self._UpdateWalletTransactions()
     48         self._UpdateMarketTransactions()
     49         self.incomeTransactionGroups = self._GetTransactionGroupsSorted(self.incomeTransactions, reverseSort=True)
     50         self.expenditureTransactionGroups = self._GetTransactionGroupsSorted(self.expenditureTransactions, reverseSort=False)
     51 
     52     def _GetTransactionGroupsSorted(self, transactions, reverseSort = True):
     53         if self.refGroupID:
     54             transactionGroups = self._GetTransactionGroupsByRefTypeID(transactions)
     55         else:
     56             transactionGroups = self._GetTransactionGroupsByRefGroupID(transactions)
     57         totalAmount = sum([ group.amount for group in transactionGroups ])
     58         for group in transactionGroups:
     59             group.UpdateRatio(totalAmount)
     60 
     61         return sorted(transactionGroups, key=lambda group: group.amount, reverse=reverseSort)
     62 
     63     def _GetTransactionGroupsByRefTypeID(self, transactions):
     64         groupsByID = {}
     65         for transaction in transactions:
     66             self._AddToTransactionGroupByRefTypeID(groupsByID, transaction)
     67 
     68         return groupsByID.values()
     69 
     70     def _AddToTransactionGroupByRefTypeID(self, groupsByID, tr):
     71         if (tr.refTypeID, tr.categoryID) not in groupsByID:
     72             group = TransactionGroup(tr.name, tr.refTypeID, self.refGroupID, tr.categoryID)
     73             groupsByID[tr.refTypeID, tr.categoryID] = group
     74         groupsByID[tr.refTypeID, tr.categoryID].AddAmount(tr.amount)
     75 
     76     def _GetTransactionGroupsByRefGroupID(self, transactions):
     77         groupsByID = {}
     78         for transaction in transactions:
     79             self._AddToTransactionGroupByRefGroupID(groupsByID, transaction)
     80 
     81         return groupsByID.values()
     82 
     83     def _AddToTransactionGroupByRefGroupID(self, groupsByID, tr):
     84         if tr.refGroupID not in groupsByID:
     85             group = TransactionGroup(tr.groupName, None, tr.refGroupID, tr.categoryID)
     86             groupsByID[tr.refGroupID] = group
     87         groupsByID[tr.refGroupID].AddAmount(tr.amount)
     88 
     89     def _UpdateMarketTransactions(self):
     90         transactions = sm.GetService('market').GetPersonalMarketTransactions()
     91         refTypeID = appConst.refMarketTransaction
     92         for transaction in transactions:
     93             if self.IsFilteredOut(refTypeID) or transaction.isForCorp:
     94                 continue
     95             categoryID = evetypes.GetCategoryID(transaction.typeID)
     96             name = evetypes.GetCategoryName(transaction.typeID)
     97             if transaction.isBuyTransaction:
     98                 name = GetByLabel('UI/Wallet/WalletWindow/ItemsBought', groupName=name)
     99                 self._AddExpenditureEntry(transaction.totalPrice, refTypeID, name, categoryID)
    100             else:
    101                 name = GetByLabel('UI/Wallet/WalletWindow/ItemsSold', groupName=name)
    102                 self._AddIncomeEntry(transaction.totalPrice, refTypeID, name, categoryID)
    103 
    104     def _UpdateWalletTransactions(self):
    105         tranactions = sm.GetService('account').GetPersonalTransactions()
    106         for transaction in tranactions:
    107             refTypeID = transaction.entryTypeID
    108             if self.IsFilteredOut(refTypeID) or refTypeID in REFTYPEID_BLACKLIST:
    109                 continue
    110             name = self.GetTypeName(transaction)
    111             if name is None:
    112                 continue
    113             if transaction.amount < 0:
    114                 self._AddExpenditureEntry(transaction.amount, refTypeID, name)
    115             else:
    116                 self._AddIncomeEntry(transaction.amount, refTypeID, name)
    117 
    118     def IsFilteredOut(self, refTypeID):
    119         groupID = self.GetGroupID(refTypeID)
    120         return self.refGroupID and groupID != self.refGroupID
    121 
    122     def GetTypeName(self, transaction):
    123         refType = sm.GetService('account').GetRefTypeKeyByID(transaction.entryTypeID)
    124         if not hasattr(refType, 'entryTypeName'):
    125             return None
    126         return refType.entryTypeName
    127 
    128     def GetGroupID(self, refTypeID):
    129         return appConst.refGroupByRefType.get(refTypeID, appConst.refGroupMisc)
    130 
    131     def GetGroupName(self):
    132         if self.refGroupID:
    133             return GetByLabel(NAME_BY_REFGROUPID[self.refGroupID])
    134 
    135     def _AddIncomeEntry(self, amount, refTypeID, name, categoryID = None):
    136         transaction = self._GetTransaction(amount, refTypeID, name, categoryID)
    137         self.incomeTransactions.append(transaction)
    138 
    139     def _AddExpenditureEntry(self, amount, refTypeID, name, categoryID = None):
    140         transaction = self._GetTransaction(amount, refTypeID, name, categoryID)
    141         self.expenditureTransactions.append(transaction)
    142 
    143     def _GetTransaction(self, amount, refTypeID, name, categoryID = None):
    144         refGroupID = self.GetGroupID(refTypeID)
    145         groupName = GetByLabel(NAME_BY_REFGROUPID[refGroupID])
    146         return Transaction(amount=amount, refTypeID=refTypeID, name=name, refGroupID=refGroupID, groupName=groupName, categoryID=categoryID)
    147 
    148 
    149 class TransactionGroup(object):
    150 
    151     def __init__(self, name, refTypeID, refGroupID, categoryID = None):
    152         self.refTypeID = refTypeID
    153         self.refGroupID = refGroupID
    154         self.name = name
    155         self.amount = 0.0
    156         self.ratio = 0.0
    157         self.categoryID = categoryID
    158 
    159     def AddAmount(self, value):
    160         self.amount += value
    161 
    162     def UpdateRatio(self, totalAmount):
    163         if not totalAmount:
    164             self.ratio = 0.0
    165         else:
    166             self.ratio = self.amount / totalAmount
    167 
    168     def GetID(self):
    169         return (self.refGroupID, self.refTypeID, self.categoryID)
    170 
    171     def GetHint(self):
    172         return "%.1f%% %s\n<color='#ffffffff'>%s</color>" % (self.ratio * 100, self.name, FmtISK(self.amount))