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,125 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
=======================
Account Sequence Option
=======================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:7e50857595e29d5af26975ca08a44d8493f0665ed6e9bc724b952bdd49d157d9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png
:target: https://odoo-community.org/page/development-status
:alt: Alpha
.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github
:target: https://github.com/OCA/account-financial-tools/tree/18.0/account_sequence_option
:alt: OCA/account-financial-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/account-financial-tools-18-0/account-financial-tools-18-0-account_sequence_option
: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/account-financial-tools&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module extends module base_sequence_option and allow you to provide
optional sequences for account.move documents, i.e., invoice, bill,
journal entry.
To use this module, enable developer mode, and check "Use sequence
options" under Settings -> Technical -> Manage Sequence Options.
If you want to define your sequences in XML, feel free to use
demo/account_demo_options.xml as a base for your own sequence
definitions.
The demo sequences use a continuous numbering scheme, without the
current year in the generated name. To use a scheme that does include
the year, set ``use_date_range`` to ``true``, and use ``%(range_year)s``
the represent the year. For example, to generate an invoice scheme that
will generate "2022F00001" in 2022, try:
::
<record id="seq_customer_invoice_1" model="ir.sequence">
<field name="name">Customer Invoice</field>
<field name="padding" eval="5" />
<field name="prefix">%(range_year)sF</field>
<field name="use_date_range">true</field>
</record>
Odoo will generate the date ranges automagically when the first invoice
(or vendor bill, etc) of a year is posted.
.. IMPORTANT::
This is an alpha version, the data model and design can change at any time without warning.
Only for development or testing purpose, do not use in production.
`More details on development status <https://odoo-community.org/page/development-status>`_
**Table of contents**
.. contents::
:local:
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-tools/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/account-financial-tools/issues/new?body=module:%20account_sequence_option%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
-------
* Ecosoft
Contributors
------------
- Kitti U. <kittiu@ecosoft.co.th>
- `Sygel <https://www.sygel.es>`__:
- Ángel García de la Chica Herrera
- Grall f. <fgr@apik.cloud>
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.
.. |maintainer-kittiu| image:: https://github.com/kittiu.png?size=40px
:target: https://github.com/kittiu
:alt: kittiu
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-kittiu|
This module is part of the `OCA/account-financial-tools <https://github.com/OCA/account-financial-tools/tree/18.0/account_sequence_option>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1,4 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from . import models

View File

@@ -0,0 +1,22 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
{
"name": "Account Sequence Option",
"summary": "Manage sequence options for account.move, i.e., invoice, bill, entry",
"version": "18.0.1.0.0",
"author": "Ecosoft, Odoo Community Association (OCA)",
"development_status": "Alpha",
"website": "https://github.com/OCA/account-financial-tools",
"category": "Accounting",
"depends": ["account", "base_sequence_option"],
"data": [
"data/account_sequence_option.xml",
"views/account_move_views.xml",
],
"demo": ["demo/account_demo_options.xml"],
"maintainers": ["kittiu"],
"license": "LGPL-3",
"installable": True,
"auto_install": False,
}

View File

@@ -0,0 +1,9 @@
<odoo noupdate="1">
<record id="account_sequence" model="ir.sequence.option">
<field name="name">Invoice / Bill / Refund / Payment</field>
<field name="model">account.move</field>
<field name="use_sequence_option" eval="False" />
</record>
</odoo>

View File

@@ -0,0 +1,95 @@
<odoo>
<!-- Demo Sequences -->
<record id="seq_customer_invoice_1" model="ir.sequence">
<field name="name">Customer Invoice</field>
<field name="padding" eval="5" />
<field name="prefix">CINV/</field>
<field name="use_date_range">false</field>
</record>
<record id="seq_customer_refund_1" model="ir.sequence">
<field name="name">Customer Refund</field>
<field name="padding" eval="5" />
<field name="prefix">CREF/</field>
<field name="use_date_range">false</field>
</record>
<record id="seq_vendor_bill_1" model="ir.sequence">
<field name="name">Vendor Bill</field>
<field name="padding" eval="5" />
<field name="prefix">VBIL/</field>
<field name="use_date_range">false</field>
</record>
<record id="seq_vendor_refund_1" model="ir.sequence">
<field name="name">Vendor Refund</field>
<field name="padding" eval="5" />
<field name="prefix">VREF/</field>
<field name="use_date_range">false</field>
</record>
<record id="seq_customer_payment_1" model="ir.sequence">
<field name="name">Customer Payment</field>
<field name="padding" eval="5" />
<field name="prefix">CPAY/</field>
<field name="use_date_range">false</field>
</record>
<record id="seq_vendor_payment_1" model="ir.sequence">
<field name="name">Vendor Payment</field>
<field name="padding" eval="5" />
<field name="prefix">VPAY/</field>
<field name="use_date_range">false</field>
</record>
<!-- Demo Options-->
<record id="account_customer_invoice_1" model="ir.sequence.option.line">
<field name="base_id" ref="account_sequence_option.account_sequence" />
<field name="name">Customer Invoice</field>
<field name="filter_domain">[("move_type", "=", "out_invoice")]</field>
<field name="sequence_id" ref="seq_customer_invoice_1" />
</record>
<record id="account_customer_refund_1" model="ir.sequence.option.line">
<field name="base_id" ref="account_sequence_option.account_sequence" />
<field name="name">Customer Refund</field>
<field name="filter_domain">[("move_type", "=", "out_refund")]</field>
<field name="sequence_id" ref="seq_customer_refund_1" />
</record>
<record id="account_vendor_bill_1" model="ir.sequence.option.line">
<field name="base_id" ref="account_sequence_option.account_sequence" />
<field name="name">Vendor Bill</field>
<field name="filter_domain">[("move_type", "=", "in_invoice")]</field>
<field name="sequence_id" ref="seq_vendor_bill_1" />
</record>
<record id="account_vendor_refund_1" model="ir.sequence.option.line">
<field name="base_id" ref="account_sequence_option.account_sequence" />
<field name="name">Vendor Refund</field>
<field name="filter_domain">[("move_type", "=", "in_refund")]</field>
<field name="sequence_id" ref="seq_vendor_refund_1" />
</record>
<record id="account_customer_payment_1" model="ir.sequence.option.line">
<field name="base_id" ref="account_sequence_option.account_sequence" />
<field name="name">Customer Payment</field>
<field
name="filter_domain"
>[("move_type", "=", "entry"), ("origin_payment_id.payment_type", "=", "inbound")]</field>
<field name="sequence_id" ref="seq_customer_payment_1" />
</record>
<record id="account_vendor_payment_1" model="ir.sequence.option.line">
<field name="base_id" ref="account_sequence_option.account_sequence" />
<field name="name">Vendor Payment</field>
<field
name="filter_domain"
>[("move_type", "=", "entry"), ("origin_payment_id.payment_type", "=", "outbound")]</field>
<field name="sequence_id" ref="seq_vendor_payment_1" />
</record>
</odoo>

View File

@@ -0,0 +1,40 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_sequence_option
#
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: account_sequence_option
#: model:ir.model.fields,field_description:account_sequence_option.field_ir_sequence_option__model
msgid "Apply On Model"
msgstr ""
#. module: account_sequence_option
#: model:ir.model,name:account_sequence_option.model_account_move
msgid "Journal Entry"
msgstr ""
#. module: account_sequence_option
#: model:ir.model.fields,field_description:account_sequence_option.field_account_bank_statement_line__sequence_option
#: model:ir.model.fields,field_description:account_sequence_option.field_account_move__sequence_option
msgid "Sequence Option"
msgstr ""
#. module: account_sequence_option
#: model:ir.model,name:account_sequence_option.model_ir_sequence_option
msgid "Sequence Option Base Model"
msgstr ""
#. module: account_sequence_option
#: model:ir.model.fields.selection,name:account_sequence_option.selection__ir_sequence_option__model__account_move
msgid "account.move"
msgstr ""

View File

@@ -0,0 +1,53 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_sequence_option
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-10-09 03:11+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.17\n"
#. module: account_sequence_option
#: model:ir.model.fields,field_description:account_sequence_option.field_ir_sequence_option__model
msgid "Apply On Model"
msgstr "Applica sul modello"
#. module: account_sequence_option
#: model:ir.model,name:account_sequence_option.model_account_move
msgid "Journal Entry"
msgstr "Registrazione contabile"
#. module: account_sequence_option
#: model:ir.model.fields,field_description:account_sequence_option.field_account_bank_statement_line__sequence_option
#: model:ir.model.fields,field_description:account_sequence_option.field_account_move__sequence_option
#: model:ir.model.fields,field_description:account_sequence_option.field_account_payment__sequence_option
msgid "Sequence Option"
msgstr "Opzione sequenza"
#. module: account_sequence_option
#: model:ir.model,name:account_sequence_option.model_ir_sequence_option
msgid "Sequence Option Base Model"
msgstr "Sequenza modello base opzione"
#. module: account_sequence_option
#: model:ir.model.fields.selection,name:account_sequence_option.selection__ir_sequence_option__model__account_move
msgid "account.move"
msgstr "Registrazione contabile (account.move)"
#~ msgid "Display Name"
#~ msgstr "Nome visualizzato"
#~ msgid "ID"
#~ msgstr "ID"
#~ msgid "Last Modified on"
#~ msgstr "Ultima modifica il"

View File

@@ -0,0 +1,5 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from . import account_move
from . import sequence_option

View File

@@ -0,0 +1,71 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from odoo import api, fields, models
class AccountMove(models.Model):
_inherit = "account.move"
sequence_option = fields.Boolean(
compute="_compute_sequence_option",
default=False,
copy=False,
store=True,
index=True,
)
@api.depends("posted_before", "state", "journal_id", "date")
def _compute_sequence_option(self):
if hasattr(self.env["account.journal"], "sequence_id"):
return
return self._compute_name()
@api.depends("posted_before", "state", "journal_id", "date")
def _compute_name(self):
options = self.env["ir.sequence.option.line"].get_model_options(self._name)
# On post, get the sequence option
if options:
for rec in self.filtered(
lambda x: x.name in (False, "/") and x.state == "posted"
):
sequence = self.env["ir.sequence.option.line"].get_sequence(
rec, options=options
)
if sequence:
rec.name = sequence.next_by_id(sequence_date=rec.date)
rec.sequence_option = True
# Call super()
res = super()._compute_name()
if options:
for rec in self:
# On create new, odoo may suggest the 1st new number, remove it.
if (
not rec.create_date
and rec.state == "draft"
and rec.name not in (False, "/")
):
rec.name = "/"
# On cancel/draft w/o number assigned yet,
# ensure no odoo number assigned.
if (
rec.create_date
and rec.state in ("draft", "cancel")
and rec.name not in (False, "/")
and not rec.sequence_option
):
rec.name = "/"
return res
# Bypass constrains if sequence is defined
def _constrains_date_sequence(self):
records = self.filtered(
lambda x: self.env["ir.sequence.option.line"].get_sequence(x)
)
return super(AccountMove, self - records)._constrains_date_sequence()
def _get_last_sequence_domain(self, relaxed=False):
(where_string, param) = super()._get_last_sequence_domain(relaxed=relaxed)
where_string += " AND coalesce(sequence_option, false) = false "
return where_string, param

View File

@@ -0,0 +1,13 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from odoo import fields, models
class IrSequenceOption(models.Model):
_inherit = "ir.sequence.option"
model = fields.Selection(
selection_add=[("account.move", "account.move")],
ondelete={"account.move": "cascade"},
)

View File

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

View File

@@ -0,0 +1,4 @@
- Kitti U. \<<kittiu@ecosoft.co.th>\>
- [Sygel](https://www.sygel.es):
- Ángel García de la Chica Herrera
- Grall f. \<<fgr@apik.cloud>\>

View File

@@ -0,0 +1,26 @@
This module extends module base_sequence_option and allow you to provide
optional sequences for account.move documents, i.e., invoice, bill,
journal entry.
To use this module, enable developer mode, and check "Use sequence
options" under Settings -\> Technical -\> Manage Sequence Options.
If you want to define your sequences in XML, feel free to use
demo/account_demo_options.xml as a base for your own sequence
definitions.
The demo sequences use a continuous numbering scheme, without the
current year in the generated name. To use a scheme that does include
the year, set `use_date_range` to `true`, and use `%(range_year)s` the
represent the year. For example, to generate an invoice scheme that will
generate "2022F00001" in 2022, try:
<record id="seq_customer_invoice_1" model="ir.sequence">
<field name="name">Customer Invoice</field>
<field name="padding" eval="5" />
<field name="prefix">%(range_year)sF</field>
<field name="use_date_range">true</field>
</record>
Odoo will generate the date ranges automagically when the first invoice
(or vendor bill, etc) of a year is posted.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,464 @@
<!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="account-sequence-option">
<h1>Account Sequence Option</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:7e50857595e29d5af26975ca08a44d8493f0665ed6e9bc724b952bdd49d157d9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Alpha" src="https://img.shields.io/badge/maturity-Alpha-red.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/license-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/account-financial-tools/tree/18.0/account_sequence_option"><img alt="OCA/account-financial-tools" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/account-financial-tools-18-0/account-financial-tools-18-0-account_sequence_option"><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/account-financial-tools&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 extends module base_sequence_option and allow you to provide
optional sequences for account.move documents, i.e., invoice, bill,
journal entry.</p>
<p>To use this module, enable developer mode, and check “Use sequence
options” under Settings -&gt; Technical -&gt; Manage Sequence Options.</p>
<p>If you want to define your sequences in XML, feel free to use
demo/account_demo_options.xml as a base for your own sequence
definitions.</p>
<p>The demo sequences use a continuous numbering scheme, without the
current year in the generated name. To use a scheme that does include
the year, set <tt class="docutils literal">use_date_range</tt> to <tt class="docutils literal">true</tt>, and use <tt class="docutils literal">%(range_year)s</tt>
the represent the year. For example, to generate an invoice scheme that
will generate “2022F00001” in 2022, try:</p>
<pre class="literal-block">
&lt;record id=&quot;seq_customer_invoice_1&quot; model=&quot;ir.sequence&quot;&gt;
&lt;field name=&quot;name&quot;&gt;Customer Invoice&lt;/field&gt;
&lt;field name=&quot;padding&quot; eval=&quot;5&quot; /&gt;
&lt;field name=&quot;prefix&quot;&gt;%(range_year)sF&lt;/field&gt;
&lt;field name=&quot;use_date_range&quot;&gt;true&lt;/field&gt;
&lt;/record&gt;
</pre>
<p>Odoo will generate the date ranges automagically when the first invoice
(or vendor bill, etc) of a year is posted.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<p class="last">This is an alpha version, the data model and design can change at any time without warning.
Only for development or testing purpose, do not use in production.
<a class="reference external" href="https://odoo-community.org/page/development-status">More details on development status</a></p>
</div>
<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/account-financial-tools/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/account-financial-tools/issues/new?body=module:%20account_sequence_option%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>Ecosoft</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-4">Contributors</a></h3>
<ul class="simple">
<li>Kitti U. &lt;<a class="reference external" href="mailto:kittiu&#64;ecosoft.co.th">kittiu&#64;ecosoft.co.th</a>&gt;</li>
<li><a class="reference external" href="https://www.sygel.es">Sygel</a>:<ul>
<li>Ángel García de la Chica Herrera</li>
</ul>
</li>
<li>Grall f. &lt;<a class="reference external" href="mailto:fgr&#64;apik.cloud">fgr&#64;apik.cloud</a>&gt;</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>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/kittiu"><img alt="kittiu" src="https://github.com/kittiu.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-financial-tools/tree/18.0/account_sequence_option">OCA/account-financial-tools</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,4 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from . import test_account_sequence_option

View File

@@ -0,0 +1,97 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from datetime import timedelta
from odoo import fields
from odoo.tests import Form, common, tagged
@tagged("post_install", "-at_install")
class TestAccountSequenceOption(common.TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.AccountMove = cls.env["account.move"]
cls.AccountMoveLine = cls.env["account.move.line"]
cls.partner_id = cls.env.ref("base.res_partner_1")
cls.product_id_1 = cls.env.ref("product.product_product_6")
cls.account_seq_opt1 = cls.env.ref("account_sequence_option.account_sequence")
cls.pay_in = cls.env.ref("account.account_payment_method_manual_in")
cls.pay_out = cls.env.ref("account.account_payment_method_manual_out")
@classmethod
def _create_invoice(self, move_type):
move_form = Form(
self.env["account.move"].with_context(default_move_type=move_type)
)
move_form.partner_id = self.partner_id
move_form.invoice_date = fields.Date.today()
with move_form.invoice_line_ids.new() as line_form:
line_form.product_id = self.product_id_1
invoice = move_form.save()
return invoice
@classmethod
def _create_payment(self, payment_type, partner_type):
ctx = {
"default_payment_type": payment_type,
"default_partner_type": partner_type,
"default_move_journal_types": ("bank", "cash"),
}
move_form = Form(self.env["account.payment"].with_context(**ctx))
move_form.partner_id = self.partner_id
payment = move_form.save()
return payment
def test_account_sequence_options(self):
"""Test different kind of sequences
1. Customer Invoice 2. Vendor Bill
3. Customer Refund 4. Vendor Refund
5. Customer Payment 6. Vendor Payment
"""
self.account_seq_opt1.use_sequence_option = True
# 1. Customer Invoice
self.invoice = self._create_invoice("out_invoice")
self.invoice.action_post()
self.invoice._compute_name()
name = hasattr(self.env["account.journal"], "sequence_id") and "INV" or "CINV"
self.assertIn(name, self.invoice.name)
# 2. Vendor Bill
self.invoice = self._create_invoice("in_invoice")
self.invoice.action_post()
name = hasattr(self.env["account.journal"], "sequence_id") and "BILL" or "VBIL"
self.assertIn(name, self.invoice.name)
# 3. Customer Refund
self.invoice = self._create_invoice("out_refund")
self.invoice.action_post()
name = hasattr(self.env["account.journal"], "sequence_id") and "RINV" or "CREF"
self.assertIn(name, self.invoice.name)
# 4. Vendor Refund
self.invoice = self._create_invoice("in_refund")
self.invoice.action_post()
name = hasattr(self.env["account.journal"], "sequence_id") and "RBILL" or "VREF"
self.assertIn(name, self.invoice.name)
# 5. Customer Payment
self.payment = self._create_payment("inbound", "customer")
self.payment.action_post()
name = hasattr(self.env["account.journal"], "sequence_id") and "BNK1" or "CPAY"
self.assertIn(name, self.payment.name)
# 6. Vendor Payment
self.payment = self._create_payment("outbound", "supplier")
self.payment.action_post()
name = hasattr(self.env["account.journal"], "sequence_id") and "BNK1" or "VPAY"
self.assertIn(name, self.payment.name)
# 7. Create out invoice, post invoice, reset invoice to Draft
# Change Date, post invoice.
self.invoice = self._create_invoice("out_invoice")
self.invoice.action_post()
old_name = self.invoice.name
self.invoice.button_draft()
self.invoice.write(
{"invoice_date": self.invoice.invoice_date - timedelta(days=1)}
)
self.invoice.action_post()
self.assertEqual(old_name, self.invoice.name)
self.invoice._constrains_date_sequence()

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2022 Angel Garcia de la Chica Herrera <angel.garcia@sygel.es>
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="account_sequence_option_view_move_form" model="ir.ui.view">
<field name="name">account_sequence_option_view_move_form</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='date']" position="after">
<field name="sequence_option" invisible="1" />
</xpath>
</field>
</record>
</odoo>