Initial commit: Odoo 18.0-20251222 extra-addons
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled

This commit is contained in:
tocmo0nlord
2026-03-13 20:43:25 +00:00
parent 36e847a7df
commit adbe430761
9472 changed files with 1265727 additions and 0 deletions

View File

@@ -0,0 +1,90 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
==============================
Maintenance Equipment Sequence
==============================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:bd05ddab30a91efcaacd646e7fcceba500d0495fec5d5687b6d8fe61255dc3ca
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/license-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%2Fmaintenance-lightgray.png?logo=github
:target: https://github.com/OCA/maintenance/tree/18.0/maintenance_equipment_sequence
:alt: OCA/maintenance
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/maintenance-18-0/maintenance-18-0-maintenance_equipment_sequence
: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/maintenance&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module introduces a sequence to the maintenance equipment managed
from the maintenance equipment category
**Table of contents**
.. contents::
:local:
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/maintenance/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/maintenance/issues/new?body=module:%20maintenance_equipment_sequence%0Aversion:%2018.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
-------
* ForgeFlow
Contributors
------------
- `ForgeFlow, S.L. <https://www.forgeflow.com>`__
- Jordi Ballester Alomar
- Adria Gil Sorribes
- Núria Martín Xifré
- Bernat Puig Font
- `Heliconia Solutions Pvt. Ltd. <https://www.heliconia.io>`__
- Bhavesh Heliconia
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/maintenance <https://github.com/OCA/maintenance/tree/18.0/maintenance_equipment_sequence>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1 @@
from . import models

View File

@@ -0,0 +1,15 @@
# Copyright 2021 ForgeFlow S.L. (https://forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Maintenance Equipment Sequence",
"summary": """
Adds sequence to maintenance equipment defined in the equipment's
category""",
"version": "18.0.1.0.0",
"license": "AGPL-3",
"author": "ForgeFlow, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/maintenance",
"depends": ["maintenance"],
"data": ["views/maintenance_views.xml"],
}

View File

@@ -0,0 +1,70 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * maintenance_equipment_sequence
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-09-20 17:47+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
"Language-Team: none\n"
"Language: es\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 4.17\n"
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,field_description:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_id
msgid "Entry Sequence"
msgstr "Secuencia"
#. module: maintenance_equipment_sequence
#: model:ir.model,name:maintenance_equipment_sequence.model_maintenance_equipment
msgid "Maintenance Equipment"
msgstr "Equipo de Mantenimiento"
#. module: maintenance_equipment_sequence
#: model:ir.model,name:maintenance_equipment_sequence.model_maintenance_equipment_category
msgid "Maintenance Equipment Category"
msgstr "Categoría Equipo de mantenimiento"
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,field_description:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_number_next
msgid "Next Number"
msgstr "Número siguiente"
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,field_description:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_prefix
msgid "Sequence Prefix"
msgstr "Prefijo de la secuencia"
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,help:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_prefix
msgid "The equipment's sequence will be created using this prefix."
msgstr "La secuencia de este equipamiento se creará usando este prefijo."
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,help:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_number_next
msgid "The next sequence number will be used for the next equipment."
msgstr "Este campo se utilizará para el siguiente código de equipamiento."
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,help:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_id
msgid ""
"This field contains the information related to the numbering of the "
"equipments belonging to this category."
msgstr ""
"Este campo contiene la información relacionada con la numeración de los "
"equipamientos de esta categoría."
#~ msgid "Code"
#~ msgstr "Código"
#~ msgid "Equipment Code"
#~ msgstr "Código del Equipamiento"
#~ msgid "Asset Category"
#~ msgstr "Categoría del activo"

View File

