diff --git a/book.py b/book.py index 9e03972..fe83a22 100644 --- a/book.py +++ b/book.py @@ -177,7 +177,7 @@ class Book(SymbolMixin, metaclass=PoolMeta): readonly=True, digits=(16, Eval('currency_digits', 2)), states={'invisible': Eval('feature', '') != 'asset'}, depends=['currency_digits', 'feature']), - 'on_change_with_yield_balance', searcher='search_asset_quantity') + 'get_yield_balance_data', searcher='search_asset_quantity') @classmethod def __setup__(cls): @@ -331,15 +331,39 @@ class Book(SymbolMixin, metaclass=PoolMeta): """ return 4 - @fields.depends('yield_sales', 'yield_dividend_total', 'diff_amount') - def on_change_with_yield_balance(self, name=None): + @classmethod + def get_yield_balance_data(cls, cashbooks, names): """ calculate yield total fee is already contained in 'diff_amount' """ - sum_lst = [ - self.diff_amount, self.yield_dividend_total, self.yield_sales] - sum2 = sum([x for x in sum_lst if x is not None]) - return sum2 + context = Transaction().context + + result = {x: {y.id: Decimal('0.0') for y in cashbooks} for x in names} + + query_date = context.get('date', None) + if context.get( + 'compute_yield_balance', + False) or query_date is not None: + amounts = {} + amounts.update(cls.get_asset_quantity(cashbooks, ['diff_amount'])) + amounts.update(cls.get_yield_data( + cashbooks, + ['yield_dividend_total', 'yield_sales'])) + + for cashbook in cashbooks: + sum_lst = [ + amounts[x][cashbook.id] + for x in [ + 'diff_amount', 'yield_dividend_total', + 'yield_sales']] + sum2 = sum([x for x in sum_lst if x is not None]) + result['yield_balance'][cashbook.id] = sum2 + else: + for cashbook in cashbooks: + for value in cashbook.value_store: + if value.field_name in names: + result[value.field_name][cashbook.id] = value.numvalue + return result @classmethod def get_yield_data_sql(cls, date_from=None, date_to=None): @@ -754,7 +778,8 @@ class Book(SymbolMixin, metaclass=PoolMeta): 'quantity', 'quantity_all', 'current_value', 'current_value_ref', 'diff_amount', 'diff_percent', 'current_rate', 'purchase_amount', 'yield_fee_total', 'yield_dividend_total', 'yield_sales', - 'yield_fee_12m', 'yield_dividend_12m', 'yield_sales_12m']) + 'yield_fee_12m', 'yield_dividend_12m', 'yield_sales_12m', + 'yield_balance']) return result @classmethod @@ -779,6 +804,10 @@ class Book(SymbolMixin, metaclass=PoolMeta): 'yield_fee_total', 'yield_dividend_total', 'yield_sales', 'yield_fee_12m', 'yield_dividend_12m', 'yield_sales_12m'])) + with Transaction().set_context({ + 'compute_yield_balance': True}): + ValStore.update_values( + cls.get_yield_balance_data(records, ['yield_balance'])) @fields.depends('id') def on_change_with_show_performance(self, name=None): diff --git a/tests/valuestore.py b/tests/valuestore.py index b9aa50f..59f0bfa 100644 --- a/tests/valuestore.py +++ b/tests/valuestore.py @@ -132,21 +132,24 @@ class ValueStoreTestCase(object): '[Book 1 | 2.50 € | Open | 1.500 u]|quantity_all|1.500|3') self.assertEqual( values[11].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_12m|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_balance|4.00|2') self.assertEqual( values[12].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_total|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_12m|0.00|2') self.assertEqual( values[13].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_12m|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_total|0.00|2') self.assertEqual( values[14].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_total|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_12m|0.00|2') self.assertEqual( values[15].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales|2.50|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_total|0.00|2') self.assertEqual( values[16].rec_name, + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales|2.50|2') + self.assertEqual( + values[17].rec_name, '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales_12m|0.00|2') # add rate @@ -203,21 +206,24 @@ class ValueStoreTestCase(object): '[Book 1 | 2.50 € | Open | 1.500 u]|quantity_all|1.500|3') self.assertEqual( values[11].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_12m|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_balance|4.29|2') self.assertEqual( values[12].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_total|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_12m|0.00|2') self.assertEqual( values[13].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_12m|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_total|0.00|2') self.assertEqual( values[14].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_total|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_12m|0.00|2') self.assertEqual( values[15].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales|2.50|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_total|0.00|2') self.assertEqual( values[16].rec_name, + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales|2.50|2') + self.assertEqual( + values[17].rec_name, '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales_12m|0.00|2') # update rate @@ -275,21 +281,24 @@ class ValueStoreTestCase(object): '[Book 1 | 2.50 € | Open | 1.500 u]|quantity_all|1.500|3') self.assertEqual( values[11].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_12m|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_balance|5.00|2') self.assertEqual( values[12].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_total|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_12m|0.00|2') self.assertEqual( values[13].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_12m|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_total|0.00|2') self.assertEqual( values[14].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_total|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_12m|0.00|2') self.assertEqual( values[15].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales|2.50|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_total|0.00|2') self.assertEqual( values[16].rec_name, + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales|2.50|2') + self.assertEqual( + values[17].rec_name, '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales_12m|0.00|2') # delete rate @@ -345,21 +354,24 @@ class ValueStoreTestCase(object): '[Book 1 | 2.50 € | Open | 1.500 u]|quantity_all|1.500|3') self.assertEqual( values[11].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_12m|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_balance|4.00|2') self.assertEqual( values[12].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_total|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_12m|0.00|2') self.assertEqual( values[13].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_12m|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_dividend_total|0.00|2') self.assertEqual( values[14].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_total|0.00|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_12m|0.00|2') self.assertEqual( values[15].rec_name, - '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales|2.50|2') + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_fee_total|0.00|2') self.assertEqual( values[16].rec_name, + '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales|2.50|2') + self.assertEqual( + values[17].rec_name, '[Book 1 | 2.50 € | Open | 1.500 u]|yield_sales_12m|0.00|2') # end ValueStoreTestCase