changeset 525364a80d10 in modules/commission:default
details: 
https://hg.tryton.org/modules/commission?cmd=changeset&node=525364a80d10
description:
        Add reporting

        issue10397
        review342321002
diffstat:

 CHANGELOG                                         |    2 +
 __init__.py                                       |    4 +
 commission.py                                     |   11 +
 commission_reporting.py                           |  249 ++++++++++++++++++++++
 commission_reporting.xml                          |  176 +++++++++++++++
 invoice.py                                        |    5 +-
 setup.py                                          |    5 +-
 tests/scenario_commission.rst                     |   27 ++
 tryton.cfg                                        |    1 +
 view/commission_form.xml                          |    8 +-
 view/commission_list.xml                          |    4 +-
 view/reporting_agent_graph_amount.xml             |   12 +
 view/reporting_agent_graph_number.xml             |   11 +
 view/reporting_agent_list.xml                     |   10 +
 view/reporting_agent_time_series_graph_amount.xml |   12 +
 view/reporting_agent_time_series_graph_number.xml |   11 +
 view/reporting_agent_time_series_list.xml         |    9 +
 view/reporting_context_form.xml                   |   18 +
 18 files changed, 567 insertions(+), 8 deletions(-)

diffs (744 lines):

diff -r e8ca6ab5ad38 -r 525364a80d10 CHANGELOG
--- a/CHANGELOG Sun Jun 06 09:37:26 2021 +0200
+++ b/CHANGELOG Fri Jun 11 00:17:19 2021 +0200
@@ -1,3 +1,5 @@
+* Add reporting
+
 Version 6.0.0 - 2021-05-03
 * Bug fixes (see mercurial logs for details)
 * Use the invoice date or payment date for commission date
diff -r e8ca6ab5ad38 -r 525364a80d10 __init__.py
--- a/__init__.py       Sun Jun 06 09:37:26 2021 +0200
+++ b/__init__.py       Fri Jun 11 00:17:19 2021 +0200
@@ -4,6 +4,7 @@
 from trytond.pool import Pool
 from . import account
 from . import commission
+from . import commission_reporting
 from . import invoice
 from . import sale
 from . import product
@@ -19,6 +20,9 @@
         commission.AgentSelection,
         commission.Commission,
         commission.CreateInvoiceAsk,
+        commission_reporting.Agent,
+        commission_reporting.AgentTimeseries,
+        commission_reporting.Context,
         invoice.Invoice,
         invoice.InvoiceLine,
         invoice.CreditInvoiceStart,
diff -r e8ca6ab5ad38 -r 525364a80d10 commission.py
--- a/commission.py     Sun Jun 06 09:37:26 2021 +0200
+++ b/commission.py     Fri Jun 11 00:17:19 2021 +0200
@@ -344,11 +344,17 @@
     product = fields.Many2One('product.product', 'Product', required=True,
         states=_readonly_states, depends=_readonly_depends,
         help="The product that is used on the invoice line.")
+    base_amount = fields.Numeric(
+        "Base Amount", digits=(16, Eval('currency_digits', 2)),
+        states=_readonly_states,
+        depends=_readonly_depends + ['currency_digits'])
     amount = fields.Numeric('Amount', required=True, digits=price_digits,
         domain=[('amount', '!=', 0)],
         states=_readonly_states, depends=_readonly_depends)
     currency = fields.Function(fields.Many2One('currency.currency',
             'Currency'), 'on_change_with_currency')
