Skip to content

Commit

Permalink
[ADD] contract_timesheet_monitoring
Browse files Browse the repository at this point in the history
  • Loading branch information
victor-champonnois committed Oct 24, 2024
1 parent ca476c1 commit 3e8fda2
Show file tree
Hide file tree
Showing 16 changed files with 733 additions and 0 deletions.
67 changes: 67 additions & 0 deletions contract_timesheet_monitoring/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
=============================
Contract timesheet monitoring
=============================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:00fb3cdc565442ffcd3351e97d0516ce6f4ceb55402981b183f7e717a1e23173
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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-coopiteasy%2Faddons-lightgray.png?logo=github
:target: https://github.com/coopiteasy/addons/tree/16.0/contract_timesheet_monitoring
:alt: coopiteasy/addons

|badge1| |badge2| |badge3|

This module was developped for clients paying a subscription fee for
functional support. We wanted to invoice a fixed amount per period, but
invoice excess time. This module provide a way for the clients and the
service provider to monitor the time spent to compare it with the
quantity bought.

**Table of contents**

.. contents::
:local:

Usage
=====

The time spent for the current period is indicated in the contract line.
Time spent for past periods is indicated in the previous invoices. Note
: this might be confusing if the contract is configured to create
invoices at the begining of the period.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/coopiteasy/addons/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/coopiteasy/addons/issues/new?body=module:%20contract_timesheet_monitoring%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
-------

* Coop IT Easy SC

Maintainers
-----------

This module is part of the `coopiteasy/addons <https://github.com/coopiteasy/addons/tree/16.0/contract_timesheet_monitoring>`_ project on GitHub.

You are welcome to contribute.
1 change: 1 addition & 0 deletions contract_timesheet_monitoring/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
21 changes: 21 additions & 0 deletions contract_timesheet_monitoring/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright 2017 Tecnativa - Luis M. Ontalba
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html

{
"name": "Contract timesheet monitoring",
"summary": "Compute time spent on service contracts",
"version": "16.0.1.0.0",
"category": "Sales",
"author": "Coop IT Easy SC, Odoo Community Association (OCA)",
"website": "https://github.com/coopiteasy/addons",
"depends": ["contract", "hr_timesheet", "contract_invoice_start_end_dates"],
"data": [
"views/contract.xml",
"views/account_invoice.xml",
"views/account_invoice_report.xml",
"views/product_template_view.xml",
"views/contract_portal_templates.xml",
],
"license": "AGPL-3",
"installable": True,
}
4 changes: 4 additions & 0 deletions contract_timesheet_monitoring/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from . import contract_line
from . import account_invoice_line
from . import account_analytic_account
from . import product_template
19 changes: 19 additions & 0 deletions contract_timesheet_monitoring/models/account_analytic_account.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from odoo import models


class AccountAnalyticAccount(models.Model):
_inherit = "account.analytic.account"

def get_time_spent_for_period(self, start_date, end_date=None):
analytic_account_lines = self.line_ids
timesheets = analytic_account_lines.filtered(
# keep only timesheets
# ensure the uom is the same as the one configure for the project
# timesheets (hours or day)
lambda x: (x.product_uom_id.measure_type == "time")
)
if timesheets:
time_spent_on_account = timesheets.filtered(
lambda x: (x.date >= start_date)
).mapped("unit_amount")
return sum(time_spent_on_account)
26 changes: 26 additions & 0 deletions contract_timesheet_monitoring/models/account_invoice_line.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Copyright 2016 Tecnativa - Carlos Dauden
# Copyright 2018 ACSONE SA/NV.
# Copyright 2020 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import fields, models


class AccountInvoiceLine(models.Model):
_inherit = "account.invoice.line"

time_spent = fields.Float(
string="Time Spent", compute="_compute_time_spent"
)
time_available = fields.Integer(related="product_id.hours_available")



def _compute_time_spent(self):
for line in self:
if line.analytic_account and line.start_date:
line.time_spent = line.analytic_account_id.get_time_spent_for_period(
line.start_date, line.end_date
)
else:
line.time_spent = False
30 changes: 30 additions & 0 deletions contract_timesheet_monitoring/models/contract_line.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from odoo import api, fields, models


class ContractLine(models.Model):
_inherit = "contract.line"

time_spent = fields.Float(
string="Time Spent", compute="_compute_time_spent"
)
time_available = fields.Integer(related="product_id.hours_available")

time_remaining = fields.Float(
string="Time Remaining", compute="_compute_time_remaining"
)

@api.depends("analytic_account_id.line_ids")
def _compute_time_spent(self):
for line in self:
if line.analytic_account_id:
period_start_date = line.last_date_invoiced or line.date_start
line.time_spent = line.analytic_account_id.get_time_spent_for_period(
period_start_date
)
else:
line.time_spent = False

@api.depends("time_available", "time_spent")
def _compute_time_remaining(self):
for line in self:
line.time_remaining = line.time_available - line.time_spent
14 changes: 14 additions & 0 deletions contract_timesheet_monitoring/models/product_template.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Copyright 2023 Coop IT Easy SC
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).

from odoo import api, fields, models


class ProductTemplate(models.Model):
_inherit = "product.template"

is_support_product = fields.Boolean()
hours_available = fields.Integer(
string="Hours available",
default=0,
)
6 changes: 6 additions & 0 deletions contract_timesheet_monitoring/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

This module was developped for clients paying a subscription fee for functional support. We wanted to invoice a fixed amount per period, but invoice excess time.
This module provide a way for the clients and the service provider to monitor the time spent to compare it with the quantity bought.



2 changes: 2 additions & 0 deletions contract_timesheet_monitoring/readme/USAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
The time spent for the current period is indicated in the contract line. Time spent for past periods is indicated in the previous invoices.
Note : this might be confusing if the contract is configured to create invoices at the begining of the period.
Loading

0 comments on commit 3e8fda2

Please sign in to comment.