[14.0][ADD] account_sequence_option

This commit is contained in:
Kitti U
2021-12-16 16:47:14 +07:00
committed by Saran440
parent d9260bf421
commit fc3543f1fe
12 changed files with 290 additions and 0 deletions

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,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,
}

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>
</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>

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,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

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 @@
* Kitti U. <kittiu@ecosoft.co.th>

View 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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

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,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)