From 4811ffdd7d7623c693a87de6202778216e9ecff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Wed, 5 Nov 2014 18:52:46 +0100 Subject: [PATCH] [ADD] account_auto_fy_sequence --- account_auto_fy_sequence/__init__.py | 26 +++++++ account_auto_fy_sequence/__openerp__.py | 53 +++++++++++++ account_auto_fy_sequence/i18n/fr.po | 3 + account_auto_fy_sequence/models/__init__.py | 26 +++++++ .../models/ir_sequence.py | 77 +++++++++++++++++++ account_auto_fy_sequence/tests/__init__.py | 30 ++++++++ .../tests/test_auto_fy_sequence.py | 69 +++++++++++++++++ 7 files changed, 284 insertions(+) create mode 100644 account_auto_fy_sequence/__init__.py create mode 100644 account_auto_fy_sequence/__openerp__.py create mode 100644 account_auto_fy_sequence/i18n/fr.po create mode 100644 account_auto_fy_sequence/models/__init__.py create mode 100644 account_auto_fy_sequence/models/ir_sequence.py create mode 100644 account_auto_fy_sequence/tests/__init__.py create mode 100644 account_auto_fy_sequence/tests/test_auto_fy_sequence.py diff --git a/account_auto_fy_sequence/__init__.py b/account_auto_fy_sequence/__init__.py new file mode 100644 index 000000000..1bc695ede --- /dev/null +++ b/account_auto_fy_sequence/__init__.py @@ -0,0 +1,26 @@ +# coding=utf-8 +############################################################################## +# +# account_auto_fy_sequence module for Odoo +# Copyright (C) 2014 ACSONE SA/NV () +# @author Stéphane Bidoul +# +# account_auto_fy_sequence is free software: +# you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License v3 or later +# as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# account_auto_fy_sequence is distributed +# in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License v3 or later for more details. +# +# You should have received a copy of the GNU Affero General Public License +# v3 or later along with this program. +# If not, see . +# +############################################################################## + +from . import models diff --git a/account_auto_fy_sequence/__openerp__.py b/account_auto_fy_sequence/__openerp__.py new file mode 100644 index 000000000..407328866 --- /dev/null +++ b/account_auto_fy_sequence/__openerp__.py @@ -0,0 +1,53 @@ +# coding=utf-8 +############################################################################## +# +# account_auto_fy_sequence module for Odoo +# Copyright (C) 2014 ACSONE SA/NV () +# @author Stéphane Bidoul +# +# account_auto_fy_sequence is free software: +# you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License v3 or later +# as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# account_auto_fy_sequence is distributed +# in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License v3 or later for more details. +# +# You should have received a copy of the GNU Affero General Public License +# v3 or later along with this program. +# If not, see . +# +############################################################################## +{ + 'name': 'Automatic Fiscal Year Sequences', + 'version': '0.1', + 'category': 'Accounting', + 'description': """ + Automatic creation of fiscal year sequences. + + This modules adds the possibility to use the %(fy)s placeholder + in sequences. %(fy)s is replaced by the fiscal year code when + using the sequence. + + The first time the sequence is used for a given fiscal year, + a specific fiscal year sequence starting at 1 is created automatically. + + /!\ If you change %(year)s to %(fy)s on a sequence that has + already been used for the current fiscal year, make sure to manually + create the fiscal year sequence for the current fiscal year and + initialize it's next number to the correct value. + """, + 'author': 'ACSONE SA/NV', + 'website': 'http://acsone.eu', + 'depends': ['account'], + 'data': [ + ], + 'installable': True, + 'application': False, + 'auto_install': False, + 'license': 'AGPL-3', +} diff --git a/account_auto_fy_sequence/i18n/fr.po b/account_auto_fy_sequence/i18n/fr.po new file mode 100644 index 000000000..1588630fd --- /dev/null +++ b/account_auto_fy_sequence/i18n/fr.po @@ -0,0 +1,3 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_auto_fy_sequence diff --git a/account_auto_fy_sequence/models/__init__.py b/account_auto_fy_sequence/models/__init__.py new file mode 100644 index 000000000..8833fa6e1 --- /dev/null +++ b/account_auto_fy_sequence/models/__init__.py @@ -0,0 +1,26 @@ +# coding=utf-8 +############################################################################## +# +# account_auto_fy_sequence module for Odoo +# Copyright (C) 2014 ACSONE SA/NV () +# @author Stéphane Bidoul +# +# account_auto_fy_sequence is free software: +# you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License v3 or later +# as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# account_auto_fy_sequence is distributed +# in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License v3 or later for more details. +# +# You should have received a copy of the GNU Affero General Public License +# v3 or later along with this program. +# If not, see . +# +############################################################################## + +from . import ir_sequence diff --git a/account_auto_fy_sequence/models/ir_sequence.py b/account_auto_fy_sequence/models/ir_sequence.py new file mode 100644 index 000000000..60a06f892 --- /dev/null +++ b/account_auto_fy_sequence/models/ir_sequence.py @@ -0,0 +1,77 @@ +# coding=utf-8 +############################################################################## +# +# account_auto_fy_sequence module for Odoo +# Copyright (C) 2014 ACSONE SA/NV () +# @author Stéphane Bidoul +# +# account_auto_fy_sequence is free software: +# you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License v3 or later +# as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# account_auto_fy_sequence is distributed +# in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License v3 or later for more details. +# +# You should have received a copy of the GNU Affero General Public License +# v3 or later along with this program. +# If not, see . +# +############################################################################## + +from openerp.osv import orm +from openerp.tools.translate import _ + +FY_SLOT = '%(fy)s' + + +class Sequence(orm.Model): + _inherit = 'ir.sequence' + + def _next(self, cr, uid, seq_ids, context=None): + if context is None: + context = {} + assert len(seq_ids) == 1 + seq = self.browse(cr, uid, seq_ids[0], context) + if (seq.prefix and FY_SLOT in seq.prefix) or \ + (seq.suffix and FY_SLOT in seq.suffix): + fiscalyear_id = context.get('fiscalyear_id') + if not fiscalyear_id: + raise orm.except_orm(_('Error!'), + _('The system tried to access ' + 'a fiscal year sequence ' + 'without specifying the actual ' + 'fiscal year.')) + for line in seq.fiscal_ids: + if line.fiscalyear_id.id == fiscalyear_id: + return super(Sequence, self)\ + ._next(cr, uid, [line.sequence_id.id], context) + # no fiscal year sequence found, auto create it + fiscalyear = self.pool['account.fiscalyear']\ + .browse(cr, uid, fiscalyear_id, context=context) + fy_seq_id = self.create(cr, uid, { + 'name': seq.name + ' - ' + fiscalyear.code, + 'code': seq.code, + 'implementation': seq.implementation, + 'prefix': (seq.prefix and + seq.prefix.replace(FY_SLOT, fiscalyear.code)), + 'suffix': (seq.suffix and + seq.suffix.replace(FY_SLOT, fiscalyear.code)), + 'number_next': 1, + 'number_increment': seq.number_increment, + 'padding': seq.padding, + 'company_id': seq.company_id.id, + }, context=context) + self.pool['account.sequence.fiscalyear']\ + .create(cr, uid, { + 'sequence_id': fy_seq_id, + 'sequence_main_id': seq.id, + 'fiscalyear_id': fiscalyear_id, + }, context=context) + return super(Sequence, self)\ + ._next(cr, uid, [fy_seq_id], context) + return super(Sequence, self)._next(cr, uid, seq_ids, context) diff --git a/account_auto_fy_sequence/tests/__init__.py b/account_auto_fy_sequence/tests/__init__.py new file mode 100644 index 000000000..a31764f72 --- /dev/null +++ b/account_auto_fy_sequence/tests/__init__.py @@ -0,0 +1,30 @@ +# coding=utf-8 +############################################################################## +# +# account_auto_fy_sequence module for Odoo +# Copyright (C) 2014 ACSONE SA/NV () +# @author Stéphane Bidoul +# +# account_auto_fy_sequence is free software: +# you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License v3 or later +# as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# account_auto_fy_sequence is distributed +# in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License v3 or later for more details. +# +# You should have received a copy of the GNU Affero General Public License +# v3 or later along with this program. +# If not, see . +# +############################################################################## + +from . import test_auto_fy_sequence + +checks = [ + test_auto_fy_sequence, +] diff --git a/account_auto_fy_sequence/tests/test_auto_fy_sequence.py b/account_auto_fy_sequence/tests/test_auto_fy_sequence.py new file mode 100644 index 000000000..235822ca7 --- /dev/null +++ b/account_auto_fy_sequence/tests/test_auto_fy_sequence.py @@ -0,0 +1,69 @@ +# coding=utf-8 +############################################################################## +# +# account_auto_fy_sequence module for Odoo +# Copyright (C) 2014 ACSONE SA/NV () +# @author Stéphane Bidoul +# +# account_auto_fy_sequence is free software: +# you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License v3 or later +# as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# account_auto_fy_sequence is distributed +# in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License v3 or later for more details. +# +# You should have received a copy of the GNU Affero General Public License +# v3 or later along with this program. +# If not, see . +# +############################################################################## + +import time + +import openerp.tests.common as common +from openerp.osv import orm + + +class TestAutoFYSequence(common.TransactionCase): + + def setUp(self): + super(TestAutoFYSequence, self).setUp() + self.seq_obj = self.registry('ir.sequence') + + def _create_seq(self, prefix): + seq_id = self.seq_obj.create(self.cr, self.uid, { + 'name': 'test sequence', + 'implementation': 'no_gap', + 'prefix': prefix, + }) + return seq_id + + def test_0(self): + """ normal sequence """ + seq_id = self._create_seq('SEQ/%(year)s/') + n = self.seq_obj._next(self.cr, self.uid, [seq_id]) + self.assertEqual(n, "SEQ/%s/1" % time.strftime("%Y")) + + def test_1(self): + """ invoke fiscal year sequence + without specifying the fiscal year """ + seq_id = self._create_seq('SEQ/%(fy)s/') + with self.assertRaises(orm.except_orm): + self.seq_obj._next(self.cr, self.uid, [seq_id]) + + def test_2(self): + """ invoke fiscal year sequence """ + fiscalyear_id = self.ref('account.data_fiscalyear') + context = {'fiscalyear_id': fiscalyear_id} + fiscalyear = self.registry('account.fiscalyear')\ + .browse(self.cr, self.uid, fiscalyear_id) + seq_id = self._create_seq('SEQ/%(fy)s/') + n = self.seq_obj._next(self.cr, self.uid, [seq_id], context) + self.assertEqual(n, "SEQ/%s/1" % fiscalyear.code) + n = self.seq_obj._next(self.cr, self.uid, [seq_id], context) + self.assertEqual(n, "SEQ/%s/2" % fiscalyear.code)