diff --git a/account_move_batch_validate/__init__.py b/account_move_batch_validate/__init__.py new file mode 100644 index 000000000..df1a591bd --- /dev/null +++ b/account_move_batch_validate/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +############################################################################### +# # +# Author: Leonardo Pistone +# Copyright 2014 Camptocamp SA +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU Affero General Public License as # +# published by the Free Software Foundation, either version 3 of the # +# License, or (at your option) any later version. # +# # +# This program 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 for more details. # +# # +# You should have received a copy of the GNU Affero General Public License # +# along with this program. If not, see . # +# # +############################################################################### +"""Account Move Batch Validate.""" + +from . import account # noqa +from . import wizard # noqa diff --git a/account_move_batch_validate/__openerp__.py b/account_move_batch_validate/__openerp__.py index 56ef8cea6..14c18ad64 100644 --- a/account_move_batch_validate/__openerp__.py +++ b/account_move_batch_validate/__openerp__.py @@ -20,7 +20,7 @@ ############################################################################### { 'name': "Account Move Batch Validate", - 'version': '0.1', + 'version': '0.2', 'author': 'Camptocamp', 'maintainer': 'Camptocamp', 'category': 'Finance', @@ -73,6 +73,7 @@ 'test': [ 'test/batch_validate.yml', 'test/batch_validate_then_unmark.yml', + 'test/batch_validate_then_delete_move.yml', ], 'installable': False, 'images': [], diff --git a/account_move_batch_validate/account.py b/account_move_batch_validate/account.py index 12b9653f3..622cf9314 100644 --- a/account_move_batch_validate/account.py +++ b/account_move_batch_validate/account.py @@ -74,6 +74,12 @@ class account_move(orm.Model): # maybe not creating too many dictionaries will make us a bit faster values = {'post_job_uuid': None} + _logger.info( + u'{0} jobs for posting moves have been created.'.format( + len(move_ids) + ) + ) + for move_id in move_ids: job_uuid = validate_one_move.delay(session, name, move_id, eta=eta) @@ -140,9 +146,12 @@ class account_move(orm.Model): @job def validate_one_move(session, model_name, move_id): """Validate a move, and leave the job reference in place.""" - - session.pool['account.move'].button_validate( - session.cr, - session.uid, - [move_id] - ) + move_pool = session.pool['account.move'] + if move_pool.exists(session.cr, session.uid, [move_id]): + move_pool.button_validate( + session.cr, + session.uid, + [move_id] + ) + else: + return _(u'Nothing to do because the record has been deleted') diff --git a/account_move_batch_validate/account_view.xml b/account_move_batch_validate/account_view.xml new file mode 100644 index 000000000..1f5a60af9 --- /dev/null +++ b/account_move_batch_validate/account_view.xml @@ -0,0 +1,28 @@ + + + + + + view.move.to_post.tree + account.move + + + + + + + + + + view.move.to_post.form + account.move + + + + + + + + + + diff --git a/account_move_batch_validate/i18n/account_move_batch_validate.pot b/account_move_batch_validate/i18n/account_move_batch_validate.pot new file mode 100644 index 000000000..d979d1c72 --- /dev/null +++ b/account_move_batch_validate/i18n/account_move_batch_validate.pot @@ -0,0 +1,191 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_move_batch_validate +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-01-17 14:17+0000\n" +"PO-Revision-Date: 2014-01-17 14:17+0000\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_move_batch_validate +#: field:account.move,post_job_uuid:0 +msgid "UUID of the Job to approve this move" +msgstr "" + +#. module: account_move_batch_validate +#: help:account.move,to_post:0 +msgid "Check this box to mark the move for batch posting" +msgstr "" + +#. module: account_move_batch_validate +#: code:addons/account_move_batch_validate/account.py:95 +#, python-format +msgid "Task set to Done because the user unmarked the move" +msgstr "" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "Mark" +msgstr "" + +#. module: account_move_batch_validate +#: selection:account.move.marker,action:0 +msgid "Unmark for posting" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move,to_post:0 +msgid "To Post" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move.marker,company_id:0 +msgid "Company" +msgstr "Société" + +#. module: account_move_batch_validate +#: model:ir.actions.act_window,name:account_move_batch_validate.action_account_move_marker +#: model:ir.ui.menu,name:account_move_batch_validate.menu_account_move_marker +msgid "Mark Journal Items for Batch Posting" +msgstr "" + +#. module: account_move_batch_validate +#: selection:account.move.marker,filter:0 +msgid "Date" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move.marker,chart_account_id:0 +msgid "Chart of Account" +msgstr "" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +#: field:account.move.marker,journal_ids:0 +msgid "Journals" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move.marker,target_move:0 +msgid "Target Moves" +msgstr "" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "Report Options" +msgstr "" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +#: selection:account.move.marker,filter:0 +msgid "Periods" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move.marker,date_to:0 +msgid "End Date" +msgstr "" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "Dates" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move.marker,period_from:0 +msgid "Start Period" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move.marker,eta:0 +msgid "Seconds to wait before starting the jobs" +msgstr "" + +#. module: account_move_batch_validate +#: selection:account.move.marker,target_move:0 +msgid "All Posted Entries" +msgstr "" + +#. module: account_move_batch_validate +#: help:account.move.marker,fiscalyear_id:0 +msgid "Keep empty for all open fiscal year" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move.marker,period_to:0 +msgid "End Period" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move.marker,fiscalyear_id:0 +msgid "Fiscal Year" +msgstr "" + +#. module: account_move_batch_validate +#: selection:account.move.marker,filter:0 +msgid "No Filters" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move.marker,action:0 +msgid "Action" +msgstr "" + +#. module: account_move_batch_validate +#: model:ir.model,name:account_move_batch_validate.model_account_move +msgid "Account Entry" +msgstr "" + +#. module: account_move_batch_validate +#: selection:account.move.marker,action:0 +msgid "Mark for posting" +msgstr "" + +#. module: account_move_batch_validate +#: model:ir.model,name:account_move_batch_validate.model_account_move_marker +msgid "Mark Journal Items for batch posting" +msgstr "" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "Filters" +msgstr "" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "Cancel" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move.marker,date_from:0 +msgid "Start Date" +msgstr "" + +#. module: account_move_batch_validate +#: help:account.move.marker,chart_account_id:0 +msgid "Select Charts of Accounts" +msgstr "" + +#. module: account_move_batch_validate +#: field:account.move.marker,filter:0 +msgid "Filter by" +msgstr "" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "or" +msgstr "" + +#. module: account_move_batch_validate +#: selection:account.move.marker,target_move:0 +msgid "All Entries" +msgstr "" + diff --git a/account_move_batch_validate/i18n/fr.po b/account_move_batch_validate/i18n/fr.po new file mode 100644 index 000000000..31d4a7f67 --- /dev/null +++ b/account_move_batch_validate/i18n/fr.po @@ -0,0 +1,192 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_move_batch_validate +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-01-17 14:17+0000\n" +"PO-Revision-Date: 2014-02-24 05:21+0000\n" +"Last-Translator: Leonardo Pistone - camptocamp " +"\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2014-06-12 06:31+0000\n" +"X-Generator: Launchpad (build 17041)\n" + +#. module: account_move_batch_validate +#: field:account.move,post_job_uuid:0 +msgid "UUID of the Job to approve this move" +msgstr "UUID du Job pour approuver cette move" + +#. module: account_move_batch_validate +#: help:account.move,to_post:0 +msgid "Check this box to mark the move for batch posting" +msgstr "Check this box to mark the move for batch posting" + +#. module: account_move_batch_validate +#: code:addons/account_move_batch_validate/account.py:95 +#, python-format +msgid "Task set to Done because the user unmarked the move" +msgstr "" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "Mark" +msgstr "Mark" + +#. module: account_move_batch_validate +#: selection:account.move.marker,action:0 +msgid "Unmark for posting" +msgstr "Unmark for posting" + +#. module: account_move_batch_validate +#: field:account.move,to_post:0 +msgid "To Post" +msgstr "Validation demandée" + +#. module: account_move_batch_validate +#: field:account.move.marker,company_id:0 +msgid "Company" +msgstr "Société" + +#. module: account_move_batch_validate +#: model:ir.actions.act_window,name:account_move_batch_validate.action_account_move_marker +#: model:ir.ui.menu,name:account_move_batch_validate.menu_account_move_marker +msgid "Mark Journal Items for Batch Posting" +msgstr "" + +#. module: account_move_batch_validate +#: selection:account.move.marker,filter:0 +msgid "Date" +msgstr "Date" + +#. module: account_move_batch_validate +#: field:account.move.marker,chart_account_id:0 +msgid "Chart of Account" +msgstr "Plan Comptable" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +#: field:account.move.marker,journal_ids:0 +msgid "Journals" +msgstr "Journaux" + +#. module: account_move_batch_validate +#: field:account.move.marker,target_move:0 +msgid "Target Moves" +msgstr "Target Moves" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "Report Options" +msgstr "Report Options" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +#: selection:account.move.marker,filter:0 +msgid "Periods" +msgstr "Periods" + +#. module: account_move_batch_validate +#: field:account.move.marker,date_to:0 +msgid "End Date" +msgstr "End Date" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "Dates" +msgstr "Dates" + +#. module: account_move_batch_validate +#: field:account.move.marker,period_from:0 +msgid "Start Period" +msgstr "Période de debut" + +#. module: account_move_batch_validate +#: field:account.move.marker,eta:0 +msgid "Seconds to wait before starting the jobs" +msgstr "Seconds to wait before starting the jobs" + +#. module: account_move_batch_validate +#: selection:account.move.marker,target_move:0 +msgid "All Posted Entries" +msgstr "Toutes les écritures passées" + +#. module: account_move_batch_validate +#: help:account.move.marker,fiscalyear_id:0 +msgid "Keep empty for all open fiscal year" +msgstr "Keep empty for all open fiscal year" + +#. module: account_move_batch_validate +#: field:account.move.marker,period_to:0 +msgid "End Period" +msgstr "Période de fin" + +#. module: account_move_batch_validate +#: field:account.move.marker,fiscalyear_id:0 +msgid "Fiscal Year" +msgstr "Exercice" + +#. module: account_move_batch_validate +#: selection:account.move.marker,filter:0 +msgid "No Filters" +msgstr "Aucun filtre" + +#. module: account_move_batch_validate +#: field:account.move.marker,action:0 +msgid "Action" +msgstr "Action" + +#. module: account_move_batch_validate +#: model:ir.model,name:account_move_batch_validate.model_account_move +msgid "Account Entry" +msgstr "Pièce comptable" + +#. module: account_move_batch_validate +#: selection:account.move.marker,action:0 +msgid "Mark for posting" +msgstr "Sélectionner pour validation" + +#. module: account_move_batch_validate +#: model:ir.model,name:account_move_batch_validate.model_account_move_marker +msgid "Mark Journal Items for batch posting" +msgstr "Sélectionner Ecritures comptables à Valider en batch" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "Filters" +msgstr "Filtres" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "Cancel" +msgstr "Annuler" + +#. module: account_move_batch_validate +#: field:account.move.marker,date_from:0 +msgid "Start Date" +msgstr "Date de début" + +#. module: account_move_batch_validate +#: help:account.move.marker,chart_account_id:0 +msgid "Select Charts of Accounts" +msgstr "Sélectionner Plan Comptable" + +#. module: account_move_batch_validate +#: field:account.move.marker,filter:0 +msgid "Filter by" +msgstr "Filtrer par" + +#. module: account_move_batch_validate +#: view:account.move.marker:0 +msgid "or" +msgstr "ou" + +#. module: account_move_batch_validate +#: selection:account.move.marker,target_move:0 +msgid "All Entries" +msgstr "Toutes les écritures" diff --git a/account_move_batch_validate/test/batch_validate.yml b/account_move_batch_validate/test/batch_validate.yml new file mode 100644 index 000000000..e129914fa --- /dev/null +++ b/account_move_batch_validate/test/batch_validate.yml @@ -0,0 +1,49 @@ +- + I create a move +- + !record {model: account.move, id: move1}: + journal_id: account.sales_journal + line_id: + - name: Receivable line + account_id: account.a_recv + debit: 1000.0 + - name: Sales line + account_id: account.a_sale + credit: 1000.0 +- + I check that the move is still draft +- + !assert {model: account.move, id: move1}: + - state == 'draft' +- + I create a wizard +- + !record {model: account.move.marker, id: wiz_marker1}: + action: mark +- + I run the wizard +- + !python {model: account.move.marker}: | + context['automated_test_execute_now'] = True + self.button_mark( + cr, uid, [ref('wiz_marker1')], context=context + ) +- + I read the UUID from the move, I dequeue the job and run it +- + !python {model: account.move}: | + from openerp.addons.connector.queue.job import OpenERPJobStorage + from openerp.addons.connector.session import ConnectorSession + + move = self.browse(cr, uid, ref('move1'), context=context) + uuid = move.post_job_uuid + session = ConnectorSession(cr, uid, context=context) + storage = OpenERPJobStorage(session) + + myjob = storage.load(uuid) + myjob.perform(session) +- + I check that the move is now approved +- + !assert {model: account.move, id: move1}: + - state == 'posted' diff --git a/account_move_batch_validate/test/batch_validate_then_delete_move.yml b/account_move_batch_validate/test/batch_validate_then_delete_move.yml index be8389fd5..c7f1d7400 100644 --- a/account_move_batch_validate/test/batch_validate_then_delete_move.yml +++ b/account_move_batch_validate/test/batch_validate_then_delete_move.yml @@ -25,6 +25,7 @@ I run the wizard - !python {model: account.move.marker}: | + context['automated_test_execute_now'] = True self.button_mark( cr, uid, [ref('wiz_marker4')], context=context ) diff --git a/account_move_batch_validate/test/batch_validate_then_unmark.yml b/account_move_batch_validate/test/batch_validate_then_unmark.yml new file mode 100644 index 000000000..adf395107 --- /dev/null +++ b/account_move_batch_validate/test/batch_validate_then_unmark.yml @@ -0,0 +1,63 @@ +- + I create a move +- + !record {model: account.move, id: move2}: + journal_id: account.sales_journal + line_id: + - name: Receivable line + account_id: account.a_recv + debit: 2000.0 + - name: Sales line + account_id: account.a_sale + credit: 2000.0 +- + I check that the move is still draft +- + !assert {model: account.move, id: move2}: + - state == 'draft' +- + I create a wizard with a long ETA +- + !record {model: account.move.marker, id: wiz_marker2}: + action: mark + eta: 10000 +- + I run the wizard +- + !python {model: account.move.marker}: | + context['automated_test_execute_now'] = True + self.button_mark( + cr, uid, [ref('wiz_marker2')], context=context + ) +- + Now I change my mind and I create a wizard to unmark the moves +- + !record {model: account.move.marker, id: wiz_unmarker3}: + action: unmark +- + I run the wizard +- + !python {model: account.move.marker}: | + self.button_mark( + cr, uid, [ref('wiz_unmarker3')], context=context + ) +- + Now I checked that my job is done, and the move is still draft +- + !python {model: account.move}: | + from openerp.addons.connector.queue.job import OpenERPJobStorage + from openerp.addons.connector.session import ConnectorSession + + session = ConnectorSession(cr, uid, context=context) + storage = OpenERPJobStorage(session) + + move = self.browse(cr, uid, ref('move2'), context=context) + myjob = storage.load(move.post_job_uuid) + assert myjob.state == 'done', 'Job is in state {0}, should be done'.format( + myjob.state + ) +- + I check that the move is still draft +- + !assert {model: account.move, id: move2}: + - state == 'draft' diff --git a/account_move_batch_validate/wizard/__init__.py b/account_move_batch_validate/wizard/__init__.py new file mode 100644 index 000000000..f13b63cb0 --- /dev/null +++ b/account_move_batch_validate/wizard/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################### +# # +# Author: Leonardo Pistone +# Copyright 2014 Camptocamp SA +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU Affero General Public License as # +# published by the Free Software Foundation, either version 3 of the # +# License, or (at your option) any later version. # +# # +# This program 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 for more details. # +# # +# You should have received a copy of the GNU Affero General Public License # +# along with this program. If not, see . # +# # +############################################################################### +"""Wizard to mark account moves for batch posting.""" +from . import move_marker # noqa diff --git a/account_move_batch_validate/wizard/move_marker.py b/account_move_batch_validate/wizard/move_marker.py new file mode 100644 index 000000000..c018bf190 --- /dev/null +++ b/account_move_batch_validate/wizard/move_marker.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +############################################################################### +# # +# Author: Leonardo Pistone +# Copyright 2014 Camptocamp SA +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU Affero General Public License as # +# published by the Free Software Foundation, either version 3 of the # +# License, or (at your option) any later version. # +# # +# This program 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 for more details. # +# # +# You should have received a copy of the GNU Affero General Public License # +# along with this program. If not, see . # +# # +############################################################################### +"""Wizards for batch posting.""" + +from openerp.osv import fields, orm +from openerp.addons.connector.session import ConnectorSession +from openerp.addons.connector.queue.job import job + + +class AccountMoveMarker(orm.TransientModel): + + """Wizard to mark account moves for batch posting.""" + + _name = "account.move.marker" + _inherit = "account.common.report" + _description = "Mark Journal Items for batch posting" + + _columns = { + 'action': fields.selection([ + ('mark', 'Mark for posting'), + ('unmark', 'Unmark for posting'), + ], "Action", required=True), + 'eta': fields.integer('Seconds to wait before starting the jobs') + } + + _defaults = { + 'action': 'mark', + } + + def button_mark(self, cr, uid, ids, context=None): + """Create a single job that will create one job per move. + + Return action. + + """ + session = ConnectorSession(cr, uid, context=context) + for wizard_id in ids: + # to find out what _classic_write does, read the documentation. + wizard_data = self.read(cr, uid, wizard_id, context=context, + load='_classic_write') + wizard_data.pop('id') + + if context.get('automated_test_execute_now'): + process_wizard(session, self._name, wizard_data) + else: + process_wizard.delay(session, self._name, wizard_data) + + return {'type': 'ir.actions.act_window_close'} + + def process_wizard(self, cr, uid, ids, context=None): + """Choose the correct list of moves to mark and then validate.""" + for wiz in self.browse(cr, uid, ids, context=context): + + move_obj = self.pool['account.move'] + + domain = [('state', '=', 'draft')] + + if wiz.filter == 'filter_period': + period_pool = self.pool['account.period'] + period_ids = period_pool.search(cr, uid, [ + ('date_start', '>=', wiz.period_from.date_start), + ('date_stop', '<=', wiz.period_to.date_stop), + ], context=context) + + domain.append(( + 'period_id', + 'in', + period_ids + )) + elif wiz.filter == 'filter_date': + domain += [ + ('date', '>=', wiz.date_from), + ('date', '<=', wiz.date_to), + ] + + if wiz.journal_ids: + domain.append(( + 'journal_id', + 'in', + [journal.id for journal in wiz.journal_ids] + )) + + move_ids = move_obj.search(cr, uid, domain, context=context) + + if wiz.action == 'mark': + move_obj.mark_for_posting(cr, uid, move_ids, eta=wiz.eta, + context=context) + + elif wiz.action == 'unmark': + move_obj.unmark_for_posting(cr, uid, move_ids, context=context) + + +@job +def process_wizard(session, model_name, wizard_data): + """Create jobs to validate Journal Entries.""" + + wiz_obj = session.pool[model_name] + new_wiz_id = wiz_obj.create( + session.cr, + session.uid, + wizard_data, + session.context + ) + + wiz_obj.process_wizard( + session.cr, + session.uid, + ids=[new_wiz_id], + context=session.context, + ) diff --git a/account_move_batch_validate/wizard/move_marker_view.xml b/account_move_batch_validate/wizard/move_marker_view.xml new file mode 100644 index 000000000..3f1b0ab51 --- /dev/null +++ b/account_move_batch_validate/wizard/move_marker_view.xml @@ -0,0 +1,60 @@ + + + + + + Mark Jornal Items for Batch Posting + account.move.marker + +
+
+
+ + + Mark Jornal Items for Batch Posting + ir.actions.act_window + account.move.marker + form + form + new + + + + + Mark Journal Items for Batch Posting + + + +
+