Initial commit: OCA Mrp packages (117 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:05 +02:00
commit 277e84fd7a
4403 changed files with 395154 additions and 0 deletions

View file

@ -0,0 +1,47 @@
# Timesheet Report Rounded
Odoo addon: hr_timesheet_report_rounded
## Installation
```bash
pip install odoo-bringout-oca-timesheet-hr_timesheet_report_rounded
```
## Dependencies
This addon depends on:
- hr_timesheet_report
- sale_timesheet_rounded
## Manifest Information
- **Name**: Timesheet Report Rounded
- **Version**: 16.0.1.0.0
- **Category**: Human Resources
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/timesheet](https://github.com/OCA/timesheet) branch 16.0, addon `hr_timesheet_report_rounded`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Hr_timesheet_report_rounded Module - hr_timesheet_report_rounded
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for hr_timesheet_report_rounded. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,6 @@
# Dependencies
This addon depends on:
- [hr_timesheet_report](../../odoo-bringout-oca-timesheet-hr_timesheet_report)
- [sale_timesheet_rounded](../../odoo-bringout-oca-timesheet-sale_timesheet_rounded)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon hr_timesheet_report_rounded or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-timesheet-hr_timesheet_report_rounded"
# or
uv pip install odoo-bringout-oca-timesheet-hr_timesheet_report_rounded"
```

View file

@ -0,0 +1,11 @@
# Models
Detected core models and extensions in hr_timesheet_report_rounded.
```mermaid
classDiagram
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: hr_timesheet_report_rounded. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon hr_timesheet_report_rounded
- License: LGPL-3

View file

@ -0,0 +1,25 @@
# Reports
Report definitions and templates in hr_timesheet_report_rounded.
```mermaid
classDiagram
class HrTimesheetReportEntry
TransientModel <|-- HrTimesheetReportEntry
```
## Available Reports
No named reports found in XML files.
## Report Files
- **hr_timesheet_report.py** (Python logic)
- **__init__.py** (Python logic)
## Notes
- Named reports above are accessible through Odoo's reporting menu
- Python files define report logic and data processing
- XML files contain report templates, definitions, and formatting
- Reports are integrated with Odoo's printing and email systems

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon hr_timesheet_report_rounded
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,103 @@
========================
Timesheet Report Rounded
========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e8d8d90fe3c0e3ea1ee67ca3396144b1c1f359ea3623d5ac843e92c469579992
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ftimesheet-lightgray.png?logo=github
:target: https://github.com/OCA/timesheet/tree/16.0/hr_timesheet_report_rounded
:alt: OCA/timesheet
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/timesheet-16-0/timesheet-16-0-hr_timesheet_report_rounded
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/timesheet&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This is a bridge module between the `Task Logs Timesheet
Report <https://github.com/cetmix/oca-timesheet/tree/16.0/hr_timesheet_report>`__
and `Sale Timesheet
Rounded <https://github.com/cetmix/oca-timesheet/tree/16.0/sale_timesheet_rounded>`__
modules. It forces the rounded time to be used in report.
**Table of contents**
.. contents::
:local:
Use Cases / Context
===================
When using time rounding in timesheets, it's reasonable to see the
rounded time in the timesheet report as well.
Configuration
=============
Please refer to the documentation of the `Task Logs Timesheet
Report <https://github.com/cetmix/oca-timesheet/tree/16.0/hr_timesheet_report>`__
and `Sale Timesheet
Rounded <https://github.com/cetmix/oca-timesheet/tree/16.0/sale_timesheet_rounded>`__
modules.
Usage
=====
No configuration is required. This module will be automatically
installed if both modules are installed in the system.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/timesheet/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/timesheet/issues/new?body=module:%20hr_timesheet_report_rounded%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
-------
* Cetmix
Contributors
------------
- Cetmix https://www.cetmix.com/
- Ivan Sokolov
Maintainers
-----------
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/timesheet <https://github.com/OCA/timesheet/tree/16.0/hr_timesheet_report_rounded>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,18 @@
# Copyright (C) 2025 Cetmix OÜ
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Timesheet Report Rounded",
"version": "16.0.1.0.0",
"category": "Human Resources",
"summary": "Show rounded time in the Timesheet Reports",
"website": "https://github.com/OCA/timesheet",
"author": "Cetmix, " "Odoo Community Association (OCA)",
"license": "AGPL-3",
"installable": True,
"auto_install": True,
"depends": [
"hr_timesheet_report",
"sale_timesheet_rounded",
],
}

View file