+    currency_digits = fields.Function(fields.Integer(
+            "Currency Digits"), 'on_change_with_currency_digits')
     type_ = fields.Function(fields.Selection([
                 ('in', 'Incoming'),
                 ('out', 'Outgoing'),
@@ -395,6 +401,11 @@
             return self.agent.currency.id
 
     @fields.depends('agent')
+    def on_change_with_currency_digits(self, name=None):
+        if self.agent:
+            return self.agent.currency.digits
+
+    @fields.depends('agent')
     def on_change_with_type_(self, name=None):
         if self.agent:
             return {
diff -r e8ca6ab5ad38 -r 525364a80d10 commission_reporting.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/commission_reporting.py   Fri Jun 11 00:17:19 2021 +0200
@@ -0,0 +1,249 @@
+# This file is part of Tryton.  The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from itertools import tee, zip_longest
+
+from dateutil.relativedelta import relativedelta
+try:
+    import pygal
+except ImportError:
+    pygal = None
+from sql import Literal, Null
+from sql.aggregate import Min, Sum, Count
+from sql.functions import CurrentTimestamp, DateTrunc
+
+from trytond.model import ModelSQL, ModelView, fields
+from trytond.pool import Pool
+from trytond.pyson import Eval, If
+from trytond.transaction import Transaction
+
+from trytond.modules.product import price_digits
+
+
+def pairwise(iterable):
+    a, b = tee(iterable)
+    next(b)
+    return zip_longest(a, b)
+
+
+class Agent(ModelView, ModelSQL):
+    "Commission Reporting per Agent"
+    __name__ = 'commission.reporting.agent'
+
+    agent = fields.Many2One('commission.agent', 'Agent')
+    number = fields.Integer("Number")
+
+    base_amount = fields.Numeric(
+        "Base Amount", digits=(16, Eval('currency_digits', 2)),
+        depends=['currency_digits'])
+    base_amount_trend = fields.Function(
+        fields.Char("Base Amount Trend"), 'get_trend')
+    amount = fields.Numeric("Amount", digits=price_digits)
+
+    time_series = fields.One2Many(
+        'commission.reporting.agent.time_series', 'agent', "Time Series")
+
+    currency = fields.Function(fields.Many2One(
+            'currency.currency', "Currency"), 'get_currency')
+    currency_digits = fields.Function(fields.Integer(
+            "Currency Digits"), 'get_currency_digits')
+
+    @classmethod
+    def table_query(cls):
+        from_item, tables, withs = cls._joins()
+        return from_item.select(
+            *cls._columns(tables, withs),
+            where=cls._where(tables, withs),
+            group_by=cls._group_by(tables, withs),
+            with_=withs.values())
+
+    @classmethod
+    def _joins(cls):
+        pool = Pool()
+        Commission = pool.get('commission')
+        Agent = pool.get('commission.agent')
+
+        tables = {}
+        tables['commission'] = commission = Commission.__table__()
+        tables['commission.agent'] = agent = Agent.__table__()
+        withs = {}
+
+        from_item = (commission
+            .join(agent, condition=commission.agent == agent.id))
+        return from_item, tables, withs
+
+    @classmethod
+    def _columns(cls, tables, withs):
+        commission = tables['commission']
+        return [
+            cls._column_id(tables, withs).as_('id'),
+            Literal(0).as_('create_uid'),
+            CurrentTimestamp().as_('create_date'),
+            cls.write_uid.sql_cast(Literal(Null)).as_('write_uid'),
+            cls.write_date.sql_cast(Literal(Null)).as_('write_date'),
+            commission.agent.as_('agent'),
+            Count(commission.id, distinct=True).as_('number'),
+            Sum(commission.base_amount).as_('base_amount'),
+            Sum(commission.amount).as_('amount'),
+            ]
+
+    @classmethod
+    def _column_id(cls, tables, withs):
+        commission = tables['commission']
+        return commission.agent
+
+    @classmethod
+    def _group_by(cls, tables, withs):
+        commission = tables['commission']
+        return [commission.agent]
+
+    @classmethod
+    def _where(cls, tables, withs):
+        context = Transaction().context
+        commission = tables['commission']
+        agent = tables['commission.agent']
+        where = agent.type_ == cls._get_agent_type(context.get('type', 'out'))
+        from_date = context.get('from_date')
+        if from_date:
+            where &= commission.date >= from_date
+        to_date = context.get('to_date')
+        if to_date:
+            where &= commission.date <= to_date
+        if context.get('invoiced'):
+            where &= commission.invoice_line != Null
+        return where
+
+    @classmethod
+    def _get_agent_type(cls, type):
+        return {
+            'out': 'agent',
+            'in': 'principal',
+            }.get(type)
+
+    @property
+    def time_series_all(self):
+        delta = self._period_delta()
+        for ts, next_ts in pairwise(self.time_series or []):
+            yield ts
+            if delta and next_ts:
+                date = ts.date + delta
+                while date < next_ts.date:
+                    yield None
+                    date += delta
+
+    @classmethod
+    def _period_delta(cls):
+        context = Transaction().context
+        return {
+            'year': relativedelta(years=1),
+            'month': relativedelta(months=1),
+            'day': relativedelta(days=1),
+            }.get(context.get('period'))
+
+    def get_trend(self, name):
+        name = name[:-len('_trend')]
+        if pygal:
+            chart = pygal.Line()
+            chart.add('', [
+                    getattr(ts, name, 0) or 0
+                    for ts in self.time_series_all])
+            return chart.render_sparktext()
+
+    def get_currency(self, name):
+        return self.agent.currency.id
+
+    def get_currency_digits(self, name):
+        return self.agent.currency.digits
+
+
+class AgentTimeseries(Agent):
+    "Commission Reporting per Agent"
+    __name__ = 'commission.reporting.agent.time_series'
+
+    date = fields.Date("Date")
+    time_series = None
+
+    @classmethod
+    def __setup__(cls):
+        super().__setup__()
+        cls._order = [('date', 'ASC')]
+
+    @classmethod
+    def _columns(cls, tables, withs):
+        return super()._columns(tables, withs) + [
+            cls._column_date(tables, withs).as_('date')]
+
+    @classmethod
+    def _column_id(cls, tables, withs):
+        commission = tables['commission']
+        return Min(commission.id)
+
+    @classmethod
+    def _column_date(cls, tables, withs):
+        context = Transaction().context
+        commission = tables['commission']
+        date = DateTrunc(context.get('period'), commission.date)
+        date = cls.date.sql_cast(date)
+        return date
+
+    @classmethod
+    def _group_by(cls, tables, withs):
+        return super()._group_by(tables, withs) + [
+            cls._column_date(tables, withs)]
+
+
+class Context(ModelView):
+    "Commission Reporting Context"
+    __name__ = 'commission.reporting.context'
+
+    type = fields.Selection([
+            ('in', "Incoming"),
+            ('out', "Outgoing"),
+            ], "Type", required=True)
+    from_date = fields.Date("From Date",
+        domain=[
+            If(Eval('to_date') & Eval('from_date'),
+                ('from_date', '<=', Eval('to_date')),
+                ()),
+            ],
+        depends=['to_date'])
+    to_date = fields.Date("To Date",
+        domain=[
+            If(Eval('from_date') & Eval('to_date'),
+                ('to_date', '>=', Eval('from_date')),
+                ()),
+            ],
+        depends=['from_date'])
+    period = fields.Selection([
+            ('year', "Year"),
+            ('month', "Month"),
+            ('day', "Day"),
+            ], "Period", required=True)
+    invoiced = fields.Boolean(
+        "Invoiced",
+        help="Only included invoiced commissions.")
+
+    @classmethod
+    def default_type(cls):
+        return Transaction().context.get('type', 'out')
+
+    @classmethod
+    def default_from_date(cls):
+        pool = Pool()
+        Date = pool.get('ir.date')
+        context = Transaction().context
+        if 'from_date' in context:
+            return context['from_date']
+        return Date.today() - relativedelta(years=1)
+
+    @classmethod
+    def default_to_date(cls):
+        pool = Pool()
+        Date = pool.get('ir.date')
+        context = Transaction().context
+        if 'to_date' in context:
+            return context['to_date']
+        return Date.today()
+
+    @classmethod
+    def default_period(cls):
+        return Transaction().context.get('period', 'month')
diff -r e8ca6ab5ad38 -r 525364a80d10 commission_reporting.xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/commission_reporting.xml  Fri Jun 11 00:17:19 2021 +0200
@@ -0,0 +1,176 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tryton>
+    <data>
+        <menuitem
+            name="Reporting"
+            parent="menu_commission"
+            sequence="100"
+            id="menu_reporting"/>
+
+        <menuitem
+            name="Commissions"
+            parent="menu_reporting"
+            sequence="10"
+            id="menu_reporting_commission"
+            icon="tryton-graph"/>
+
+        <record model="ir.ui.view" id="reporting_context_view_form">
+            <field name="model">commission.reporting.context</field>
+            <field name="type">form</field>
+            <field name="name">reporting_context_form</field>
+        </record>
+
+        <record model="ir.ui.view" id="reporting_agent_view_list">
+            <field name="model">commission.reporting.agent</field>
+            <field name="type">tree</field>
+            <field name="name">reporting_agent_list</field>
+        </record>
+
+        <record model="ir.ui.view" id="reporting_agent_view_graph_amount">
+            <field name="model">commission.reporting.agent</field>
+            <field name="type">graph</field>
+            <field name="name">reporting_agent_graph_amount</field>
+        </record>
+
+        <record model="ir.ui.view" id="reporting_agent_view_graph_number">
+            <field name="model">commission.reporting.agent</field>
+            <field name="type">graph</field>
+            <field name="name">reporting_agent_graph_number</field>
+        </record>
+
+        <record model="ir.action.act_window" id="act_reporting_agent">
+            <field name="name">Commissions per Agent</field>
+            <field name="res_model">commission.reporting.agent</field>
+            <field name="context_model">commission.reporting.context</field>
+        </record>
+        <record model="ir.action.act_window.view" 
id="act_reporting_agent_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="reporting_agent_view_list"/>
+            <field name="act_window" ref="act_reporting_agent"/>
+        </record>
+        <record model="ir.action.act_window.view" 
id="act_reporting_agent_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="reporting_agent_view_graph_amount"/>
+            <field name="act_window" ref="act_reporting_agent"/>
+        </record>
+        <record model="ir.action.act_window.view" 
id="act_reporting_agent_view3">
+            <field name="sequence" eval="30"/>
+            <field name="view" ref="reporting_agent_view_graph_number"/>
+            <field name="act_window" ref="act_reporting_agent"/>
+        </record>
+        <record model="ir.action.keyword" id="act_reporting_agent_keyword1">
+            <field name="keyword">tree_open</field>
+            <field name="model" eval="'ir.ui.menu,%s' % 
ref('menu_reporting_commission')"/>
+            <field name="action" ref="act_reporting_agent"/>
+        </record>
+
+        <record model="ir.rule.group" 
id="rule_group_reporting_agent_companies">
+            <field name="name">User in companies</field>
+            <field name="model"
+                search="[('model', '=', 'commission.reporting.agent')]"/>
+            <field name="global_p" eval="True"/>
+        </record>
+        <record model="ir.rule" id="rule_reporting_agent_companies">
+            <field name="domain"
+                eval="[('agent.company', 'in', Eval('companies', []))]"
+                pyson="1"/>
+            <field name="rule_group" 
ref="rule_group_reporting_agent_companies"/>
+        </record>
+
+        <record model="ir.model.access" id="access_reporting_agent">
+            <field name="model" search="[('model', '=', 
'commission.reporting.agent')]"/>
+            <field name="perm_read" eval="False"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+        <record model="ir.model.access" id="access_reporting_agent_commission">
+            <field name="model" search="[('model', '=', 
'commission.reporting.agent')]"/>
+            <field name="group" ref="group_commission"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
+        <record model="ir.ui.view" id="reporting_agent_time_series_view_list">
+            <field name="model">commission.reporting.agent.time_series</field>
+            <field name="type">tree</field>
+            <field name="name">reporting_agent_time_series_list</field>
+        </record>
+
+        <record model="ir.ui.view" 
id="reporting_agent_time_series_view_graph_amount">
+            <field name="model">commission.reporting.agent.time_series</field>
+            <field name="type">graph</field>
+            <field name="name">reporting_agent_time_series_graph_amount</field>
+        </record>
+
+        <record model="ir.ui.view" 
id="reporting_agent_time_series_view_graph_number">
+            <field name="model">commission.reporting.agent.time_series</field>
+            <field name="type">graph</field>
+            <field name="name">reporting_agent_time_series_graph_number</field>
+        </record>
+
+        <record model="ir.action.act_window" 
id="act_reporting_agent_time_series">
+            <field name="name">Commissions per Agent</field>
+            <field 
name="res_model">commission.reporting.agent.time_series</field>
+            <field name="context_model">commission.reporting.context</field>
+            <field
+                name="domain"
+                eval="[('agent', '=', Eval('active_id', -1))]"
+                pyson="1"/>
+            <field name="order" eval="[('date', 'DESC')]" pyson="1"/>
+        </record>
+        <record model="ir.action.act_window.view" 
id="act_reporting_agent_time_series_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="reporting_agent_time_series_view_list"/>
+            <field name="act_window" ref="act_reporting_agent_time_series"/>
+        </record>
+        <record model="ir.action.act_window.view" 
id="act_reporting_agent_time_series_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" 
ref="reporting_agent_time_series_view_graph_amount"/>
+            <field name="act_window" ref="act_reporting_agent_time_series"/>
+        </record>
+        <record model="ir.action.act_window.view" 
id="act_reporting_agent_time_series_view3">
+            <field name="sequence" eval="30"/>
+            <field name="view" 
ref="reporting_agent_time_series_view_graph_number"/>
+            <field name="act_window" ref="act_reporting_agent_time_series"/>
+        </record>
+        <record model="ir.action.keyword" 
id="act_reporting_agent_time_series_keyword1">
+            <field name="keyword">tree_open</field>
+            <field name="model">commission.reporting.agent,-1</field>
+            <field name="action" ref="act_reporting_agent_time_series"/>
+        </record>
+
+        <record model="ir.rule.group" 
id="rule_group_reporting_agent_time_series_companies">
+            <field name="name">User in companies</field>
+            <field name="model"
+                search="[('model', '=', 
'commission.reporting.agent.time_series')]"/>
+            <field name="global_p" eval="True"/>
+        </record>
+        <record model="ir.rule" 
id="rule_reporting_agent_time_series_companies">
+            <field name="domain"
+                eval="[('agent.company', 'in', Eval('companies', []))]"
+                pyson="1"/>
+            <field name="rule_group" 
ref="rule_group_reporting_agent_time_series_companies"/>
+        </record>
+
+        <record model="ir.model.access" 
id="access_reporting_agent_time_series">
+            <field name="model" search="[('model', '=', 
'commission.reporting.agent.time_series')]"/>
+            <field name="perm_read" eval="False"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+        <record model="ir.model.access" 
id="access_reporting_agent_time_series_commission">
+            <field name="model" search="[('model', '=', 
'commission.reporting.agent.time_series')]"/>
+            <field name="group" ref="group_commission"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+    </data>
+</tryton>
diff -r e8ca6ab5ad38 -r 525364a80d10 invoice.py
--- a/invoice.py        Sun Jun 06 09:37:26 2021 +0200
+++ b/invoice.py        Fri Jun 11 00:17:19 2021 +0200
@@ -162,9 +162,9 @@
             if not plan:
                 continue
             with Transaction().set_context(date=self.invoice.currency_date):
