mirror of
https://github.com/OCA/account-financial-tools.git
synced 2025-02-02 12:47:26 +02:00
[14.0][ADD] account_sequence_option
This commit is contained in:
4
account_sequence_option/__init__.py
Normal file
4
account_sequence_option/__init__.py
Normal 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
|
||||
19
account_sequence_option/__manifest__.py
Normal file
19
account_sequence_option/__manifest__.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# 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": "14.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"],
|
||||
"demo": ["demo/account_demo_options.xml"],
|
||||
"maintainers": ["kittiu"],
|
||||
"license": "LGPL-3",
|
||||
"installable": True,
|
||||
"auto_install": False,
|
||||
}
|
||||
9
account_sequence_option/data/account_sequence_option.xml
Normal file
9
account_sequence_option/data/account_sequence_option.xml
Normal 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>
|
||||
95
account_sequence_option/demo/account_demo_options.xml
Normal file
95
account_sequence_option/demo/account_demo_options.xml
Normal 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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</record>
|
||||
|
||||
<!-- Demo Options-->
|
||||
|
||||
<record id="account_customer_invoice_1" model="ir.sequence.option.line">
|
||||
<field name="base_id" ref="account_sequence" />
|
||||
<field name="name">Customer Invoice</field>
|
||||
<field name="filter_domain">[("move_type", "=", "out_invoice")]</field>
|
||||
<field
|
||||
name="sequence_id"
|
||||
ref="account_sequence_option.seq_customer_invoice_1"
|
||||
/>
|
||||
</record>
|
||||
|
||||
<record id="account_customer_refund_1" model="ir.sequence.option.line">
|
||||
<field name="base_id" ref="account_sequence" />
|
||||
<field name="name">Customer Refund</field>
|
||||
<field name="filter_domain">[("move_type", "=", "out_refund")]</field>
|
||||
<field name="sequence_id" ref="account_sequence_option.seq_customer_refund_1" />
|
||||
</record>
|
||||
|
||||
<record id="account_vendor_bill_1" model="ir.sequence.option.line">
|
||||
<field name="base_id" ref="account_sequence" />
|
||||
<field name="name">Vendor Bill</field>
|
||||
<field name="filter_domain">[("move_type", "=", "in_invoice")]</field>
|
||||
<field name="sequence_id" ref="account_sequence_option.seq_vendor_bill_1" />
|
||||
</record>
|
||||
|
||||
<record id="account_vendor_refund_1" model="ir.sequence.option.line">
|
||||
<field name="base_id" ref="account_sequence" />
|
||||
<field name="name">Vendor Refund</field>
|
||||
<field name="filter_domain">[("move_type", "=", "in_refund")]</field>
|
||||
<field name="sequence_id" ref="account_sequence_option.seq_vendor_refund_1" />
|
||||
</record>
|
||||
|
||||
<record id="account_customer_payment_1" model="ir.sequence.option.line">
|
||||
<field name="base_id" ref="account_sequence" />
|
||||
<field name="name">Customer Payment</field>
|
||||
<field
|
||||
name="filter_domain"
|
||||
>[("move_type", "=", "entry"), ("payment_id.payment_type", "=", "inbound")]</field>
|
||||
<field
|
||||
name="sequence_id"
|
||||
ref="account_sequence_option.seq_customer_payment_1"
|
||||
/>
|
||||
</record>
|
||||
|
||||
<record id="account_vendor_payment_1" model="ir.sequence.option.line">
|
||||
<field name="base_id" ref="account_sequence" />
|
||||
<field name="name">Vendor Payment</field>
|
||||
<field
|
||||
name="filter_domain"
|
||||
>[("move_type", "=", "entry"), ("payment_id.payment_type", "=", "outbound")]</field>
|
||||
<field name="sequence_id" ref="account_sequence_option.seq_vendor_payment_1" />
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
5
account_sequence_option/models/__init__.py
Normal file
5
account_sequence_option/models/__init__.py
Normal 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
|
||||
64
account_sequence_option/models/account_move.py
Normal file
64
account_sequence_option/models/account_move.py
Normal file
@@ -0,0 +1,64 @@
|
||||
# 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_name",
|
||||
default=False,
|
||||
copy=False,
|
||||
store=True,
|
||||
index=True,
|
||||
)
|
||||
|
||||
@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 l: l.name in (False, "/") and l.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()
|
||||
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 = "/"
|
||||
|
||||
# Bypass constrains if sequence is defined
|
||||
def _constrains_date_sequence(self):
|
||||
records = self.filtered(
|
||||
lambda l: self.env["ir.sequence.option.line"].get_sequence(l)
|
||||
)
|
||||
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
|
||||
13
account_sequence_option/models/sequence_option.py
Normal file
13
account_sequence_option/models/sequence_option.py
Normal 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"},
|
||||
)
|
||||
1
account_sequence_option/readme/CONTRIBUTORS.rst
Normal file
1
account_sequence_option/readme/CONTRIBUTORS.rst
Normal file
@@ -0,0 +1 @@
|
||||
* Kitti U. <kittiu@ecosoft.co.th>
|
||||
2
account_sequence_option/readme/DESCRIPTION.rst
Normal file
2
account_sequence_option/readme/DESCRIPTION.rst
Normal file
@@ -0,0 +1,2 @@
|
||||
This module extends module ir_sequence_option and allow you to
|
||||
provide optional sequences for account.move documents, i.e., invoice, bill, journal entry.
|
||||
BIN
account_sequence_option/static/description/icon.png
Normal file
BIN
account_sequence_option/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.2 KiB |
4
account_sequence_option/tests/__init__.py
Normal file
4
account_sequence_option/tests/__init__.py
Normal 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
|
||||
@@ -0,0 +1,74 @@
|
||||
# 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
|
||||
from odoo.tests.common import Form, TransactionCase, tagged
|
||||
|
||||
|
||||
@tagged("post_install", "-at_install")
|
||||
class TestAccountSequenceOption(TransactionCase):
|
||||
def setUp(self):
|
||||
super(TestAccountSequenceOption, self).setUp()
|
||||
self.AccountMove = self.env["account.move"]
|
||||
self.AccountMoveLine = self.env["account.move.line"]
|
||||
self.partner_id = self.env.ref("base.res_partner_1")
|
||||
self.product_id_1 = self.env.ref("product.product_product_6")
|
||||
self.account_seq_opt1 = self.env.ref("account_sequence_option.account_sequence")
|
||||
self.pay_in = self.env.ref("account.account_payment_method_manual_in")
|
||||
self.pay_out = self.env.ref("account.account_payment_method_manual_out")
|
||||
|
||||
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
|
||||
|
||||
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.payment_type = payment_type
|
||||
move_form.partner_type = partner_type
|
||||
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.assertIn("CINV", self.invoice.name)
|
||||
# 2. Vendor Bill
|
||||
self.invoice = self._create_invoice("in_invoice")
|
||||
self.invoice.action_post()
|
||||
self.assertIn("VBIL", self.invoice.name)
|
||||
# 3. Customer Refund
|
||||
self.invoice = self._create_invoice("out_refund")
|
||||
self.invoice.action_post()
|
||||
self.assertIn("CREF", self.invoice.name)
|
||||
# 4. Vendor Refund
|
||||
self.invoice = self._create_invoice("in_refund")
|
||||
self.invoice.action_post()
|
||||
self.assertIn("VREF", self.invoice.name)
|
||||
# 5. Customer Payment
|
||||
self.payment = self._create_payment("inbound", "customer")
|
||||
self.payment.action_post()
|
||||
self.assertIn("CPAY", self.payment.name)
|
||||
# 6. Vendor Payment
|
||||
self.payment = self._create_payment("outbound", "supplier")
|
||||
self.payment.action_post()
|
||||
self.assertIn("VPAY", self.payment.name)
|
||||
Reference in New Issue
Block a user