override project profitibility report
This commit is contained in:
parent
825cb03abc
commit
f27d5839f5
|
@ -1,4 +1,5 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import controllers
|
||||
from . import models
|
||||
from . import models
|
||||
from . import report
|
|
@ -30,6 +30,7 @@
|
|||
'views/project_view.xml',
|
||||
'views/hr_timesheet_templates.xml',
|
||||
'views/analytic_view.xml',
|
||||
'report/project_profitability_report_analysis_views.xml',
|
||||
'views/views.xml',
|
||||
'views/templates.xml',
|
||||
],
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,4 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import project_profitability_report_analysis
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,360 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import fields, models, tools
|
||||
|
||||
|
||||
class ProfitabilityAnalysis(models.Model):
|
||||
|
||||
_name = "project.profitability.report"
|
||||
_description = "Project Profitability Report"
|
||||
_order = 'project_id, sale_line_id'
|
||||
_auto = False
|
||||
|
||||
analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', readonly=True)
|
||||
project_id = fields.Many2one('project.project', string='Project', readonly=True)
|
||||
currency_id = fields.Many2one('res.currency', string='Project Currency', readonly=True)
|
||||
company_id = fields.Many2one('res.company', string='Project Company', readonly=True)
|
||||
user_id = fields.Many2one('res.users', string='Project Manager', readonly=True)
|
||||
partner_id = fields.Many2one('res.partner', string='Customer', readonly=True)
|
||||
line_date = fields.Date("Date", readonly=True)
|
||||
# cost
|
||||
budgeted_unit_amount = fields.Float("Budgeted Duration", digits=(16, 2), readonly=True, group_operator="sum")
|
||||
timesheet_unit_amount = fields.Float("Timesheet Duration", digits=(16, 2), readonly=True, group_operator="sum")
|
||||
timesheet_cost = fields.Float("Timesheet Cost", digits=(16, 2), readonly=True, group_operator="sum")
|
||||
expense_cost = fields.Float("Other Costs", digits=(16, 2), readonly=True, group_operator="sum")
|
||||
# sale revenue
|
||||
order_confirmation_date = fields.Datetime('Sales Order Confirmation Date', readonly=True)
|
||||
sale_line_id = fields.Many2one('sale.order.line', string='Sale Order Line', readonly=True)
|
||||
sale_order_id = fields.Many2one('sale.order', string='Sale Order', readonly=True)
|
||||
product_id = fields.Many2one('product.product', string='Product', readonly=True)
|
||||
|
||||
amount_untaxed_to_invoice = fields.Float("Untaxed Amount to Invoice", digits=(16, 2), readonly=True, group_operator="sum")
|
||||
amount_untaxed_invoiced = fields.Float("Untaxed Amount Invoiced", digits=(16, 2), readonly=True, group_operator="sum")
|
||||
expense_amount_untaxed_to_invoice = fields.Float("Untaxed Amount to Re-invoice", digits=(16, 2), readonly=True, group_operator="sum")
|
||||
expense_amount_untaxed_invoiced = fields.Float("Untaxed Amount Re-invoiced", digits=(16, 2), readonly=True, group_operator="sum")
|
||||
other_revenues = fields.Float("Other Revenues", digits=(16, 2), readonly=True, group_operator="sum",
|
||||
help="All revenues that are not from timesheets and that are linked to the analytic account of the project.")
|
||||
margin = fields.Float("Margin", digits=(16, 2), readonly=True, group_operator="sum")
|
||||
|
||||
def init(self):
|
||||
tools.drop_view_if_exists(self._cr, self._table)
|
||||
query = """
|
||||
CREATE VIEW %s AS (
|
||||
SELECT
|
||||
sub.id as id,
|
||||
sub.project_id as project_id,
|
||||
sub.user_id as user_id,
|
||||
sub.sale_line_id as sale_line_id,
|
||||
sub.analytic_account_id as analytic_account_id,
|
||||
sub.partner_id as partner_id,
|
||||
sub.company_id as company_id,
|
||||
sub.currency_id as currency_id,
|
||||
sub.sale_order_id as sale_order_id,
|
||||
sub.order_confirmation_date as order_confirmation_date,
|
||||
sub.product_id as product_id,
|
||||
sub.sale_qty_delivered_method as sale_qty_delivered_method,
|
||||
sub.expense_amount_untaxed_to_invoice as expense_amount_untaxed_to_invoice,
|
||||
sub.expense_amount_untaxed_invoiced as expense_amount_untaxed_invoiced,
|
||||
sub.amount_untaxed_to_invoice as amount_untaxed_to_invoice,
|
||||
sub.amount_untaxed_invoiced as amount_untaxed_invoiced,
|
||||
sub.timesheet_unit_amount as timesheet_unit_amount,
|
||||
sub.timesheet_cost as timesheet_cost,
|
||||
sub.expense_cost as expense_cost,
|
||||
sub.other_revenues as other_revenues,
|
||||
sub.line_date as line_date,
|
||||
(sub.expense_amount_untaxed_to_invoice + sub.expense_amount_untaxed_invoiced + sub.amount_untaxed_to_invoice +
|
||||
sub.amount_untaxed_invoiced + sub.other_revenues + sub.timesheet_cost + sub.expense_cost)
|
||||
as margin
|
||||
FROM (
|
||||
SELECT
|
||||
ROW_NUMBER() OVER (ORDER BY P.id, SOL.id) AS id,
|
||||
P.id AS project_id,
|
||||
P.user_id AS user_id,
|
||||
SOL.id AS sale_line_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
P.partner_id AS partner_id,
|
||||
C.id AS company_id,
|
||||
C.currency_id AS currency_id,
|
||||
S.id AS sale_order_id,
|
||||
S.date_order AS order_confirmation_date,
|
||||
SOL.product_id AS product_id,
|
||||
SOL.qty_delivered_method AS sale_qty_delivered_method,
|
||||
COST_SUMMARY.expense_amount_untaxed_to_invoice AS expense_amount_untaxed_to_invoice,
|
||||
COST_SUMMARY.expense_amount_untaxed_invoiced AS expense_amount_untaxed_invoiced,
|
||||
COST_SUMMARY.amount_untaxed_to_invoice AS amount_untaxed_to_invoice,
|
||||
COST_SUMMARY.amount_untaxed_invoiced AS amount_untaxed_invoiced,
|
||||
COST_SUMMARY.timesheet_unit_amount AS timesheet_unit_amount,
|
||||
COST_SUMMARY.timesheet_cost AS timesheet_cost,
|
||||
COST_SUMMARY.expense_cost AS expense_cost,
|
||||
COST_SUMMARY.other_revenues AS other_revenues,
|
||||
COST_SUMMARY.line_date::date AS line_date
|
||||
FROM project_project P
|
||||
JOIN res_company C ON C.id = P.company_id
|
||||
LEFT JOIN (
|
||||
-- Each costs and revenues will be retrieved individually by sub-requests
|
||||
-- This is required to able to get the date
|
||||
SELECT
|
||||
project_id,
|
||||
analytic_account_id,
|
||||
sale_line_id,
|
||||
SUM(timesheet_unit_amount) AS timesheet_unit_amount,
|
||||
SUM(timesheet_cost) AS timesheet_cost,
|
||||
SUM(expense_cost) AS expense_cost,
|
||||
SUM(other_revenues) AS other_revenues,
|
||||
SUM(downpayment_invoiced) AS downpayment_invoiced,
|
||||
SUM(expense_amount_untaxed_to_invoice) AS expense_amount_untaxed_to_invoice,
|
||||
SUM(expense_amount_untaxed_invoiced) AS expense_amount_untaxed_invoiced,
|
||||
SUM(amount_untaxed_to_invoice) AS amount_untaxed_to_invoice,
|
||||
SUM(amount_untaxed_invoiced) AS amount_untaxed_invoiced,
|
||||
line_date AS line_date
|
||||
FROM (
|
||||
-- Get the timesheet costs
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
TS.so_line AS sale_line_id,
|
||||
TS.unit_amount AS timesheet_unit_amount,
|
||||
TS.amount AS timesheet_cost,
|
||||
0.0 AS other_revenues,
|
||||
0.0 AS expense_cost,
|
||||
0.0 AS downpayment_invoiced,
|
||||
0.0 AS expense_amount_untaxed_to_invoice,
|
||||
0.0 AS expense_amount_untaxed_invoiced,
|
||||
0.0 AS amount_untaxed_to_invoice,
|
||||
0.0 AS amount_untaxed_invoiced,
|
||||
TS.date AS line_date
|
||||
FROM account_analytic_line TS, project_project P
|
||||
WHERE TS.project_id IS NOT NULL AND P.id = TS.project_id AND P.active = 't' AND P.allow_timesheets = 't'
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Get the other revenues
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
AAL.so_line AS sale_line_id,
|
||||
0.0 AS timesheet_unit_amount,
|
||||
0.0 AS timesheet_cost,
|
||||
AAL.amount AS other_revenues,
|
||||
0.0 AS expense_cost,
|
||||
0.0 AS downpayment_invoiced,
|
||||
0.0 AS expense_amount_untaxed_to_invoice,
|
||||
0.0 AS expense_amount_untaxed_invoiced,
|
||||
0.0 AS amount_untaxed_to_invoice,
|
||||
0.0 AS amount_untaxed_invoiced,
|
||||
AAL.date AS line_date
|
||||
FROM project_project P
|
||||
LEFT JOIN account_analytic_account AA ON P.analytic_account_id = AA.id
|
||||
LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id
|
||||
WHERE AAL.amount > 0.0 AND AAL.project_id IS NULL AND P.active = 't' AND P.allow_timesheets = 't'
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Get the expense costs from account analytic line
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
AAL.so_line AS sale_line_id,
|
||||
0.0 AS timesheet_unit_amount,
|
||||
0.0 AS timesheet_cost,
|
||||
0.0 AS other_revenues,
|
||||
AAL.amount AS expense_cost,
|
||||
0.0 AS downpayment_invoiced,
|
||||
0.0 AS expense_amount_untaxed_to_invoice,
|
||||
0.0 AS expense_amount_untaxed_invoiced,
|
||||
0.0 AS amount_untaxed_to_invoice,
|
||||
0.0 AS amount_untaxed_invoiced,
|
||||
AAL.date AS line_date
|
||||
FROM project_project P
|
||||
LEFT JOIN account_analytic_account AA ON P.analytic_account_id = AA.id
|
||||
LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id
|
||||
WHERE AAL.amount < 0.0 AND AAL.project_id IS NULL AND P.active = 't' AND P.allow_timesheets = 't'
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Get the invoiced downpayments
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
MY_SOLS.id AS sale_line_id,
|
||||
0.0 AS timesheet_unit_amount,
|
||||
0.0 AS timesheet_cost,
|
||||
0.0 AS other_revenues,
|
||||
0.0 AS expense_cost,
|
||||
CASE WHEN MY_SOLS.invoice_status = 'invoiced' THEN MY_SOLS.price_reduce ELSE 0.0 END AS downpayment_invoiced,
|
||||
0.0 AS expense_amount_untaxed_to_invoice,
|
||||
0.0 AS expense_amount_untaxed_invoiced,
|
||||
0.0 AS amount_untaxed_to_invoice,
|
||||
0.0 AS amount_untaxed_invoiced,
|
||||
MY_S.date_order AS line_date
|
||||
FROM project_project P
|
||||
LEFT JOIN sale_order_line MY_SOL ON P.sale_line_id = MY_SOL.id
|
||||
LEFT JOIN sale_order MY_S ON MY_SOL.order_id = MY_S.id
|
||||
LEFT JOIN sale_order_line MY_SOLS ON MY_SOLS.order_id = MY_S.id
|
||||
WHERE MY_SOLS.is_downpayment = 't'
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Get the expense costs from sale order line
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
OLIS.id AS sale_line_id,
|
||||
0.0 AS timesheet_unit_amount,
|
||||
0.0 AS timesheet_cost,
|
||||
0.0 AS other_revenues,
|
||||
OLIS.price_reduce AS expense_cost,
|
||||
0.0 AS downpayment_invoiced,
|
||||
0.0 AS expense_amount_untaxed_to_invoice,
|
||||
0.0 AS expense_amount_untaxed_invoiced,
|
||||
0.0 AS amount_untaxed_to_invoice,
|
||||
0.0 AS amount_untaxed_invoiced,
|
||||
ANLI.date AS line_date
|
||||
FROM project_project P
|
||||
LEFT JOIN account_analytic_account ANAC ON P.analytic_account_id = ANAC.id
|
||||
LEFT JOIN account_analytic_line ANLI ON ANAC.id = ANLI.account_id
|
||||
LEFT JOIN sale_order_line OLI ON P.sale_line_id = OLI.id
|
||||
LEFT JOIN sale_order ORD ON OLI.order_id = ORD.id
|
||||
LEFT JOIN sale_order_line OLIS ON ORD.id = OLIS.order_id
|
||||
WHERE OLIS.product_id = ANLI.product_id AND OLIS.is_downpayment = 't' AND ANLI.amount < 0.0 AND ANLI.project_id IS NULL AND P.active = 't' AND P.allow_timesheets = 't'
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Get the following values: expense amount untaxed to invoice/invoiced, amount untaxed to invoice/invoiced
|
||||
-- These values have to be computed from all the records retrieved just above but grouped by project and sale order line
|
||||
SELECT
|
||||
AMOUNT_UNTAXED.project_id AS project_id,
|
||||
AMOUNT_UNTAXED.analytic_account_id AS analytic_account_id,
|
||||
AMOUNT_UNTAXED.sale_line_id AS sale_line_id,
|
||||
0.0 AS timesheet_unit_amount,
|
||||
0.0 AS timesheet_cost,
|
||||
0.0 AS other_revenues,
|
||||
0.0 AS expense_cost,
|
||||
0.0 AS downpayment_invoiced,
|
||||
CASE
|
||||
WHEN SOL.qty_delivered_method = 'analytic' THEN (SOL.untaxed_amount_to_invoice / CASE COALESCE(S.currency_rate, 0) WHEN 0 THEN 1.0 ELSE S.currency_rate END)
|
||||
ELSE 0.0
|
||||
END AS expense_amount_untaxed_to_invoice,
|
||||
CASE
|
||||
WHEN SOL.qty_delivered_method = 'analytic' AND SOL.invoice_status != 'no'
|
||||
THEN
|
||||
CASE
|
||||
WHEN T.expense_policy = 'sales_price'
|
||||
THEN (SOL.price_reduce / CASE COALESCE(S.currency_rate, 0) WHEN 0 THEN 1.0 ELSE S.currency_rate END) * SOL.qty_invoiced
|
||||
ELSE -AMOUNT_UNTAXED.expense_cost
|
||||
END
|
||||
ELSE 0.0
|
||||
END AS expense_amount_untaxed_invoiced,
|
||||
CASE
|
||||
WHEN SOL.qty_delivered_method IN ('timesheet', 'manual') THEN (SOL.untaxed_amount_to_invoice / CASE COALESCE(S.currency_rate, 0) WHEN 0 THEN 1.0 ELSE S.currency_rate END)
|
||||
ELSE 0.0
|
||||
END AS amount_untaxed_to_invoice,
|
||||
CASE
|
||||
WHEN SOL.qty_delivered_method IN ('timesheet', 'manual') THEN (COALESCE(SOL.untaxed_amount_invoiced, AMOUNT_UNTAXED.downpayment_invoiced) / CASE COALESCE(S.currency_rate, 0) WHEN 0 THEN 1.0 ELSE S.currency_rate END)
|
||||
ELSE 0.0
|
||||
END AS amount_untaxed_invoiced,
|
||||
S.date_order AS line_date
|
||||
FROM project_project P
|
||||
JOIN res_company C ON C.id = P.company_id
|
||||
LEFT JOIN (
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
AAL.so_line AS sale_line_id,
|
||||
0.0 AS expense_cost,
|
||||
0.0 AS downpayment_invoiced
|
||||
FROM account_analytic_line AAL, project_project P
|
||||
WHERE AAL.project_id IS NOT NULL AND P.id = AAL.project_id AND P.active = 't'
|
||||
GROUP BY P.id, AAL.so_line
|
||||
|
||||
UNION
|
||||
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
AAL.so_line AS sale_line_id,
|
||||
0.0 AS expense_cost,
|
||||
0.0 AS downpayment_invoiced
|
||||
FROM project_project P
|
||||
LEFT JOIN account_analytic_account AA ON P.analytic_account_id = AA.id
|
||||
LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id
|
||||
WHERE AAL.amount > 0.0 AND AAL.project_id IS NULL AND P.active = 't' AND P.allow_timesheets = 't'
|
||||
GROUP BY P.id, AA.id, AAL.so_line
|
||||
UNION
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
AAL.so_line AS sale_line_id,
|
||||
SUM(AAL.amount) AS expense_cost,
|
||||
0.0 AS downpayment_invoiced
|
||||
FROM project_project P
|
||||
LEFT JOIN account_analytic_account AA ON P.analytic_account_id = AA.id
|
||||
LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id
|
||||
WHERE AAL.amount < 0.0 AND AAL.project_id IS NULL AND P.active = 't' AND P.allow_timesheets = 't'
|
||||
GROUP BY P.id, AA.id, AAL.so_line
|
||||
UNION
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
MY_SOLS.id AS sale_line_id,
|
||||
0.0 AS expense_cost,
|
||||
CASE WHEN MY_SOLS.invoice_status = 'invoiced' THEN MY_SOLS.price_reduce ELSE 0.0 END AS downpayment_invoiced
|
||||
FROM project_project P
|
||||
LEFT JOIN sale_order_line MY_SOL ON P.sale_line_id = MY_SOL.id
|
||||
LEFT JOIN sale_order MY_S ON MY_SOL.order_id = MY_S.id
|
||||
LEFT JOIN sale_order_line MY_SOLS ON MY_SOLS.order_id = MY_S.id
|
||||
WHERE MY_SOLS.is_downpayment = 't'
|
||||
GROUP BY P.id, MY_SOLS.id
|
||||
UNION
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
OLIS.id AS sale_line_id,
|
||||
OLIS.price_reduce AS expense_cost,
|
||||
0.0 AS downpayment_invoiced
|
||||
FROM project_project P
|
||||
LEFT JOIN account_analytic_account ANAC ON P.analytic_account_id = ANAC.id
|
||||
LEFT JOIN account_analytic_line ANLI ON ANAC.id = ANLI.account_id
|
||||
LEFT JOIN sale_order_line OLI ON P.sale_line_id = OLI.id
|
||||
LEFT JOIN sale_order ORD ON OLI.order_id = ORD.id
|
||||
LEFT JOIN sale_order_line OLIS ON ORD.id = OLIS.order_id
|
||||
WHERE OLIS.product_id = ANLI.product_id AND OLIS.is_downpayment = 't' AND ANLI.amount < 0.0 AND ANLI.project_id IS NULL AND P.active = 't' AND P.allow_timesheets = 't'
|
||||
GROUP BY P.id, OLIS.id
|
||||
UNION
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
SOL.id AS sale_line_id,
|
||||
0.0 AS expense_cost,
|
||||
0.0 AS downpayment_invoiced
|
||||
FROM sale_order_line SOL
|
||||
INNER JOIN project_project P ON SOL.project_id = P.id
|
||||
WHERE P.active = 't' AND P.allow_timesheets = 't'
|
||||
UNION
|
||||
SELECT
|
||||
P.id AS project_id,
|
||||
P.analytic_account_id AS analytic_account_id,
|
||||
SOL.id AS sale_line_id,
|
||||
0.0 AS expense_cost,
|
||||
0.0 AS downpayment_invoiced
|
||||
FROM sale_order_line SOL
|
||||
INNER JOIN project_task T ON SOL.task_id = T.id
|
||||
INNER JOIN project_project P ON P.id = T.project_id
|
||||
WHERE P.active = 't' AND P.allow_timesheets = 't'
|
||||
) AMOUNT_UNTAXED ON AMOUNT_UNTAXED.project_id = P.id
|
||||
LEFT JOIN sale_order_line SOL ON AMOUNT_UNTAXED.sale_line_id = SOL.id
|
||||
LEFT JOIN sale_order S ON SOL.order_id = S.id
|
||||
LEFT JOIN product_product PP on (SOL.product_id = PP.id)
|
||||
LEFT JOIN product_template T on (PP.product_tmpl_id = T.id)
|
||||
WHERE P.active = 't' AND P.analytic_account_id IS NOT NULL
|
||||
) SUB_COST_SUMMARY
|
||||
GROUP BY project_id, analytic_account_id, sale_line_id, line_date
|
||||
) COST_SUMMARY ON COST_SUMMARY.project_id = P.id
|
||||
LEFT JOIN sale_order_line SOL ON COST_SUMMARY.sale_line_id = SOL.id
|
||||
LEFT JOIN sale_order S ON SOL.order_id = S.id
|
||||
WHERE P.active = 't' AND P.analytic_account_id IS NOT NULL
|
||||
) AS sub
|
||||
)
|
||||
""" % self._table
|
||||
self._cr.execute(query)
|
|
@ -0,0 +1,76 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<record id="sale_timesheet.project_profitability_report_view_pivot" model="ir.ui.view">
|
||||
<field name="name">project.profitability.report.pivot</field>
|
||||
<field name="model">project.profitability.report</field>
|
||||
<field name="arch" type="xml">
|
||||
<pivot string="Profitability Analysis" display_quantity="true" disable_linking="True" sample="1">
|
||||
<field name="project_id" type="row"/>
|
||||
<field name="amount_untaxed_to_invoice" type="measure"/>
|
||||
<field name="amount_untaxed_invoiced" type="measure"/>
|
||||
<field name="timesheet_cost" type="measure"/>
|
||||
<field name="budgeted_unit_amount" type="measure"/>
|
||||
</pivot>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sale_timesheet.project_profitability_report_view_graph" model="ir.ui.view">
|
||||
<field name="name">project.profitability.report.graph</field>
|
||||
<field name="model">project.profitability.report</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Profitability Analysis" type="bar" sample="1" disable_linking="1">
|
||||
<field name="project_id" type="row"/>
|
||||
<field name="product_id" type="col"/>
|
||||
<field name="amount_untaxed_to_invoice" type="measure"/>
|
||||
<field name="amount_untaxed_invoiced" type="measure"/>
|
||||
<field name="timesheet_cost" type="measure"/>
|
||||
<field name="other_revenues" type="measure"/>
|
||||
<field name="margin" type="measure"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="sale_timesheet.project_profitability_report_view_search" model="ir.ui.view">
|
||||
<field name="name">project.profitability.report.search</field>
|
||||
<field name="model">project.profitability.report</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Profitability Analysis">
|
||||
<field name="project_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="product_id"/>
|
||||
<field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<filter string="My Projects" name="my_project" domain="[('user_id','=', uid)]"/>
|
||||
<group expand="1" string="Group By">
|
||||
<filter string="Project" name="group_by_project" context="{'group_by':'project_id'}"/>
|
||||
<filter string="Project Manager" name="group_by_user_id" context="{'group_by':'user_id'}"/>
|
||||
<filter string="Customer" name="group_by_partner_id" context="{'group_by':'partner_id'}"/>
|
||||
<filter string="Company" name="group_by_company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
|
||||
<filter string="Date" name="group_by_line_date" context="{'group_by':'line_date'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sale_timesheet.project_profitability_report_action" model="ir.actions.act_window">
|
||||
<field name="name">Project Costs and Revenues</field>
|
||||
<field name="res_model">project.profitability.report</field>
|
||||
<field name="view_mode">pivot,graph</field>
|
||||
<field name="search_view_id" ref="sale_timesheet.project_profitability_report_view_search"/>
|
||||
<field name="context">{
|
||||
'group_by_no_leaf':1,
|
||||
'group_by':[],
|
||||
'sale_show_order_product_name': 1,
|
||||
}</field>
|
||||
<field name="help">This report allows you to analyse the profitability of your projects: compare the amount to invoice, the ones already invoiced and the project cost (via timesheet cost of your employees).</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="sale_timesheet.menu_project_profitability_analysis"
|
||||
parent="project.menu_project_report"
|
||||
action="sale_timesheet.project_profitability_report_action"
|
||||
name="Project Costs and Revenues"
|
||||
sequence="50"/>
|
||||
|
||||
</odoo>
|
Loading…
Reference in New Issue