book: added fields to book-form
This commit is contained in:
parent
91de15e093
commit
20f465ae3a
4 changed files with 183 additions and 36 deletions
99
book.py
99
book.py
|
@ -10,6 +10,8 @@ from trytond.modules.cashbook.book import STATES2, DEPENDS2
|
|||
from trytond.transaction import Transaction
|
||||
from trytond.report import Report
|
||||
from decimal import Decimal
|
||||
from datetime import timedelta
|
||||
from sql import Literal
|
||||
from sql.functions import CurrentDate
|
||||
from sql.aggregate import Sum
|
||||
from sql.conditionals import Case, Coalesce
|
||||
|
@ -121,38 +123,46 @@ class Book(SymbolMixin, metaclass=PoolMeta):
|
|||
yield_dividend_total = fields.Function(fields.Numeric(string='Dividend',
|
||||
help='Total dividends received',
|
||||
readonly=True, digits=(16, Eval('currency_digits', 2)),
|
||||
depends=['currency_digits']),
|
||||
'get_yield_data')
|
||||
states={
|
||||
'invisible': Eval('feature', '') != 'asset',
|
||||
}, depends=['currency_digits', 'feature']), 'get_yield_data')
|
||||
yield_dividend_12m = fields.Function(fields.Numeric(string='Dividend 1y',
|
||||
help='Dividends received in the last twelve months',
|
||||
readonly=True, digits=(16, Eval('currency_digits', 2)),
|
||||
depends=['currency_digits']),
|
||||
'get_yield_data')
|
||||
states={
|
||||
'invisible': Eval('feature', '') != 'asset',
|
||||
}, depends=['currency_digits', 'feature']), 'get_yield_data')
|
||||
yield_fee_total = fields.Function(fields.Numeric(string='Trade Fee',
|
||||
help='Total trade fees payed',
|
||||
readonly=True, digits=(16, Eval('currency_digits', 2)),
|
||||
depends=['currency_digits']),
|
||||
'get_yield_data')
|
||||
states={
|
||||
'invisible': Eval('feature', '') != 'asset',
|
||||
}, depends=['currency_digits', 'feature']), 'get_yield_data')
|
||||
yield_fee_12m = fields.Function(fields.Numeric(string='Trade Fee 1y',
|
||||
help='Trade fees payed in the last twelve month',
|
||||
readonly=True, digits=(16, Eval('currency_digits', 2)),
|
||||
depends=['currency_digits']),
|
||||
'get_yield_data')
|
||||
states={
|
||||
'invisible': Eval('feature', '') != 'asset',
|
||||
}, depends=['currency_digits', 'feature']), 'get_yield_data')
|
||||
yield_sales = fields.Function(fields.Numeric(string='Sales',
|
||||
help='Total profit or loss on sale of shares.',
|
||||
readonly=True, digits=(16, Eval('currency_digits', 2)),
|
||||
depends=['currency_digits']),
|
||||
'get_yield_data')
|
||||
states={
|
||||
'invisible': Eval('feature', '') != 'asset',
|
||||
}, depends=['currency_digits', 'feature']), 'get_yield_data')
|
||||
yield_sales_12m = fields.Function(fields.Numeric(string='Sales 1y',
|
||||
help='Total profit or loss on sale of shares in the last twelve month.',
|
||||
readonly=True, digits=(16, Eval('currency_digits', 2)),
|
||||
depends=['currency_digits']),
|
||||
'get_yield_data')
|
||||
states={
|
||||
'invisible': Eval('feature', '') != 'asset',
|
||||
}, depends=['currency_digits', 'feature']), 'get_yield_data')
|
||||
yield_balance = fields.Function(fields.Numeric(string='Total Yield',
|
||||
help='Total income: price gain + dividends + sales gains - fees',
|
||||
readonly=True, digits=(16, Eval('currency_digits', 2)),
|
||||
depends=['currency_digits']),
|
||||
'get_yield_data')
|
||||
states={
|
||||
'invisible': Eval('feature', '') != 'asset',
|
||||
}, depends=['currency_digits', 'feature']),
|
||||
'on_change_with_yield_balance')
|
||||
|
||||
@classmethod
|
||||
def view_attributes(cls):
|
||||
|
@ -190,8 +200,15 @@ class Book(SymbolMixin, metaclass=PoolMeta):
|
|||
"""
|
||||
return 4
|
||||
|
||||
@fields.depends('yield_sales', 'yield_fee_total', 'yield_dividend_total', 'diff_amount')
|
||||
def on_change_with_yield_balance(self, name=None):
|
||||
""" calculate yield total
|
||||
"""
|
||||
return self.diff_amount + self.yield_dividend_total + \
|
||||
self.yield_sales - self.yield_fee_total
|
||||
|
||||
@classmethod
|
||||
def get_yield_data_sql(cls, date_from=none, date_to=None):
|
||||
def get_yield_data_sql(cls, date_from=None, date_to=None):
|
||||
""" collect yield data
|
||||
"""
|
||||
pool = Pool()
|
||||
|
@ -201,7 +218,7 @@ class Book(SymbolMixin, metaclass=PoolMeta):
|
|||
tab_book = cls.__table__()
|
||||
tab_line = Line.__table__()
|
||||
|
||||
where = True
|
||||
where = Literal(True)
|
||||
if date_from:
|
||||
where &= tab_line.date >= date_from
|
||||
if date_to:
|
||||
|
@ -218,7 +235,8 @@ class Book(SymbolMixin, metaclass=PoolMeta):
|
|||
Sum(tab_line_yield.fee).as_('fee'),
|
||||
Sum(tab_line_yield.dividend).as_('dividend'),
|
||||
Sum(tab_line_gainloss.gainloss).as_('gainloss'),
|
||||
having=where
|
||||
group_by=[tab_book.id],
|
||||
where=where
|
||||
)
|
||||
return (tab_book, query)
|
||||
|
||||
|
@ -226,13 +244,12 @@ class Book(SymbolMixin, metaclass=PoolMeta):
|
|||
def get_yield_data(cls, cashbooks, names):
|
||||
""" collect yield data
|
||||
"""
|
||||
pool = Pool()
|
||||
CashBook = pool.get('cashbook.book')
|
||||
IrDate = pool.get('ir.date')
|
||||
cursor = Transaction().connection.cursor()
|
||||
(tab_book, query) = cls.get_yield_data_sql()
|
||||
result = {x:{y.id: None for y in cashbooks} for x in names}
|
||||
|
||||
query.where = tab_book.id.in_([x.id for x in cashbooks])
|
||||
cursor.execute(*query)
|
||||
records = cursor.fetchall()
|
||||
context = Transaction().context
|
||||
result = {x:{y.id: Decimal('0.0') for y in cashbooks} for x in names}
|
||||
|
||||
def quantize_val(value, line):
|
||||
""" quantize...
|
||||
|
@ -241,14 +258,34 @@ class Book(SymbolMixin, metaclass=PoolMeta):
|
|||
value or Decimal('0.0')
|
||||
).quantize(Decimal(str(1/10**line.currency_digits)))
|
||||
|
||||
for record in records:
|
||||
line = Line2(record[0])
|
||||
values = {
|
||||
'trade_fee': quantize_val(record[1], line),
|
||||
'asset_dividend': quantize_val(record[2], line),
|
||||
}
|
||||
for name in list(name_set):
|
||||
result[name][record[0]] = values[name]
|
||||
# results for 'total'
|
||||
(tab_book1, query_total) = cls.get_yield_data_sql()
|
||||
query_total.where &= tab_book1.id.in_([x.id for x in cashbooks])
|
||||
cursor.execute(*query_total)
|
||||
records_total = cursor.fetchall()
|
||||
|
||||
# results for 12 months
|
||||
query_date = context.get('date', IrDate.today())
|
||||
(tab_book2, query_12m) = cls.get_yield_data_sql(
|
||||
date_to = query_date,
|
||||
date_from = query_date - timedelta(days=365),
|
||||
)
|
||||
query_12m.where &= tab_book2.id.in_([x.id for x in cashbooks])
|
||||
cursor.execute(*query_12m)
|
||||
records_12m = cursor.fetchall()
|
||||
|
||||
result = {x:{y.id: Decimal('0.0') for y in cashbooks} for x in names}
|
||||
for record in records_total:
|
||||
book = CashBook(record[0])
|
||||
result['yield_fee_total'][record[0]] = quantize_val(record[1], book)
|
||||
result['yield_dividend_total'][record[0]] = quantize_val(record[2], book)
|
||||
result['yield_sales'][record[0]] = quantize_val(record[3], book)
|
||||
|
||||
for record in records_12m:
|
||||
book = CashBook(record[0])
|
||||
result['yield_fee_12m'][record[0]] = quantize_val(record[1], book)
|
||||
result['yield_dividend_12m'][record[0]] = quantize_val(record[2], book)
|
||||
result['yield_sales_12m'][record[0]] = quantize_val(record[3], book)
|
||||
|
||||
return result
|
||||
|
||||
|
|
|
@ -50,6 +50,10 @@ msgctxt "view:cashbook.book:"
|
|||
msgid "Quantity"
|
||||
msgstr "Anzahl"
|
||||
|
||||
msgctxt "view:cashbook.book:"
|
||||
msgid "Fees and dividends"
|
||||
msgstr "Gebühren und Dividenden"
|
||||
|
||||
msgctxt "view:cashbook.book:"
|
||||
msgid "Current valuation of the investment"
|
||||
msgstr "aktuelle Bewertung der Vermögensanlage"
|
||||
|
|
84
locale/en.po
84
locale/en.po
|
@ -34,6 +34,10 @@ msgctxt "view:cashbook.book:"
|
|||
msgid "Quantity"
|
||||
msgstr "Quantity"
|
||||
|
||||
msgctxt "view:cashbook.book:"
|
||||
msgid "Fees and dividends"
|
||||
msgstr "Fees and dividends"
|
||||
|
||||
msgctxt "view:cashbook.book:"
|
||||
msgid "Current valuation of the investment"
|
||||
msgstr "Current valuation of the investment"
|
||||
|
@ -122,6 +126,62 @@ msgctxt "help:cashbook.book,current_rate:"
|
|||
msgid "Rate per unit of investment based on current stock exchange price."
|
||||
msgstr "Rate per unit of investment based on current stock exchange price."
|
||||
|
||||
msgctxt "field:cashbook.book,yield_dividend_total:"
|
||||
msgid "Dividend"
|
||||
msgstr "Dividend"
|
||||
|
||||
msgctxt "help:cashbook.book,yield_dividend_total:"
|
||||
msgid "Total dividends received"
|
||||
msgstr "Total dividends received"
|
||||
|
||||
msgctxt "field:cashbook.book,yield_dividend_12m:"
|
||||
msgid "Dividend 1y"
|
||||
msgstr "Dividend 1y"
|
||||
|
||||
msgctxt "help:cashbook.book,yield_dividend_12m:"
|
||||
msgid "Dividends received in the last twelve months"
|
||||
msgstr "Dividends received in the last twelve months"
|
||||
|
||||
msgctxt "field:cashbook.book,yield_fee_total:"
|
||||
msgid "Trade Fee"
|
||||
msgstr "Trade Fee"
|
||||
|
||||
msgctxt "help:cashbook.book,yield_fee_total:"
|
||||
msgid "Total trade fees payed"
|
||||
msgstr "Total trade fees payed"
|
||||
|
||||
msgctxt "field:cashbook.book,yield_fee_12m:"
|
||||
msgid "Trade Fee 1y"
|
||||
msgstr "Trade Fee 1y"
|
||||
|
||||
msgctxt "help:cashbook.book,yield_fee_12m:"
|
||||
msgid "Trade fees payed in the last twelve month"
|
||||
msgstr "Trade fees payed in the last twelve month"
|
||||
|
||||
msgctxt "field:cashbook.book,yield_sales:"
|
||||
msgid "Sales"
|
||||
msgstr "Sales"
|
||||
|
||||
msgctxt "help:cashbook.book,yield_sales:"
|
||||
msgid "Total profit or loss on sale of shares."
|
||||
msgstr "Total profit or loss on sale of shares."
|
||||
|
||||
msgctxt "field:cashbook.book,yield_sales_12m:"
|
||||
msgid "Sales 1y"
|
||||
msgstr "Sales 1y"
|
||||
|
||||
msgctxt "help:cashbook.book,yield_sales_12m:"
|
||||
msgid "Total profit or loss on sale of shares in the last twelve month."
|
||||
msgstr "Total profit or loss on sale of shares in the last twelve month."
|
||||
|
||||
msgctxt "field:cashbook.book,yield_balance:"
|
||||
msgid "Total Yield"
|
||||
msgstr "Total Yield"
|
||||
|
||||
msgctxt "help:cashbook.book,yield_balance:"
|
||||
msgid "Total income: price gain + dividends + sales gains - fees"
|
||||
msgstr "Total income: price gain + dividends + sales gains - fees"
|
||||
|
||||
msgctxt "field:cashbook.split,quantity_digits:"
|
||||
msgid "Digits"
|
||||
msgstr "Digits"
|
||||
|
@ -238,6 +298,30 @@ msgctxt "help:cashbook.line,diff_percent:"
|
|||
msgid "percentage performance since acquisition"
|
||||
msgstr "percentage performance since acquisition"
|
||||
|
||||
msgctxt "field:cashbook.line,trade_fee:"
|
||||
msgid "Fee"
|
||||
msgstr "Fee"
|
||||
|
||||
msgctxt "help:cashbook.line,trade_fee:"
|
||||
msgid "Trading fee for the current booking line."
|
||||
msgstr "Trading fee for the current booking line."
|
||||
|
||||
msgctxt "field:cashbook.line,asset_dividend:"
|
||||
msgid "Dividend"
|
||||
msgstr "Dividend"
|
||||
|
||||
msgctxt "help:cashbook.line,asset_dividend:"
|
||||
msgid "Dividend received at the current booking line."
|
||||
msgstr "Dividend received at the current booking line."
|
||||
|
||||
msgctxt "field:cashbook.line,asset_gainloss:"
|
||||
msgid "Profit/Loss"
|
||||
msgstr "Profit/Loss"
|
||||
|
||||
msgctxt "help:cashbook.line,asset_gainloss:"
|
||||
msgid "Profit or loss on sale on the current booking line."
|
||||
msgstr "Profit or loss on sale on the current booking line."
|
||||
|
||||
msgctxt "field:cashbook.recon,start_quantity:"
|
||||
msgid "Start Quantity"
|
||||
msgstr "Start Quantity"
|
||||
|
|
|
@ -6,18 +6,20 @@ full copyright notices and license terms. -->
|
|||
|
||||
<xpath expr="/form/notebook/page[@name='balance']/field[@name='balance_ref']"
|
||||
position="after">
|
||||
<separator colspan="4" name="quantity" string="Quantity"/>
|
||||
<newline/>
|
||||
<separator colspan="2" name="quantity" string="Quantity"/>
|
||||
<separator colspan="4" name="current_value" string="Current valuation of the investment"/>
|
||||
|
||||
<label name="quantity"/>
|
||||
<field name="quantity" symbol="quantity_uom"/>
|
||||
<label name="quantity_all"/>
|
||||
<field name="quantity_all" symbol="quantity_uom"/>
|
||||
|
||||
<separator colspan="4" name="current_value" string="Current valuation of the investment"/>
|
||||
<label name="current_value"/>
|
||||
<field name="current_value" symbol="currency"/>
|
||||
<label name="current_value_ref"/>
|
||||
<field name="current_value_ref" symbol="company_currency"/>
|
||||
|
||||
<label name="quantity_all"/>
|
||||
<field name="quantity_all" symbol="quantity_uom"/>
|
||||
|
||||
<label name="diff_amount"/>
|
||||
<field name="diff_amount" symbol="currency"/>
|
||||
<label name="diff_percent"/>
|
||||
|
@ -25,8 +27,28 @@ full copyright notices and license terms. -->
|
|||
<field name="diff_percent" xexpand="0"/>
|
||||
<label name="diff_percent" xalign="0.0" string="%" xexpand="1"/>
|
||||
</group>
|
||||
|
||||
<label id="lab1" colspan="2" string=" "/>
|
||||
<label name="yield_balance"/>
|
||||
<field name="yield_balance" symbol="currency"/>
|
||||
<label name="current_rate"/>
|
||||
<field name="current_rate" symbol="asset_symbol"/>
|
||||
|
||||
<separator name="yield_dividend_total" colspan="6" string="Fees and dividends"/>
|
||||
<label name="yield_sales"/>
|
||||
<field name="yield_sales" symbol="currency"/>
|
||||
<label name="yield_dividend_total"/>
|
||||
<field name="yield_dividend_total" symbol="currency"/>
|
||||
<label name="yield_fee_total"/>
|
||||
<field name="yield_fee_total" symbol="currency"/>
|
||||
|
||||
<label name="yield_sales_12m"/>
|
||||
<field name="yield_sales_12m" symbol="currency"/>
|
||||
<label name="yield_dividend_12m"/>
|
||||
<field name="yield_dividend_12m" symbol="currency"/>
|
||||
<label name="yield_fee_12m"/>
|
||||
<field name="yield_fee_12m" symbol="currency"/>
|
||||
|
||||
</xpath>
|
||||
|
||||
<xpath expr="/form/notebook/page[@id='pggeneral']" position="after">
|
||||
|
|
Loading…
Reference in a new issue