@@ -0,0 +1,70 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * maintenance_equipment_sequence
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-07-28 09:49+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 4.3.2\n"
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,field_description:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_id
msgid "Entry Sequence"
msgstr "Sequenza iniziale"
#. module: maintenance_equipment_sequence
#: model:ir.model,name:maintenance_equipment_sequence.model_maintenance_equipment
msgid "Maintenance Equipment"
msgstr "Attrezzatura manutenzione"
#. module: maintenance_equipment_sequence
#: model:ir.model,name:maintenance_equipment_sequence.model_maintenance_equipment_category
msgid "Maintenance Equipment Category"
msgstr "Categoria attrezzatura menutenzione"
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,field_description:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_number_next
msgid "Next Number"
msgstr "Numero successivo"
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,field_description:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_prefix
msgid "Sequence Prefix"
msgstr "Prefisso sequenza"
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,help:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_prefix
msgid "The equipment's sequence will be created using this prefix."
msgstr ""
"La sequenza dell'attrezzatura verrà creata utilizzando questo prefisso."
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,help:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_number_next
msgid "The next sequence number will be used for the next equipment."
msgstr ""
"Il numero di sequenza successivo verrà utilizzato per la prossima "
"attrezzatura."
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,help:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_id
msgid ""
"This field contains the information related to the numbering of the "
"equipments belonging to this category."
msgstr ""
"Questo campo contiene l'informazione relativa alla numerazione delle "
"attrezzature appartenenti a questa categoria."
#~ msgid "Code"
#~ msgstr "Codice"
#~ msgid "Equipment Code"
#~ msgstr "Codice attrezzatura"

View File

@@ -0,0 +1,56 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * maintenance_equipment_sequence
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.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: maintenance_equipment_sequence
#: model:ir.model.fields,field_description:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_id
msgid "Entry Sequence"
msgstr ""
#. module: maintenance_equipment_sequence
#: model:ir.model,name:maintenance_equipment_sequence.model_maintenance_equipment
msgid "Maintenance Equipment"
msgstr ""
#. module: maintenance_equipment_sequence
#: model:ir.model,name:maintenance_equipment_sequence.model_maintenance_equipment_category
msgid "Maintenance Equipment Category"
msgstr ""
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,field_description:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_number_next
msgid "Next Number"
msgstr ""
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,field_description:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_prefix
msgid "Sequence Prefix"
msgstr ""
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,help:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_prefix
msgid "The equipment's sequence will be created using this prefix."
msgstr ""
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,help:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_number_next
msgid "The next sequence number will be used for the next equipment."
msgstr ""
#. module: maintenance_equipment_sequence
#: model:ir.model.fields,help:maintenance_equipment_sequence.field_maintenance_equipment_category__sequence_id
msgid ""
"This field contains the information related to the numbering of the "
"equipments belonging to this category."
msgstr ""

View File

@@ -0,0 +1 @@
from . import maintenance

View File

