2018-01-16 06:58:15 +01:00
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
2018-01-16 11:34:37 +01:00
|
|
|
<flectra>
|
2018-01-16 06:58:15 +01:00
|
|
|
|
|
|
|
<template id="assets_backend" name="sale timesheet assets" inherit_id="web.assets_backend">
|
|
|
|
<xpath expr="." position="inside">
|
|
|
|
<script type="text/javascript" src="/sale_timesheet/static/src/js/timesheet_plan.js"></script>
|
|
|
|
<link rel="stylesheet" href="/sale_timesheet/static/src/less/sale_timesheet.less"/>
|
|
|
|
</xpath>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<template id="timesheet_plan" name="Timesheet Plan">
|
|
|
|
<div class="o_form_view o_form_readonly o_project_plan">
|
|
|
|
<div class="o_form_sheet_bg">
|
|
|
|
<div class="o_form_sheet o_timesheet_plan_content">
|
|
|
|
<div class="o_timesheet_plan_sale_timesheet">
|
|
|
|
<div class="o_timesheet_plan_sale_timesheet_dashboard">
|
|
|
|
|
|
|
|
<div class="o_timesheet_plan_stat_buttons oe_button_box">
|
|
|
|
<t t-foreach="stat_buttons" t-as="stat_button">
|
|
|
|
<button class="btn btn-sm oe_stat_button" t-att-data-domain="stat_button['domain']" t-att-data-res-model="stat_button['res_model']">
|
|
|
|
<div t-attf-class="fa fa-fw o_button_icon #{stat_button['icon']}"></div>
|
|
|
|
<div name="task_count" class="o_field_widget o_stat_info o_readonly_modifier" t-att-title="stat_button['name']">
|
|
|
|
<span class="o_stat_value" t-if="stat_button.get('count')">
|
|
|
|
<t t-esc="stat_button['count']"/>
|
|
|
|
</span>
|
|
|
|
<span class="o_stat_text">
|
|
|
|
<t t-esc="stat_button['name']"/>
|
|
|
|
</span>
|
|
|
|
</div>
|
|
|
|
</button>
|
|
|
|
</t>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<table class="table">
|
|
|
|
<tbody>
|
|
|
|
<tr>
|
|
|
|
<th rowspan="5">
|
|
|
|
<a type="action" t-att-domain="json.dumps(domain)" context="{'pivot_row_groupby': ['date:month'],'pivot_column_groupby': ['timesheet_invoice_type'], 'pivot_measures': ['unit_amount']}">Hours</a>
|
|
|
|
</th>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell">
|
|
|
|
<t t-esc="dashboard['hours']['billable_time']" t-options="{'widget': 'float_time'}"/>
|
|
|
|
</td>
|
|
|
|
<td>Timesheets</td>
|
|
|
|
<th rowspan="5">
|
|
|
|
<a type="action" t-att-domain="json.dumps(domain)" context="{'pivot_row_groupby': ['date:month', 'employee_id'], 'pivot_column_groupby': ['timesheet_invoice_type'],'pivot_measures': ['unit_amount']}">Rates</a>
|
|
|
|
</th>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell">
|
|
|
|
<t t-esc="dashboard['rates']['billable_time']"/> %
|
|
|
|
</td>
|
|
|
|
<td>Timesheets</td>
|
|
|
|
<th rowspan="5">
|
|
|
|
<a type="action" t-att-domain="json.dumps(domain)" context="{'pivot_row_groupby': ['timesheet_invoice_id'], 'pivot_column_groupby': ['date:month'],'pivot_measures': ['amount', 'timesheet_revenue']}">Profitability</a>
|
|
|
|
</th>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell">
|
|
|
|
<t t-if="currency.position == 'before'" t-esc="currency.symbol"/>
|
|
|
|
<t t-esc="dashboard['money_amount']['invoiced']"/>
|
|
|
|
<t t-if="currency.position == 'after'" t-esc="currency.symbol"/>
|
|
|
|
</td>
|
|
|
|
<td>Invoiced</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell">
|
|
|
|
<t t-esc="dashboard['hours']['billable_fixed']" t-options="{'widget': 'float_time'}"/>
|
|
|
|
</td>
|
|
|
|
<td>Fixed</td>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell">
|
|
|
|
<t t-esc="dashboard['rates']['billable_fixed']"/> %
|
|
|
|
</td>
|
|
|
|
<td>Fixed</td>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell">
|
|
|
|
<t t-if="currency.position == 'before'" t-esc="currency.symbol"/>
|
|
|
|
<t t-esc="dashboard['money_amount']['to_invoice']"/>
|
|
|
|
<t t-if="currency.position == 'after'" t-esc="currency.symbol"/>
|
|
|
|
</td>
|
|
|
|
<td>To invoice</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell">
|
|
|
|
<t t-esc="dashboard['hours']['non_billable_project']" t-options="{'widget': 'float_time'}"/>
|
|
|
|
</td>
|
|
|
|
<td>No task found</td>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell">
|
|
|
|
<t t-esc="dashboard['rates']['non_billable_project']"/> %
|
|
|
|
</td>
|
|
|
|
<td>No task found</td>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell">
|
|
|
|
<t t-if="currency.position == 'before'" t-esc="currency.symbol"/>
|
|
|
|
<t t-esc="dashboard['money_amount']['cost']"/>
|
|
|
|
<t t-if="currency.position == 'after'" t-esc="currency.symbol"/>
|
|
|
|
</td>
|
|
|
|
<td>Cost</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell">
|
|
|
|
<t t-esc="dashboard['hours']['non_billable']" t-options="{'widget': 'float_time'}"/>
|
|
|
|
</td>
|
|
|
|
<td>Non Billable</td>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell">
|
|
|
|
<t t-esc="dashboard['rates']['non_billable']"/> %
|
|
|
|
</td>
|
|
|
|
<td>Non Billable</td>
|
|
|
|
<td class="o_timesheet_plan_dashboard_cell"></td>
|
|
|
|
<td></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td class="o_timesheet_plan_dashboard_total">
|
|
|
|
<t t-esc="dashboard['hours']['total']" t-options="{'widget': 'float_time'}"/>
|
|
|
|
</td>
|
|
|
|
<td><b>Total</b></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td class="o_timesheet_plan_dashboard_total">
|
|
|
|
<t t-if="currency.position == 'before'" t-esc="currency.symbol"/>
|
|
|
|
<t t-esc="dashboard['money_amount']['total']"/>
|
|
|
|
<t t-if="currency.position == 'after'" t-esc="currency.symbol"/>
|
|
|
|
</td>
|
|
|
|
<td><b>Total</b></td>
|
|
|
|
</tr>
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="o_timesheet_plan_sale_timesheet_people_time">
|
|
|
|
<h3>Time by people</h3>
|
|
|
|
<t t-if="not repartition_employee">
|
|
|
|
<p>There is no timesheet for now.</p>
|
|
|
|
</t>
|
|
|
|
<t t-if="repartition_employee">
|
|
|
|
<div class="pull-right o_timesheet_plan_badge">
|
|
|
|
<span class="badge o_progress_billable_fixed">
|
|
|
|
<a type="action" t-att-domain="json.dumps(domain + [('timesheet_invoice_type','=','billable_fixed')])">Billable fixed</a>
|
|
|
|
</span>
|
|
|
|
<span class="badge o_progress_billable_time">
|
|
|
|
<a type="action" t-att-domain="json.dumps(domain + [('timesheet_invoice_type','=','billable_time')])">Billable time</a>
|
|
|
|
</span>
|
|
|
|
<span class="badge o_progress_non_billable_project">
|
|
|
|
<a type="action" t-att-domain="json.dumps(domain + [('timesheet_invoice_type','=','non_billable_project')])">No task found</a>
|
|
|
|
</span>
|
|
|
|
<span class="badge o_progress_non_billable">
|
|
|
|
<a type="action" t-att-domain="json.dumps(domain + [('timesheet_invoice_type','=','non_billable')])">Non billable</a>
|
|
|
|
</span>
|
|
|
|
</div>
|
|
|
|
<table class="table">
|
|
|
|
<tbody>
|
|
|
|
<t t-foreach="repartition_employee" t-as="employee_id">
|
|
|
|
<tr>
|
|
|
|
<td style="width: 15%">
|
|
|
|
<a type="action" t-att-domain="json.dumps(domain)" t-att-context="{'search_default_employee_id': employee_id}" views="[[0, 'list']]">
|
|
|
|
<t t-esc="repartition_employee[employee_id]['employee_name']"/>
|
|
|
|
</a>
|
|
|
|
</td>
|
|
|
|
<td style="width: 10%">
|
|
|
|
<t t-esc="repartition_employee[employee_id]['total']" t-options="{'widget': 'float_time'}"/>
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<div class="progress" t-att-style="'width: ' + str(repartition_employee[employee_id]['total'] / repartition_employee_max * 100) +'%'">
|
|
|
|
|
|
|
|
<t t-set="total" t-value="repartition_employee[employee_id]['total']" />
|
|
|
|
<t t-set="billable_fixed" t-value="repartition_employee[employee_id]['billable_fixed']" />
|
|
|
|
<t t-set="billable_time" t-value="repartition_employee[employee_id]['billable_time']" />
|
|
|
|
<t t-set="non_billable" t-value="repartition_employee[employee_id]['non_billable']" />
|
|
|
|
<t t-set="non_billable_project" t-value="repartition_employee[employee_id]['non_billable_project']"/>
|
|
|
|
|
|
|
|
<t t-if="billable_fixed">
|
|
|
|
<t t-set="billable_fixed_title"><t t-esc="billable_fixed" t-options="{'widget': 'float_time'}" /></t>
|
|
|
|
<div class="progress-bar o_progress_billable_fixed"
|
|
|
|
t-att-style="'width: ' + str(billable_fixed / total * 100) + '%'"
|
|
|
|
t-att-title="billable_fixed_title"
|
|
|
|
t-att-data-domain="repartition_employee[employee_id]['__domain_billable_fixed']">
|
|
|
|
</div>
|
|
|
|
</t>
|
|
|
|
<t t-if="billable_time">
|
|
|
|
<t t-set="billable_time_title"><t t-esc="billable_time" t-options="{'widget': 'float_time'}" /></t>
|
|
|
|
<div class="progress-bar o_progress_billable_time"
|
|
|
|
t-att-style="'width: ' + str(billable_time / total * 100) + '%'"
|
|
|
|
t-att-title="billable_time_title"
|
|
|
|
t-att-data-domain="repartition_employee[employee_id]['__domain_billable_time']">
|
|
|
|
</div>
|
|
|
|
</t>
|
|
|
|
<t t-if="non_billable_project">
|
|
|
|
<t t-set="non_billable_project_title"><t t-esc="non_billable_project" t-options="{'widget': 'float_time'}" /></t>
|
|
|
|
<div class="progress-bar o_progress_non_billable_project"
|
|
|
|
t-att-style="'width: ' + str(non_billable_project / total * 100) + '%'"
|
|
|
|
t-att-title="non_billable_project_title"
|
|
|
|
t-att-data-domain="repartition_employee[employee_id]['__domain_non_billable_project']">
|
|
|
|
</div>
|
|
|
|
</t>
|
|
|
|
<t t-if="non_billable">
|
|
|
|
<t t-set="non_billable_title"><t t-esc="non_billable" t-options="{'widget': 'float_time'}" /></t>
|
|
|
|
<div class="progress-bar o_progress_non_billable"
|
|
|
|
t-att-style="'width: ' + str(non_billable / total * 100) + '%'"
|
|
|
|
t-att-title="non_billable_title"
|
|
|
|
t-att-data-domain="json.dumps(repartition_employee[employee_id]['__domain_non_billable'])">
|
|
|
|
</div>
|
|
|
|
</t>
|
|
|
|
</div>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</t>
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
</t>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
2018-01-16 11:34:37 +01:00
|
|
|
</flectra>
|