218 lines
13 KiB
XML
218 lines
13 KiB
XML
|
<?xml version="1.0" encoding="utf-8"?>
|
||
|
<odoo>
|
||
|
<template id="portal_layout" name="Portal layout: timesheet menu entry" inherit_id="portal.portal_breadcrumbs" priority="35">
|
||
|
<xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside">
|
||
|
<li t-if="page_name == 'timesheet' or timesheet" t-attf-class="breadcrumb-item #{'active' if not timesheet else ''}">
|
||
|
<t>Timesheets</t>
|
||
|
</li>
|
||
|
</xpath>
|
||
|
</template>
|
||
|
|
||
|
<template id="portal_my_home_timesheet" name="Show Timesheets" customize_show="True" inherit_id="portal.portal_my_home" priority="45">
|
||
|
<xpath expr="//div[hasclass('o_portal_docs')]" position="before">
|
||
|
<t t-set="portal_service_category_enable" t-value="True"/>
|
||
|
</xpath>
|
||
|
<div id="portal_service_category" position="inside">
|
||
|
<t t-call="portal.portal_docs_entry">
|
||
|
<t t-set="icon" t-value="'/hr_timesheet/static/img/timesheet.svg'"/>
|
||
|
<t t-set="title">Timesheets</t>
|
||
|
<t t-set="url" t-value="'/my/timesheets'"/>
|
||
|
<t t-set="text">Review all timesheets related to your projects</t>
|
||
|
<t t-set="placeholder_count" t-value="'timesheet_count'"/>
|
||
|
</t>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<template id="portal_my_timesheets" name="My Timesheets">
|
||
|
<t t-call="portal.portal_layout">
|
||
|
<t t-set="breadcrumbs_searchbar" t-value="True"/>
|
||
|
|
||
|
<t t-call="portal.portal_searchbar">
|
||
|
<t t-set="title">Timesheets</t>
|
||
|
</t>
|
||
|
<t t-if="not grouped_timesheets">
|
||
|
<div class="alert alert-warning" role="alert">
|
||
|
There are no timesheets.
|
||
|
</div>
|
||
|
</t>
|
||
|
<t t-if="grouped_timesheets">
|
||
|
<t t-call="portal.portal_table">
|
||
|
<thead>
|
||
|
<tr>
|
||
|
<th t-if="not groupby == 'date'">Date</th>
|
||
|
<th t-if="not groupby == 'employee'">Employee</th>
|
||
|
<th t-if="not groupby == 'project'">Project</th>
|
||
|
<th t-if="not groupby == 'task'">Task</th>
|
||
|
<th>Description</th>
|
||
|
<th t-if="is_uom_day" class="text-end">Days Spent</th>
|
||
|
<th t-else="" class="text-end">Hours Spent</th>
|
||
|
</tr>
|
||
|
</thead>
|
||
|
<t t-foreach="grouped_timesheets" t-as="timesheets_with_hours">
|
||
|
<t t-set="timesheets" t-value="timesheets_with_hours[0]"/>
|
||
|
<t t-set="hours_spent" t-value="timesheets_with_hours[1]"/>
|
||
|
<tbody style="font-size: 0.8rem">
|
||
|
<tr t-if="not groupby =='none'" class="table-light">
|
||
|
<t t-if="groupby == 'project'">
|
||
|
<th t-if="groupby == 'project'" colspan="5">
|
||
|
<span t-field="timesheets[0].project_id.name"/>
|
||
|
</th>
|
||
|
<th colspan="1" class="text-end text-muted">
|
||
|
<t t-if="is_uom_day">
|
||
|
Total: <span class="text-muted" t-esc="timesheets._convert_hours_to_days(hours_spent)" t-options='{"widget": "timesheet_uom"}'/>
|
||
|
</t>
|
||
|
<t t-else="">
|
||
|
Total: <span class="text-muted" t-esc="hours_spent" t-options='{"widget": "float_time"}'/>
|
||
|
</t>
|
||
|
</th>
|
||
|
</t>
|
||
|
<t t-elif="groupby == 'task'">
|
||
|
<th colspan="5">
|
||
|
<span t-field="timesheets[0].task_id.name"/>
|
||
|
</th>
|
||
|
<th colspan="1" class="text-end text-muted">
|
||
|
<t t-if="is_uom_day">
|
||
|
Total: <span t-esc="timesheets._convert_hours_to_days(hours_spent)" t-options='{"widget": "timesheet_uom"}'/>
|
||
|
</t>
|
||
|
<t t-else="">
|
||
|
Total: <span t-esc="hours_spent" t-options='{"widget": "float_time"}'/>
|
||
|
</t>
|
||
|
</th>
|
||
|
</t>
|
||
|
<t t-elif="groupby == 'date'">
|
||
|
<th colspan="5">
|
||
|
<span t-field="timesheets[0].date"/>
|
||
|
</th>
|
||
|
<th colspan="1" class="text-end text-muted">
|
||
|
<t t-if="is_uom_day">
|
||
|
Total: <span t-esc="timesheets._convert_hours_to_days(hours_spent)" t-options='{"widget": "timesheet_uom"}'/>
|
||
|
</t>
|
||
|
<t t-else="">
|
||
|
Total: <span t-esc="hours_spent" t-options='{"widget": "float_time"}'/>
|
||
|
</t>
|
||
|
</th>
|
||
|
</t>
|
||
|
<t t-elif="groupby == 'employee'">
|
||
|
<th colspan="5">
|
||
|
<span t-field="timesheets[0].employee_id.name"/>
|
||
|
</th>
|
||
|
<th colspan="1" class="text-end text-muted">
|
||
|
<t t-if="is_uom_day">
|
||
|
Total: <span t-esc="timesheets._convert_hours_to_days(hours_spent)" t-options='{"widget": "timesheet_uom"}'/>
|
||
|
</t>
|
||
|
<t t-else="">
|
||
|
Total: <span t-esc="hours_spent" t-options='{"widget": "float_time"}'/>
|
||
|
</t>
|
||
|
</th>
|
||
|
</t>
|
||
|
</tr>
|
||
|
<tr t-else="">
|
||
|
<div style="text-align: right;" class="me-2 mb-1 text-muted">
|
||
|
<t t-if="is_uom_day">
|
||
|
Total: <span t-esc="timesheets._convert_hours_to_days(hours_spent)" t-options='{"widget": "timesheet_uom"}'/>
|
||
|
</t>
|
||
|
<t t-else="">
|
||
|
Total: <span t-esc="hours_spent" t-options='{"widget": "float_time"}'/>
|
||
|
</t>
|
||
|
</div>
|
||
|
</tr>
|
||
|
</tbody>
|
||
|
<tbody style="font-size: 0.8rem">
|
||
|
<t t-foreach="timesheets" t-as="timesheet">
|
||
|
<tr>
|
||
|
<td t-if="not groupby == 'date'"><span t-field="timesheet.date" t-options='{"widget": "date"}'/></td>
|
||
|
<td t-if="not groupby == 'employee'"><span t-field="timesheet.employee_id" t-att-title="timesheet.employee_id.display_name" /></td>
|
||
|
<td t-if="not groupby == 'project'"><span t-field="timesheet.project_id" t-att-title="timesheet.project_id.display_name"/></td>
|
||
|
<td t-if="not groupby == 'task'"><span t-field="timesheet.task_id" t-att-title="timesheet.task_id.display_name"/></td>
|
||
|
<td><span t-esc="timesheet.name" t-att-title="timesheet.name"/></td>
|
||
|
<td class="text-end">
|
||
|
<span t-if="is_uom_day" t-esc="timesheet._get_timesheet_time_day()" t-options='{"widget": "timesheet_uom"}'/>
|
||
|
<span t-else="" t-field="timesheet.unit_amount" t-options='{"widget": "float_time"}'/>
|
||
|
</td>
|
||
|
</tr>
|
||
|
</t>
|
||
|
</tbody>
|
||
|
</t>
|
||
|
</t>
|
||
|
</t>
|
||
|
</t>
|
||
|
</template>
|
||
|
|
||
|
<template id="portal_timesheet_table" name="Portal Timesheet Table">
|
||
|
<table class="o_portal_my_doc_table table table-sm">
|
||
|
<thead>
|
||
|
<tr>
|
||
|
<th>Date</th>
|
||
|
<th>Employee</th>
|
||
|
<th>Description</th>
|
||
|
<th t-if="is_uom_day" class="text-end">Days Spent</th>
|
||
|
<th t-else="" class="text-end">Hours Spent</th>
|
||
|
</tr>
|
||
|
</thead>
|
||
|
<tr t-foreach="timesheets" t-as="timesheet">
|
||
|
<td><t t-esc="timesheet.date" t-options='{"widget": "date"}'/></td>
|
||
|
<td t-attf-title="#{timesheet.employee_id.name}"><t t-esc="timesheet.employee_id.name"/></td>
|
||
|
<td><t t-esc="timesheet.name"/></td>
|
||
|
<td class="text-end">
|
||
|
<span t-if="is_uom_day" t-esc="timesheet._get_timesheet_time_day()" t-options='{"widget": "timesheet_uom"}'/>
|
||
|
<span t-else="" t-field="timesheet.unit_amount" t-options='{"widget": "float_time"}'/>
|
||
|
</td>
|
||
|
</tr>
|
||
|
</table>
|
||
|
<div class="container_subtotal">
|
||
|
<div class="row justify-content-end">
|
||
|
<div t-attf-class="{{'col-auto' if report_type != 'html' else 'col-sm-2'}}">
|
||
|
<table class="table table-sm">
|
||
|
<tr>
|
||
|
<t t-set="timesheets_amount" t-value="round(sum(timesheets.mapped('unit_amount')), 2)"></t>
|
||
|
<td><strong>Total: </strong></td>
|
||
|
<td class="text-end">
|
||
|
<t t-if="is_uom_day">
|
||
|
<span t-esc="timesheets._convert_hours_to_days(timesheets_amount)" t-options="{'widget': 'timesheet_uom'}"/>
|
||
|
</t>
|
||
|
<t t-else="">
|
||
|
<span t-esc="timesheets_amount" t-options='{"widget": "float_time"}'/>
|
||
|
</t>
|
||
|
</td>
|
||
|
</tr>
|
||
|
<t t-set="timesheets_by_subtask_amount" t-value="round(sum(sum(timesheet_by_subtask.mapped('unit_amount') or 0.0) for timesheet_by_subtask in timesheets_by_subtask.values()), 2) or 0.0"></t>
|
||
|
<tr>
|
||
|
<div t-if="timesheets_by_subtask">
|
||
|
<t t-if="is_uom_day">
|
||
|
<td><strong>Days recorded on sub-tasks: </strong></td>
|
||
|
<td class="text-end">
|
||
|
<span t-esc="timesheets._convert_hours_to_days(timesheets_by_subtask_amount)" t-options='{"widget": "timesheet_uom"}'/>
|
||
|
</td>
|
||
|
</t>
|
||
|
<t t-else="">
|
||
|
<td><strong>Hours recorded on sub-tasks: </strong></td>
|
||
|
<td class="text-end">
|
||
|
<span t-esc="timesheets_by_subtask_amount" t-options='{"widget": "float_time"}'/>
|
||
|
</td>
|
||
|
</t>
|
||
|
</div>
|
||
|
</tr>
|
||
|
<t t-set="allocated_time" t-value="task.allocated_hours"></t>
|
||
|
<tr t-attf-class="{{task.remaining_hours < 0 and 'text-danger' or ''}}">
|
||
|
<div t-if="allocated_time > 0" name="allocated_time">
|
||
|
<t t-if="is_uom_day">
|
||
|
<td><strong>Remaining Days: </strong></td>
|
||
|
<td class="text-end">
|
||
|
<span t-esc="timesheets._convert_hours_to_days(allocated_time - timesheets_amount - timesheets_by_subtask_amount)" t-options='{"widget": "timesheet_uom"}'/>
|
||
|
</td>
|
||
|
</t>
|
||
|
<t t-else="">
|
||
|
<td><strong>Remaining Hours: </strong></td>
|
||
|
<td class="text-end">
|
||
|
<span t-esc="allocated_time - timesheets_amount - timesheets_by_subtask_amount" t-options='{"widget": "float_time"}'/>
|
||
|
</td>
|
||
|
</t>
|
||
|
</div>
|
||
|
</tr>
|
||
|
</table>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
</odoo>
|