[IMP] account_move_fiscal_month: black, isort, prettier
This commit is contained in:
parent
b79d5d84b2
commit
14ecf98649
@ -2,17 +2,12 @@
|
|||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Account Move Fiscal Month',
|
"name": "Account Move Fiscal Month",
|
||||||
'summary': """Display the fiscal month on journal entries/item""",
|
"summary": """Display the fiscal month on journal entries/item""",
|
||||||
'version': '12.0.1.1.1',
|
"version": "12.0.1.1.1",
|
||||||
'license': 'AGPL-3',
|
"license": "AGPL-3",
|
||||||
'author': 'ACSONE SA/NV,Odoo Community Association (OCA)',
|
"author": "ACSONE SA/NV,Odoo Community Association (OCA)",
|
||||||
'website': 'https://github.com/OCA/account-financial-tools',
|
"website": "https://github.com/OCA/account-financial-tools",
|
||||||
'depends': [
|
"depends": ["account_fiscal_month",],
|
||||||
'account_fiscal_month',
|
"data": ["views/account_move.xml", "views/account_move_line.xml",],
|
||||||
],
|
|
||||||
'data': [
|
|
||||||
'views/account_move.xml',
|
|
||||||
'views/account_move_line.xml',
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
|
@ -7,39 +7,45 @@ from odoo.osv import expression
|
|||||||
|
|
||||||
class AccountMove(models.Model):
|
class AccountMove(models.Model):
|
||||||
|
|
||||||
_inherit = 'account.move'
|
_inherit = "account.move"
|
||||||
|
|
||||||
date_range_fm_id = fields.Many2one(
|
date_range_fm_id = fields.Many2one(
|
||||||
comodel_name='date.range', string="Fiscal month",
|
comodel_name="date.range",
|
||||||
compute='_compute_date_range_fm', search='_search_date_range_fm',
|
string="Fiscal month",
|
||||||
|
compute="_compute_date_range_fm",
|
||||||
|
search="_search_date_range_fm",
|
||||||
)
|
)
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
@api.depends('date', 'company_id')
|
@api.depends("date", "company_id")
|
||||||
def _compute_date_range_fm(self):
|
def _compute_date_range_fm(self):
|
||||||
for rec in self:
|
for rec in self:
|
||||||
date = rec.date
|
date = rec.date
|
||||||
company = rec.company_id
|
company = rec.company_id
|
||||||
rec.date_range_fm_id =\
|
rec.date_range_fm_id = company and company.find_daterange_fm(date) or False
|
||||||
company and company.find_daterange_fm(date) or False
|
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _search_date_range_fm(self, operator, value):
|
def _search_date_range_fm(self, operator, value):
|
||||||
if operator in ('=', '!=', 'in', 'not in'):
|
if operator in ("=", "!=", "in", "not in"):
|
||||||
date_range_domain = [('id', operator, value)]
|
date_range_domain = [("id", operator, value)]
|
||||||
else:
|
else:
|
||||||
date_range_domain = [('name', operator, value)]
|
date_range_domain = [("name", operator, value)]
|
||||||
|
|
||||||
date_ranges = self.env['date.range'].search(date_range_domain)
|
date_ranges = self.env["date.range"].search(date_range_domain)
|
||||||
domain = []
|
domain = []
|
||||||
for date_range in date_ranges:
|
for date_range in date_ranges:
|
||||||
domain = expression.OR([domain, [
|
domain = expression.OR(
|
||||||
'&',
|
[
|
||||||
'&',
|
domain,
|
||||||
('date', '>=', date_range.date_start),
|
[
|
||||||
('date', '<=', date_range.date_end),
|
"&",
|
||||||
'|',
|
"&",
|
||||||
('company_id', '=', False),
|
("date", ">=", date_range.date_start),
|
||||||
('company_id', '=', date_range.company_id.id),
|
("date", "<=", date_range.date_end),
|
||||||
]])
|
"|",
|
||||||
|
("company_id", "=", False),
|
||||||
|
("company_id", "=", date_range.company_id.id),
|
||||||
|
],
|
||||||
|
]
|
||||||
|
)
|
||||||
return domain
|
return domain
|
||||||
|
@ -6,8 +6,6 @@ from odoo import fields, models
|
|||||||
|
|
||||||
class AccountMoveLine(models.Model):
|
class AccountMoveLine(models.Model):
|
||||||
|
|
||||||
_inherit = 'account.move.line'
|
_inherit = "account.move.line"
|
||||||
|
|
||||||
date_range_fm_id = fields.Many2one(
|
date_range_fm_id = fields.Many2one(related="move_id.date_range_fm_id",)
|
||||||
related='move_id.date_range_fm_id',
|
|
||||||
)
|
|
||||||
|
@ -6,150 +6,191 @@ from odoo.tests.common import TransactionCase
|
|||||||
|
|
||||||
|
|
||||||
class TestAccountMoveFiscalMonth(TransactionCase):
|
class TestAccountMoveFiscalMonth(TransactionCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestAccountMoveFiscalMonth, self).setUp()
|
super(TestAccountMoveFiscalMonth, self).setUp()
|
||||||
self.AccountObj = self.env['account.account']
|
self.AccountObj = self.env["account.account"]
|
||||||
self.AccountJournalObj = self.env['account.journal']
|
self.AccountJournalObj = self.env["account.journal"]
|
||||||
self.AccountMoveObj = self.env['account.move']
|
self.AccountMoveObj = self.env["account.move"]
|
||||||
self.DateRangeObj = self.env['date.range']
|
self.DateRangeObj = self.env["date.range"]
|
||||||
|
|
||||||
self.bank_journal = self.AccountJournalObj.search([
|
self.bank_journal = self.AccountJournalObj.search(
|
||||||
('type', '=', 'bank')
|
[("type", "=", "bank")], limit=1
|
||||||
], limit=1)
|
)
|
||||||
|
|
||||||
self.account_type_recv = self.env.ref(
|
self.account_type_recv = self.env.ref("account.data_account_type_receivable")
|
||||||
'account.data_account_type_receivable')
|
self.account_type_rev = self.env.ref("account.data_account_type_revenue")
|
||||||
self.account_type_rev = self.env.ref(
|
|
||||||
'account.data_account_type_revenue')
|
|
||||||
|
|
||||||
self.account_recv = self.AccountObj.create({
|
self.account_recv = self.AccountObj.create(
|
||||||
'code': 'RECV_DR',
|
{
|
||||||
'name': "Receivable (test)",
|
"code": "RECV_DR",
|
||||||
'reconcile': True,
|
"name": "Receivable (test)",
|
||||||
'user_type_id': self.account_type_recv.id,
|
"reconcile": True,
|
||||||
})
|
"user_type_id": self.account_type_recv.id,
|
||||||
self.account_sale = self.AccountObj.create({
|
}
|
||||||
'code': 'SALE_DR',
|
)
|
||||||
'name': "Receivable (sale)",
|
self.account_sale = self.AccountObj.create(
|
||||||
'reconcile': True,
|
{
|
||||||
'user_type_id': self.account_type_rev.id,
|
"code": "SALE_DR",
|
||||||
})
|
"name": "Receivable (sale)",
|
||||||
|
"reconcile": True,
|
||||||
|
"user_type_id": self.account_type_rev.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
self.date_range_type_month = self.env.ref(
|
self.date_range_type_month = self.env.ref(
|
||||||
'account_fiscal_month.date_range_fiscal_month')
|
"account_fiscal_month.date_range_fiscal_month"
|
||||||
|
)
|
||||||
|
|
||||||
self.date_range_january_2017 = self.DateRangeObj.create({
|
self.date_range_january_2017 = self.DateRangeObj.create(
|
||||||
'name': "January 2017",
|
{
|
||||||
'date_start': '2017-01-01',
|
"name": "January 2017",
|
||||||
'date_end': '2017-01-31',
|
"date_start": "2017-01-01",
|
||||||
'type_id': self.date_range_type_month.id,
|
"date_end": "2017-01-31",
|
||||||
})
|
"type_id": self.date_range_type_month.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
self.date_range_february_2017 = self.DateRangeObj.create({
|
self.date_range_february_2017 = self.DateRangeObj.create(
|
||||||
'name': "February 2017",
|
{
|
||||||
'date_start': '2017-02-01',
|
"name": "February 2017",
|
||||||
'date_end': '2017-02-28',
|
"date_start": "2017-02-01",
|
||||||
'type_id': self.date_range_type_month.id,
|
"date_end": "2017-02-28",
|
||||||
})
|
"type_id": self.date_range_type_month.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
self.date_range_january_2018 = self.DateRangeObj.create({
|
self.date_range_january_2018 = self.DateRangeObj.create(
|
||||||
'name': "January 2018",
|
{
|
||||||
'date_start': '2018-01-01',
|
"name": "January 2018",
|
||||||
'date_end': '2018-01-31',
|
"date_start": "2018-01-01",
|
||||||
'type_id': self.date_range_type_month.id,
|
"date_end": "2018-01-31",
|
||||||
})
|
"type_id": self.date_range_type_month.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
def create_account_move(self, date_str):
|
def create_account_move(self, date_str):
|
||||||
return self.AccountMoveObj.create({
|
return self.AccountMoveObj.create(
|
||||||
'journal_id': self.bank_journal.id,
|
{
|
||||||
'date': date_str,
|
"journal_id": self.bank_journal.id,
|
||||||
'line_ids': [
|
"date": date_str,
|
||||||
(0, 0, {
|
"line_ids": [
|
||||||
'name': "Debit",
|
(
|
||||||
'debit': 1000,
|
0,
|
||||||
'account_id': self.account_recv.id,
|
0,
|
||||||
}),
|
{
|
||||||
(0, 0, {
|
"name": "Debit",
|
||||||
'name': "Credit",
|
"debit": 1000,
|
||||||
'credit': 1000,
|
"account_id": self.account_recv.id,
|
||||||
'account_id': self.account_sale.id,
|
},
|
||||||
}),
|
),
|
||||||
]
|
(
|
||||||
})
|
0,
|
||||||
|
0,
|
||||||
|
{
|
||||||
|
"name": "Credit",
|
||||||
|
"credit": 1000,
|
||||||
|
"account_id": self.account_sale.id,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
def test_01_account_move_date_range_fm_id_compute(self):
|
def test_01_account_move_date_range_fm_id_compute(self):
|
||||||
january_1st = Date.from_string('2017-01-01')
|
january_1st = Date.from_string("2017-01-01")
|
||||||
move = self.create_account_move(january_1st)
|
move = self.create_account_move(january_1st)
|
||||||
|
|
||||||
self.assertEquals(
|
self.assertEquals(
|
||||||
move.date_range_fm_id, self.date_range_january_2017,
|
move.date_range_fm_id,
|
||||||
msg="Move period should be January 2017")
|
self.date_range_january_2017,
|
||||||
self.assertTrue(all([
|
msg="Move period should be January 2017",
|
||||||
|
)
|
||||||
|
self.assertTrue(
|
||||||
|
all(
|
||||||
|
[
|
||||||
line.date_range_fm_id == self.date_range_january_2017
|
line.date_range_fm_id == self.date_range_january_2017
|
||||||
for line in move.line_ids
|
for line in move.line_ids
|
||||||
]), msg="All lines period should be January 2017")
|
]
|
||||||
|
),
|
||||||
|
msg="All lines period should be January 2017",
|
||||||
|
)
|
||||||
|
|
||||||
march_1st = Date.from_string('2017-03-01')
|
march_1st = Date.from_string("2017-03-01")
|
||||||
move = self.create_account_move(march_1st)
|
move = self.create_account_move(march_1st)
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
bool(move.date_range_fm_id),
|
bool(move.date_range_fm_id), msg="Move shouldn't have any date range"
|
||||||
msg="Move shouldn't have any date range")
|
)
|
||||||
|
|
||||||
def test_02_account_move_date_range_fm_id_search(self):
|
def test_02_account_move_date_range_fm_id_search(self):
|
||||||
january_2017_1st = Date.from_string('2017-01-01')
|
january_2017_1st = Date.from_string("2017-01-01")
|
||||||
february_2017_1st = Date.from_string('2017-02-01')
|
february_2017_1st = Date.from_string("2017-02-01")
|
||||||
march_2017_1st = Date.from_string('2017-03-01')
|
march_2017_1st = Date.from_string("2017-03-01")
|
||||||
january_2018_1st = Date.from_string('2018-01-01')
|
january_2018_1st = Date.from_string("2018-01-01")
|
||||||
|
|
||||||
move_jan_2017 = self.create_account_move(january_2017_1st)
|
move_jan_2017 = self.create_account_move(january_2017_1st)
|
||||||
move_feb_2017 = self.create_account_move(february_2017_1st)
|
move_feb_2017 = self.create_account_move(february_2017_1st)
|
||||||
move_march_2017 = self.create_account_move(march_2017_1st)
|
move_march_2017 = self.create_account_move(march_2017_1st)
|
||||||
move_jan_2018 = self.create_account_move(january_2018_1st)
|
move_jan_2018 = self.create_account_move(january_2018_1st)
|
||||||
|
|
||||||
moves = self.AccountMoveObj.search([
|
moves = self.AccountMoveObj.search([("date_range_fm_id", "ilike", "January"),])
|
||||||
('date_range_fm_id', 'ilike', 'January'),
|
|
||||||
])
|
|
||||||
|
|
||||||
self.assertTrue(all([
|
self.assertTrue(
|
||||||
|
all(
|
||||||
|
[
|
||||||
move_jan_2017 in moves,
|
move_jan_2017 in moves,
|
||||||
move_feb_2017 not in moves,
|
move_feb_2017 not in moves,
|
||||||
move_march_2017 not in moves,
|
move_march_2017 not in moves,
|
||||||
move_jan_2018 in moves,
|
move_jan_2018 in moves,
|
||||||
]), msg="There should be only moves in January")
|
]
|
||||||
|
),
|
||||||
|
msg="There should be only moves in January",
|
||||||
|
)
|
||||||
|
|
||||||
moves = self.AccountMoveObj.search([
|
moves = self.AccountMoveObj.search([("date_range_fm_id", "ilike", "2017"),])
|
||||||
('date_range_fm_id', 'ilike', '2017'),
|
|
||||||
])
|
|
||||||
|
|
||||||
self.assertTrue(all([
|
self.assertTrue(
|
||||||
|
all(
|
||||||
|
[
|
||||||
move_jan_2017 in moves,
|
move_jan_2017 in moves,
|
||||||
move_feb_2017 in moves,
|
move_feb_2017 in moves,
|
||||||
move_march_2017 not in moves,
|
move_march_2017 not in moves,
|
||||||
move_jan_2018 not in moves,
|
move_jan_2018 not in moves,
|
||||||
]))
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
moves = self.AccountMoveObj.search([
|
moves = self.AccountMoveObj.search(
|
||||||
('date_range_fm_id', '=', self.date_range_january_2017.id),
|
[("date_range_fm_id", "=", self.date_range_january_2017.id),]
|
||||||
])
|
)
|
||||||
|
|
||||||
self.assertTrue(all([
|
self.assertTrue(
|
||||||
|
all(
|
||||||
|
[
|
||||||
move_jan_2017 in moves,
|
move_jan_2017 in moves,
|
||||||
move_feb_2017 not in moves,
|
move_feb_2017 not in moves,
|
||||||
move_march_2017 not in moves,
|
move_march_2017 not in moves,
|
||||||
move_jan_2018 not in moves,
|
move_jan_2018 not in moves,
|
||||||
]))
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
moves = self.AccountMoveObj.search([
|
moves = self.AccountMoveObj.search(
|
||||||
('date_range_fm_id', 'in', (
|
[
|
||||||
self.date_range_january_2017.id,
|
(
|
||||||
self.date_range_february_2017.id
|
"date_range_fm_id",
|
||||||
)),
|
"in",
|
||||||
])
|
(self.date_range_january_2017.id, self.date_range_february_2017.id),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
self.assertTrue(all([
|
self.assertTrue(
|
||||||
|
all(
|
||||||
|
[
|
||||||
move_jan_2017 in moves,
|
move_jan_2017 in moves,
|
||||||
move_feb_2017 in moves,
|
move_feb_2017 in moves,
|
||||||
move_march_2017 not in moves,
|
move_march_2017 not in moves,
|
||||||
move_jan_2018 not in moves,
|
move_jan_2018 not in moves,
|
||||||
]))
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
@ -1,46 +1,35 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<!-- Copyright 2017 ACSONE SA/NV
|
<!-- Copyright 2017 ACSONE SA/NV
|
||||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
|
||||||
|
|
||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<record model="ir.ui.view" id="account_move_form_view">
|
<record model="ir.ui.view" id="account_move_form_view">
|
||||||
<field name="name">account.move.form (in account_move_fiscal_month)</field>
|
<field name="name">account.move.form (in account_move_fiscal_month)</field>
|
||||||
<field name="model">account.move</field>
|
<field name="model">account.move</field>
|
||||||
<field name="inherit_id" ref="account.view_move_form"/>
|
<field name="inherit_id" ref="account.view_move_form" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
<field name="date" position="after">
|
<field name="date" position="after">
|
||||||
<field name="date_range_fm_id" options="{'no_open': True}"/>
|
<field name="date_range_fm_id" options="{'no_open': True}" />
|
||||||
</field>
|
</field>
|
||||||
|
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.ui.view" id="account_move_search_view">
|
<record model="ir.ui.view" id="account_move_search_view">
|
||||||
<field name="name">account.move.search (in account_move_fiscal_month)</field>
|
<field name="name">account.move.search (in account_move_fiscal_month)</field>
|
||||||
<field name="model">account.move</field>
|
<field name="model">account.move</field>
|
||||||
<field name="inherit_id" ref="account.view_account_move_filter"/>
|
<field name="inherit_id" ref="account.view_account_move_filter" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
<field name="date" position="after">
|
<field name="date" position="after">
|
||||||
<field name="date_range_fm_id"/>
|
<field name="date_range_fm_id" />
|
||||||
</field>
|
</field>
|
||||||
|
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.ui.view" id="account_move_tree_view">
|
<record model="ir.ui.view" id="account_move_tree_view">
|
||||||
<field name="name">account.move.tree (in account_move_fiscal_month)</field>
|
<field name="name">account.move.tree (in account_move_fiscal_month)</field>
|
||||||
<field name="model">account.move</field>
|
<field name="model">account.move</field>
|
||||||
<field name="inherit_id" ref="account.view_move_tree"/>
|
<field name="inherit_id" ref="account.view_move_tree" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
<field name="date" position="after">
|
<field name="date" position="after">
|
||||||
<field name="date_range_fm_id"/>
|
<field name="date_range_fm_id" />
|
||||||
</field>
|
</field>
|
||||||
|
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
@ -1,46 +1,41 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<!-- Copyright 2017 ACSONE SA/NV
|
<!-- Copyright 2017 ACSONE SA/NV
|
||||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
|
||||||
|
|
||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<record model="ir.ui.view" id="account_move_line_form_view">
|
<record model="ir.ui.view" id="account_move_line_form_view">
|
||||||
<field name="name">account.move.line.form (in account_move_line_fiscal_month)</field>
|
<field
|
||||||
|
name="name"
|
||||||
|
>account.move.line.form (in account_move_line_fiscal_month)</field>
|
||||||
<field name="model">account.move.line</field>
|
<field name="model">account.move.line</field>
|
||||||
<field name="inherit_id" ref="account.view_move_line_form"/>
|
<field name="inherit_id" ref="account.view_move_line_form" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
<field name="date" position="after">
|
<field name="date" position="after">
|
||||||
<field name="date_range_fm_id" options="{'no_open': True}"/>
|
<field name="date_range_fm_id" options="{'no_open': True}" />
|
||||||
</field>
|
</field>
|
||||||
|
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.ui.view" id="account_move_line_search_view">
|
<record model="ir.ui.view" id="account_move_line_search_view">
|
||||||
<field name="name">account.move.line.search (in account_move_line_fiscal_month)</field>
|
<field
|
||||||
|
name="name"
|
||||||
|
>account.move.line.search (in account_move_line_fiscal_month)</field>
|
||||||
<field name="model">account.move.line</field>
|
<field name="model">account.move.line</field>
|
||||||
<field name="inherit_id" ref="account.view_account_move_line_filter"/>
|
<field name="inherit_id" ref="account.view_account_move_line_filter" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
<field name="date" position="after">
|
<field name="date" position="after">
|
||||||
<field name="date_range_fm_id"/>
|
<field name="date_range_fm_id" />
|
||||||
</field>
|
</field>
|
||||||
|
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.ui.view" id="account_move_line_tree_view">
|
<record model="ir.ui.view" id="account_move_line_tree_view">
|
||||||
<field name="name">account.move.line.tree (in account_move_line_fiscal_month)</field>
|
<field
|
||||||
|
name="name"
|
||||||
|
>account.move.line.tree (in account_move_line_fiscal_month)</field>
|
||||||
<field name="model">account.move.line</field>
|
<field name="model">account.move.line</field>
|
||||||
<field name="inherit_id" ref="account.view_move_line_tree"/>
|
<field name="inherit_id" ref="account.view_move_line_tree" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
<field name="date" position="after">
|
<field name="date" position="after">
|
||||||
<field name="date_range_fm_id"/>
|
<field name="date_range_fm_id" />
|
||||||
</field>
|
</field>
|
||||||
|
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
Loading…
Reference in New Issue
Block a user