mirror of
https://github.com/OCA/account-financial-tools.git
synced 2025-02-02 12:47:26 +02:00
[PRT] 8.0 API
This commit is contained in:
67
account_reset_chart/README.rst
Normal file
67
account_reset_chart/README.rst
Normal file
@@ -0,0 +1,67 @@
|
||||
.. 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 moves
|
||||
and journals. 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)
|
||||
|
||||
Caution! This process will destroy
|
||||
|
||||
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 +1 @@
|
||||
import model
|
||||
from . import models
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
##############################################################################
|
||||
#
|
||||
# Odoo, an open source suite of business apps
|
||||
# This module copyright (C) 2014 Therp BV (<http://therp.nl>).
|
||||
# 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
|
||||
@@ -20,39 +20,13 @@
|
||||
##############################################################################
|
||||
{
|
||||
"name": "Reset a chart of accounts",
|
||||
"summary": ("Delete the accounting setup from an otherwise reusable "
|
||||
"database"),
|
||||
"version": "1.0",
|
||||
"author": "Therp BV",
|
||||
"category": 'Partner',
|
||||
"description": """
|
||||
Removes the current chart of accounts, including moves and journals. 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.
|
||||
|
||||
No interface is provided. Please run through xmlrpc, for instance using
|
||||
erppeek:
|
||||
|
||||
|
||||
import erppeek
|
||||
|
||||
host = 'localhost'
|
||||
port = '8069'
|
||||
user_pw = 'admin'
|
||||
dbname = 'openerp'
|
||||
|
||||
client = erppeek.Client('http://%s:%s' % (host, port))
|
||||
client.login('admin', user_pw, dbname)
|
||||
wiz_id = client.create('account.reset.chart', {'company_id': 1})
|
||||
client.AccountResetChart.reset_chart([wiz_id])
|
||||
|
||||
|
||||
Use with caution, obviously.
|
||||
|
||||
Compatibility
|
||||
=============
|
||||
This module is compatible with Odoo 7.0.
|
||||
""",
|
||||
"author": "Therp BV,Odoo Community Association (OCA)",
|
||||
"category": 'Accounting & Finance',
|
||||
"depends": [
|
||||
'account',
|
||||
],
|
||||
'license': 'AGPL-3'
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
from . import account_reset_chart
|
||||
@@ -1,127 +0,0 @@
|
||||
from openerp.osv import orm, fields
|
||||
from openerp import netsvc
|
||||
import logging
|
||||
|
||||
|
||||
class ResetChart(orm.TransientModel):
|
||||
_name = 'account.reset.chart'
|
||||
_rec_name = 'company_id'
|
||||
_columns = {
|
||||
'company_id': fields.many2one(
|
||||
'res.company', required=True),
|
||||
}
|
||||
|
||||
def reset_chart(self, cr, uid, ids, context=None):
|
||||
logger = logging.getLogger('openerp.addons.account_reset_chart')
|
||||
wkf_service = netsvc.LocalService('workflow')
|
||||
wiz = self.browse(cr, uid, ids[0], context=context)
|
||||
company_id = wiz.company_id.id
|
||||
move_obj = self.pool['account.move']
|
||||
inv_obj = self.pool['account.invoice']
|
||||
inv_line_obj = self.pool['account.invoice.line']
|
||||
inv_tax_obj = self.pool['account.invoice.tax']
|
||||
|
||||
def unlink_from_company(model):
|
||||
logger.info('Unlinking all records of model %s', model)
|
||||
obj = self.pool.get(model)
|
||||
if not obj:
|
||||
logger.info('Model %s not found', model)
|
||||
return
|
||||
obj_ids = obj.search(
|
||||
cr, uid, [('company_id', '=', company_id)],
|
||||
context=context)
|
||||
obj.unlink(cr, uid, obj_ids)
|
||||
|
||||
payment_obj = self.pool.get('payment.order')
|
||||
if payment_obj:
|
||||
logger.info('Deleting payment orders.')
|
||||
cr.execute(
|
||||
"""
|
||||
DELETE FROM payment_line
|
||||
WHERE order_id IN (
|
||||
SELECT id FROM payment_order
|
||||
WHERE company_id = %s);
|
||||
""", (company_id,))
|
||||
cr.execute(
|
||||
"DELETE FROM payment_order WHERE company_id = %s;",
|
||||
(company_id,))
|
||||
|
||||
unlink_from_company('payment.mode')
|
||||
|
||||
unlink_from_company('account.banking.account.settings')
|
||||
unlink_from_company('res.partner.bank')
|
||||
|
||||
logger.info('Undoing reconciliations')
|
||||
rec_obj = self.pool['account.move.reconcile']
|
||||
rec_ids = rec_obj.search(
|
||||
cr, uid,
|
||||
[('line_id.move_id.company_id', '=', company_id)], context=context)
|
||||
rec_obj.unlink(cr, uid, rec_ids, context=context)
|
||||
|
||||
logger.info('Reset paid invoices\'s workflows')
|
||||
paid_inv_ids = tuple(inv_obj.search(
|
||||
cr, uid,
|
||||
[('company_id', '=', company_id), ('state', '=', 'paid')],
|
||||
context=context))
|
||||
if paid_inv_ids:
|
||||
cr.execute(
|
||||
"""
|
||||
UPDATE wkf_instance
|
||||
SET state = 'active'
|
||||
WHERE res_type = 'account_invoice'
|
||||
AND res_id IN %s""" % (paid_inv_ids,))
|
||||
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)
|
||||
""" % (paid_inv_ids,))
|
||||
for inv_id in paid_inv_ids:
|
||||
wkf_service.trg_validate(
|
||||
uid, 'account.invoice', inv_id, 'invoice_cancel', cr)
|
||||
|
||||
logger.info('Dismantling invoices')
|
||||
inv_ids = inv_obj.search(
|
||||
cr, uid,
|
||||
[('company_id', '=', company_id)],
|
||||
context=context)
|
||||
inv_line_ids = inv_line_obj.search(
|
||||
cr, uid, [('invoice_id', 'in', inv_ids)], context=context)
|
||||
inv_line_obj.unlink(cr, uid, inv_line_ids, context=context)
|
||||
inv_tax_ids = inv_tax_obj.search(
|
||||
cr, uid, [('invoice_id', 'in', inv_ids)], context=context)
|
||||
inv_tax_obj.unlink(cr, uid, inv_tax_ids, context=context)
|
||||
logger.info('Unlinking invoices')
|
||||
cr.execute(
|
||||
"""
|
||||
DELETE FROM account_invoice
|
||||
WHERE id IN %s""" % (tuple(inv_ids),))
|
||||
|
||||
logger.info('Unlinking moves')
|
||||
move_ids = move_obj.search(
|
||||
cr, uid, [('company_id', '=', company_id)],
|
||||
context=context)
|
||||
cr.execute(
|
||||
"""UPDATE account_move SET state = 'draft'
|
||||
WHERE id IN %s""" % (tuple(move_ids),))
|
||||
move_obj.unlink(cr, uid, move_ids, context=context)
|
||||
|
||||
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')
|
||||
cr.execute(
|
||||
"""
|
||||
DELETE FROM ir_property
|
||||
WHERE value_reference LIKE 'account.account,%%'
|
||||
AND company_id = %s""" % (company_id,))
|
||||
unlink_from_company('account.account')
|
||||
return True
|
||||
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
|
||||
136
account_reset_chart/models/res_company.py
Normal file
136
account_reset_chart/models/res_company.py
Normal file
@@ -0,0 +1,136 @@
|
||||
# -*- 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):
|
||||
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:
|
||||
self.env['payment.order']
|
||||
logger.info('Deleting 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('Undoing 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')
|
||||
|
||||
logger.info('Dismantling invoices')
|
||||
inv_ids = self.env['account.invoice'].search(
|
||||
[('company_id', '=', self.id)]).ids
|
||||
if inv_ids:
|
||||
self.env['account.invoice.line'].search(
|
||||
[('invoice_id', 'in', inv_ids)]).unlink()
|
||||
self.env['account.invoice.tax'].search(
|
||||
[('invoice_id', 'in', inv_ids)]).unlink()
|
||||
logger.info('Unlinking invoices')
|
||||
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
|
||||
Reference in New Issue
Block a user