@ -0,0 +1,19 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet_report_rounded
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: hr_timesheet_report_rounded
#: model:ir.model,name:hr_timesheet_report_rounded.model_hr_timesheet_report_entry
msgid "HR Timesheet Report entry"
msgstr "Unos HR izvještaja radnih listova"

View file

@ -0,0 +1,19 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet_report_rounded
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: hr_timesheet_report_rounded
#: model:ir.model,name:hr_timesheet_report_rounded.model_hr_timesheet_report_entry
msgid "HR Timesheet Report entry"
msgstr ""

View file

@ -0,0 +1,22 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet_report_rounded
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-06-04 10:26+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10.4\n"
#. module: hr_timesheet_report_rounded
#: model:ir.model,name:hr_timesheet_report_rounded.model_hr_timesheet_report_entry
msgid "HR Timesheet Report entry"
msgstr "Voce resoconto foglio ore RU"

View file

@ -0,0 +1 @@
Please refer to the documentation of the [Task Logs Timesheet Report](https://github.com/cetmix/oca-timesheet/tree/16.0/hr_timesheet_report) and [Sale Timesheet Rounded](https://github.com/cetmix/oca-timesheet/tree/16.0/sale_timesheet_rounded) modules.

View file

@ -0,0 +1 @@
When using time rounding in timesheets, it's reasonable to see the rounded time in the timesheet report as well.

View file

@ -0,0 +1,4 @@
* Cetmix <https://www.cetmix.com/>
* Ivan Sokolov

View file

@ -0,0 +1,2 @@
This is a bridge module between the [Task Logs Timesheet Report](https://github.com/cetmix/oca-timesheet/tree/16.0/hr_timesheet_report) and [Sale Timesheet Rounded](https://github.com/cetmix/oca-timesheet/tree/16.0/sale_timesheet_rounded) modules.
It forces the rounded time to be used in report.

View file

@ -0,0 +1 @@
No configuration is required. This module will be automatically installed if both modules are installed in the system.

View file

@ -0,0 +1,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import hr_timesheet_report

View file

@ -0,0 +1,26 @@
# Copyright 2018-2020 Brainbean Apps (https://brainbeanapps.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models
from odoo.osv.expression import TRUE_DOMAIN
from odoo.tools.safe_eval import safe_eval
class HrTimesheetReportEntry(models.TransientModel):
_inherit = "hr.timesheet.report.entry"
def _compute_total_unit_amount(self):
AccountAnalyticLine = self.env["account.analytic.line"]
uom_hour = self.env.ref("uom.product_uom_hour")
for entry in self:
total_unit_amount = 0.0
line_ids = AccountAnalyticLine.search(
safe_eval(entry.scope) if entry.scope else TRUE_DOMAIN
)
for line_id in line_ids:
total_unit_amount += line_id.product_uom_id._compute_quantity(
line_id.unit_amount_rounded, uom_hour
)
entry.total_unit_amount = total_unit_amount

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,451 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Timesheet Report Rounded</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="timesheet-report-rounded">
<h1 class="title">Timesheet Report Rounded</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e8d8d90fe3c0e3ea1ee67ca3396144b1c1f359ea3623d5ac843e92c469579992
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/timesheet/tree/16.0/hr_timesheet_report_rounded"><img alt="OCA/timesheet" src="https://img.shields.io/badge/github-OCA%2Ftimesheet-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/timesheet-16-0/timesheet-16-0-hr_timesheet_report_rounded"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/timesheet&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This is a bridge module between the <a class="reference external" href="https://github.com/cetmix/oca-timesheet/tree/16.0/hr_timesheet_report">Task Logs Timesheet
Report</a>
and&nbsp;<a class="reference external" href="https://github.com/cetmix/oca-timesheet/tree/16.0/sale_timesheet_rounded">Sale Timesheet
Rounded</a>
modules. It forces the rounded time to be used in report.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#use-cases-context" id="toc-entry-1">Use Cases / Context</a></li>
<li><a class="reference internal" href="#configuration" id="toc-entry-2">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-3">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-4">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-5">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-6">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-7">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-8">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="use-cases-context">
<h1><a class="toc-backref" href="#toc-entry-1">Use Cases / Context</a></h1>
<p>When using time rounding in timesheets, its reasonable to see the
rounded time in the timesheet report as well.</p>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-2">Configuration</a></h1>
<p>Please refer to the documentation of the <a class="reference external" href="https://github.com/cetmix/oca-timesheet/tree/16.0/hr_timesheet_report">Task Logs Timesheet
Report</a>
and&nbsp;<a class="reference external" href="https://github.com/cetmix/oca-timesheet/tree/16.0/sale_timesheet_rounded">Sale Timesheet
Rounded</a>
modules.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-3">Usage</a></h1>
<p>No configuration is required. This module will be automatically
installed if both modules are installed in the system.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-4">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/timesheet/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/timesheet/issues/new?body=module:%20hr_timesheet_report_rounded%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-5">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-6">Authors</a></h2>
<ul class="simple">
<li>Cetmix</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-7">Contributors</a></h2>
<ul class="simple">
<li>Cetmix <a class="reference external" href="https://www.cetmix.com/">https://www.cetmix.com/</a><ul>
<li>Ivan Sokolov</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-8">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/timesheet/tree/16.0/hr_timesheet_report_rounded">OCA/timesheet</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,4 @@
# Copyright (C) 2025 Cetmix OÜ
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import test_report

View file

@ -0,0 +1,109 @@
from odoo import fields
from odoo.tests.common import TransactionCase
class TestHrTimesheetReportEntry(TransactionCase):
def setUp(self):
super().setUp()
# Create a project allowing timesheets
self.project = self.env["project.project"].create(
{
"name": "Test Project",
"allow_timesheets": True,
}
)
# Ensure no rounding by default
self.project.write({"timesheet_rounding_method": "NO"})
# Create an employee for timesheet lines
self.employee = self.env["hr.employee"].create(
{
"name": "Test Employee",
"user_id": self.env.uid,
"company_id": self.env.company.id,
}
)
# Hour UoM
self.uom = self.env.ref("uom.product_uom_hour")
# Get existing report group (loaded by hr_timesheet_report)
self.report_group = self.env["hr.timesheet.report.group"].search([], limit=1)
if not self.report_group:
self.skipTest("hr_timesheet_report.group data not loaded")
# Models
self.AAL = self.env["account.analytic.line"]
self.ReportEntry = self.env["hr.timesheet.report.entry"]
def _make_lines(self, amounts):
"""Helper to create analytic lines with given unit_amounts."""
lines = []
for amt in amounts:
vals = {
"project_id": self.project.id,
"account_id": self.project.analytic_account_id.id,
"employee_id": self.employee.id,
"unit_amount": amt,
"product_uom_id": self.uom.id,
"date": fields.Date.today(),
"name": "Test",
}
lines.append(self.AAL.create(vals))
return lines
def test_no_rounding(self):
"""Without rounding, total == sum(unit_amount)."""
lines = self._make_lines([1.5, 2.5])
entry = self.ReportEntry.create(
{
"scope": "[]",
"group_id": self.report_group.id,
}
)
entry._compute_total_unit_amount()
expected = sum(line.unit_amount for line in lines)
self.assertAlmostEqual(entry.total_unit_amount, expected)
def test_half_up_rounding(self):
"""With HALF_UP rounding to nearest whole, total == sum(unit_amount_rounded)."""
# Set rounding to nearest 1 unit, HALF_UP
self.project.write(
{
"timesheet_rounding_unit": 1.0,
"timesheet_rounding_method": "HALF_UP",
"timesheet_rounding_factor": 100,
}
)
self._make_lines([1.2, 1.6])
entry = self.ReportEntry.create(
{
"scope": "[]",
"group_id": self.report_group.id,
}
)
entry._compute_total_unit_amount()
# 1.2 -> 1, 1.6 -> 2 => total 3
self.assertAlmostEqual(entry.total_unit_amount, 3.0)
def test_default_scope(self):
"""When scope is falsy, TRUE_DOMAIN branch sums all lines."""
self._make_lines([2.0, 3.0])
entry = self.ReportEntry.create(
{
"group_id": self.report_group.id,
}
)
entry._compute_total_unit_amount()
self.assertAlmostEqual(entry.total_unit_amount, 5.0)
def test_scope_filter(self):
"""When scope is provided, safe_eval branch filters lines correctly."""
# Create two lines, only one matches the filter
l1, l2 = self._make_lines([1.0, 2.0])
domain = "[('id', 'in', [%d])]" % l2.id
entry = self.ReportEntry.create(
{
"scope": domain,
"group_id": self.report_group.id,
}
)
entry._compute_total_unit_amount()
# Only l2 should be counted
self.assertAlmostEqual(entry.total_unit_amount, l2.unit_amount)

View file

@ -0,0 +1,43 @@
[project]
name = "odoo-bringout-oca-timesheet-hr_timesheet_report_rounded"
version = "16.0.0"
description = "Timesheet Report Rounded - Show rounded time in the Timesheet Reports"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-timesheet-hr_timesheet_report>=16.0.0",
"odoo-bringout-oca-timesheet-sale_timesheet_rounded>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["hr_timesheet_report_rounded"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]