Browse Source

Merge pull request #120 from Tecnativa/9.0-new-account_bank_statement_import_move_line

[9.0][NEW] account_bank _statement_import_move_line
pull/98/merge
Pedro M. Baeza 7 years ago
committed by GitHub
parent
commit
518545d45d
  1. 65
      account_bank_statement_import_move_line/README.rst
  2. 5
      account_bank_statement_import_move_line/__init__.py
  3. 22
      account_bank_statement_import_move_line/__openerp__.py
  4. 180
      account_bank_statement_import_move_line/i18n/es.po
  5. 4
      account_bank_statement_import_move_line/models/__init__.py
  6. 37
      account_bank_statement_import_move_line/models/account_move_line.py
  7. BIN
      account_bank_statement_import_move_line/static/description/icon.png
  8. 4
      account_bank_statement_import_move_line/tests/__init__.py
  9. 74
      account_bank_statement_import_move_line/tests/test_account_bank_statement_import_move_line.py
  10. 19
      account_bank_statement_import_move_line/views/account_bank_statement_view.xml
  11. 4
      account_bank_statement_import_move_line/wizards/__init__.py
  12. 119
      account_bank_statement_import_move_line/wizards/account_statement_line_create.py
  13. 63
      account_bank_statement_import_move_line/wizards/account_statement_line_create_view.xml

65
account_bank_statement_import_move_line/README.rst

