mirror of
https://github.com/OCA/account-financial-tools.git
synced 2025-02-02 12:47:26 +02:00
Merge pull request #185 from StefanRijnhart/8.0-add-account_reset_chart_therp
[8.0] add account_reset_chart
This commit is contained in:
66
account_reset_chart/README.rst
Normal file
66
account_reset_chart/README.rst
Normal 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.
|
||||
1
account_reset_chart/__init__.py
Normal file
1
account_reset_chart/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import models
|
||||
32
account_reset_chart/__openerp__.py
Normal file
32
account_reset_chart/__openerp__.py
Normal 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'
|
||||
}
|
||||
1
account_reset_chart/models/__init__.py
Normal file
1
account_reset_chart/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import res_company
|
||||
151
account_reset_chart/models/res_company.py
Normal file
151
account_reset_chart/models/res_company.py
Normal 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
|
||||
BIN
account_reset_chart/static/description/icon.png
Normal file
BIN
account_reset_chart/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
Reference in New Issue
Block a user