def check_acct(self): actor_sums = {} for t in self.market.trades: actor_sums = add_or_create_key(actor_sums, t.seller, t.offer_bid.energy) actor_sums = subtract_or_create_key(actor_sums, t.buyer, t.offer_bid.energy) for actor, sum_ in actor_sums.items(): assert self.market.traded_energy[actor] == sum_ assert sum(self.market.traded_energy.values()) == 0
def _update_stats_after_trade(self, trade, offer, buyer, already_tracked=False): # FIXME: The following updates need to be done in response to the BC event # TODO: For now event driven blockchain updates have been disabled in favor of a # sequential approach, but once event handling is enabled this needs to be handled if not already_tracked: self.trades.append(trade) self._update_accumulated_trade_price_energy(trade) self.traded_energy = add_or_create_key(self.traded_energy, offer.seller, offer.energy) self.traded_energy = subtract_or_create_key(self.traded_energy, buyer, offer.energy) self._update_min_max_avg_trade_prices(offer.price / offer.energy) # Recalculate offer min/max price since offer was removed self._update_min_max_avg_offer_prices()
def _accumulate_area_trades(area, parent, accumulated_trades, past_market_types): if area.name not in accumulated_trades: accumulated_trades[area.name] = { "type": "house", "produced": 0.0, "earned": 0.0, "consumedFrom": {}, "spentTo": {}, "producedForExternal": {}, "earnedFromExternal": {}, "consumedFromExternal": {}, "spentToExternal": {}, } area_IAA_name = make_iaa_name(area) child_names = [ area_name_from_area_or_iaa_name(c.name) for c in area.children ] area_markets = getattr(area, past_market_types) if area_markets is not None: if type(area_markets) != list: area_markets = [area_markets] for market in area_markets: for trade in market.trades: if area_name_from_area_or_iaa_name(trade.seller) in child_names and \ area_name_from_area_or_iaa_name(trade.buyer) in child_names: # House self-consumption trade accumulated_trades[ area.name]["produced"] -= trade.offer.energy accumulated_trades[ area.name]["earned"] += trade.offer.price accumulated_trades[area.name]["consumedFrom"] = \ add_or_create_key(accumulated_trades[area.name]["consumedFrom"], area.name, trade.offer.energy) accumulated_trades[area.name]["spentTo"] = \ add_or_create_key(accumulated_trades[area.name]["spentTo"], area.name, trade.offer.price) elif trade.buyer == area_IAA_name: accumulated_trades[ area.name]["earned"] += trade.offer.price accumulated_trades[ area.name]["produced"] -= trade.offer.energy for market in area_markets: for trade in market.trades: if area_name_from_area_or_iaa_name(trade.seller) == \ area.name and area_name_from_area_or_iaa_name(trade.buyer) in child_names: accumulated_trades[area.name]["consumedFromExternal"] = \ subtract_or_create_key(accumulated_trades[area.name] ["consumedFromExternal"], area_name_from_area_or_iaa_name(trade.buyer), trade.offer.energy) accumulated_trades[area.name]["spentToExternal"] = \ add_or_create_key(accumulated_trades[area.name]["spentToExternal"], area_name_from_area_or_iaa_name(trade.buyer), trade.offer.price) elif area_name_from_area_or_iaa_name(trade.buyer) == \ area.name and area_name_from_area_or_iaa_name(trade.seller) in child_names: accumulated_trades[area.name]["producedForExternal"] = \ add_or_create_key(accumulated_trades[area.name]["producedForExternal"], area_name_from_area_or_iaa_name(trade.seller), trade.offer.energy) accumulated_trades[area.name]["earnedFromExternal"] = \ add_or_create_key(accumulated_trades[area.name]["earnedFromExternal"], area_name_from_area_or_iaa_name(trade.seller), trade.offer.price) accumulated_trades = \ _area_trade_from_parent(area, parent, accumulated_trades, past_market_types) return accumulated_trades