Merge pull request #185 from StefanRijnhart/8.0-add-account_reset_chart_therp

[8.0] add account_reset_chart
This commit is contained in:
Pedro M. Baeza
2015-04-13 12:51:06 +02:00
6 changed files with 251 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:alt: License
Account chart reset
===================
Adds a method to the company to remove its chart of accounts, including all
related transactions, journals etc. By necessity, this process also removes
the company's bank accounts as they are linked to the company's journals and
the company's payment orders and payment modes if the payment module is
installed.
As a result, you can then reconfigure the company chart of account with the
same or a different chart template.
Usage
=====
To prevent major disasters when this module is installed, no interface is
provided. Please run through xmlrpc, for instance using erppeek: ::
import erppeek
host = 'localhost'
port = '8069'
admin_pw = 'admin'
dbname = 'openerp'
client = erppeek.Client('http://%s:%s' % (host, port))
client.login('admin', admin_pw, dbname)
client.execute('res.company', 'reset_chart', 1)
Known issues / Roadmap
======================
This should work with the standard accounting modules installed. All sorts of
combinations with third party modules are imaginable that would require
modifications or extensions of the current implementation.
Sequences are not reset during the process.
Credits
=======
Contributors
------------
* Stefan Rijnhart <stefan@therp.nl>
Icon courtesy of Alan Klim (CC-BY-20) -
https://www.flickr.com/photos/igraph/6469812927/
Maintainer
----------
.. image:: http://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: http://odoo-community.org
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
To contribute to this module, please visit http://odoo-community.org.

View File

@@ -0,0 +1 @@
from . import models

View File

@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Odoo, an open source suite of business apps
# This module copyright (C) 2014-2015 Therp BV (<http://therp.nl>).
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
{
"name": "Reset a chart of accounts",
"summary": ("Delete the accounting setup from an otherwise reusable "
"database"),
"version": "1.0",
"author": "Therp BV,Odoo Community Association (OCA)",
"category": 'Accounting & Finance',
"depends": [
'account',
],
'license': 'AGPL-3'
}

View File

@@ -0,0 +1 @@
from . import res_company

View File

@@ -0,0 +1,151 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Odoo, an open source suite of business apps
# This module copyright (C) 2014-2015 Therp BV (<http://therp.nl>).
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import api, models
import logging
class Company(models.Model):
_inherit = 'res.company'
@api.one
def reset_chart(self):
"""
This method removes the chart of account on the company record,
including all the related financial transactions.
"""
logger = logging.getLogger('openerp.addons.account_reset_chart')
def unlink_from_company(model):
logger.info('Unlinking all records of model %s for company %s',
model, self.name)
try:
obj = self.env[model]
except KeyError:
logger.info('Model %s not found', model)
return
records = obj.search([('company_id', '=', self.id)])
if records: # account_account.unlink() breaks on empty id list
records.unlink()
self.env['account.journal'].search(
[('company_id', '=', self.id)]).write({'update_posted': True})
statements = self.env['account.bank.statement'].search(
[('company_id', '=', self.id)])
statements.button_cancel()
statements.unlink()
try:
voucher_obj = self.env['account.voucher']
logger.info('Unlinking vouchers.')
vouchers = voucher_obj.search(
[('company_id', '=', self.id),
('state', 'in', ('proforma', 'posted'))])
vouchers.cancel_voucher()
voucher_obj.search(
[('company_id', '=', self.id)]).unlink()
except KeyError:
pass
try:
if self.env['payment.order']:
logger.info('Unlinking payment orders.')
self._cr.execute(
"""
DELETE FROM payment_line
WHERE order_id IN (
SELECT id FROM payment_order
WHERE company_id = %s);
""", (self.id,))
self._cr.execute(
"DELETE FROM payment_order WHERE company_id = %s;",
(self.id,))
unlink_from_company('payment.mode')
except KeyError:
pass
unlink_from_company('account.banking.account.settings')
unlink_from_company('res.partner.bank')
logger.info('Unlinking reconciliations')
rec_obj = self.env['account.move.reconcile']
rec_obj.search(
[('line_id.company_id', '=', self.id)]).unlink()
logger.info('Reset paid invoices\'s workflows')
paid_invoices = self.env['account.invoice'].search(
[('company_id', '=', self.id), ('state', '=', 'paid')])
if paid_invoices:
self._cr.execute(
"""
UPDATE wkf_instance
SET state = 'active'
WHERE res_type = 'account_invoice'
AND res_id IN %s""", (tuple(paid_invoices.ids),))
self._cr.execute(
"""
UPDATE wkf_workitem
SET act_id = (
SELECT res_id FROM ir_model_data
WHERE module = 'account'
AND name = 'act_open')
WHERE inst_id IN (
SELECT id FROM wkf_instance
WHERE res_type = 'account_invoice'
AND res_id IN %s)
""", (tuple(paid_invoices.ids),))
paid_invoices.signal_workflow('invoice_cancel')
inv_ids = self.env['account.invoice'].search(
[('company_id', '=', self.id)]).ids
if inv_ids:
logger.info('Unlinking invoices')
self.env['account.invoice.line'].search(
[('invoice_id', 'in', inv_ids)]).unlink()
self.env['account.invoice.tax'].search(
[('invoice_id', 'in', inv_ids)]).unlink()
self._cr.execute(
"""
DELETE FROM account_invoice
WHERE id IN %s""", (tuple(inv_ids),))
logger.info('Unlinking moves')
moves = self.env['account.move'].search([('company_id', '=', self.id)])
if moves:
self._cr.execute(
"""UPDATE account_move SET state = 'draft'
WHERE id IN %s""", (tuple(moves.ids),))
moves.unlink()
unlink_from_company('account.fiscal.position')
unlink_from_company('account.tax')
unlink_from_company('account.tax.code')
unlink_from_company('account.journal')
logger.info('Unlink properties with account as values')
self._cr.execute(
"""
DELETE FROM ir_property
WHERE value_reference LIKE 'account.account,%%'
AND company_id = %s""", (self.id,))
unlink_from_company('account.account')
return True

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB