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] fieldservice_expense #1284

Open
wants to merge 1 commit into
base: 18.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
35 changes: 35 additions & 0 deletions fieldservice_expense/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
**This file is going to be generated by oca-gen-addon-readme.**

*Manual changes will be overwritten.*

Please provide content in the ``readme`` directory:

* **DESCRIPTION.rst** (required)
* INSTALL.rst (optional)
* CONFIGURE.rst (optional)
* **USAGE.rst** (optional, highly recommended)
* DEVELOP.rst (optional)
* ROADMAP.rst (optional)
* HISTORY.rst (optional, recommended)
* **CONTRIBUTORS.rst** (optional, highly recommended)
* CREDITS.rst (optional)

Content of this README will also be drawn from the addon manifest,
from keys such as name, authors, maintainers, development_status,
and license.

A good, one sentence summary in the manifest is also highly recommended.


Automatic changelog generation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

`HISTORY.rst` can be auto generated using `towncrier <https://pypi.org/project/towncrier>`_.

Just put towncrier compatible changelog fragments into `readme/newsfragments`
and the changelog file will be automatically generated and updated when a new fragment is added.

Please refer to `towncrier` documentation to know more.

NOTE: the changelog will be automatically generated when using `/ocabot merge $option`.
If you need to run it manually, refer to `OCA/maintainer-tools README <https://github.com/OCA/maintainer-tools>`_.
1 change: 1 addition & 0 deletions fieldservice_expense/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
19 changes: 19 additions & 0 deletions fieldservice_expense/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copyright (C) 2018 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Field Service - Expenses",
"summary": "Manage expenses of orders",
"version": "18.0.1.0.0",
"license": "AGPL-3",
"category": "TMS",
"author": "Open Source Integrators, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/field-service",
"depends": ["fieldservice", "hr_expense", "fieldservice_account"],
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"depends": ["fieldservice", "hr_expense", "fieldservice_account"],
"depends": ["hr_expense", "fieldservice_account"],

"data": [
"views/hr_expense_views.xml",
"views/fsm_order_views.xml",
],
"demo": [],
"development_status": "Alpha",
"maintainers": ["max3903", "EdgarRetes"],
}
2 changes: 2 additions & 0 deletions fieldservice_expense/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import hr_expense
from . import fsm_order
31 changes: 31 additions & 0 deletions fieldservice_expense/models/fsm_order.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Copyright (C) 2024 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import _, api, fields, models


class FSMOrder(models.Model):
_inherit = "fsm.order"

expense_ids = fields.One2many(
"hr.expense",
"fsm_order_id",
)

expense_count = fields.Integer(compute="_compute_expenses")

@api.depends("expense_ids")
def _compute_expenses(self):
for record in self:
record.expense_count = len(record.expense_ids)

Check warning on line 20 in fieldservice_expense/models/fsm_order.py

View check run for this annotation

Codecov / codecov/patch

fieldservice_expense/models/fsm_order.py#L20

Added line #L20 was not covered by tests

def action_view_expenses(self):
self.ensure_one()
return {

Check warning on line 24 in fieldservice_expense/models/fsm_order.py

View check run for this annotation

Codecov / codecov/patch

fieldservice_expense/models/fsm_order.py#L23-L24

Added lines #L23 - L24 were not covered by tests
"type": "ir.actions.act_window",
"res_model": "hr.expense",
"view_mode": "list,form",
"domain": [("fsm_order_id", "=", self.id)],
"context": {"default_fsm_order_id": self.id},
"name": _("Expenses for FSM Order %s") % self.name,
}
21 changes: 21 additions & 0 deletions fieldservice_expense/models/hr_expense.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright (C) 2024 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import _, fields, models


class HrExpense(models.Model):
_inherit = "hr.expense"

fsm_order_id = fields.Many2one("fsm.order")

def action_view_order(self):
self.ensure_one()
return {

Check warning on line 14 in fieldservice_expense/models/hr_expense.py

View check run for this annotation

Codecov / codecov/patch

fieldservice_expense/models/hr_expense.py#L13-L14

Added lines #L13 - L14 were not covered by tests
"type": "ir.actions.act_window",
"res_model": "fsm.order",
"view_mode": "form",
"res_id": self.fsm_order_id.id,
"target": "current",
"name": _("Order: %s") % self.fsm_order_id.name,
}
3 changes: 3 additions & 0 deletions fieldservice_expense/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
4 changes: 4 additions & 0 deletions fieldservice_expense/readme/USAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
## Create expenses in orders
1. Go to FSM module.
2. Select or create a new order.
3. In the Expense page, create a new expense.
25 changes: 25 additions & 0 deletions fieldservice_expense/views/fsm_order_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<odoo>
<record id="fsm_order_inherit_view_form" model="ir.ui.view">
<field name="name">fsm.order.inherit.view.form</field>
<field name="model">fsm.order</field>
<field name="inherit_id" ref="fieldservice.fsm_order_form" />
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button
name="action_view_expenses"
type="object"
class="oe_stat_button"
icon="fa-money"
invisible="not expense_ids"
>
<field string="Expenses" name="expense_count" widget="statinfo" />
</button>
</xpath>
<xpath expr="//page[@name='execution_page']" position="before">
<page string="Expenses">
<field name="expense_ids" />
</page>
</xpath>
</field>
</record>
</odoo>
47 changes: 47 additions & 0 deletions fieldservice_expense/views/hr_expense_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<odoo>
<record id="fsm_hr_expense_inherit_view_form" model="ir.ui.view">
<field name="name">fsm.hr.expense.inherit.view.form</field>
<field name="model">hr.expense</field>
<field name="inherit_id" ref="hr_expense.hr_expense_view_form" />
<field name="arch" type="xml">
<xpath expr="//sheet" position="inside">
<div class="oe_button_box" name="button_box">
<button
name="action_view_order"
type="object"
class="oe_stat_button"
icon="fa-code-fork"
invisible="not fsm_order_id"
>
<span class="o_stat_text">FSM Order</span>
</button>
</div>
</xpath>
<xpath expr="//sheet" position="inside">
<notebook>
<page string="FSM Order">
<group>
<field name="fsm_order_id" string="Order" />
</group>
</page>
</notebook>
</xpath>
</field>
</record>

<record id="hr_expense_inherit_view_search" model="ir.ui.view">
<field name="name">hr.expense.inherit.view.search</field>
<field name="model">hr.expense</field>
<field name="inherit_id" ref="hr_expense.hr_expense_view_search" />
<field name="arch" type="xml">
<xpath expr="//filter[@name='activities_upcoming_all']" position="after">
<separator />
<filter
string="Order"
name="order"
domain="[('fsm_order_id', '!=', False)]"
/>
</xpath>
</field>
</record>
</odoo>
Loading