@ -0,0 +1,65 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
=======================================
Account Bank Statement Import Move Line
=======================================
This module adds a button to bank statement form view to open a wizard to allow
filtering, selecting and importing lines form journal items into the bank
statement.
Usage
=====
#. Go to Invoicing > Dashboard.
#. Create a new bank statement from a bank journal.
#. Click button "Import Journal Items".
#. Select filtering options.
#. Click on button "Add All Move Lines" to auto-select the move lines matching
the selected criteria or click on Add an item to manually select the move
lines filtered by the criteria.
#. Click on button "Create Statement Lines".
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/174/9.0
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/bank-statement-import/issues>`_. In case of trouble,
please
check there if your issue has already been reported. If you spotted it first,
help us smash it by providing detailed and welcomed feedback.
Credits
=======
Images
------
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
Contributors
------------
* Luis M. Ontalba luis.martinez@tecnativa.com>
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://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 https://odoo-community.org.

5
account_bank_statement_import_move_line/__init__.py

@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from . import models
from . import wizards

22
account_bank_statement_import_move_line/__openerp__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Luis M. Ontalba
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
{
'name': 'Bank statement import move lines',
'version': '9.0.1.0.0',
'category': 'Accounting',
'author': 'Tecnativa, '
'Odoo Community Association (OCA)',
'website': 'https://www.tecnativa.com',
'depends': [
'account',
],
'data': [
'wizards/account_statement_line_create_view.xml',
'views/account_bank_statement_view.xml',
],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
}

180
account_bank_statement_import_move_line/i18n/es.po

@ -0,0 +1,180 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_bank_statement_import_move_line
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-30 09:48+0000\n"
"PO-Revision-Date: 2017-07-30 09:48+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_bank_statement_import_move_line
#: model:ir.ui.view,arch_db:account_bank_statement_import_move_line.account_statement_line_create_view_form
msgid "Add All Move Lines"
msgstr "Añadir todas las líneas"
#. module: account_bank_statement_import_move_line
#: selection:account.statement.line.create,target_move:0
msgid "All Entries"
msgstr "Todos los asientos"
#. module: account_bank_statement_import_move_line
#: selection:account.statement.line.create,target_move:0
msgid "All Posted Entries"
msgstr "Todos los asientos confirmados"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_allow_blocked
msgid "Allow Litigation Move Lines"
msgstr "Permitir apuntes en litígio"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_statement_id
msgid "Bank Statement"
msgstr "Extracto bancario"
#. module: account_bank_statement_import_move_line
#: model:ir.ui.view,arch_db:account_bank_statement_import_move_line.account_statement_line_create_view_form
msgid "Cancel"
msgstr "Cancelar"
#. module: account_bank_statement_import_move_line
#: model:ir.ui.view,arch_db:account_bank_statement_import_move_line.account_statement_line_create_view_form
msgid "Choose Move Lines Filter Options"
msgstr "Elegir opciones de filtro de apuntes"
#. module: account_bank_statement_import_move_line
#: model:ir.ui.view,arch_db:account_bank_statement_import_move_line.account_statement_line_create_view_form
msgid "Click on Add All Move Lines to auto-select the move lines matching the above criteria or click on Add an item to manually select the move lines filtered by the above criteria."
msgstr "Clic en Añadir todas las líneas para seleccionar automáticamente las líneas de movimiento que coinciden con los criterios anteriores o clic en Agregar un elemento para seleccionar manualmente las líneas de movimiento filtradas por los criterios anteriores."
#. module: account_bank_statement_import_move_line
#: model:ir.actions.act_window,name:account_bank_statement_import_move_line.account_statement_line_create_action
msgid "Create Lines from Move Lines"
msgstr "Crear Líneas desde apuntes"
#. module: account_bank_statement_import_move_line
#: model:ir.ui.view,arch_db:account_bank_statement_import_move_line.account_statement_line_create_view_form
msgid "Create Statement Lines"
msgstr "Crear líneas del extracto"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_create_uid
msgid "Created by"
msgstr "Creado por"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_create_date
msgid "Created on"
msgstr "Creado en"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_display_name
msgid "Display Name"
msgstr "Nombre mostrado"
#. module: account_bank_statement_import_move_line
#: selection:account.statement.line.create,date_type:0
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_due_date
msgid "Due Date"
msgstr "Fecha vencimiento"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_id
msgid "ID"
msgstr "ID (identificación)"
#. module: account_bank_statement_import_move_line
#: model:ir.ui.view,arch_db:account_bank_statement_import_move_line.view_bank_statement_form
msgid "Import Journal Items"
msgstr "Importar apuntes contables"
#. module: account_bank_statement_import_move_line
#: model:ir.model,name:account_bank_statement_import_move_line.model_account_move_line
msgid "Journal Item"
msgstr "Apunte contable"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_journal_ids
msgid "Journals Filter"
msgstr "Filtro de diarios"
#. module: account_bank_statement_import_move_line
#: model:ir.ui.view,arch_db:account_bank_statement_import_move_line.account_statement_line_create_view_form
msgid "Keep empty for using all journals"
msgstr "Dejar vacío para seleccionar todos los diarios"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create___last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_write_uid
msgid "Last Updated by"
msgstr "Última actualización de"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_write_date
msgid "Last Updated on"
msgstr "Última actualización en"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_invoice
msgid "Linked to an Invoice or Refund"
msgstr "Vinculado a factura o devolución"
#. module: account_bank_statement_import_move_line
#: selection:account.statement.line.create,date_type:0
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_move_date
msgid "Move Date"
msgstr "Fecha del apunte"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_move_line_ids
msgid "Move Lines"
msgstr "Apuntes contables"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_partner_id
msgid "Partner Related"
msgstr "Empresa relacionada"
#. module: account_bank_statement_import_move_line
#: code:addons/account_bank_statement_import_move_line/wizards/account_statement_line_create.py:93
#, python-format
msgid "Select Move Lines to Create Statement"
msgstr "Seleccionar apuntes para crear extracto"
#. module: account_bank_statement_import_move_line
#: model:ir.ui.view,arch_db:account_bank_statement_import_move_line.account_statement_line_create_view_form
msgid "Selected Move Lines to Create Lines"
msgstr "Apuntes seleccionados para crear líneas"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_target_move
msgid "Target Moves"
msgstr "Movimientos destino"
#. module: account_bank_statement_import_move_line
#: model:ir.ui.view,arch_db:account_bank_statement_import_move_line.account_statement_line_create_view_form
msgid "Total Residual"
msgstr "Total Residual"
#. module: account_bank_statement_import_move_line
#: model:ir.model.fields,field_description:account_bank_statement_import_move_line.field_account_statement_line_create_date_type
msgid "Type of Date Filter"
msgstr "Tipo de filtro por fecha"
#. module: account_bank_statement_import_move_line
#: model:ir.model,name:account_bank_statement_import_move_line.model_account_statement_line_create
msgid "Wizard to create statement lines"
msgstr "Asistente para crear líneas de extracto"

4
account_bank_statement_import_move_line/models/__init__.py

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from . import account_move_line

37
account_bank_statement_import_move_line/models/account_move_line.py

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Luis M. Ontalba
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from openerp import api, models
class AccountMoveLine(models.Model):
_inherit = 'account.move.line'
@api.multi
def _prepare_statement_line_vals(self, statement):
self.ensure_one()
assert statement, 'Missing statement'
amount = 0.0
if self.debit > 0:
amount = self.debit
elif self.credit > 0:
amount = -self.credit
vals = {
'name': self.name or '?',
'amount': amount,
'partner_id': self.partner_id.id,
'statement_id': statement.id,
'ref': self.ref,
'date': self.date_maturity,
'amount_currency': self.amount_currency,
'currency_id': self.currency_id.id,
}
return vals
@api.multi
def create_statement_line_from_move_line(self, statement):
abslo = self.env['account.bank.statement.line']
for mline in self:
abslo.create(mline._prepare_statement_line_vals(statement))
return

BIN
account_bank_statement_import_move_line/static/description/icon.png

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

4
account_bank_statement_import_move_line/tests/__init__.py

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0
from . import test_account_bank_statement_import_move_line

74
account_bank_statement_import_move_line/tests/test_account_bank_statement_import_move_line.py

@ -0,0 +1,74 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Luis M. Ontalba
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0
from openerp.tests import common
from openerp import fields
class TestAccountBankStatementImportMoveLine(common.SavepointCase):
@classmethod
def setUpClass(cls):
super(TestAccountBankStatementImportMoveLine, cls).setUpClass()
cls.account_type = cls.env['account.account.type'].create({
'name': 'Test Account Type'})
cls.a_receivable = cls.env['account.account'].create({
'code': 'TAA',
'name': 'Test Receivable Account',
'internal_type': 'receivable',
'user_type_id': cls.account_type.id,
})
cls.partner = cls.env['res.partner'].create({
'name': 'Test Partner 2',
'parent_id': False,
'account_id': cls.a_receivable.id,
})
cls.journal = cls.env['account.journal'].create({
'name': 'Test Journal',
'type': 'bank',
})
cls.invoice = cls.env['account.invoice'].create({
'name': 'Test Invoice 3',
'partner_id': cls.partner.id,
'type': 'out_invoice',
'journal_id': cls.journal.id,
'invoice_line_ids': [(0, 0, {
'account_id': cls.a_receivable.id,
'name': 'Test line',
'quantity': 1.0,
'price_unit': 100.00,
})],
})
cls.statement = cls.env['account.bank.statement'].create({
'journal_id': cls.journal.id})
def test_global(self):
self.invoice.signal_workflow('invoice_open')
self.assertTrue(self.invoice.move_id)
self.invoice.move_id.post()
wizard_o = self.env['account.statement.line.create']
context = wizard_o._context.copy()
context.update({
'active_model': 'account.bank.statement',
'active_id': self.statement.id,
})
wizard = wizard_o.with_context(context).create({
'statement_id': self.statement.id,
'partner_id': self.partner.id,
'journal_ids': [(4, self.journal.id)],
'allow_blocked': True,
'date_type': 'move',
'move_date': fields.Date.today(),
'invoice': False,
})
wizard.populate()
self.assertTrue(len(wizard.move_line_ids), 2)
wizard.invoice = True
wizard.move_line_filters_change()
wizard.populate()
self.assertTrue(len(wizard.move_line_ids), 1)
line = wizard.move_line_ids[0]
self.assertEqual(line.debit, self.invoice.amount_total)
wizard.create_statement_lines()
line = self.statement.line_ids[0]
self.assertEqual(line.amount, self.invoice.amount_total)

19
account_bank_statement_import_move_line/views/account_bank_statement_view.xml

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<record id="view_bank_statement_form" model="ir.ui.view">
<field name="name">account.bank.statement.form.population</field>
<field name="model">account.bank.statement</field>
<field name="inherit_id" ref="account.view_bank_statement_form"/>
<field name="arch" type="xml">
<field name="all_lines_reconciled" position="after">
<button name="%(account_statement_line_create_action)d"
string="Import Journal Items" type="action"
class="oe_highlight"
attrs="{'invisible':[('state', '!=', 'open')]}"/>
</field>
</field>
</record>
</openerp>

4
account_bank_statement_import_move_line/wizards/__init__.py

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from . import account_statement_line_create

119
account_bank_statement_import_move_line/wizards/account_statement_line_create.py

@ -0,0 +1,119 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Luis M. Ontalba
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from openerp import _, api, fields, models
class AccountStatementLineCreate(models.TransientModel):
_name = 'account.statement.line.create'
_description = 'Wizard to create statement lines'
statement_id = fields.Many2one(
'account.bank.statement', string='Bank Statement')
partner_id = fields.Many2one('res.partner', string='Partner Related',
domain=['|', ('parent_id', '=', False),
('is_company', '=', True)])
journal_ids = fields.Many2many(
'account.journal', string='Journals Filter')
target_move = fields.Selection([
('posted', 'All Posted Entries'),
('all', 'All Entries'),
], string='Target Moves')
allow_blocked = fields.Boolean(
string='Allow Litigation Move Lines')
invoice = fields.Boolean(
string='Linked to an Invoice or Refund')
date_type = fields.Selection([
('due', 'Due Date'),
('move', 'Move Date'),
], string="Type of Date Filter", required=True)
due_date = fields.Date(string="Due Date",
default=fields.Date.context_today)
move_date = fields.Date(string='Move Date',
default=fields.Date.context_today)
move_line_ids = fields.Many2many(
'account.move.line', string='Move Lines')
@api.model
def default_get(self, field_list):
res = super(AccountStatementLineCreate, self).default_get(field_list)
context = self.env.context
assert context.get('active_model') == 'account.bank.statement',\
'active_model should be account.bank.statement'
assert context.get('active_id'), 'Missing active_id in context !'
statement = self.env[
'account.bank.statement'].browse(context['active_id'])
res.update({
'target_move': 'posted',
'date_type': 'due',
'invoice': True,
'statement_id': statement.id,
})
return res
@api.multi
def _prepare_move_line_domain(self):
self.ensure_one()
domain = [('reconciled', '=', False),
('account_id.internal_type', 'in', ('payable',
'receivable')),
('company_id', '=', self.env.user.company_id.id)]
if self.journal_ids:
domain += [('journal_id', 'in', self.journal_ids.ids)]
else:
journals = self.env['account.journal'].search([])
domain += [('journal_id', 'in', journals.ids)]
if self.partner_id:
domain += [('partner_id', '=', self.partner_id.id)]
if self.target_move == 'posted':
domain += [('move_id.state', '=', 'posted')]
if not self.allow_blocked:
domain += [('blocked', '!=', True)]
if self.date_type == 'due':
domain += [
'|',
('date_maturity', '<=', self.due_date),
('date_maturity', '=', False)]
elif self.date_type == 'move':
domain.append(('date', '<=', self.move_date))
if self.invoice:
domain.append(('invoice_id', '!=', False))
paylines = self.env['account.payment'].search([
('state', 'in', ('draft', 'posted', 'sent')),
('move_line_ids', '!=', False)])
if paylines:
move_in_payment_ids = paylines.mapped('move_line_ids.id')
domain += [('id', 'not in', move_in_payment_ids)]
return domain
@api.multi
def populate(self):
domain = self._prepare_move_line_domain()
lines = self.env['account.move.line'].search(domain)
self.move_line_ids = lines
action = {
'name': _('Select Move Lines to Create Statement'),
'type': 'ir.actions.act_window',
'res_model': 'account.statement.line.create',
'view_mode': 'form',
'target': 'new',
'res_id': self.id,
'context': self._context,
}
return action
@api.onchange(
'date_type', 'move_date', 'due_date', 'journal_ids', 'invoice',
'target_move', 'allow_blocked', 'partner_id')
def move_line_filters_change(self):
domain = self._prepare_move_line_domain()
res = {'domain': {'move_line_ids': domain}}
return res
@api.multi
def create_statement_lines(self):
if self.move_line_ids:
self.move_line_ids.create_statement_line_from_move_line(
self.statement_id)
return True

63
account_bank_statement_import_move_line/wizards/account_statement_line_create_view.xml

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<record id="account_statement_line_create_view_form" model="ir.ui.view">
<field name="name">account_statement_line_create_form</field>
<field name="model">account.statement.line.create</field>
<field name="arch" type="xml">
<form string="Choose Move Lines Filter Options">
<group name="main">
<field name="statement_id" invisible="1"/>
<field name="partner_id"/>
<field name="date_type"/>
<field name="move_date"
attrs="{'required': [('date_type', '=', 'move')],
'invisible': [('date_type', '!=', 'move')]}"/>
<field name="due_date"
attrs="{'required': [('date_type', '=', 'due')],
'invisible': [('date_type', '!=', 'due')]}"/>
<field name="journal_ids" widget="many2many_tags"
placeholder="Keep empty for using all journals"/>
<field name="target_move" widget="radio"/>
<field name="invoice"/>
<field name="allow_blocked"/>
<label string="Click on Add All Move Lines to auto-select the move lines matching the above criteria or click on Add an item to manually select the move lines filtered by the above criteria." colspan="2"/>
<button name="populate" type="object" string="Add All Move Lines"/>
</group>
<group name="move_lines"
string="Selected Move Lines to Create Lines">
<field name="move_line_ids" nolabel="1">
<tree>
<field name="date"/>
<field name="move_id" required="0"/>
<field name="journal_id"/>
<field name="partner_id"/>
<field name="account_id"/>
<field name="date_maturity"/>
<field name="debit"/>
<field name="credit"/>
<field name="amount_residual" sum="Total Residual"/>
<field name="amount_currency"/>
<field name="amount_residual_currency"/>
<field name="company_currency_id" invisible="1"/>
</tree>
</field>
</group>
<footer>
<button name="create_statement_lines" type="object"
string="Create Statement Lines" class="oe_highlight"/>
<button string="Cancel" special="cancel" class="oe_link"/>
</footer>
</form>
</field>
</record>
<record id="account_statement_line_create_action"
model="ir.actions.act_window">
<field name="name">Create Lines from Move Lines</field>
<field name="res_model">account.statement.line.create</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</openerp>
Loading…
Cancel
Save