Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ADD] contract_timesheet_monitoring #331

Open
wants to merge 6 commits into
base: 12.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
19 changes: 19 additions & 0 deletions contract_timesheet_monitoring/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# 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/product_template_view.xml",
"views/contract_portal_templates.xml",
],
"license": "AGPL-3",
"installable": True,
}
3 changes: 3 additions & 0 deletions contract_timesheet_monitoring/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from . import contract_line
from . import account_analytic_account
from . import product_template
18 changes: 18 additions & 0 deletions contract_timesheet_monitoring/models/account_analytic_account.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
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
lambda x: (x.product_uom_id.measure_type == "time")
)
if timesheets:
if start_date:
timesheets = timesheets.filtered(
lambda x: (x.date >= start_date)
)
return sum(timesheets.mapped("unit_amount"))
41 changes: 41 additions & 0 deletions contract_timesheet_monitoring/models/contract_line.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from odoo import api, fields, models
from odoo.exceptions import UserError


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.time_available")

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

def _get_period_start_date(self):
if self.recurring_invoicing_type == 'post-paid':
start_date = self.recurring_next_dat
else:
start_date = self.recurring_next_date - self.get_relative_delta(
self.recurring_rule_type, self.recurring_interval
)
return start_date

@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._get_period_start_date()
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()
time_available = fields.Integer(
string="Time 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
Loading