-                amount = Currency.compute(self.invoice.currency,
+                base_amount = Currency.compute(self.invoice.currency,
                     self.amount, agent.currency, round=False)
-            amount = self._get_commission_amount(amount, plan)
+            amount = self._get_commission_amount(base_amount, plan)
             if amount:
                 amount = round_price(amount)
             if not amount:
@@ -179,6 +179,7 @@
                 commission.date = self.invoice.reconciled or today
             commission.agent = agent
             commission.product = plan.commission_product
+            commission.base_amount = base_amount
             commission.amount = amount
             commissions.append(commission)
         return commissions
diff -r e8ca6ab5ad38 -r 525364a80d10 setup.py
--- a/setup.py  Sun Jun 06 09:37:26 2021 +0200
+++ b/setup.py  Fri Jun 11 00:17:19 2021 +0200
@@ -57,7 +57,7 @@
 if local_version:
     version += '+' + '.'.join(local_version)
 
-requires = ['simpleeval', 'python-sql']
+requires = ['simpleeval', 'python-sql', 'python-dateutil']
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res)(\W|$)', dep):
         requires.append(get_require_version('trytond_%s' % dep))
@@ -139,6 +139,9 @@
     license='GPL-3',
     python_requires='>=3.6',
     install_requires=requires,
+    extras_require={
+        'sparklines': ['pygal'],
+        },
     dependency_links=dependency_links,
     zip_safe=False,
     entry_points="""
diff -r e8ca6ab5ad38 -r 525364a80d10 tests/scenario_commission.rst
--- a/tests/scenario_commission.rst     Sun Jun 06 09:37:26 2021 +0200
+++ b/tests/scenario_commission.rst     Fri Jun 11 00:17:19 2021 +0200
@@ -22,6 +22,9 @@
 
     >>> config = activate_modules('commission')
 
+    >>> ReportingAgent = Model.get('commission.reporting.agent')
+    >>> ReportingAgentTimeseries = 
Model.get('commission.reporting.agent.time_series')
+
 Create company::
 
     >>> _ = create_company()
@@ -151,6 +154,8 @@
     >>> line, = invoice.lines
     >>> len(line.commissions)
     2
+    >>> [c.base_amount for c in line.commissions]
+    [Decimal('100.00'), Decimal('100.00')]
     >>> [c.amount for c in line.commissions]
     [Decimal('10.0000'), Decimal('10.0000')]
     >>> [c.invoice_state for c in line.commissions]
@@ -222,3 +227,25 @@
     >>> credit_note, = credit.actions[0]
     >>> credit_note.agent == agent
     True
+
+Check commission reporting per agent::
+
+    >>> with config.set_context(type='out'):
+    ...     reporting_agent, = ReportingAgent.find([])
+    ...     reporting_agent_timeseries, = ReportingAgentTimeseries.find([])
+
+    >>> reporting_agent.base_amount == Decimal('100.00')
+    True
+    >>> reporting_agent.amount == Decimal('10.0000')
+    True
+    >>> reporting_agent.number
+    1
+
+    >>> reporting_agent_timeseries.date == tomorrow
+    True
+    >>> reporting_agent_timeseries.base_amount == Decimal('100.00')
+    True
+    >>> reporting_agent_timeseries.amount == Decimal('10.00')
+    True
+    >>> reporting_agent_timeseries.number
+    1
diff -r e8ca6ab5ad38 -r 525364a80d10 tryton.cfg
--- a/tryton.cfg        Sun Jun 06 09:37:26 2021 +0200
+++ b/tryton.cfg        Fri Jun 11 00:17:19 2021 +0200
@@ -12,6 +12,7 @@
     sale
 xml:
     commission.xml
+    commission_reporting.xml
     invoice.xml
     sale.xml
     account.xml
diff -r e8ca6ab5ad38 -r 525364a80d10 view/commission_form.xml
--- a/view/commission_form.xml  Sun Jun 06 09:37:26 2021 +0200
+++ b/view/commission_form.xml  Fri Jun 11 00:17:19 2021 +0200
@@ -10,10 +10,12 @@
     <field name="type_"/>
     <label name="product"/>
     <field name="product"/>
+
+    <label name="base_amount"/>
+    <field name="base_amount" symbol="currency"/>
     <label name="amount"/>
-    <field name="amount"/>
-    <label name="currency"/>
-    <field name="currency"/>
+    <field name="amount" symbol="currency"/>
+
     <label name="origin"/>
     <field name="origin"/>
     <newline/>
diff -r e8ca6ab5ad38 -r 525364a80d10 view/commission_list.xml
--- a/view/commission_list.xml  Sun Jun 06 09:37:26 2021 +0200
+++ b/view/commission_list.xml  Fri Jun 11 00:17:19 2021 +0200
@@ -5,8 +5,8 @@
     <field name="type_"/>
     <field name="agent" expand="1"/>
     <field name="date"/>
-    <field name="amount"/>
-    <field name="currency"/>
+    <field name="base_amount" symbol="currency"/>
+    <field name="amount" symbol="currency"/>
     <field name="invoice_state"/>
     <button name="invoice" tree_invisible="1"/>
 </tree>
diff -r e8ca6ab5ad38 -r 525364a80d10 view/reporting_agent_graph_amount.xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/view/reporting_agent_graph_amount.xml     Fri Jun 11 00:17:19 2021 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<graph>
+    <x>
+        <field name="agent"/>
+    </x>
+    <y>
+        <field name="base_amount"/>
+        <field name="amount"/>
+    </y>
+</graph>
diff -r e8ca6ab5ad38 -r 525364a80d10 view/reporting_agent_graph_number.xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/view/reporting_agent_graph_number.xml     Fri Jun 11 00:17:19 2021 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<graph>
+    <x>
+        <field name="agent"/>
+    </x>
+    <y>
+        <field name="number"/>
+    </y>
+</graph>
diff -r e8ca6ab5ad38 -r 525364a80d10 view/reporting_agent_list.xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/view/reporting_agent_list.xml     Fri Jun 11 00:17:19 2021 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree keyword_open="1">
+    <field name="agent" expand="1"/>
+    <field name="number"/>
+    <field name="base_amount" symbol="currency"/>
+    <field name="base_amount_trend" expand="1"/>
+    <field name="amount" symbol="currency"/>
+</tree>
diff -r e8ca6ab5ad38 -r 525364a80d10 
view/reporting_agent_time_series_graph_amount.xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/view/reporting_agent_time_series_graph_amount.xml Fri Jun 11 00:17:19 
2021 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<graph>
+    <x>
+        <field name="date"/>
+    </x>
+    <y>
+        <field name="base_amount"/>
+        <field name="amount"/>
+    </y>
+</graph>
diff -r e8ca6ab5ad38 -r 525364a80d10 
view/reporting_agent_time_series_graph_number.xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/view/reporting_agent_time_series_graph_number.xml Fri Jun 11 00:17:19 
2021 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<graph>
+    <x>
+        <field name="date"/>
+    </x>
+    <y>
+        <field name="number"/>
+    </y>
+</graph>
diff -r e8ca6ab5ad38 -r 525364a80d10 view/reporting_agent_time_series_list.xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/view/reporting_agent_time_series_list.xml Fri Jun 11 00:17:19 2021 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree>
+    <field name="date"/>
+    <field name="number"/>
+    <field name="base_amount" symbol="currency"/>
+    <field name="amount" symbol="currency"/>
+</tree>
diff -r e8ca6ab5ad38 -r 525364a80d10 view/reporting_context_form.xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/view/reporting_context_form.xml   Fri Jun 11 00:17:19 2021 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form>
+    <group id="dates" colspan="2" col="4">
+        <label name="from_date"/>
+        <field name="from_date"/>
+        <label name="to_date"/>
+        <field name="to_date"/>
+    </group>
+    <label name="period"/>
+    <field name="period"/>
+
+    <label name="type"/>
+    <field name="type"/>
+    <label name="invoiced"/>
+    <field name="invoiced"/>
+</form>

Reply via email to