@@ -0,0 +1,125 @@
# Copyright 2021 ForgeFlow S.L. (https://forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class MaintenanceEquipmentCategory(models.Model):
_inherit = "maintenance.equipment.category"
sequence_prefix = fields.Char(
help="The equipment's sequence will be created using this prefix.",
)
sequence_id = fields.Many2one(
"ir.sequence",
string="Entry Sequence",
help="This field contains the information related to the "
"numbering of the equipments belonging to this category.",
copy=False,
)
sequence_number_next = fields.Integer(
string="Next Number",
help="The next sequence number will be used for the next equipment.",
compute="_compute_seq_number_next",
inverse="_inverse_seq_number_next",
)
@api.model
def _create_sequence(self, vals):
"""Create new no_gap entry sequence"""
seq = {
"name": vals.get("name", False) or self.name,
"implementation": "no_gap",
"prefix": (vals.get("sequence_prefix", False) or self.sequence_prefix),
"padding": 4,
"number_increment": 1,
"use_date_range": False,
}
seq = self.env["ir.sequence"].create(seq)
seq_date_range = seq._get_current_sequence()
seq_date_range.number_next = vals.get("sequence_number_next", 1)
return seq
# do not depend on 'sequence_id.date_range_ids', because
# sequence_id._get_current_sequence() may invalidate it!
@api.depends("sequence_id.use_date_range", "sequence_id.number_next_actual")
def _compute_seq_number_next(self):
"""Compute 'sequence_number_next' according to the current sequence
in use, an ir.sequence or an ir.sequence.date_range.
"""
for category in self:
if category.sequence_id:
sequence = category.sequence_id._get_current_sequence()
category.sequence_number_next = sequence.number_next_actual
else:
category.sequence_number_next = 1
def _inverse_seq_number_next(self):
"""
Inverse 'sequence_number_next' to edit the current sequence next number
"""
for category in self:
if category.sequence_id and category.sequence_number_next:
sequence = category.sequence_id._get_current_sequence()
sequence.sudo().number_next = category.sequence_number_next
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if not vals.get("sequence_id", False):
if vals.get("sequence_prefix", False):
vals["sequence_id"] = self.sudo()._create_sequence(vals).id
else:
vals["sequence_prefix"] = (
self.env["ir.sequence"].browse(vals["sequence_id"]).prefix
)
recs = super().create(vals_list)
recs._compute_equipment_code()
return recs
def write(self, vals):
if not vals.get("sequence_id", False):
if vals.get("sequence_prefix", False):
vals["sequence_id"] = self.sudo()._create_sequence(vals).id
else:
vals["sequence_prefix"] = (
self.env["ir.sequence"].browse(vals["sequence_id"]).prefix
)
result = super().write(vals)
self._compute_equipment_code()
return result
@api.onchange("sequence_id")
def _onchange_sequence_id(self):
if self.sequence_id:
self.sequence_prefix = self.sequence_id.prefix
def _compute_equipment_code(self):
for category in self:
if category.sequence_id:
category_equipments = category.env["maintenance.equipment"].search(
[("category_id", "=", category.id)]
)
for equipment in category_equipments:
if not equipment.serial_no and equipment.category_id.sequence_id:
equipment.serial_no = equipment.category_id.sequence_id._next()
class MaintenanceEquipment(models.Model):
_inherit = "maintenance.equipment"
@api.model_create_multi
def create(self, vals_list):
equipments = super().create(vals_list)
for equipment in equipments:
category = equipment.category_id
if category and category.sequence_id and not equipment.serial_no:
equipment.serial_no = category.sequence_id._next()
return equipments
def write(self, vals):
result = super().write(vals)
for rec in self:
if rec.category_id and not rec.serial_no and rec.category_id.sequence_id:
rec.serial_no = rec.category_id.sequence_id._next()
return result

View File

@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View File

@@ -0,0 +1,7 @@
- [ForgeFlow, S.L.](https://www.forgeflow.com)
- Jordi Ballester Alomar
- Adria Gil Sorribes
- Núria Martín Xifré
- Bernat Puig Font
- [Heliconia Solutions Pvt. Ltd.](https://www.heliconia.io)
- Bhavesh Heliconia

View File

@@ -0,0 +1,2 @@
This module introduces a sequence to the maintenance equipment managed
from the maintenance equipment category

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,440 @@
<!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>README.rst</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">
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="maintenance-equipment-sequence">
<h1>Maintenance Equipment Sequence</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:bd05ddab30a91efcaacd646e7fcceba500d0495fec5d5687b6d8fe61255dc3ca
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/maintenance/tree/18.0/maintenance_equipment_sequence"><img alt="OCA/maintenance" src="https://img.shields.io/badge/github-OCA%2Fmaintenance-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/maintenance-18-0/maintenance-18-0-maintenance_equipment_sequence"><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/maintenance&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module introduces a sequence to the maintenance equipment managed
from the maintenance equipment category</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-3">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-4">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/maintenance/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/maintenance/issues/new?body=module:%20maintenance_equipment_sequence%0Aversion:%2018.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">
<h2><a class="toc-backref" href="#toc-entry-2">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-3">Authors</a></h3>
<ul class="simple">
<li>ForgeFlow</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-4">Contributors</a></h3>
<ul class="simple">
<li><a class="reference external" href="https://www.forgeflow.com">ForgeFlow, S.L.</a><ul>
<li>Jordi Ballester Alomar</li>
<li>Adria Gil Sorribes</li>
<li>Núria Martín Xifré</li>
<li>Bernat Puig Font</li>
</ul>
</li>
<li><a class="reference external" href="https://www.heliconia.io">Heliconia Solutions Pvt. Ltd.</a><ul>
<li>Bhavesh Heliconia</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h3>
<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/maintenance/tree/18.0/maintenance_equipment_sequence">OCA/maintenance</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>
</div>
</body>
</html>

View File

@@ -0,0 +1 @@
from . import test_maintenance_equipment_sequence

View File

@@ -0,0 +1,168 @@
# Copyright 2020 ForgeFlow S.L. (https://forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.tests.common import TransactionCase
class TestMaintenanceEquipmentSequence(TransactionCase):
def setUp(self):
super().setUp()
self.maintenance_equipment_categ_obj = self.env[
"maintenance.equipment.category"
]
self.maintenance_equipment_obj = self.env["maintenance.equipment"]
self.sequence_obj = self.env["ir.sequence"]
def test_01_maintenance_equipment_sequence(self):
"""Create equipment category and check sequence has been
automatically created, create equipments inside category and check
sequence number has been set
"""
# Create category
categ_1 = self.maintenance_equipment_categ_obj.create(
{
"name": "Test Category",
"sequence_prefix": "TTC",
"sequence_number_next": 1,
}
)
seq_1 = self.sequence_obj.search(
[("name", "=", categ_1.name), ("prefix", "=", "TTC")], limit=1
)
self.assertEqual(seq_1.prefix, categ_1.sequence_prefix)
self.assertEqual(seq_1.number_next_actual, categ_1.sequence_number_next)
# Create category without sequence, then write prefix and number next
categ_2 = self.maintenance_equipment_categ_obj.create(
{"name": "Test Category 2"}
)
categ_2.write({"sequence_prefix": "TTC2", "sequence_number_next": 100})
seq_2 = self.sequence_obj.search(
[("name", "=", categ_2.name), ("prefix", "=", "TTC2")], limit=1
)
self.assertEqual(seq_2.prefix, categ_2.sequence_prefix)
self.assertEqual(seq_2.number_next_actual, categ_2.sequence_number_next)
# Assign sequence 1 to category 2
categ_2.write({"sequence_id": seq_1.id})
categ_2._onchange_sequence_id()
# Create equipment inside category
equipment_1 = self.maintenance_equipment_obj.create(
{"name": "Laptop 1", "category_id": categ_2.id}
)
categ_2._compute_equipment_code()
self.assertEqual(equipment_1.serial_no, "TTC0001")
# Set code manually
equipment_1.write({"serial_no": "TTC0023"})
self.assertEqual(equipment_1.serial_no, "TTC0023")
# Remove code and be automatically set to sequence next value
equipment_1.write({"serial_no": False})
self.assertEqual(equipment_1.serial_no, "TTC0002")
def test_02_compute_seq_number_next(self):
"""Test Compute 'sequence_number_next' according to the current sequence in use,
an ir.sequence or an ir.sequence.date_range."""
sequence = self.sequence_obj.create(
{
"name": "Test Sequence",
"prefix": "TST",
"padding": 3,
"number_next": 5,
"use_date_range": False,
}
)
category = self.maintenance_equipment_categ_obj.create(
{
"name": "Test Category with Sequence",
"sequence_id": sequence.id,
}
)
category._compute_seq_number_next()
self.assertEqual(category.sequence_number_next, 5)
sequence.write({"number_next_actual": 10})
category._compute_seq_number_next()
self.assertEqual(category.sequence_number_next, 10)
category_no_seq = self.maintenance_equipment_categ_obj.create(
{
"name": "Test Category without Sequence",
}
)
category_no_seq._compute_seq_number_next()
self.assertEqual(category_no_seq.sequence_number_next, 1)
def test_03_create_with_existing_sequence(self):
"""Test def create(self, vals):"""
existing_sequence = self.sequence_obj.create(
{
"name": "Existing Sequence",
"prefix": "EXS",
"padding": 3,
"number_increment": 1,
"use_date_range": False,
}
)
category_with_seq = self.maintenance_equipment_categ_obj.create(
{
"name": "Category with Existing Sequence",
"sequence_id": existing_sequence.id,
}
)
self.assertEqual(category_with_seq.sequence_prefix, "EXS")
self.assertEqual(category_with_seq.sequence_id.id, existing_sequence.id)
def test_04_compute_equipment_code(self):
"""Test def _compute_equipment_code(self):"""
seq_01 = self.sequence_obj.create(
{
"name": "Test Sequence",
"prefix": "TST",
"padding": 3,
"number_increment": 1,
"use_date_range": False,
}
)
cat_01 = self.maintenance_equipment_categ_obj.create(
{"name": "Test Category", "sequence_id": seq_01.id}
)
equipment_01 = self.env["maintenance.equipment"].create(
{
"name": "Test Equipment 1",
"category_id": cat_01.id,
"serial_no": False,
}
)
equipment_02 = self.env["maintenance.equipment"].create(
{
"name": "Test Equipment 2",
"category_id": cat_01.id,
"serial_no": False,
}
)
equipment_03 = self.env["maintenance.equipment"].create(
{
"name": "Test Equipment 3",
"category_id": False,
"serial_no": False,
}
)
self.assertEqual(equipment_01.serial_no, "TST001")
self.assertEqual(equipment_02.serial_no, "TST002")
self.assertFalse(equipment_03.serial_no)
equipment_03.write({"category_id": cat_01.id})
self.assertEqual(equipment_03.serial_no, "TST003")

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- equipment.category : views -->
<record id="hr_equipment_category_view_form" model="ir.ui.view">
<field name="name">equipment.category.form</field>
<field name="model">maintenance.equipment.category</field>
<field name="inherit_id" ref="maintenance.hr_equipment_category_view_form" />
<field name="arch" type="xml">
<group name="group_alias" position="after">
<group>
<field name="sequence_prefix" readonly="sequence_id != False" />
<field
name="sequence_number_next"
style="padding-right: 1.0em"
readonly="sequence_id != False"
invisible="sequence_prefix == False"
/>
<field name="sequence_id" required="0" />
</group>
</group>
</field>
</record>
<record id="hr_equipment_category_view_tree" model="ir.ui.view">
<field name="name">equipment.category.list</field>
<field name="model">maintenance.equipment.category</field>
<field name="inherit_id" ref="maintenance.hr_equipment_category_view_tree" />
<field name="arch" type="xml">
<field name="company_id" position="after">
<field name="sequence_prefix" optional="show" />
</field>
</field>
</record>
<record id="hr_equipment_category_view_search" model="ir.ui.view">
<field name="name">equipment.category.search</field>
<field name="model">maintenance.equipment.category</field>
<field name="inherit_id" ref="maintenance.hr_equipment_category_view_search" />
<field name="arch" type="xml">
<field name="name" position="after">
<field name="sequence_prefix" />
</field>
</field>
</record>
<!-- equiment : views -->
<record id="hr_equipment_view_form" model="ir.ui.view">
<field name="name">equipment.form</field>
<field name="model">maintenance.equipment</field>
<field name="inherit_id" ref="maintenance.hr_equipment_view_form" />
<field name="priority">99</field>
<field name="arch" type="xml">
<field name="serial_no" position="attributes">
<attribute name="invisible">1</attribute>
</field>
<xpath expr="//div[hasclass('oe_title')]/*[1]" position="before">
<label for="serial_no" class="oe_edit_only" />
<h3>
<field name="serial_no" />
</h3>
</xpath>
</field>
</record>
<record id="hr_equipment_view_tree" model="ir.ui.view">
<field name="name">equipment.list</field>
<field name="model">maintenance.equipment</field>
<field name="inherit_id" ref="maintenance.hr_equipment_view_tree" />
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="before">
<field name="serial_no" position="move" />
</xpath>
</field>
</record>
<record id="hr_equipment_view_search" model="ir.ui.view">
<field name="name">equipment.search</field>
<field name="model">maintenance.equipment</field>
<field name="inherit_id" ref="maintenance.hr_equipment_view_search" />
<field name="arch" type="xml">
<field name="name" position="after">
<field name="serial_no" />
</field>
</field>
</record>
</odoo>