[Fix] Merge

This commit is contained in:
Florian da Costa
2014-04-10 15:19:22 +02:00
85 changed files with 4960 additions and 496 deletions

View File

@@ -0,0 +1,90 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_advanced_reconcile
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 11:54+0000\n"
"PO-Revision-Date: 2014-01-21 11:54+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_advanced_reconcile
#: field:easy.reconcile.advanced,partner_ids:0
#: field:easy.reconcile.advanced.ref,partner_ids:0
msgid "Restrict on partners"
msgstr ""
#. module: account_advanced_reconcile
#: field:easy.reconcile.advanced,account_id:0
#: field:easy.reconcile.advanced.ref,account_id:0
msgid "Account"
msgstr ""
#. module: account_advanced_reconcile
#: model:ir.model,name:account_advanced_reconcile.model_account_easy_reconcile_method
msgid "reconcile method for account_easy_reconcile"
msgstr ""
#. module: account_advanced_reconcile
#: field:easy.reconcile.advanced,journal_id:0
#: field:easy.reconcile.advanced.ref,journal_id:0
msgid "Journal"
msgstr ""
#. module: account_advanced_reconcile
#: field:easy.reconcile.advanced,account_profit_id:0
#: field:easy.reconcile.advanced.ref,account_profit_id:0
msgid "Account Profit"
msgstr ""
#. module: account_advanced_reconcile
#: view:account.easy.reconcile:0
msgid "Match multiple debit vs multiple credit entries. Allow partial reconciliation. The lines should have the partner, the credit entry ref. is matched vs the debit entry ref. or name."
msgstr ""
#. module: account_advanced_reconcile
#: field:easy.reconcile.advanced,filter:0
#: field:easy.reconcile.advanced.ref,filter:0
msgid "Filter"
msgstr ""
#. module: account_advanced_reconcile
#: view:account.easy.reconcile:0
msgid "Advanced. Partner and Ref"
msgstr ""
#. module: account_advanced_reconcile
#: field:easy.reconcile.advanced,date_base_on:0
#: field:easy.reconcile.advanced.ref,date_base_on:0
msgid "Date of reconciliation"
msgstr ""
#. module: account_advanced_reconcile
#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced
msgid "easy.reconcile.advanced"
msgstr ""
#. module: account_advanced_reconcile
#: field:easy.reconcile.advanced,account_lost_id:0
#: field:easy.reconcile.advanced.ref,account_lost_id:0
msgid "Account Lost"
msgstr ""
#. module: account_advanced_reconcile
#: model:ir.model,name:account_advanced_reconcile.model_easy_reconcile_advanced_ref
msgid "easy.reconcile.advanced.ref"
msgstr ""
#. module: account_advanced_reconcile
#: field:easy.reconcile.advanced,write_off:0
#: field:easy.reconcile.advanced.ref,write_off:0
msgid "Write off allowed"
msgstr ""

View File

@@ -6,15 +6,16 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: OpenERP Server 6.1\n" "Project-Id-Version: OpenERP Server 6.1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-01-04 08:25+0000\n" "POT-Creation-Date: 2014-01-21 11:54+0000\n"
"PO-Revision-Date: 2013-01-04 09:27+0100\n" "PO-Revision-Date: 2014-03-21 15:24+0000\n"
"Last-Translator: Guewen Baconnier <guewen.baconnier@camptocamp.com>\n" "Last-Translator: Guewen Baconnier @ Camptocamp <Unknown>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: \n" "X-Launchpad-Export-Date: 2014-03-22 07:11+0000\n"
"X-Generator: Launchpad (build 16967)\n"
"Language: \n"
#. module: account_advanced_reconcile #. module: account_advanced_reconcile
#: field:easy.reconcile.advanced,partner_ids:0 #: field:easy.reconcile.advanced,partner_ids:0
@@ -47,8 +48,15 @@ msgstr "Compte de produit"
#. module: account_advanced_reconcile #. module: account_advanced_reconcile
#: view:account.easy.reconcile:0 #: view:account.easy.reconcile:0
msgid "Match multiple debit vs multiple credit entries. Allow partial reconciliation. The lines should have the partner, the credit entry ref. is matched vs the debit entry ref. or name." msgid ""
msgstr "Le Lettrage peut s'effectuer sur plusieurs écritures de débit et crédit. Le Lettrage partiel est autorisé. Les écritures doivent avoir le même partenaire et la référence sur les écritures de crédit doit se retrouver dans la référence ou la description sur les écritures de débit." "Match multiple debit vs multiple credit entries. Allow partial "
"reconciliation. The lines should have the partner, the credit entry ref. is "
"matched vs the debit entry ref. or name."
msgstr ""
"Le Lettrage peut s'effectuer sur plusieurs écritures de débit et crédit. Le "
"Lettrage partiel est autorisé. Les écritures doivent avoir le même "
"partenaire et la référence sur les écritures de crédit doit se retrouver "
"dans la référence ou la description sur les écritures de débit."
#. module: account_advanced_reconcile #. module: account_advanced_reconcile
#: field:easy.reconcile.advanced,filter:0 #: field:easy.reconcile.advanced,filter:0
@@ -88,4 +96,3 @@ msgstr "easy.reconcile.advanced.ref"
#: field:easy.reconcile.advanced.ref,write_off:0 #: field:easy.reconcile.advanced.ref,write_off:0
msgid "Write off allowed" msgid "Write off allowed"
msgstr "Écart autorisé" msgstr "Écart autorisé"

View File

@@ -25,7 +25,7 @@ Advanced reconciliation method for the module account_easy_reconcile
Reconcile rules with transaction_ref Reconcile rules with transaction_ref
""", """,
'version': '1.0', 'version': '1.0.1',
'author': 'Camptocamp', 'author': 'Camptocamp',
'category': 'Finance', 'category': 'Finance',
'website': 'http://www.camptocamp.com', 'website': 'http://www.camptocamp.com',

View File

@@ -30,7 +30,7 @@ class AccountMoveLine(Model):
'transaction_ref': fields.char('Transaction Ref.', size=128), 'transaction_ref': fields.char('Transaction Ref.', size=128),
} }
class AccountBankSatement(Model): class AccountBankStatement(Model):
""" """
Inherit account.bank.statement class in order to set transaction_ref info on account.move.line Inherit account.bank.statement class in order to set transaction_ref info on account.move.line
""" """
@@ -43,7 +43,7 @@ class AccountBankSatement(Model):
if context is None: if context is None:
context = {} context = {}
res = super(AccountBankSatement, self)._prepare_move_line_vals( res = super(AccountBankStatement, self)._prepare_move_line_vals(
cr, uid, st_line, move_id, debit, credit, cr, uid, st_line, move_id, debit, credit,
currency_id=currency_id, currency_id=currency_id,
amount_currency=amount_currency, amount_currency=amount_currency,

View File

@@ -0,0 +1,97 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_advanced_reconcile_transaction_ref
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 11:55+0000\n"
"PO-Revision-Date: 2014-01-21 11:55+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_advanced_reconcile_transaction_ref
#: field:easy.reconcile.advanced.transaction_ref,partner_ids:0
msgid "Restrict on partners"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: field:easy.reconcile.advanced.transaction_ref,account_id:0
msgid "Account"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: view:account.easy.reconcile:0
msgid "Advanced. Partner and Transaction Ref"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: view:account.easy.reconcile:0
msgid "Match multiple debit vs multiple credit entries. Allow partial reconciliation. The lines should have the partner, the credit entry transaction ref. is matched vs the debit entry transaction ref. or name."
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_easy_reconcile_advanced_transaction_ref
msgid "easy.reconcile.advanced.transaction_ref"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: field:account.move.line,transaction_ref:0
msgid "Transaction Ref."
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: field:easy.reconcile.advanced.transaction_ref,journal_id:0
msgid "Journal"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: field:easy.reconcile.advanced.transaction_ref,account_profit_id:0
msgid "Account Profit"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_account_bank_statement
msgid "Bank Statement"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: field:easy.reconcile.advanced.transaction_ref,filter:0
msgid "Filter"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_account_easy_reconcile_method
msgid "reconcile method for account_easy_reconcile"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: field:easy.reconcile.advanced.transaction_ref,date_base_on:0
msgid "Date of reconciliation"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_account_move_line
msgid "Journal Items"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_easy_reconcile_advanced
msgid "easy.reconcile.advanced"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: field:easy.reconcile.advanced.transaction_ref,account_lost_id:0
msgid "Account Lost"
msgstr ""
#. module: account_advanced_reconcile_transaction_ref
#: field:easy.reconcile.advanced.transaction_ref,write_off:0
msgid "Write off allowed"
msgstr ""

View File

@@ -6,14 +6,16 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n" "Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-08-13 09:37+0000\n" "POT-Creation-Date: 2014-01-21 11:55+0000\n"
"PO-Revision-Date: 2013-08-13 09:37+0000\n" "PO-Revision-Date: 2014-03-21 15:25+0000\n"
"Last-Translator: <>\n" "Last-Translator: Vincent Renaville@camptocamp "
"<vincent.renaville@camptocamp.com>\n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: \n" "X-Launchpad-Export-Date: 2014-03-22 07:11+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: account_advanced_reconcile_transaction_ref #. module: account_advanced_reconcile_transaction_ref
#: field:easy.reconcile.advanced.transaction_ref,partner_ids:0 #: field:easy.reconcile.advanced.transaction_ref,partner_ids:0
@@ -32,8 +34,16 @@ msgstr "Avancé. Partenaire et Référence de transaction"
#. module: account_advanced_reconcile_transaction_ref #. module: account_advanced_reconcile_transaction_ref
#: view:account.easy.reconcile:0 #: view:account.easy.reconcile:0
msgid "Match multiple debit vs multiple credit entries. Allow partial reconciliation. The lines should have the partner, the credit entry transaction ref. is matched vs the debit entry transaction ref. or name." msgid ""
msgstr "Le lettrage peut s'effectuer sur plusieurs écritures de débit et crédit. Le Lettrage partiel est autorisé. Les écritures doivent avoir le même partenaire et la même référence de transaction sur les écritures de crédit doit se retrouver dans la référence de transaction ou la description sur les écritures de débit." "Match multiple debit vs multiple credit entries. Allow partial "
"reconciliation. The lines should have the partner, the credit entry "
"transaction ref. is matched vs the debit entry transaction ref. or name."
msgstr ""
"Le lettrage peut s'effectuer sur plusieurs écritures de débit et crédit. Le "
"Lettrage partiel est autorisé. Les écritures doivent avoir le même "
"partenaire et la même référence de transaction sur les écritures de crédit "
"doit se retrouver dans la référence de transaction ou la description sur les "
"écritures de débit."
#. module: account_advanced_reconcile_transaction_ref #. module: account_advanced_reconcile_transaction_ref
#: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_easy_reconcile_advanced_transaction_ref #: model:ir.model,name:account_advanced_reconcile_transaction_ref.model_easy_reconcile_advanced_transaction_ref
@@ -94,4 +104,3 @@ msgstr "Compte de charge"
#: field:easy.reconcile.advanced.transaction_ref,write_off:0 #: field:easy.reconcile.advanced.transaction_ref,write_off:0
msgid "Write off allowed" msgid "Write off allowed"
msgstr "Ecart autorisé" msgstr "Ecart autorisé"

View File

@@ -21,7 +21,7 @@
{ {
"name": "Easy Reconcile", "name": "Easy Reconcile",
"version": "1.3.0", "version": "1.3.1",
"depends": ["account"], "depends": ["account"],
"author": "Akretion,Camptocamp", "author": "Akretion,Camptocamp",
"description": """ "description": """

View File

@@ -22,6 +22,7 @@
from openerp.osv import fields, osv, orm from openerp.osv import fields, osv, orm
from openerp.tools.translate import _ from openerp.tools.translate import _
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
from openerp.tools.translate import _
class easy_reconcile_options(orm.AbstractModel): class easy_reconcile_options(orm.AbstractModel):
@@ -258,6 +259,58 @@ class account_easy_reconcile(orm.Model):
_('There is no history of reconciled ' _('There is no history of reconciled '
'items on the task: %s.') % rec.name) 'items on the task: %s.') % rec.name)
def _open_move_line_list(sefl, cr, uid, move_line_ids, name, context=None):
return {
'name': name,
'view_mode': 'tree,form',
'view_id': False,
'view_type': 'form',
'res_model': 'account.move.line',
'type': 'ir.actions.act_window',
'nodestroy': True,
'target': 'current',
'domain': unicode([('id', 'in', move_line_ids)]),
}
def open_unreconcile(self, cr, uid, ids, context=None):
""" Open the view of move line with the unreconciled move lines
"""
assert len(ids) == 1 , \
"You can only open entries from one profile at a time"
obj_move_line = self.pool.get('account.move.line')
res = {}
for task in self.browse(cr, uid, ids, context=context):
line_ids = obj_move_line.search(
cr, uid,
[('account_id', '=', task.account.id),
('reconcile_id', '=', False),
('reconcile_partial_id', '=', False)],
context=context)
name = _('Unreconciled items')
return self._open_move_line_list(cr, uid, line_ids, name, context=context)
def open_partial_reconcile(self, cr, uid, ids, context=None):
""" Open the view of move line with the unreconciled move lines
"""
assert len(ids) == 1 , \
"You can only open entries from one profile at a time"
obj_move_line = self.pool.get('account.move.line')
res = {}
for task in self.browse(cr, uid, ids, context=context):
line_ids = obj_move_line.search(
cr, uid,
[('account_id', '=', task.account.id),
('reconcile_id', '=', False),
('reconcile_partial_id', '!=', False)],
context=context)
name = _('Partial reconciled items')
return self._open_move_line_list(cr, uid, line_ids, name, context=context)
def last_history_reconcile(self, cr, uid, rec_id, context=None): def last_history_reconcile(self, cr, uid, rec_id, context=None):
""" Get the last history record for this reconciliation profile """ Get the last history record for this reconciliation profile
and return the action which opens move lines reconciled and return the action which opens move lines reconciled

View File

@@ -13,11 +13,9 @@
<button name="run_reconcile" class="oe_highlight" <button name="run_reconcile" class="oe_highlight"
string="Start Auto Reconciliation" type="object"/> string="Start Auto Reconciliation" type="object"/>
<button icon="STOCK_JUMP_TO" name="last_history_reconcile" <button icon="STOCK_JUMP_TO" name="last_history_reconcile"
class="oe_highlight"
string="Display items reconciled on the last run" string="Display items reconciled on the last run"
type="object"/> type="object"/>
<button icon="STOCK_JUMP_TO" name="last_history_partial" <button icon="STOCK_JUMP_TO" name="last_history_partial"
class="oe_highlight"
string="Display items partially reconciled on the last run" string="Display items partially reconciled on the last run"
type="object"/> type="object"/>
</header> </header>
@@ -30,8 +28,16 @@
<field name="company_id" groups="base.group_multi_company"/> <field name="company_id" groups="base.group_multi_company"/>
</group> </group>
<group> <group>
<field name="unreconciled_count"/> <group>
<field name="reconciled_partial_count"/> <field name="unreconciled_count"/>
<button icon="STOCK_JUMP_TO" name="open_unreconcile"
string="Go to unreconciled items" type="object"/>
</group>
<group>
<field name="reconciled_partial_count"/>
<button icon="STOCK_JUMP_TO" name="open_partial_reconcile"
string="Go to partial reconciled items" type="object"/>
</group>
</group> </group>
</group> </group>
<notebook colspan="4"> <notebook colspan="4">

View File

@@ -0,0 +1,406 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_easy_reconcile
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 11:55+0000\n"
"PO-Revision-Date: 2014-01-21 11:55+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_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:108
#: view:easy.reconcile.history:0
#: field:easy.reconcile.history,reconcile_ids:0
#, python-format
msgid "Reconciliations"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
#: view:easy.reconcile.history:0
msgid "Automatic Easy Reconcile History"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Information"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
#: view:easy.reconcile.history:0
msgid "Go to partially reconciled items"
msgstr ""
#. module: account_easy_reconcile
#: help:account.easy.reconcile.method,sequence:0
msgid "The sequence field is used to order the reconcile method"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_history
msgid "easy.reconcile.history"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.actions.act_window,help:account_easy_reconcile.action_account_easy_reconcile
msgid "<p class=\"oe_view_nocontent_create\">\n"
" Click to add a reconciliation profile.\n"
" </p><p>\n"
" A reconciliation profile specifies, for one account, how\n"
" the entries should be reconciled.\n"
" You can select one or many reconciliation methods which will\n"
" be run sequentially to match the entries between them.\n"
" </p>\n"
" "
msgstr ""
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_options
msgid "easy.reconcile.options"
msgstr ""
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Group By..."
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile,unreconciled_count:0
msgid "Unreconciled Items"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_base
msgid "easy.reconcile.base"
msgstr ""
#. module: account_easy_reconcile
#: field:easy.reconcile.history,reconcile_line_ids:0
msgid "Reconciled Items"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile,reconcile_method:0
msgid "Method"
msgstr ""
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "7 Days"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.actions.act_window,name:account_easy_reconcile.action_easy_reconcile_history
msgid "Easy Automatic Reconcile History"
msgstr ""
#. module: account_easy_reconcile
#: field:easy.reconcile.history,date:0
msgid "Run date"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Match one debit line vs one credit line. Do not allow partial reconciliation. The lines should have the same amount (with the write-off) and the same reference to be reconciled."
msgstr ""
#. module: account_easy_reconcile
#: model:ir.actions.act_window,name:account_easy_reconcile.act_easy_reconcile_to_history
msgid "History Details"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Display items reconciled on the last run"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,name:0
msgid "Type"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile,company_id:0
#: field:account.easy.reconcile.method,company_id:0
#: field:easy.reconcile.history,company_id:0
msgid "Company"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,account_profit_id:0
#: field:easy.reconcile.base,account_profit_id:0
#: field:easy.reconcile.options,account_profit_id:0
#: field:easy.reconcile.simple,account_profit_id:0
#: field:easy.reconcile.simple.name,account_profit_id:0
#: field:easy.reconcile.simple.partner,account_profit_id:0
#: field:easy.reconcile.simple.reference,account_profit_id:0
msgid "Account Profit"
msgstr ""
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Todays' Reconcilations"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Simple. Amount and Name"
msgstr ""
#. module: account_easy_reconcile
#: field:easy.reconcile.base,partner_ids:0
#: field:easy.reconcile.simple,partner_ids:0
#: field:easy.reconcile.simple.name,partner_ids:0
#: field:easy.reconcile.simple.partner,partner_ids:0
#: field:easy.reconcile.simple.reference,partner_ids:0
msgid "Restrict on partners"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.actions.act_window,name:account_easy_reconcile.action_account_easy_reconcile
#: model:ir.ui.menu,name:account_easy_reconcile.menu_easy_reconcile
msgid "Easy Automatic Reconcile"
msgstr ""
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Today"
msgstr ""
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Date"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile,last_history:0
msgid "Last History"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Configuration"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile,reconciled_partial_count:0
#: field:easy.reconcile.history,partial_line_ids:0
msgid "Partially Reconciled Items"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_partner
msgid "easy.reconcile.simple.partner"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,write_off:0
#: field:easy.reconcile.base,write_off:0
#: field:easy.reconcile.options,write_off:0
#: field:easy.reconcile.simple,write_off:0
#: field:easy.reconcile.simple.name,write_off:0
#: field:easy.reconcile.simple.partner,write_off:0
#: field:easy.reconcile.simple.reference,write_off:0
msgid "Write off allowed"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Automatic Easy Reconcile"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile,account:0
#: field:easy.reconcile.base,account_id:0
#: field:easy.reconcile.simple,account_id:0
#: field:easy.reconcile.simple.name,account_id:0
#: field:easy.reconcile.simple.partner,account_id:0
#: field:easy.reconcile.simple.reference,account_id:0
msgid "Account"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,task_id:0
msgid "Task"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile,name:0
msgid "Name"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Simple. Amount and Partner"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Start Auto Reconcilation"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_name
msgid "easy.reconcile.simple.name"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,filter:0
#: field:easy.reconcile.base,filter:0
#: field:easy.reconcile.options,filter:0
#: field:easy.reconcile.simple,filter:0
#: field:easy.reconcile.simple.name,filter:0
#: field:easy.reconcile.simple.partner,filter:0
#: field:easy.reconcile.simple.reference,filter:0
msgid "Filter"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Match one debit line vs one credit line. Do not allow partial reconciliation. The lines should have the same amount (with the write-off) and the same partner to be reconciled."
msgstr ""
#. module: account_easy_reconcile
#: field:easy.reconcile.history,easy_reconcile_id:0
msgid "Reconcile Profile"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile_method
msgid "reconcile method for account_easy_reconcile"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Start Auto Reconciliation"
msgstr ""
#. module: account_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile.py:257
#, python-format
msgid "Error"
msgstr ""
#. module: account_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile.py:258
#, python-format
msgid "There is no history of reconciled items on the task: %s."
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Match one debit line vs one credit line. Do not allow partial reconciliation. The lines should have the same amount (with the write-off) and the same name to be reconciled."
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,account_lost_id:0
#: field:easy.reconcile.base,account_lost_id:0
#: field:easy.reconcile.options,account_lost_id:0
#: field:easy.reconcile.simple,account_lost_id:0
#: field:easy.reconcile.simple.name,account_lost_id:0
#: field:easy.reconcile.simple.partner,account_lost_id:0
#: field:easy.reconcile.simple.reference,account_lost_id:0
msgid "Account Lost"
msgstr ""
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Reconciliation Profile"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
#: field:account.easy.reconcile,history_ids:0
msgid "History"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
#: view:easy.reconcile.history:0
msgid "Go to reconciled items"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Profile Information"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile.method:0
msgid "Automatic Easy Reconcile Method"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Simple. Amount and Reference"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Display items partially reconciled on the last run"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,sequence:0
msgid "Sequence"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple
msgid "easy.reconcile.simple"
msgstr ""
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Reconciliations of last 7 days"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,date_base_on:0
#: field:easy.reconcile.base,date_base_on:0
#: field:easy.reconcile.options,date_base_on:0
#: field:easy.reconcile.simple,date_base_on:0
#: field:easy.reconcile.simple.name,date_base_on:0
#: field:easy.reconcile.simple.partner,date_base_on:0
#: field:easy.reconcile.simple.reference,date_base_on:0
msgid "Date of reconciliation"
msgstr ""
#. module: account_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:111
#: view:easy.reconcile.history:0
#: field:easy.reconcile.history,reconcile_partial_ids:0
#, python-format
msgid "Partial Reconciliations"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,journal_id:0
#: field:easy.reconcile.base,journal_id:0
#: field:easy.reconcile.options,journal_id:0
#: field:easy.reconcile.simple,journal_id:0
#: field:easy.reconcile.simple.name,journal_id:0
#: field:easy.reconcile.simple.partner,journal_id:0
#: field:easy.reconcile.simple.reference,journal_id:0
msgid "Journal"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_reference
msgid "easy.reconcile.simple.reference"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile
msgid "account easy reconcile"
msgstr ""

View File

@@ -0,0 +1,415 @@
# Spanish translation for banking-addons
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
# This file is distributed under the same license as the banking-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: banking-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2014-01-21 11:55+0000\n"
"PO-Revision-Date: 2014-04-02 21:56+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-03 06:06+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: account_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:101
#: field:easy.reconcile.history,reconcile_ids:0
#, python-format
msgid "Reconciliations"
msgstr "Conciliaciones"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
#: view:easy.reconcile.history:0
msgid "Automatic Easy Reconcile History"
msgstr "Historial de conciliación automática sencilla"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Information"
msgstr "Información"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
#: view:easy.reconcile.history:0
msgid "Go to partially reconciled items"
msgstr "Ir a los elementos parcialmente conciliados"
#. module: account_easy_reconcile
#: help:account.easy.reconcile.method,sequence:0
msgid "The sequence field is used to order the reconcile method"
msgstr ""
"El campo de secuencia se usa para ordenar los métodos de conciliación"
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_history
msgid "easy.reconcile.history"
msgstr "easy.reconcile.history"
#. module: account_easy_reconcile
#: model:ir.actions.act_window,help:account_easy_reconcile.action_account_easy_reconcile
msgid ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to add a reconciliation profile.\n"
" </p><p>\n"
" A reconciliation profile specifies, for one account, how\n"
" the entries should be reconciled.\n"
" You can select one or many reconciliation methods which will\n"
" be run sequentially to match the entries between them.\n"
" </p>\n"
" "
msgstr ""
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_options
msgid "easy.reconcile.options"
msgstr "easy.reconcile.options"
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Group By..."
msgstr "Agrupar por..."
#. module: account_easy_reconcile
#: field:account.easy.reconcile,unreconciled_count:0
msgid "Unreconciled Items"
msgstr ""
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_base
msgid "easy.reconcile.base"
msgstr "easy.reconcile.base"
#. module: account_easy_reconcile
#: field:easy.reconcile.history,reconcile_line_ids:0
msgid "Reconciled Items"
msgstr "Elementos conciliados"
#. module: account_easy_reconcile
#: field:account.easy.reconcile,reconcile_method:0
msgid "Method"
msgstr "Método"
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "7 Days"
msgstr "7 días"
#. module: account_easy_reconcile
#: model:ir.actions.act_window,name:account_easy_reconcile.action_easy_reconcile_history
msgid "Easy Automatic Reconcile History"
msgstr "Historial de la conciliación automática sencilla"
#. module: account_easy_reconcile
#: field:easy.reconcile.history,date:0
msgid "Run date"
msgstr "Fecha ejecucción"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid ""
"Match one debit line vs one credit line. Do not allow partial "
"reconciliation. The lines should have the same amount (with the write-off) "
"and the same reference to be reconciled."
msgstr ""
#. module: account_easy_reconcile
#: model:ir.actions.act_window,name:account_easy_reconcile.act_easy_reconcile_to_history
msgid "History Details"
msgstr "Detalles del historial"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Display items reconciled on the last run"
msgstr "Mostrar elementos conciliados en la última ejecucción"
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,name:0
msgid "Type"
msgstr "Tipo"
#. module: account_easy_reconcile
#: field:account.easy.reconcile,company_id:0
#: field:account.easy.reconcile.method,company_id:0
#: field:easy.reconcile.history,company_id:0
msgid "Company"
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,account_profit_id:0
#: field:easy.reconcile.base,account_profit_id:0
#: field:easy.reconcile.options,account_profit_id:0
#: field:easy.reconcile.simple,account_profit_id:0
#: field:easy.reconcile.simple.name,account_profit_id:0
#: field:easy.reconcile.simple.partner,account_profit_id:0
#: field:easy.reconcile.simple.reference,account_profit_id:0
msgid "Account Profit"
msgstr "Cuenta de ganancias"
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Todays' Reconcilations"
msgstr "Conciliaciones de hoy"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Simple. Amount and Name"
msgstr "Simple. Cantidad y nombre"
#. module: account_easy_reconcile
#: field:easy.reconcile.base,partner_ids:0
#: field:easy.reconcile.simple,partner_ids:0
#: field:easy.reconcile.simple.name,partner_ids:0
#: field:easy.reconcile.simple.partner,partner_ids:0
#: field:easy.reconcile.simple.reference,partner_ids:0
msgid "Restrict on partners"
msgstr "Restringir en las empresas"
#. module: account_easy_reconcile
#: model:ir.actions.act_window,name:account_easy_reconcile.action_account_easy_reconcile
#: model:ir.ui.menu,name:account_easy_reconcile.menu_easy_reconcile
msgid "Easy Automatic Reconcile"
msgstr "Conciliación automática simple"
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Today"
msgstr "Hoy"
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Date"
msgstr "Fecha"
#. module: account_easy_reconcile
#: field:account.easy.reconcile,last_history:0
msgid "Last History"
msgstr "Último historial"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Configuration"
msgstr "Configuración"
#. module: account_easy_reconcile
#: field:easy.reconcile.history,partial_line_ids:0
msgid "Partially Reconciled Items"
msgstr "Elementos parcialmente conciliados"
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_partner
msgid "easy.reconcile.simple.partner"
msgstr "easy.reconcile.simple.partner"
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,write_off:0
#: field:easy.reconcile.base,write_off:0
#: field:easy.reconcile.options,write_off:0
#: field:easy.reconcile.simple,write_off:0
#: field:easy.reconcile.simple.name,write_off:0
#: field:easy.reconcile.simple.partner,write_off:0
#: field:easy.reconcile.simple.reference,write_off:0
msgid "Write off allowed"
msgstr "Desajuste permitido"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Automatic Easy Reconcile"
msgstr "Conciliación automática sencilla"
#. module: account_easy_reconcile
#: field:account.easy.reconcile,account:0
#: field:easy.reconcile.base,account_id:0
#: field:easy.reconcile.simple,account_id:0
#: field:easy.reconcile.simple.name,account_id:0
#: field:easy.reconcile.simple.partner,account_id:0
#: field:easy.reconcile.simple.reference,account_id:0
msgid "Account"
msgstr "Cuenta"
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,task_id:0
msgid "Task"
msgstr "Tarea"
#. module: account_easy_reconcile
#: field:account.easy.reconcile,name:0
msgid "Name"
msgstr "Nombre"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Simple. Amount and Partner"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Start Auto Reconcilation"
msgstr "Iniciar conciliación automática"
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_name
msgid "easy.reconcile.simple.name"
msgstr "easy.reconcile.simple.name"
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,filter:0
#: field:easy.reconcile.base,filter:0
#: field:easy.reconcile.options,filter:0
#: field:easy.reconcile.simple,filter:0
#: field:easy.reconcile.simple.name,filter:0
#: field:easy.reconcile.simple.partner,filter:0
#: field:easy.reconcile.simple.reference,filter:0
msgid "Filter"
msgstr "Filtro"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid ""
"Match one debit line vs one credit line. Do not allow partial "
"reconciliation. The lines should have the same amount (with the write-off) "
"and the same partner to be reconciled."
msgstr ""
#. module: account_easy_reconcile
#: field:easy.reconcile.history,easy_reconcile_id:0
msgid "Reconcile Profile"
msgstr "Perfil de conciliación"
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile_method
msgid "reconcile method for account_easy_reconcile"
msgstr "Método de conciliación para account_easy_reconcile"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Start Auto Reconciliation"
msgstr ""
#. module: account_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile.py:233
#, python-format
msgid "Error"
msgstr "Error"
#. module: account_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile.py:258
#, python-format
msgid "There is no history of reconciled items on the task: %s."
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid ""
"Match one debit line vs one credit line. Do not allow partial "
"reconciliation. The lines should have the same amount (with the write-off) "
"and the same name to be reconciled."
msgstr ""
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,account_lost_id:0
#: field:easy.reconcile.base,account_lost_id:0
#: field:easy.reconcile.options,account_lost_id:0
#: field:easy.reconcile.simple,account_lost_id:0
#: field:easy.reconcile.simple.name,account_lost_id:0
#: field:easy.reconcile.simple.partner,account_lost_id:0
#: field:easy.reconcile.simple.reference,account_lost_id:0
msgid "Account Lost"
msgstr "Cuenta de pérdidas"
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Reconciliation Profile"
msgstr "Perfil de conciliación"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
#: field:account.easy.reconcile,history_ids:0
msgid "History"
msgstr "Historial"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
#: view:easy.reconcile.history:0
msgid "Go to reconciled items"
msgstr "Ir a los elementos conciliados"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Profile Information"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile.method:0
msgid "Automatic Easy Reconcile Method"
msgstr "Método de conciliación automática sencilla"
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Simple. Amount and Reference"
msgstr ""
#. module: account_easy_reconcile
#: view:account.easy.reconcile:0
msgid "Display items partially reconciled on the last run"
msgstr "Mostrar elementos conciliados parcialmente en la última ejecucción"
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,sequence:0
msgid "Sequence"
msgstr "Secuencia"
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple
msgid "easy.reconcile.simple"
msgstr "easy.reconcile.simple"
#. module: account_easy_reconcile
#: view:easy.reconcile.history:0
msgid "Reconciliations of last 7 days"
msgstr "Conciliaciones de los últimos 7 días"
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,date_base_on:0
#: field:easy.reconcile.base,date_base_on:0
#: field:easy.reconcile.options,date_base_on:0
#: field:easy.reconcile.simple,date_base_on:0
#: field:easy.reconcile.simple.name,date_base_on:0
#: field:easy.reconcile.simple.partner,date_base_on:0
#: field:easy.reconcile.simple.reference,date_base_on:0
msgid "Date of reconciliation"
msgstr ""
#. module: account_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:104
#: field:easy.reconcile.history,reconcile_partial_ids:0
#, python-format
msgid "Partial Reconciliations"
msgstr "Conciliaciones parciales"
#. module: account_easy_reconcile
#: field:account.easy.reconcile.method,journal_id:0
#: field:easy.reconcile.base,journal_id:0
#: field:easy.reconcile.options,journal_id:0
#: field:easy.reconcile.simple,journal_id:0
#: field:easy.reconcile.simple.name,journal_id:0
#: field:easy.reconcile.simple.partner,journal_id:0
#: field:easy.reconcile.simple.reference,journal_id:0
msgid "Journal"
msgstr "Diario"
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_reference
msgid "easy.reconcile.simple.reference"
msgstr "easy.reconcile.simple.reference"
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile
msgid "account easy reconcile"
msgstr "account easy reconcile"

View File

@@ -6,18 +6,19 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: OpenERP Server 6.1\n" "Project-Id-Version: OpenERP Server 6.1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-01-04 08:39+0000\n" "POT-Creation-Date: 2014-01-21 11:55+0000\n"
"PO-Revision-Date: 2013-01-04 09:55+0100\n" "PO-Revision-Date: 2014-03-21 15:25+0000\n"
"Last-Translator: Guewen Baconnier <guewen.baconnier@camptocamp.com>\n" "Last-Translator: Guewen Baconnier @ Camptocamp <Unknown>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: \n" "X-Launchpad-Export-Date: 2014-03-22 07:11+0000\n"
"X-Generator: Launchpad (build 16967)\n"
"Language: \n"
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:101 #: code:addons/account_easy_reconcile/easy_reconcile_history.py:108
#: view:easy.reconcile.history:0 #: view:easy.reconcile.history:0
#: field:easy.reconcile.history,reconcile_ids:0 #: field:easy.reconcile.history,reconcile_ids:0
#, python-format #, python-format
@@ -121,8 +122,13 @@ msgstr "Date de lancement"
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: view:account.easy.reconcile:0 #: view:account.easy.reconcile:0
msgid "Match one debit line vs one credit line. Do not allow partial reconciliation. The lines should have the same amount (with the write-off) and the same reference to be reconciled." msgid ""
msgstr "Lettre un débit avec un crédit ayant le même montant et la même référence. Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)." "Match one debit line vs one credit line. Do not allow partial "
"reconciliation. The lines should have the same amount (with the write-off) "
"and the same reference to be reconciled."
msgstr ""
"Lettre un débit avec un crédit ayant le même montant et la même référence. "
"Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)."
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: model:ir.actions.act_window,name:account_easy_reconcile.act_easy_reconcile_to_history #: model:ir.actions.act_window,name:account_easy_reconcile.act_easy_reconcile_to_history
@@ -140,15 +146,11 @@ msgid "Type"
msgstr "Type" msgstr "Type"
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: field:account.easy.reconcile.method,journal_id:0 #: field:account.easy.reconcile,company_id:0
#: field:easy.reconcile.base,journal_id:0 #: field:account.easy.reconcile.method,company_id:0
#: field:easy.reconcile.options,journal_id:0 #: field:easy.reconcile.history,company_id:0
#: field:easy.reconcile.simple,journal_id:0 msgid "Company"
#: field:easy.reconcile.simple.name,journal_id:0 msgstr ""
#: field:easy.reconcile.simple.partner,journal_id:0
#: field:easy.reconcile.simple.reference,journal_id:0
msgid "Journal"
msgstr "Journal"
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: field:account.easy.reconcile.method,account_profit_id:0 #: field:account.easy.reconcile.method,account_profit_id:0
@@ -281,35 +283,50 @@ msgstr "Filtre"
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: view:account.easy.reconcile:0 #: view:account.easy.reconcile:0
msgid "Match one debit line vs one credit line. Do not allow partial reconciliation. The lines should have the same amount (with the write-off) and the same partner to be reconciled." msgid ""
msgstr "Lettre un débit avec un crédit ayant le même montant et le même partenaire. Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)." "Match one debit line vs one credit line. Do not allow partial "
"reconciliation. The lines should have the same amount (with the write-off) "
"and the same partner to be reconciled."
msgstr ""
"Lettre un débit avec un crédit ayant le même montant et le même partenaire. "
"Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)."
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: field:easy.reconcile.history,easy_reconcile_id:0 #: field:easy.reconcile.history,easy_reconcile_id:0
msgid "Reconcile Profile" msgid "Reconcile Profile"
msgstr "Profil de réconciliation" msgstr "Profil de réconciliation"
#. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile_method
msgid "reconcile method for account_easy_reconcile"
msgstr "Méthode de lettrage"
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: view:account.easy.reconcile:0 #: view:account.easy.reconcile:0
msgid "Start Auto Reconciliation" msgid "Start Auto Reconciliation"
msgstr "Lancer le lettrage automatisé" msgstr "Lancer le lettrage automatisé"
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile.py:250 #: code:addons/account_easy_reconcile/easy_reconcile.py:257
#, python-format #, python-format
msgid "Error" msgid "Error"
msgstr "Erreur" msgstr "Erreur"
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile.py:251 #: code:addons/account_easy_reconcile/easy_reconcile.py:258
#, python-format #, python-format
msgid "There is no history of reconciled items on the task: %s." msgid "There is no history of reconciled items on the task: %s."
msgstr "Il n'y a pas d'historique d'écritures lettrées sur la tâche: %s." msgstr "Il n'y a pas d'historique d'écritures lettrées sur la tâche: %s."
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: view:account.easy.reconcile:0 #: view:account.easy.reconcile:0
msgid "Match one debit line vs one credit line. Do not allow partial reconciliation. The lines should have the same amount (with the write-off) and the same name to be reconciled." msgid ""
msgstr "Lettre un débit avec un crédit ayant le même montant et la même description. Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)." "Match one debit line vs one credit line. Do not allow partial "
"reconciliation. The lines should have the same amount (with the write-off) "
"and the same name to be reconciled."
msgstr ""
"Lettre un débit avec un crédit ayant le même montant et la même description. "
"Le lettrage ne peut être partiel (écriture d'ajustement en cas d'écart)."
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: field:account.easy.reconcile.method,account_lost_id:0 #: field:account.easy.reconcile.method,account_lost_id:0
@@ -386,7 +403,7 @@ msgid "Date of reconciliation"
msgstr "Date de lettrage" msgstr "Date de lettrage"
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: code:addons/account_easy_reconcile/easy_reconcile_history.py:104 #: code:addons/account_easy_reconcile/easy_reconcile_history.py:111
#: view:easy.reconcile.history:0 #: view:easy.reconcile.history:0
#: field:easy.reconcile.history,reconcile_partial_ids:0 #: field:easy.reconcile.history,reconcile_partial_ids:0
#, python-format #, python-format
@@ -394,9 +411,15 @@ msgid "Partial Reconciliations"
msgstr "Lettrages partiels" msgstr "Lettrages partiels"
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile_method #: field:account.easy.reconcile.method,journal_id:0
msgid "reconcile method for account_easy_reconcile" #: field:easy.reconcile.base,journal_id:0
msgstr "Méthode de lettrage" #: field:easy.reconcile.options,journal_id:0
#: field:easy.reconcile.simple,journal_id:0
#: field:easy.reconcile.simple.name,journal_id:0
#: field:easy.reconcile.simple.partner,journal_id:0
#: field:easy.reconcile.simple.reference,journal_id:0
msgid "Journal"
msgstr "Journal"
#. module: account_easy_reconcile #. module: account_easy_reconcile
#: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_reference #: model:ir.model,name:account_easy_reconcile.model_easy_reconcile_simple_reference
@@ -407,19 +430,3 @@ msgstr "easy.reconcile.simple.reference"
#: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile #: model:ir.model,name:account_easy_reconcile.model_account_easy_reconcile
msgid "account easy reconcile" msgid "account easy reconcile"
msgstr "Lettrage automatisé" msgstr "Lettrage automatisé"
#~ msgid "Unreconciled Entries"
#~ msgstr "Écritures non lettrées"
#, fuzzy
#~ msgid "Partially Reconciled Entries"
#~ msgstr "Lettrages partiels"
#~ msgid "Task Information"
#~ msgstr "Information sur la tâche"
#~ msgid "Reconcile Method"
#~ msgstr "Méthode de lettrage"
#~ msgid "Log"
#~ msgstr "Historique"

View File

@@ -20,7 +20,7 @@
# #
{'name': "Bank statement completion from bank account number", {'name': "Bank statement completion from bank account number",
'version': '1.0', 'version': '1.0.1',
'author': 'ACSONE SA/NV', 'author': 'ACSONE SA/NV',
'maintainer': 'ACSONE SA/NV', 'maintainer': 'ACSONE SA/NV',
'category': 'Finance', 'category': 'Finance',
@@ -29,21 +29,20 @@
'account_statement_base_completion', 'account_statement_base_completion',
], ],
'description': """ 'description': """
Add a completion method based on the partner bank account number provided by the bank/office. Add a completion method based on the partner bank account number
provided by the bank/office.
Completion will look in the partner with that bank account number to match the partner, Completion will look in the partner with that bank account number
then it will fill in the bank statement line with it to ease the reconciliation. to match the partner, then it will fill in the bank statement line
with it to ease the reconciliation.
""", """,
'website': 'http://www.acsone.eu', 'website': 'http://www.acsone.eu',
'init_xml': [], 'data': [
'update_xml': [
"data.xml", "data.xml",
], ],
'demo_xml': [], 'demo': [],
'test': [],
'installable': True, 'installable': True,
'images': [], 'auto_install': False,
'auto_install': True,
'license': 'AGPL-3', 'license': 'AGPL-3',
} }

View File

@@ -3,7 +3,7 @@
<data noupdate="1"> <data noupdate="1">
<record id="bank_statement_completion_rule_10" model="account.statement.completion.rule"> <record id="bank_statement_completion_rule_10" model="account.statement.completion.rule">
<field name="name">Match from bank account number (Nomal or IBAN))</field> <field name="name">Match from bank account number (Normal or IBAN))</field>
<field name="sequence">10</field> <field name="sequence">10</field>
<field name="function_to_call">get_from_bank_account</field> <field name="function_to_call">get_from_bank_account</field>
</record> </record>

View File

@@ -0,0 +1,43 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_statement_bankaccount_completion
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 11:57+0000\n"
"PO-Revision-Date: 2014-01-21 11:57+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_statement_bankaccount_completion
#: help:account.bank.statement.line,partner_acc_number:0
msgid "Account number of the partner"
msgstr ""
#. module: account_statement_bankaccount_completion
#: model:ir.model,name:account_statement_bankaccount_completion.model_account_bank_statement_line
msgid "Bank Statement Line"
msgstr ""
#. module: account_statement_bankaccount_completion
#: code:addons/account_statement_bankaccount_completion/statement.py:68
#, python-format
msgid "Line named \"%s\" (Ref:%s) was matched by more than one partner for account number \"%s\"."
msgstr ""
#. module: account_statement_bankaccount_completion
#: field:account.bank.statement.line,partner_acc_number:0
msgid "Account Number"
msgstr ""
#. module: account_statement_bankaccount_completion
#: model:ir.model,name:account_statement_bankaccount_completion.model_account_statement_completion_rule
msgid "account.statement.completion.rule"
msgstr ""

View File

@@ -19,5 +19,5 @@
# #
############################################################################## ##############################################################################
import statement from . import partner
import partner from . import statement

View File

@@ -20,7 +20,7 @@
############################################################################## ##############################################################################
{'name': "Bank statement base completion", {'name': "Bank statement base completion",
'version': '1.0', 'version': '1.0.2',
'author': 'Camptocamp', 'author': 'Camptocamp',
'maintainer': 'Camptocamp', 'maintainer': 'Camptocamp',
'category': 'Finance', 'category': 'Finance',
@@ -35,7 +35,6 @@
1) Match from statement line label (based on partner field 'Bank Statement Label') 1) Match from statement line label (based on partner field 'Bank Statement Label')
2) Match from statement line label (based on partner name) 2) Match from statement line label (based on partner name)
3) Match from statement line reference (based on SO number)
3) Match from statement line reference (based on Invoice number) 3) Match from statement line reference (based on Invoice number)
You can easily override this module and add your own rules in your own one. The basic rules only You can easily override this module and add your own rules in your own one. The basic rules only
@@ -58,15 +57,19 @@
""", """,
'website': 'http://www.camptocamp.com', 'website': 'http://www.camptocamp.com',
'init_xml': [], 'data': [
'update_xml': [
'statement_view.xml', 'statement_view.xml',
'partner_view.xml', 'partner_view.xml',
'data.xml', 'data.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',
], ],
'demo_xml': [], 'demo': [],
'test': [], 'test': [
'test/partner.yml',
'test/invoice.yml',
'test/supplier_invoice.yml',
'test/completion_test.yml'
],
'installable': True, 'installable': True,
'images': [], 'images': [],
'auto_install': False, 'auto_install': False,

View File

@@ -14,12 +14,6 @@
<field name="function_to_call">get_from_label_and_partner_name</field> <field name="function_to_call">get_from_label_and_partner_name</field>
</record> </record>
<record id="bank_statement_completion_rule_1" model="account.statement.completion.rule">
<field name="name">Match from line reference (based on SO number)</field>
<field name="sequence">50</field>
<field name="function_to_call">get_from_ref_and_so</field>
</record>
<record id="bank_statement_completion_rule_4" model="account.statement.completion.rule"> <record id="bank_statement_completion_rule_4" model="account.statement.completion.rule">
<field name="name">Match from line reference (based on Invoice number)</field> <field name="name">Match from line reference (based on Invoice number)</field>
<field name="sequence">40</field> <field name="sequence">40</field>

View File

@@ -0,0 +1,216 @@
# Abkhazian translation for banking-addons
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
# This file is distributed under the same license as the banking-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: banking-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2014-01-21 11:57+0000\n"
"PO-Revision-Date: 2014-04-02 23:04+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Abkhazian <ab@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-03 06:06+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: account_statement_base_completion
#: view:account.statement.completion.rule:0
msgid "Related Profiles"
msgstr ""
#. module: account_statement_base_completion
#: help:account.bank.statement.line,label:0
msgid ""
"Generic field to store a label given from the bank/office on which we can "
"base the default/standard providen rule."
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:169
#, python-format
msgid ""
"Line named \"%s\" (Ref:%s) was matched by more than one partner while "
"looking on %s invoices"
msgstr ""
#. module: account_statement_base_completion
#: field:account.bank.statement,completion_logs:0
msgid "Completion Log"
msgstr ""
#. module: account_statement_base_completion
#: field:account.bank.statement.line,label:0
msgid "Label"
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement
msgid "Bank Statement"
msgstr ""
#. module: account_statement_base_completion
#: field:account.statement.completion.rule,function_to_call:0
msgid "Method"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:326
#, python-format
msgid ""
"Line named \"%s\" (Ref:%s) was matched by more than one partner while "
"looking on partner by name"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:504
#, python-format
msgid "Statement ID %s auto-completed for %s lines completed"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:500
#, python-format
msgid ""
"%s Bank Statement ID %s has %s lines completed by %s \n"
"%s\n"
"%s\n"
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement_line
msgid "Bank Statement Line"
msgstr ""
#. module: account_statement_base_completion
#: field:account.bank.statement.line,additionnal_bank_fields:0
msgid "Additionnal infos from bank"
msgstr ""
#. module: account_statement_base_completion
#: view:account.statement.profile:0
msgid "Auto-Completion Rules"
msgstr ""
#. module: account_statement_base_completion
#: view:account.bank.statement:0
msgid "Importation related infos"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:159
#: code:addons/account_statement_base_completion/statement.py:179
#, python-format
msgid "Invalid invoice type for completion: %"
msgstr ""
#. module: account_statement_base_completion
#: field:account.statement.completion.rule,name:0
msgid "Name"
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_statement_profile
msgid "Statement Profile"
msgstr ""
#. module: account_statement_base_completion
#: view:account.bank.statement:0
msgid "Auto Completion"
msgstr ""
#. module: account_statement_base_completion
#: view:account.statement.completion.rule:0
#: model:ir.actions.act_window,name:account_statement_base_completion.action_st_completion_rule_tree
#: model:ir.ui.menu,name:account_statement_base_completion.menu_action_st_completion_rule_tree_menu
msgid "Statement Completion Rule"
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_statement_completion_rule
msgid "account.statement.completion.rule"
msgstr ""
#. module: account_statement_base_completion
#: help:account.bank.statement.line,additionnal_bank_fields:0
msgid ""
"Used by completion and import system. Adds every field that is present in "
"your bank/office statement file"
msgstr ""
#. module: account_statement_base_completion
#: field:account.statement.completion.rule,profile_ids:0
#: field:account.statement.profile,rule_ids:0
msgid "Related statement profiles"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:158
#: code:addons/account_statement_base_completion/statement.py:178
#, python-format
msgid "System error"
msgstr ""
#. module: account_statement_base_completion
#: field:account.bank.statement.line,already_completed:0
msgid "Auto-Completed"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:448
#: code:addons/account_statement_base_completion/statement.py:466
#, python-format
msgid "ORM bypass error"
msgstr ""
#. module: account_statement_base_completion
#: field:account.statement.completion.rule,sequence:0
msgid "Sequence"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:280
#, python-format
msgid ""
"Line named \"%s\" (Ref:%s) was matched by more than one partner while "
"looking on partner label: %s"
msgstr ""
#. module: account_statement_base_completion
#: help:account.statement.completion.rule,sequence:0
msgid "Lower means parsed first."
msgstr ""
#. module: account_statement_base_completion
#: field:res.partner,bank_statement_label:0
msgid "Bank Statement Label"
msgstr ""
#. module: account_statement_base_completion
#: help:account.bank.statement.line,already_completed:0
msgid ""
"When this checkbox is ticked, the auto-completion process/button will ignore "
"this line."
msgstr ""
#. module: account_statement_base_completion
#: help:res.partner,bank_statement_label:0
msgid ""
"Enter the various label found on your bank statement separated by a ; If "
" one of this label is include in the bank statement line, the "
"partner will be automatically filled (as long as you use "
"this method/rules in your statement profile)."
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_res_partner
msgid "Partner"
msgstr ""
#. module: account_statement_base_completion
#: view:account.bank.statement:0
msgid "Completion Logs"
msgstr ""

View File

@@ -0,0 +1,199 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_statement_base_completion
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 11:57+0000\n"
"PO-Revision-Date: 2014-01-21 11:57+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_statement_base_completion
#: view:account.statement.completion.rule:0
msgid "Related Profiles"
msgstr ""
#. module: account_statement_base_completion
#: help:account.bank.statement.line,label:0
msgid "Generic field to store a label given from the bank/office on which we can base the default/standard providen rule."
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:169
#, python-format
msgid "Line named \"%s\" (Ref:%s) was matched by more than one partner while looking on %s invoices"
msgstr ""
#. module: account_statement_base_completion
#: field:account.bank.statement,completion_logs:0
msgid "Completion Log"
msgstr ""
#. module: account_statement_base_completion
#: field:account.bank.statement.line,label:0
msgid "Label"
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement
msgid "Bank Statement"
msgstr ""
#. module: account_statement_base_completion
#: field:account.statement.completion.rule,function_to_call:0
msgid "Method"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:326
#, python-format
msgid "Line named \"%s\" (Ref:%s) was matched by more than one partner while looking on partner by name"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:504
#, python-format
msgid "Statement ID %s auto-completed for %s lines completed"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:500
#, python-format
msgid "%s Bank Statement ID %s has %s lines completed by %s \n"
"%s\n"
"%s\n"
""
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement_line
msgid "Bank Statement Line"
msgstr ""
#. module: account_statement_base_completion
#: field:account.bank.statement.line,additionnal_bank_fields:0
msgid "Additionnal infos from bank"
msgstr ""
#. module: account_statement_base_completion
#: view:account.statement.profile:0
msgid "Auto-Completion Rules"
msgstr ""
#. module: account_statement_base_completion
#: view:account.bank.statement:0
msgid "Importation related infos"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:159
#: code:addons/account_statement_base_completion/statement.py:179
#, python-format
msgid "Invalid invoice type for completion: %"
msgstr ""
#. module: account_statement_base_completion
#: field:account.statement.completion.rule,name:0
msgid "Name"
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_statement_profile
msgid "Statement Profile"
msgstr ""
#. module: account_statement_base_completion
#: view:account.bank.statement:0
msgid "Auto Completion"
msgstr ""
#. module: account_statement_base_completion
#: view:account.statement.completion.rule:0
#: model:ir.actions.act_window,name:account_statement_base_completion.action_st_completion_rule_tree
#: model:ir.ui.menu,name:account_statement_base_completion.menu_action_st_completion_rule_tree_menu
msgid "Statement Completion Rule"
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_statement_completion_rule
msgid "account.statement.completion.rule"
msgstr ""
#. module: account_statement_base_completion
#: help:account.bank.statement.line,additionnal_bank_fields:0
msgid "Used by completion and import system. Adds every field that is present in your bank/office statement file"
msgstr ""
#. module: account_statement_base_completion
#: field:account.statement.completion.rule,profile_ids:0
#: field:account.statement.profile,rule_ids:0
msgid "Related statement profiles"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:158
#: code:addons/account_statement_base_completion/statement.py:178
#, python-format
msgid "System error"
msgstr ""
#. module: account_statement_base_completion
#: field:account.bank.statement.line,already_completed:0
msgid "Auto-Completed"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:448
#: code:addons/account_statement_base_completion/statement.py:466
#, python-format
msgid "ORM bypass error"
msgstr ""
#. module: account_statement_base_completion
#: field:account.statement.completion.rule,sequence:0
msgid "Sequence"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:280
#, python-format
msgid "Line named \"%s\" (Ref:%s) was matched by more than one partner while looking on partner label: %s"
msgstr ""
#. module: account_statement_base_completion
#: help:account.statement.completion.rule,sequence:0
msgid "Lower means parsed first."
msgstr ""
#. module: account_statement_base_completion
#: field:res.partner,bank_statement_label:0
msgid "Bank Statement Label"
msgstr ""
#. module: account_statement_base_completion
#: help:account.bank.statement.line,already_completed:0
msgid "When this checkbox is ticked, the auto-completion process/button will ignore this line."
msgstr ""
#. module: account_statement_base_completion
#: help:res.partner,bank_statement_label:0
msgid "Enter the various label found on your bank statement separated by a ; If one of this label is include in the bank statement line, the partner will be automatically filled (as long as you use this method/rules in your statement profile)."
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_res_partner
msgid "Partner"
msgstr ""
#. module: account_statement_base_completion
#: view:account.bank.statement:0
msgid "Completion Logs"
msgstr ""

View File

@@ -1,153 +1,193 @@
# French translation for banking-addons
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
# This file is distributed under the same license as the banking-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: banking-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2014-01-21 11:57+0000\n"
"PO-Revision-Date: 2014-03-21 15:17+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: French <fr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-22 07:11+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: view:account.statement.completion.rule:0 #: view:account.statement.completion.rule:0
msgid "Related Profiles" msgid "Related Profiles"
msgstr "Profils liés" msgstr ""
#. module: account_statement_base_completion
#: help:account.statement.completion.rule,sequence:0
msgid "Lower means parsed first."
msgstr "Plus petite séquence analysée en premier."
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:150
#: code:addons/account_statement_base_completion/statement.py:182
#: code:addons/account_statement_base_completion/statement.py:219
#: code:addons/account_statement_base_completion/statement.py:252
#, python-format
msgid "Line named \"%s\" (Ref:%s) was matched by more than one partner."
msgstr "La ligne nommée \"%s\" (Ref:%s) correspond à plusieurs partenaires."
#. module: account_statement_base_completion
#: field:account.bank.statement,completion_logs:0
msgid "Completion Log"
msgstr "Journal des complétions"
#. module: account_statement_base_completion
#: field:account.bank.statement.line,label:0
msgid "Label"
msgstr "Description"
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: help:account.bank.statement.line,label:0 #: help:account.bank.statement.line,label:0
msgid "" msgid ""
"Generiy field to store a label given from the bank/office on which we " "Generic field to store a label given from the bank/office on which we can "
"can base the default/standard providen rule." "base the default/standard providen rule."
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:169
#, python-format
msgid ""
"Line named \"%s\" (Ref:%s) was matched by more than one partner while "
"looking on %s invoices"
msgstr ""
#. module: account_statement_base_completion
#: field:account.bank.statement,completion_logs:0
msgid "Completion Log"
msgstr ""
#. module: account_statement_base_completion
#: field:account.bank.statement.line,label:0
msgid "Label"
msgstr "" msgstr ""
"Ce champs permet de stocker une description complémentaire fournie par la banque."
"Le lettrage avancé pourra être effectué sur ce critère."
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement #: model:ir.model,name:account_statement_base_completion.model_account_bank_statement
msgid "Bank Statement" msgid "Bank Statement"
msgstr "Relevé bancaire" msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: field:account.statement.completion.rule,function_to_call:0 #: field:account.statement.completion.rule,function_to_call:0
msgid "Method" msgid "Method"
msgstr "Méthode" msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:352 #: code:addons/account_statement_base_completion/statement.py:326
#, python-format #, python-format
msgid "Bank Statement ID %s has %s lines completed by %s"
msgstr "Le relevé bancaire avec l'ID %s a %s lignes completées par %s"
#. module: account_statement_base_completion
#: field:account.bank.statement.line,additionnal_bank_fields:0
msgid "Additionnal infos from bank"
msgstr "Informations additionnelles de la banque"
#. module: account_statement_base_completion
#: view:account.statement.profile:0
msgid "Auto-Completion Rules"
msgstr "Règles d'auto-complétion"
#. module: account_statement_base_completion
#: help:account.bank.statement.line,additionnal_bank_fields:0
msgid "" msgid ""
"Used by completion and import system. Adds every field that is present in " "Line named \"%s\" (Ref:%s) was matched by more than one partner while "
"your bank/office statement file" "looking on partner by name"
msgstr "" msgstr ""
"Utilisé au niveau de l'auto-complétion et de l'import. Permet l'ajout de n'importe quel "
"champs additionnel communiqué par la banque"
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: view:account.bank.statement:0 #: code:addons/account_statement_base_completion/statement.py:504
msgid "Importation related infos" #, python-format
msgstr "Importation des informations liées" msgid "Statement ID %s auto-completed for %s lines completed"
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_statement_profile #. module: account_statement_base_completion
msgid "Statement Profil" #: code:addons/account_statement_base_completion/statement.py:500
msgstr "Profil de relevé" #, python-format
msgid ""
#. module: account_statement_base_completion "%s Bank Statement ID %s has %s lines completed by %s \n"
#: field:account.statement.completion.rule,name:0 "%s\n"
msgid "Name" "%s\n"
msgstr "Nom"
#. module: account_statement_base_completion
#: constraint:account.statement.profile:0
msgid "You need to put a partner if you tic the 'Force partner on bank move' !"
msgstr "" msgstr ""
"Vous devez indiquer un partenaire si vous avez coché 'Indiquer un partenaire sur la ligne d'écriture de la banque' !"
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_bank_statement_line #: model:ir.model,name:account_statement_base_completion.model_account_bank_statement_line
msgid "Bank Statement Line" msgid "Bank Statement Line"
msgstr "Ligne de relevé bancaire" msgstr ""
#. module: account_statement_base_completion
#: field:account.bank.statement.line,additionnal_bank_fields:0
msgid "Additionnal infos from bank"
msgstr ""
#. module: account_statement_base_completion
#: view:account.statement.profile:0
msgid "Auto-Completion Rules"
msgstr ""
#. module: account_statement_base_completion
#: view:account.bank.statement:0
msgid "Importation related infos"
msgstr ""
#. module: account_statement_base_completion
#: code:addons/account_statement_base_completion/statement.py:159
#: code:addons/account_statement_base_completion/statement.py:179
#, python-format
msgid "Invalid invoice type for completion: %"
msgstr ""
#. module: account_statement_base_completion
#: field:account.statement.completion.rule,name:0
msgid "Name"
msgstr ""
#. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_statement_profile
msgid "Statement Profile"
msgstr ""
#. module: account_statement_base_completion
#: view:account.bank.statement:0
msgid "Auto Completion"
msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: view:account.statement.completion.rule:0 #: view:account.statement.completion.rule:0
#: model:ir.actions.act_window,name:account_statement_base_completion.action_st_completion_rule_tree #: model:ir.actions.act_window,name:account_statement_base_completion.action_st_completion_rule_tree
#: model:ir.ui.menu,name:account_statement_base_completion.menu_action_st_completion_rule_tree_menu #: model:ir.ui.menu,name:account_statement_base_completion.menu_action_st_completion_rule_tree_menu
msgid "Statement Completion Rule" msgid "Statement Completion Rule"
msgstr "Règle d'auto-complétion du relevé" msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_account_statement_completion_rule #: model:ir.model,name:account_statement_base_completion.model_account_statement_completion_rule
msgid "account.statement.completion.rule" msgid "account.statement.completion.rule"
msgstr "account.statement.completion.rule" msgstr ""
#. module: account_statement_base_completion
#: help:account.bank.statement.line,additionnal_bank_fields:0
msgid ""
"Used by completion and import system. Adds every field that is present in "
"your bank/office statement file"
msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: field:account.statement.completion.rule,profile_ids:0 #: field:account.statement.completion.rule,profile_ids:0
#: field:account.statement.profile,rule_ids:0 #: field:account.statement.profile,rule_ids:0
msgid "Related statement profiles" msgid "Related statement profiles"
msgstr "Profils liés" msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: constraint:account.bank.statement.line:0 #: code:addons/account_statement_base_completion/statement.py:158
msgid "" #: code:addons/account_statement_base_completion/statement.py:178
"The amount of the voucher must be the same amount as the one on the " #, python-format
"statement line" msgid "System error"
msgstr "" msgstr ""
"Le montant du justificatif doit être identique à celui de la ligne le "
"concernant sur le relevé"
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: field:account.bank.statement.line,already_completed:0 #: field:account.bank.statement.line,already_completed:0
msgid "Auto-Completed" msgid "Auto-Completed"
msgstr "Auto-Completé" msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: view:account.bank.statement:0 #: code:addons/account_statement_base_completion/statement.py:448
msgid "Auto Completion" #: code:addons/account_statement_base_completion/statement.py:466
msgstr "Auto-complétion" #, python-format
msgid "ORM bypass error"
msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: field:account.statement.completion.rule,sequence:0 #: field:account.statement.completion.rule,sequence:0
msgid "Sequence" msgid "Sequence"
msgstr "Séquence" msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: constraint:account.bank.statement:0 #: code:addons/account_statement_base_completion/statement.py:280
msgid "The journal and period chosen have to belong to the same company." #, python-format
msgstr "Le journal et la période doivent appartenir à la même société." msgid ""
"Line named \"%s\" (Ref:%s) was matched by more than one partner while "
"looking on partner label: %s"
msgstr ""
#. module: account_statement_base_completion
#: help:account.statement.completion.rule,sequence:0
msgid "Lower means parsed first."
msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: field:res.partner,bank_statement_label:0 #: field:res.partner,bank_statement_label:0
msgid "Bank Statement Label" msgid "Bank Statement Label"
msgstr "Description de relevé bancaire" msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: help:account.bank.statement.line,already_completed:0 #: help:account.bank.statement.line,already_completed:0
@@ -155,26 +195,22 @@ msgid ""
"When this checkbox is ticked, the auto-completion process/button will ignore " "When this checkbox is ticked, the auto-completion process/button will ignore "
"this line." "this line."
msgstr "" msgstr ""
"Les lignes cochées seront ignorées lorsque vous cliquez sur le bouton auto-complétion"
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: help:res.partner,bank_statement_label:0 #: help:res.partner,bank_statement_label:0
msgid "" msgid ""
"Enter the various label found on your bank statement separated by a ; " "Enter the various label found on your bank statement separated by a ; If "
"If one of this label is include in the bank statement line, " " one of this label is include in the bank statement line, the "
"the partner will be automatically filled (as long as you " "partner will be automatically filled (as long as you use "
"use this method/rules in your statement profile)." "this method/rules in your statement profile)."
msgstr "" msgstr ""
"Entrez les différentes descriptions/informations sur votre relevé bancaire séparées par un ';' "
"Si l'une d'entre elles figure dans la ligne du relevé, le partenaire correspondant pourra"
"être automatiquement retrouvé (à condition d'utiliser un règle de lettrage dans le profil)."
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: model:ir.model,name:account_statement_base_completion.model_res_partner #: model:ir.model,name:account_statement_base_completion.model_res_partner
msgid "Partner" msgid "Partner"
msgstr "Partenaire" msgstr ""
#. module: account_statement_base_completion #. module: account_statement_base_completion
#: view:account.bank.statement:0 #: view:account.bank.statement:0
msgid "Completion Logs" msgid "Completion Logs"
msgstr "Journaux d'auto-complétion" msgstr ""

View File

@@ -23,6 +23,7 @@ import traceback
import sys import sys
import logging import logging
import simplejson import simplejson
import inspect
import psycopg2 import psycopg2
@@ -73,14 +74,13 @@ class AccountStatementProfil(orm.Model):
rel='as_rul_st_prof_rel'), rel='as_rul_st_prof_rel'),
} }
def _get_callable(self, cr, uid, profile, context=None): def _get_rules(self, cr, uid, profile, context=None):
if isinstance(profile, (int, long)): if isinstance(profile, (int, long)):
prof = self.browse(cr, uid, profile, context=context) prof = self.browse(cr, uid, profile, context=context)
else: else:
prof = profile prof = profile
# We need to respect the sequence order # We need to respect the sequence order
sorted_array = sorted(prof.rule_ids, key=attrgetter('sequence')) return sorted(prof.rule_ids, key=attrgetter('sequence'))
return tuple((x.function_to_call for x in sorted_array))
def _find_values_from_rules(self, cr, uid, calls, line, context=None): def _find_values_from_rules(self, cr, uid, calls, line, context=None):
""" """
@@ -99,12 +99,15 @@ class AccountStatementProfil(orm.Model):
if context is None: if context is None:
context = {} context = {}
if not calls: if not calls:
calls = self._get_callable(cr, uid, line['profile_id'], context=context) calls = self._get_rules(cr, uid, line['profile_id'], context=context)
rule_obj = self.pool.get('account.statement.completion.rule') rule_obj = self.pool.get('account.statement.completion.rule')
for call in calls: for call in calls:
method_to_call = getattr(rule_obj, call) method_to_call = getattr(rule_obj, call.function_to_call)
result = method_to_call(cr, uid, line, context) if len(inspect.getargspec(method_to_call).args) == 6:
result = method_to_call(cr, uid, call.id, line, context)
else:
result = method_to_call(cr, uid, line, context)
if result: if result:
result['already_completed'] = True result['already_completed'] = True
return result return result
@@ -132,7 +135,6 @@ class AccountStatementCompletionRule(orm.Model):
return [ return [
('get_from_ref_and_invoice', 'From line reference (based on customer invoice number)'), ('get_from_ref_and_invoice', 'From line reference (based on customer invoice number)'),
('get_from_ref_and_supplier_invoice', 'From line reference (based on supplier invoice number)'), ('get_from_ref_and_supplier_invoice', 'From line reference (based on supplier invoice number)'),
('get_from_ref_and_so', 'From line reference (based on SO number)'),
('get_from_label_and_partner_field', 'From line label (based on partner field)'), ('get_from_label_and_partner_field', 'From line label (based on partner field)'),
('get_from_label_and_partner_name', 'From line label (based on partner name)')] ('get_from_label_and_partner_name', 'From line label (based on partner name)')]
@@ -232,49 +234,6 @@ class AccountStatementCompletionRule(orm.Model):
""" """
return self._from_invoice(cr, uid, line, 'customer', context=context) return self._from_invoice(cr, uid, line, 'customer', context=context)
# Should be private but data are initialised with no update XML
def get_from_ref_and_so(self, cr, uid, st_line, context=None):
"""
Match the partner based on the SO number and the reference of the statement
line. Then, call the generic get_values_for_line method to complete other values.
If more than one partner matched, raise the ErrorTooManyPartner error.
:param int/long st_line: read of the concerned account.bank.statement.line
:return:
A dict of value that can be passed directly to the write method of
the statement line or {}
{'partner_id': value,
'account_id': value,
...}
"""
st_obj = self.pool.get('account.bank.statement.line')
res = {}
if st_line:
so_obj = self.pool.get('sale.order')
so_id = so_obj.search(cr,
uid,
[('name', '=', st_line['ref'])],
context=context)
if so_id:
if so_id and len(so_id) == 1:
so = so_obj.browse(cr, uid, so_id[0], context=context)
res['partner_id'] = so.partner_id.id
elif so_id and len(so_id) > 1:
raise ErrorTooManyPartner(_('Line named "%s" (Ref:%s) was matched by more '
'than one partner while looking on SO by ref.') %
(st_line['name'], st_line['ref']))
st_vals = st_obj.get_values_for_line(cr,
uid,
profile_id=st_line['profile_id'],
master_account_id=st_line['master_account_id'],
partner_id=res.get('partner_id', False),
line_type='customer',
amount=st_line['amount'] if st_line['amount'] else 0.0,
context=context)
res.update(st_vals)
return res
# Should be private but data are initialised with no update XML # Should be private but data are initialised with no update XML
def get_from_label_and_partner_field(self, cr, uid, st_line, context=None): def get_from_label_and_partner_field(self, cr, uid, st_line, context=None):
""" """
@@ -360,9 +319,12 @@ class AccountStatementCompletionRule(orm.Model):
if not context['partner_memoizer']: if not context['partner_memoizer']:
return res return res
st_obj = self.pool.get('account.bank.statement.line') st_obj = self.pool.get('account.bank.statement.line')
sql = "SELECT id FROM res_partner WHERE name ~* %s and id in %s" # regexp_replace(name,'([^a-zA-Z0-9 -])', '\\\1', 'g'), 'i') escape the column name to avoid false positive. (ex 'jho..doe' -> 'joh\.\.doe'
pattern = ".*%s.*" % re.escape(st_line['name']) sql = """SELECT id FROM (
cr.execute(sql, (pattern, context['partner_memoizer'])) SELECT id, regexp_matches(%s, regexp_replace(name,'([^[:alpha:]0-9 -])', %s, 'g'), 'i') AS name_match FROM res_partner
WHERE id IN %s) AS res_patner_matcher
WHERE name_match IS NOT NULL"""
cr.execute(sql, (st_line['name'], r"\\\1", context['partner_memoizer']))
result = cr.fetchall() result = cr.fetchall()
if not result: if not result:
return res return res
@@ -373,7 +335,7 @@ class AccountStatementCompletionRule(orm.Model):
res['partner_id'] = result[0][0] res['partner_id'] = result[0][0]
st_vals = st_obj.get_values_for_line(cr, st_vals = st_obj.get_values_for_line(cr,
uid, uid,
profile_id=st_line['porfile_id'], profile_id=st_line['profile_id'],
master_account_id=st_line['master_account_id'], master_account_id=st_line['master_account_id'],
partner_id=res['partner_id'], partner_id=res['partner_id'],
line_type=False, line_type=False,
@@ -478,7 +440,7 @@ class AccountStatementLine(orm.Model):
""" """
statement_line_obj = self.pool['account.bank.statement.line'] statement_line_obj = self.pool['account.bank.statement.line']
model_cols = statement_line_obj._columns model_cols = statement_line_obj._columns
sparse_fields = dict([(k , col) for k, col in model_cols.iteritems() if isinstance(col, fields.sparse) and col._type == 'char']) sparse_fields = dict([(k, col) for k, col in model_cols.iteritems() if isinstance(col, fields.sparse) and col._type == 'char'])
values = [] values = []
for statement in statement_store: for statement in statement_store:
to_json_k = set() to_json_k = set()
@@ -489,11 +451,10 @@ class AccountStatementLine(orm.Model):
serialized = st_copy.setdefault(col.serialization_field, {}) serialized = st_copy.setdefault(col.serialization_field, {})
serialized[k] = st_copy[k] serialized[k] = st_copy[k]
for k in to_json_k: for k in to_json_k:
st_copy[k] = simplejson.dumps(st_copy[k]) st_copy[k] = simplejson.dumps(st_copy[k])
values.append(st_copy) values.append(st_copy)
return values return values
def _insert_lines(self, cr, uid, statement_store, context=None): def _insert_lines(self, cr, uid, statement_store, context=None):
""" Do raw insert into database because ORM is awfully slow """ Do raw insert into database because ORM is awfully slow
when doing batch write. It is a shame that batch function when doing batch write. It is a shame that batch function
@@ -530,7 +491,7 @@ class AccountStatementLine(orm.Model):
sql_err.pgerror) sql_err.pgerror)
class AccountBankSatement(orm.Model): class AccountBankStatement(orm.Model):
""" """
We add a basic button and stuff to support the auto-completion We add a basic button and stuff to support the auto-completion
of the bank statement once line have been imported or manually fullfill. of the bank statement once line have been imported or manually fullfill.
@@ -554,18 +515,21 @@ class AccountBankSatement(orm.Model):
""" """
user_name = self.pool.get('res.users').read(cr, uid, uid, user_name = self.pool.get('res.users').read(cr, uid, uid,
['name'], context=context)['name'] ['name'], context=context)['name']
statement = self.browse(cr, uid, stat_id, context=context)
number_line = len(statement.line_ids)
log = self.read(cr, uid, stat_id, ['completion_logs'], log = self.read(cr, uid, stat_id, ['completion_logs'],
context=context)['completion_logs'] context=context)['completion_logs']
log = log if log else "" log = log if log else ""
completion_date = datetime.datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT) completion_date = datetime.datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)
message = (_("%s Bank Statement ID %s has %s lines completed by %s \n%s\n%s\n") % message = (_("%s Bank Statement ID %s has %s/%s lines completed by %s \n%s\n%s\n") %
(completion_date, stat_id, number_imported, user_name, error_msg, log)) (completion_date, stat_id, number_imported, number_line, user_name,
error_msg, log))
self.write(cr, uid, [stat_id], {'completion_logs': message}, context=context) self.write(cr, uid, [stat_id], {'completion_logs': message}, context=context)
body = (_('Statement ID %s auto-completed for %s lines completed') % body = (_('Statement ID %s auto-completed for %s/%s lines completed') %
(stat_id, number_imported)), (stat_id, number_imported, number_line)),
self.message_post(cr, uid, self.message_post(cr, uid,
[stat_id], [stat_id],
body=body, body=body,
@@ -589,7 +553,7 @@ class AccountBankSatement(orm.Model):
ctx = context.copy() ctx = context.copy()
ctx['line_ids'] = tuple((x.id for x in stat.line_ids)) ctx['line_ids'] = tuple((x.id for x in stat.line_ids))
b_profile = stat.profile_id b_profile = stat.profile_id
rules = profile_obj._get_callable(cr, uid, b_profile, context=context) rules = profile_obj._get_rules(cr, uid, b_profile, context=context)
profile_id = b_profile.id # Only for perfo even it gains almost nothing profile_id = b_profile.id # Only for perfo even it gains almost nothing
master_account_id = b_profile.receivable_account_id master_account_id = b_profile.receivable_account_id
master_account_id = master_account_id.id if master_account_id else False master_account_id = master_account_id.id if master_account_id else False

View File

@@ -0,0 +1,87 @@
-
In order to test the banking framework, I first need to create a profile
-
!record {model: account.statement.profile, id: profile_test1}:
name: Bank EUR Profile
journal_id: account.bank_journal
commission_account_id: account.a_expense
company_id: base.main_company
balance_check: True
rule_ids:
- bank_statement_completion_rule_4
- bank_statement_completion_rule_5
- bank_statement_completion_rule_2
- bank_statement_completion_rule_3
-
Now I create a statement. I create statment lines separately because I need
to find each one by XML id
-
!record {model: account.bank.statement, id: statement_test1}:
name: Statement 2
profile_id: profile_test1
company_id: base.main_company
-
I create a statement line for a CI
-
!record {model: account.bank.statement.line, id: statement_line_ci}:
name: Test autocompletion based on Customer Invoice Number
statement_id: statement_test1
ref: CI0001
date: '2013-12-20'
amount: 210.0
-
I create a statement line for a SI
-
!record {model: account.bank.statement.line, id: statement_line_si}:
name: Test autocompletion based on Supplier Invoice Number
statement_id: statement_test1
ref: T2S12345
date: '2013-12-19'
amount: -65.0
-
I create a statement line for the Partner Name
-
!record {model: account.bank.statement.line, id: statement_line_partner_name}:
name: Test autocompletion based on Partner Name Vauxoo
statement_id: statement_test1
ref: /
date: '2013-12-17'
amount: 600.0
-
I create a statement line for the Partner Label
-
!record {model: account.bank.statement.line, id: statement_line_partner_label}:
name: test autocompletion based on text (XXX66Z) matching with partner form information (note that Ref does not exist)
statement_id: statement_test1
ref: ZU788
date: '2013-12-24'
amount: -932.4
-
I run the auto complete
-
!python {model: account.bank.statement}: |
result = self.button_auto_completion(cr, uid, [ref("statement_test1")])
-
Now I can check that all is nice and shiny, line 1. I expect the Customer
Invoice Number to be recognised.
I Use _ref, because ref conflicts with the field ref of the statement line
-
!assert {model: account.bank.statement.line, id: statement_line_ci, string: Check completion by CI number}:
- partner_id.id == _ref("base.res_partner_12")
-
Line 2. I expect the Supplier invoice number to be recognised. The supplier
invoice was created by the account module demo data, and we confirmed it
here.
-
!assert {model: account.bank.statement.line, id: statement_line_si, string: Check completion by SI number}:
- partner_id.id == _ref("base.res_partner_17")
-
Line 3. I check that the partner name has been recognised.
-
!assert {model: account.bank.statement.line, id: statement_line_partner_name, string: Check completion by partner name}:
- partner_id.name == 'Vauxoo'
-
Line 4. I check that the partner special label has been recognised.
-
!assert {model: account.bank.statement.line, id: statement_line_partner_label, string: Check completion by partner label}:
- partner_id.id == _ref("base.res_partner_6")

View File

@@ -0,0 +1,32 @@
-
I create a customer Invoice to be found by the completion.
-
!record {model: account.invoice, id: invoice_for_completion_1}:
account_id: account.a_recv
company_id: base.main_company
currency_id: base.EUR
internal_number: CI0001
invoice_line:
- account_id: account.a_sale
name: '[PCSC234] PC Assemble SC234'
price_unit: 210.0
quantity: 1.0
product_id: product.product_product_3
uos_id: product.product_uom_unit
journal_id: account.bank_journal
partner_id: base.res_partner_12
reference_type: none
-
I confirm the Invoice
-
!workflow {model: account.invoice, action: invoice_open, ref: invoice_for_completion_1}
-
I check that the invoice state is "Open"
-
!assert {model: account.invoice, id: invoice_for_completion_1}:
- state == 'open'
-
I check that it is given the number "CI0001"
-
!assert {model: account.invoice, id: invoice_for_completion_1, string: Check CI number}:
- number == 'CI0001'

View File

@@ -0,0 +1,5 @@
-
I fill in the field Bank Statement Label in a Partner
-
!record {model: res.partner, id: base.res_partner_6}:
bank_statement_label: XXX66Z

View File

@@ -0,0 +1,31 @@
-
I check that my invoice is a supplier invoice
-
!assert {model: account.invoice, id: account.demo_invoice_0, string: Check invoice type}:
- type == 'in_invoice'
-
I add a reference to an existing supplier invoce
-
!python {model: account.invoice}: |
self.write(cr, uid, ref('account.demo_invoice_0'), {
'supplier_invoice_number': 'T2S12345'
})
-
I check a second time that my invoice is still a supplier invoice
-
!assert {model: account.invoice, id: account.demo_invoice_0, string: Check invoice type 2}:
- type == 'in_invoice'
-
Now I confirm it
-
!workflow {model: account.invoice, action: invoice_open, ref: account.demo_invoice_0}
-
I check that the supplier number is there
-
!assert {model: account.invoice, id: account.demo_invoice_0, string: Check supplier number}:
- supplier_invoice_number == 'T2S12345'
-
I check a third time that my invoice is still a supplier invoice
-
!assert {model: account.invoice, id: account.demo_invoice_0, string: Check invoice type 3}:
- type == 'in_invoice'

View File

@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
#
#
# Authors: Laurent Mignon
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
# All Rights Reserved
#
# 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 . import test_base_completion
checks = [
test_base_completion
]

View File

@@ -0,0 +1,95 @@
# -*- coding: utf-8 -*-
#
#
# Authors: Laurent Mignon
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
# All Rights Reserved
#
# 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.tests import common
import time
from collections import namedtuple
name_completion_case = namedtuple("name_completion_case", ["partner_name", "line_label", "should_match"])
NAMES_COMPLETION_CASES = [
name_completion_case("Acsone", "Line for Acsone SA", True),
name_completion_case("Acsone", "Line for Acsone", True),
name_completion_case("Acsone", "Acsone for line", True),
name_completion_case("acsone", "Acsone for line", True),
name_completion_case("Acsone SA", "Line for Acsone SA test", True),
name_completion_case("Ac..ne", "Acsone for line", False),
name_completion_case("é@|r{}", "Acsone é@|r{} for line", True),
name_completion_case("Acsone", "A..one for line", False),
name_completion_case("A.one SA", "A.one SA for line", True),
name_completion_case("Acsone SA", "Line for Acsone ([^a-zA-Z0-9 -]) SA test", False),
name_completion_case("Acsone ([^a-zA-Z0-9 -]) SA", "Line for Acsone ([^a-zA-Z0-9 -]) SA test", True),
]
class base_completion(common.TransactionCase):
def setUp(self):
super(base_completion, self).setUp()
self.company_a = self.browse_ref('base.main_company')
self.profile_obj = self.registry("account.statement.profile")
self.partner_obj = self.registry("res.partner")
self.account_bank_statement_obj = self.registry("account.bank.statement")
self.account_bank_statement_line_obj = self.registry("account.bank.statement.line")
self.journal_id = self.ref("account.bank_journal")
self.partner_id = self.ref('base.main_partner')
self.account_id = self.ref("account.a_recv")
self.partner_id = self.ref("base.res_partner_12")
def test_name_completion(self):
"""Test complete partner_id from statement line label
Test the automatic completion of the partner_id based if the name of the partner appears in
the statement line label
"""
self.completion_rule_id = self.ref('account_statement_base_completion.bank_statement_completion_rule_3')
# Create the profile
self.profile_id = self.profile_obj.create(self.cr, self.uid, {
"name": "TEST",
"commission_account_id": self.account_id,
"journal_id": self.journal_id,
"rule_ids": [(6, 0, [self.completion_rule_id])]})
# Create a bank statement
self.statement_id = self.account_bank_statement_obj.create(self.cr, self.uid, {
"balance_end_real": 0.0,
"balance_start": 0.0,
"date": time.strftime('%Y-%m-%d'),
"journal_id": self.journal_id,
"profile_id": self.profile_id
})
for case in NAMES_COMPLETION_CASES:
self.partner_obj.write(self.cr, self.uid, self.partner_id, {'name': case.partner_name})
statement_line_id = self.account_bank_statement_line_obj.create(self.cr, self.uid, {
'amount': 1000.0,
'name': case.line_label,
'ref': 'My ref',
'statement_id': self.statement_id,
})
statement_line = self.account_bank_statement_line_obj.browse(self.cr, self.uid, statement_line_id)
self.assertFalse(statement_line.partner_id, "Partner_id must be blank before completion")
statement_obj = self.account_bank_statement_obj.browse(self.cr, self.uid, self.statement_id)
statement_obj.button_auto_completion()
statement_line = self.account_bank_statement_line_obj.browse(self.cr, self.uid, statement_line_id)
if case.should_match:
self.assertEquals(self.partner_id, statement_line.partner_id['id'],
"Missing expected partner id after completion (partner_name: %s, line_name: %s)" % (case.partner_name, case.line_label))
else:
self.assertNotEquals(self.partner_id, statement_line.partner_id['id'],
"Partner id should be empty after completion(partner_name: %s, line_name: %s)" % (case.partner_name, case.line_label))

View File

@@ -20,7 +20,7 @@
############################################################################## ##############################################################################
{'name': "Bank statement base import", {'name': "Bank statement base import",
'version': '1.0', 'version': '1.1.1',
'author': 'Camptocamp', 'author': 'Camptocamp',
'maintainer': 'Camptocamp', 'maintainer': 'Camptocamp',
'category': 'Finance', 'category': 'Finance',

View File

@@ -0,0 +1,289 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_statement_base_import
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 11:58+0000\n"
"PO-Revision-Date: 2014-01-21 11:58+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_statement_base_import
#: view:credit.statement.import:0
#: model:ir.actions.act_window,name:account_statement_base_import.statement_importer_action
msgid "Import statement"
msgstr ""
#. module: account_statement_base_import
#: view:account.statement.profile:0
msgid "Historical Import Logs"
msgstr ""
#. module: account_statement_base_import
#: model:ir.model,name:account_statement_base_import.model_credit_statement_import
msgid "credit.statement.import"
msgstr ""
#. module: account_statement_base_import
#: field:credit.statement.import,input_statement:0
msgid "Statement file"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:168
#, python-format
msgid "Column %s you try to import is not present in the bank statement line!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:162
#, python-format
msgid "Nothing to import"
msgstr ""
#. module: account_statement_base_import
#: field:credit.statement.import,journal_id:0
msgid "Financial journal to use transaction"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:108
#, python-format
msgid "Column %s not present in file"
msgstr ""
#. module: account_statement_base_import
#: view:account.statement.profile:0
#: model:ir.ui.menu,name:account_statement_base_import.statement_importer_menu
msgid "Import Bank Statement"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:54
#, python-format
msgid "User Error"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:223
#, python-format
msgid "The statement cannot be created: %s"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:167
#, python-format
msgid "Missing column!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/parser.py:150
#, python-format
msgid "No buffer file given."
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:107
#: code:addons/account_statement_base_import/parser/file_parser.py:171
#: code:addons/account_statement_base_import/parser/file_parser.py:205
#, python-format
msgid "Invalid data"
msgstr ""
#. module: account_statement_base_import
#: field:account.statement.profile,launch_import_completion:0
msgid "Launch completion after import"
msgstr ""
#. module: account_statement_base_import
#: field:credit.statement.import,partner_id:0
msgid "Credit insitute partner"
msgstr ""
#. module: account_statement_base_import
#: view:account.statement.profile:0
msgid "Import related infos"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:163
#, python-format
msgid "The file is empty"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/wizard/import_statement.py:90
#, python-format
msgid "Please use a file with an extention"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:172
#: code:addons/account_statement_base_import/parser/file_parser.py:206
#, python-format
msgid "Value %s of column %s is not valid.\n"
" Please check the line with ref %s:\n"
" \n"
" Detail: %s"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:29
#: code:addons/account_statement_base_import/parser/generic_file_parser.py:30
#, python-format
msgid "Please install python lib xlrd"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:160
#, python-format
msgid " It should be YYYY-MM-DD for column: %s value: %s \n"
" \n"
" \n"
" Please check the line with ref: %s \n"
" \n"
" Detail: %s"
msgstr ""
#. module: account_statement_base_import
#: field:account.statement.profile,last_import_date:0
msgid "Last Import Date"
msgstr ""
#. module: account_statement_base_import
#: model:ir.model,name:account_statement_base_import.model_account_statement_profile
msgid "Statement Profile"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:222
#, python-format
msgid "Statement import error"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:193
#, python-format
msgid "Please modify the cell formatting to date format for column: %s value: %s\n"
" Please check the line with ref: %s\n"
" \n"
" Detail: %s"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:192
#, python-format
msgid "Date format is not valid"
msgstr ""
#. module: account_statement_base_import
#: field:account.statement.profile,import_type:0
msgid "Type of import"
msgstr ""
#. module: account_statement_base_import
#: help:account.statement.profile,launch_import_completion:0
msgid "Tic that box to automatically launch the completion on each imported file using this profile."
msgstr ""
#. module: account_statement_base_import
#: help:credit.statement.import,balance_check:0
msgid "Tic that box if you want OpenERP to control the start/end balance before confirming a bank statement. If don't ticked, no balance control will be done."
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:154
#, python-format
msgid "No Profile!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:159
#, python-format
msgid "Date format is not valid."
msgstr ""
#. module: account_statement_base_import
#: field:credit.statement.import,profile_id:0
msgid "Import configuration parameter"
msgstr ""
#. module: account_statement_base_import
#: field:account.statement.profile,rec_log:0
msgid "log"
msgstr ""
#. module: account_statement_base_import
#: view:credit.statement.import:0
msgid "Import Parameters Summary"
msgstr ""
#. module: account_statement_base_import
#: field:credit.statement.import,balance_check:0
msgid "Balance check"
msgstr ""
#. module: account_statement_base_import
#: field:credit.statement.import,force_partner_on_bank:0
msgid "Force partner on bank move"
msgstr ""
#. module: account_statement_base_import
#: field:credit.statement.import,file_name:0
msgid "File Name"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:55
#, python-format
msgid "Invalid file type %s. Please use csv or xls"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:155
#, python-format
msgid "You must provide a valid profile to import a bank statement!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:83
#, python-format
msgid "Statement ID %s have been imported with %s lines."
msgstr ""
#. module: account_statement_base_import
#: field:credit.statement.import,receivable_account_id:0
msgid "Force Receivable/Payable Account"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:164
#: code:addons/account_statement_base_import/parser/file_parser.py:174
#: code:addons/account_statement_base_import/parser/file_parser.py:198
#: code:addons/account_statement_base_import/parser/file_parser.py:208
#, python-format
msgid "Missing"
msgstr ""
#. module: account_statement_base_import
#: help:account.statement.profile,import_type:0
msgid "Choose here the method by which you want to import bank statement for this profile."
msgstr ""
#. module: account_statement_base_import
#: view:credit.statement.import:0
msgid "Cancel"
msgstr ""
#. module: account_statement_base_import
#: help:credit.statement.import,force_partner_on_bank:0
msgid "Tic that box if you want to use the credit insitute partner in the counterpart of the treasury/banking move."
msgstr ""

View File

@@ -0,0 +1,305 @@
# Spanish translation for banking-addons
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
# This file is distributed under the same license as the banking-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: banking-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2014-01-21 11:58+0000\n"
"PO-Revision-Date: 2014-04-02 22:23+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-03 06:06+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: account_statement_base_import
#: view:credit.statement.import:0
#: model:ir.actions.act_window,name:account_statement_base_import.statement_importer_action
msgid "Import statement"
msgstr "Importar extracto"
#. module: account_statement_base_import
#: view:account.statement.profile:0
msgid "Historical Import Logs"
msgstr ""
#. module: account_statement_base_import
#: model:ir.model,name:account_statement_base_import.model_credit_statement_import
msgid "credit.statement.import"
msgstr "credit.statement.import"
#. module: account_statement_base_import
#: field:credit.statement.import,input_statement:0
msgid "Statement file"
msgstr "Archivo de extracto"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:168
#, python-format
msgid ""
"Column %s you try to import is not present in the bank statement line!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:162
#, python-format
msgid "Nothing to import"
msgstr ""
#. module: account_statement_base_import
#: field:credit.statement.import,journal_id:0
msgid "Financial journal to use transaction"
msgstr "Diario contable a usar"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:102
#, python-format
msgid "Column %s not present in file"
msgstr "La columna %s no está presente en el archivo"
#. module: account_statement_base_import
#: view:account.statement.profile:0
#: model:ir.ui.menu,name:account_statement_base_import.statement_importer_menu
msgid "Import Bank Statement"
msgstr "Importar extracto bancario"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:54
#, python-format
msgid "User Error"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:223
#, python-format
msgid "The statement cannot be created: %s"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:167
#, python-format
msgid "Missing column!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/parser.py:166
#, python-format
msgid "No buffer file given."
msgstr "No se ha proporcionado ningún búfer de archivo."
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:107
#: code:addons/account_statement_base_import/parser/file_parser.py:171
#: code:addons/account_statement_base_import/parser/file_parser.py:205
#, python-format
msgid "Invalid data"
msgstr ""
#. module: account_statement_base_import
#: field:account.statement.profile,launch_import_completion:0
msgid "Launch completion after import"
msgstr "Lanzar el completado después de la importación"
#. module: account_statement_base_import
#: field:credit.statement.import,partner_id:0
msgid "Credit insitute partner"
msgstr "Empresa para el agente financiero"
#. module: account_statement_base_import
#: view:account.statement.profile:0
msgid "Import related infos"
msgstr "Importar información relacionada"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:163
#, python-format
msgid "The file is empty"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/wizard/import_statement.py:93
#, python-format
msgid "Please use a file with an extention"
msgstr "Use por favor un archivo con extensión"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:172
#: code:addons/account_statement_base_import/parser/file_parser.py:206
#, python-format
msgid ""
"Value %s of column %s is not valid.\n"
" Please check the line with ref %s:\n"
" \n"
" Detail: %s"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:29
#: code:addons/account_statement_base_import/parser/generic_file_parser.py:31
#, python-format
msgid "Please install python lib xlrd"
msgstr "Por favor instale la librería de Python xlrd"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:160
#, python-format
msgid ""
" It should be YYYY-MM-DD for column: %s value: %s \n"
" \n"
" \n"
" Please check the line with ref: %s \n"
" \n"
" Detail: %s"
msgstr ""
#. module: account_statement_base_import
#: field:account.statement.profile,last_import_date:0
msgid "Last Import Date"
msgstr "Última fecha de importación"
#. module: account_statement_base_import
#: model:ir.model,name:account_statement_base_import.model_account_statement_profile
msgid "Statement Profile"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:234
#, python-format
msgid "Statement import error"
msgstr "Error de importación del extracto"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:193
#, python-format
msgid ""
"Please modify the cell formatting to date format for column: %s value: %s\n"
" Please check the line with ref: %s\n"
" \n"
" Detail: %s"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:192
#, python-format
msgid "Date format is not valid"
msgstr ""
#. module: account_statement_base_import
#: field:account.statement.profile,import_type:0
msgid "Type of import"
msgstr "Tipo de importación"
#. module: account_statement_base_import
#: help:account.statement.profile,launch_import_completion:0
msgid ""
"Tic that box to automatically launch the completion on each imported file "
"using this profile."
msgstr ""
#. module: account_statement_base_import
#: help:credit.statement.import,balance_check:0
msgid ""
"Tic that box if you want OpenERP to control the start/end balance before "
"confirming a bank statement. If don't ticked, no balance control will be "
"done."
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:154
#, python-format
msgid "No Profile!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:159
#, python-format
msgid "Date format is not valid."
msgstr ""
#. module: account_statement_base_import
#: field:credit.statement.import,profile_id:0
msgid "Import configuration parameter"
msgstr "Parámetros de configuración de la importación"
#. module: account_statement_base_import
#: field:account.statement.profile,rec_log:0
msgid "log"
msgstr "registro"
#. module: account_statement_base_import
#: view:credit.statement.import:0
msgid "Import Parameters Summary"
msgstr "Resumen de parámetros de importación"
#. module: account_statement_base_import
#: field:credit.statement.import,balance_check:0
msgid "Balance check"
msgstr "Comprobar saldo"
#. module: account_statement_base_import
#: field:credit.statement.import,force_partner_on_bank:0
msgid "Force partner on bank move"
msgstr "Forzar empresa en el apunte bancario"
#. module: account_statement_base_import
#: field:credit.statement.import,file_name:0
msgid "File Name"
msgstr "Nombre del archivo"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:55
#, python-format
msgid "Invalid file type %s. Please use csv or xls"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:155
#, python-format
msgid "You must provide a valid profile to import a bank statement!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:83
#, python-format
msgid "Statement ID %s have been imported with %s lines."
msgstr ""
#. module: account_statement_base_import
#: field:credit.statement.import,receivable_account_id:0
msgid "Force Receivable/Payable Account"
msgstr "Forzar cuenta a cobrar/a pagar"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:164
#: code:addons/account_statement_base_import/parser/file_parser.py:174
#: code:addons/account_statement_base_import/parser/file_parser.py:198
#: code:addons/account_statement_base_import/parser/file_parser.py:208
#, python-format
msgid "Missing"
msgstr ""
#. module: account_statement_base_import
#: help:account.statement.profile,import_type:0
msgid ""
"Choose here the method by which you want to import bank statement for this "
"profile."
msgstr ""
"Escoja aquí el método con el que quiere importar el extracto bancario para "
"este perfil."
#. module: account_statement_base_import
#: view:credit.statement.import:0
msgid "Cancel"
msgstr "Cancelar"
#. module: account_statement_base_import
#: help:credit.statement.import,force_partner_on_bank:0
msgid ""
"Tic that box if you want to use the credit insitute partner in the "
"counterpart of the treasury/banking move."
msgstr ""

View File

@@ -1,243 +1,287 @@
# French translation for banking-addons
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
# This file is distributed under the same license as the banking-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: banking-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2014-01-21 11:58+0000\n"
"PO-Revision-Date: 2014-03-21 15:17+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: French <fr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-22 07:11+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: account_statement_base_import #. module: account_statement_base_import
#: view:credit.statement.import:0 #: view:credit.statement.import:0
#: model:ir.actions.act_window,name:account_statement_base_import.statement_importer_action #: model:ir.actions.act_window,name:account_statement_base_import.statement_importer_action
msgid "Import statement" msgid "Import statement"
msgstr "Import de relevé" msgstr ""
#. module: account_statement_base_import
#: view:account.statement.profile:0
msgid "Historical Import Logs"
msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: model:ir.model,name:account_statement_base_import.model_credit_statement_import #: model:ir.model,name:account_statement_base_import.model_credit_statement_import
msgid "credit.statement.import" msgid "credit.statement.import"
msgstr "credit.statement.import" msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:218
#, python-format
msgid "The statement cannot be created : %s"
msgstr "Le relevé ne peut être créé : %s"
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:credit.statement.import,input_statement:0 #: field:credit.statement.import,input_statement:0
msgid "Statement file" msgid "Statement file"
msgstr "Fichier à importer" msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: view:account.statement.profile:0 #: code:addons/account_statement_base_import/statement.py:168
msgid "Import Logs" #, python-format
msgstr "Journaux d'import" msgid ""
"Column %s you try to import is not present in the bank statement line!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:162
#, python-format
msgid "Nothing to import"
msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:credit.statement.import,journal_id:0 #: field:credit.statement.import,journal_id:0
msgid "Financial journal to use transaction" msgid "Financial journal to use transaction"
msgstr "Journal" msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:100 #: code:addons/account_statement_base_import/parser/file_parser.py:108
#, python-format #, python-format
msgid "Column %s not present in file" msgid "Column %s not present in file"
msgstr "Colonne %s non présente dans le fichier" msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: view:account.statement.profile:0 #: view:account.statement.profile:0
#: model:ir.ui.menu,name:account_statement_base_import.statement_importer_menu #: model:ir.ui.menu,name:account_statement_base_import.statement_importer_menu
msgid "Import Bank Statement" msgid "Import Bank Statement"
msgstr "Importation de relevé"
#. module: account_statement_base_import
#: model:ir.model,name:account_statement_base_import.model_account_statement_profile
msgid "Statement Profil"
msgstr "Profil du relevé"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:100
#, python-format
msgid "Commission line"
msgstr "Ligne de commission"
#. module: account_statement_base_import
#: field:credit.statement.import,commission_account_id:0
msgid "Commission account"
msgstr "Compte de commission"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:172
#, python-format
msgid "Column %s you try to import is not present in the bank statement line !"
msgstr "" msgstr ""
"La colonne %s que vous essayez d'importer n'est pas présente dans la ligne de relevé !"
#. module: account_statement_base_import #. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:71 #: code:addons/account_statement_base_import/parser/file_parser.py:54
#, python-format #, python-format
msgid "Bank Statement ID %s have been imported with %s lines " msgid "User Error"
msgstr "Le relevé avec l'ID %s a été importé avec %s lignes " msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:223
#, python-format
msgid "The statement cannot be created: %s"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:167
#, python-format
msgid "Missing column!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/parser.py:150
#, python-format
msgid "No buffer file given."
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:107
#: code:addons/account_statement_base_import/parser/file_parser.py:171
#: code:addons/account_statement_base_import/parser/file_parser.py:205
#, python-format
msgid "Invalid data"
msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:account.statement.profile,launch_import_completion:0 #: field:account.statement.profile,launch_import_completion:0
msgid "Launch completion after import" msgid "Launch completion after import"
msgstr "Lancer l'auto-complétion après import" msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:credit.statement.import,partner_id:0 #: field:credit.statement.import,partner_id:0
msgid "Credit insitute partner" msgid "Credit insitute partner"
msgstr "Organisme bancaire" msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:160
#, python-format
msgid "No Profile !"
msgstr "Aucun Profil !"
#. module: account_statement_base_import #. module: account_statement_base_import
#: view:account.statement.profile:0 #: view:account.statement.profile:0
msgid "Import related infos" msgid "Import related infos"
msgstr "Importation des informations liées"
#. module: account_statement_base_import
#: help:credit.statement.import,force_partner_on_bank:0
msgid ""
"Tic that box if you want to use the credit insitute "
"partner in the "
"counterpart of the treasury/banking move."
msgstr "" msgstr ""
"Cochez cette case si vous voulez utiliser comme partenaire "
"l'organisme bancaire au niveau de la ligne de banque"
#. module: account_statement_base_import #. module: account_statement_base_import
#: code:addons/account_statement_base_import/wizard/import_statement.py:93 #: code:addons/account_statement_base_import/statement.py:163
#, python-format
msgid "The file is empty"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/wizard/import_statement.py:90
#, python-format #, python-format
msgid "Please use a file with an extention" msgid "Please use a file with an extention"
msgstr "Veuillez sélectionner un fichier avec une extension"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:161
#, python-format
msgid "You must provide a valid profile to import a bank statement !"
msgstr "Vous devez fournir un profil valide pour importer un relevé !"
#. module: account_statement_base_import
#: help:credit.statement.import,balance_check:0
msgid ""
"Tic that box if you want OpenERP to control the start/end "
"balance before confirming "
"a bank statement. If don't ticked, no balance control will be done."
msgstr "" msgstr ""
"Cochez cette case si vous souhaitez un contrôle du solde final "
"avant la validation du relevé."
#. module: account_statement_base_import #. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:31 #: code:addons/account_statement_base_import/parser/file_parser.py:172
#: code:addons/account_statement_base_import/parser/generic_file_parser.py:31 #: code:addons/account_statement_base_import/parser/file_parser.py:206
#, python-format
msgid ""
"Value %s of column %s is not valid.\n"
" Please check the line with ref %s:\n"
" \n"
" Detail: %s"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:29
#: code:addons/account_statement_base_import/parser/generic_file_parser.py:30
#, python-format #, python-format
msgid "Please install python lib xlrd" msgid "Please install python lib xlrd"
msgstr "Veuillez installer la bibliothèque python xlrd" msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:58 #: code:addons/account_statement_base_import/parser/file_parser.py:160
#, python-format #, python-format
msgid "Invalide file type %s. please use csv or xls" msgid ""
msgstr "Type de fichier invalide : %s. Veuillez utiliser un csv ou un xls" " It should be YYYY-MM-DD for column: %s value: %s \n"
" \n"
" \n"
" Please check the line with ref: %s \n"
" \n"
" Detail: %s"
msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:account.statement.profile,last_import_date:0 #: field:account.statement.profile,last_import_date:0
msgid "Last Import Date" msgid "Last Import Date"
msgstr "Date de dernier import"
#. module: account_statement_base_import
#: field:credit.statement.import,commission_analytic_id:0
msgid "Commission analytic account"
msgstr "Compte analytique de la commission"
#. module: account_statement_base_import
#: constraint:account.statement.profile:0
msgid "You need to put a partner if you tic the 'Force partner on bank move' !"
msgstr "" msgstr ""
"Vous devez spécifier un partenaire si vous avez coché 'Forcer un partenaire sur la ligne de la banque' !"
#. module: account_statement_base_import #. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:217 #: model:ir.model,name:account_statement_base_import.model_account_statement_profile
msgid "Statement Profile"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:222
#, python-format #, python-format
msgid "Statement import error" msgid "Statement import error"
msgstr "Erreur d'import de relevé" msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:account.bank.statement.line,commission_amount:0 #: code:addons/account_statement_base_import/parser/file_parser.py:193
msgid "Line Commission Amount"
msgstr "Montant de la commission de la ligne"
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:171
#, python-format #, python-format
msgid "Missing column !" msgid ""
msgstr "Colonne manquante !" "Please modify the cell formatting to date format for column: %s value: %s\n"
" Please check the line with ref: %s\n"
" \n"
" Detail: %s"
msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:account.statement.profile,rec_log:0 #: code:addons/account_statement_base_import/parser/file_parser.py:192
msgid "log" #, python-format
msgstr "journal" msgid "Date format is not valid"
msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:account.statement.profile,import_type:0 #: field:account.statement.profile,import_type:0
msgid "Type of import" msgid "Type of import"
msgstr "Type d'import"
#. module: account_statement_base_import
#: constraint:account.bank.statement.line:0
msgid ""
"The amount of the voucher must be the same amount as the one on the "
"statement line"
msgstr "" msgstr ""
"Le montant du justificatif doit être identique à celui de la ligne le "
"concernant sur le relevé"
#. module: account_statement_base_import #. module: account_statement_base_import
#: help:account.statement.profile,launch_import_completion:0 #: help:account.statement.profile,launch_import_completion:0
msgid "" msgid ""
"Tic that box to automatically launch the completion on each " "Tic that box to automatically launch the completion on each imported file "
"imported file using this profile." "using this profile."
msgstr ""
#. module: account_statement_base_import
#: help:credit.statement.import,balance_check:0
msgid ""
"Tic that box if you want OpenERP to control the start/end balance before "
"confirming a bank statement. If don't ticked, no balance control will be "
"done."
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:154
#, python-format
msgid "No Profile!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:159
#, python-format
msgid "Date format is not valid."
msgstr "" msgstr ""
"Cocher cette case pour lancer automatiquement l'auto-complétion sur"
"chaque fichier importé avec ce profil."
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:credit.statement.import,profile_id:0 #: field:credit.statement.import,profile_id:0
msgid "Import configuration parameter" msgid "Import configuration parameter"
msgstr "Paramètres de configuration d'import" msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/parser.py:156 #: field:account.statement.profile,rec_log:0
#, python-format msgid "log"
msgid "No buffer file given." msgstr ""
msgstr "Pas de fichier tampon donné."
#. module: account_statement_base_import #. module: account_statement_base_import
#: view:credit.statement.import:0 #: view:credit.statement.import:0
msgid "Import Parameters Summary" msgid "Import Parameters Summary"
msgstr "Résumé des paramètres d'import" msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:credit.statement.import,balance_check:0 #: field:credit.statement.import,balance_check:0
msgid "Balance check" msgid "Balance check"
msgstr "Vérification des soldes" msgstr ""
#. module: account_statement_base_import
#: model:ir.model,name:account_statement_base_import.model_account_bank_statement_line
msgid "Bank Statement Line"
msgstr "Ligne de relevé bancaire"
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:credit.statement.import,force_partner_on_bank:0 #: field:credit.statement.import,force_partner_on_bank:0
msgid "Force partner on bank move" msgid "Force partner on bank move"
msgstr "Forcer un partenaire sur la ligne du compte de banque" msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:credit.statement.import,file_name:0 #: field:credit.statement.import,file_name:0
msgid "File Name" msgid "File Name"
msgstr "Nom du fichier" msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:55
#, python-format
msgid "Invalid file type %s. Please use csv or xls"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:155
#, python-format
msgid "You must provide a valid profile to import a bank statement!"
msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/statement.py:83
#, python-format
msgid "Statement ID %s have been imported with %s lines."
msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: field:credit.statement.import,receivable_account_id:0 #: field:credit.statement.import,receivable_account_id:0
msgid "Force Receivable/Payable Account" msgid "Force Receivable/Payable Account"
msgstr "Forcer le compte Client/Fournisseur" msgstr ""
#. module: account_statement_base_import
#: code:addons/account_statement_base_import/parser/file_parser.py:164
#: code:addons/account_statement_base_import/parser/file_parser.py:174
#: code:addons/account_statement_base_import/parser/file_parser.py:198
#: code:addons/account_statement_base_import/parser/file_parser.py:208
#, python-format
msgid "Missing"
msgstr ""
#. module: account_statement_base_import #. module: account_statement_base_import
#: help:account.statement.profile,import_type:0 #: help:account.statement.profile,import_type:0
@@ -245,9 +289,15 @@ msgid ""
"Choose here the method by which you want to import bank statement for this " "Choose here the method by which you want to import bank statement for this "
"profile." "profile."
msgstr "" msgstr ""
"Choisissez la méthode d'import de relevé pour ce profil."
#. module: account_statement_base_import #. module: account_statement_base_import
#: view:credit.statement.import:0 #: view:credit.statement.import:0
msgid "Cancel" msgid "Cancel"
msgstr "Annulation" msgstr ""
#. module: account_statement_base_import
#: help:credit.statement.import,force_partner_on_bank:0
msgid ""
"Tic that box if you want to use the credit insitute partner in the "
"counterpart of the treasury/banking move."
msgstr ""

View File

@@ -35,24 +35,24 @@ def float_or_zero(val):
class FileParser(BankStatementImportParser): class FileParser(BankStatementImportParser):
""" """
Generic abstract class for defining parser for .csv or .xls file format. Generic abstract class for defining parser for .csv, .xls or .xlsx file format.
""" """
def __init__(self, parse_name, ftype='csv', extra_fields=None, header=None, **kwargs): def __init__(self, parse_name, ftype='csv', extra_fields=None, header=None, **kwargs):
""" """
:param char: parse_name: The name of the parser :param char: parse_name: The name of the parser
:param char: ftype: extension of the file (could be csv or xls) :param char: ftype: extension of the file (could be csv, xls or xlsx)
:param dict: extra_fields: extra fields to add to the conversion dict. In the format :param dict: extra_fields: extra fields to add to the conversion dict. In the format
{fieldname: fieldtype} {fieldname: fieldtype}
:param list: header : specify header fields if the csv file has no header :param list: header : specify header fields if the csv file has no header
""" """
super(FileParser, self).__init__(parse_name, **kwargs) super(FileParser, self).__init__(parse_name, **kwargs)
if ftype in ('csv', 'xls'): if ftype in ('csv', 'xls' ,'xlsx'):
self.ftype = ftype self.ftype = ftype[0:3]
else: else:
raise except_osv(_('User Error'), raise except_osv(_('User Error'),
_('Invalid file type %s. Please use csv or xls') % ftype) _('Invalid file type %s. Please use csv, xls or xlsx') % ftype)
self.conversion_dict = { self.conversion_dict = {
'ref': unicode, 'ref': unicode,
'label': unicode, 'label': unicode,
@@ -81,7 +81,7 @@ class FileParser(BankStatementImportParser):
def _parse(self, *args, **kwargs): def _parse(self, *args, **kwargs):
""" """
Launch the parsing through .csv or .xls depending on the Launch the parsing through .csv, .xls or .xlsx depending on the
given ftype given ftype
""" """
@@ -128,7 +128,7 @@ class FileParser(BankStatementImportParser):
def _parse_xls(self): def _parse_xls(self):
""" """
:return: dict of dict from xls file (line/rows) :return: dict of dict from xls/xlsx file (line/rows)
""" """
wb_file = tempfile.NamedTemporaryFile() wb_file = tempfile.NamedTemporaryFile()
wb_file.write(self.filebuffer) wb_file.write(self.filebuffer)
@@ -180,7 +180,7 @@ class FileParser(BankStatementImportParser):
def _from_xls(self, result_set, conversion_rules): def _from_xls(self, result_set, conversion_rules):
""" """
Handle the converstion from the dict and handle date format from Handle the converstion from the dict and handle date format from
an .xls file. an .csv, .xls or .xlsx file.
""" """
for line in result_set: for line in result_set:
for rule in conversion_rules: for rule in conversion_rules:

View File

@@ -20,12 +20,13 @@
############################################################################## ##############################################################################
import base64 import base64
import csv import csv
from datetime import datetime
def UnicodeDictReader(utf8_data, **kwargs): def UnicodeDictReader(utf8_data, **kwargs):
sniffer = csv.Sniffer() sniffer = csv.Sniffer()
pos = utf8_data.tell() pos = utf8_data.tell()
sample_data = utf8_data.read(1024) sample_data = utf8_data.read(2048)
utf8_data.seek(pos) utf8_data.seek(pos)
dialect = sniffer.sniff(sample_data, delimiters=',;\t') dialect = sniffer.sniff(sample_data, delimiters=',;\t')
csv_reader = csv.DictReader(utf8_data, dialect=dialect, **kwargs) csv_reader = csv.DictReader(utf8_data, dialect=dialect, **kwargs)
@@ -49,6 +50,10 @@ class BankStatementImportParser(object):
self.result_row_list = None self.result_row_list = None
# The file buffer on which to work on # The file buffer on which to work on
self.filebuffer = None self.filebuffer = None
self.balance_start = None
self.balance_end = None
self.statement_name = None
self.statement_date = None
@classmethod @classmethod
def parser_for(cls, parser_name): def parser_for(cls, parser_name):
@@ -110,6 +115,19 @@ class BankStatementImportParser(object):
""" """
return NotImplementedError return NotImplementedError
def get_st_vals(self):
"""
This method return a dict of vals that ca be passed to
create method of statement.
:return: dict of vals that represent additional infos for the statement
"""
return {
'name': self.statement_name or '/',
'balance_start': self.balance_start,
'balance_end_real': self.balance_end,
'date': self.statement_date or datetime.now()
}
def get_st_line_vals(self, line, *args, **kwargs): def get_st_line_vals(self, line, *args, **kwargs):
""" """
Implement a method in your parser that must return a dict of vals that can be Implement a method in your parser that must return a dict of vals that can be

View File

@@ -26,17 +26,19 @@ import datetime
from openerp.osv.orm import Model from openerp.osv.orm import Model
from openerp.osv import fields, osv from openerp.osv import fields, osv
from parser import new_bank_statement_parser from parser import new_bank_statement_parser
from openerp.tools.config import config
class AccountStatementProfil(Model): class AccountStatementProfil(Model):
_inherit = "account.statement.profile" _inherit = "account.statement.profile"
def get_import_type_selection(self, cr, uid, context=None): def get_import_type_selection(self, cr, uid, context=None):
""" """This is the method to be inherited for adding the parser"""
Has to be inherited to add parser
"""
return [('generic_csvxls_so', 'Generic .csv/.xls based on SO Name')] return [('generic_csvxls_so', 'Generic .csv/.xls based on SO Name')]
def _get_import_type_selection(self, cr, uid, context=None):
return self.get_import_type_selection(cr, uid, context=context)
_columns = { _columns = {
'launch_import_completion': fields.boolean( 'launch_import_completion': fields.boolean(
"Launch completion after import", "Launch completion after import",
@@ -46,14 +48,17 @@ class AccountStatementProfil(Model):
# we remove deprecated as it floods logs in standard/warning level sob... # we remove deprecated as it floods logs in standard/warning level sob...
'rec_log': fields.text('log', readonly=True), # Deprecated 'rec_log': fields.text('log', readonly=True), # Deprecated
'import_type': fields.selection( 'import_type': fields.selection(
get_import_type_selection, _get_import_type_selection,
'Type of import', 'Type of import',
required=True, required=True,
help="Choose here the method by which you want to import bank" help="Choose here the method by which you want to import bank"
"statement for this profile."), "statement for this profile."),
} }
_defaults = {
'import_type': 'generic_csvxls_so'
}
def _write_extra_statement_lines( def _write_extra_statement_lines(
self, cr, uid, parser, result_row_list, profile, statement_id, context): self, cr, uid, parser, result_row_list, profile, statement_id, context):
"""Insert extra lines after the main statement lines. """Insert extra lines after the main statement lines.
@@ -85,7 +90,11 @@ class AccountStatementProfil(Model):
context=context) context=context)
return True return True
def prepare_statetement_lines_vals( #Deprecated remove on V8
def prepare_statetement_lines_vals(self, *args, **kwargs):
return self.prepare_statement_lines_vals(*args, **kwargs)
def prepare_statement_lines_vals(
self, cr, uid, parser_vals, account_payable, account_receivable, self, cr, uid, parser_vals, account_payable, account_receivable,
statement_id, context): statement_id, context):
""" """
@@ -101,6 +110,7 @@ class AccountStatementProfil(Model):
:return: dict of vals that will be passed to create method of statement line. :return: dict of vals that will be passed to create method of statement line.
""" """
statement_obj = self.pool.get('account.bank.statement') statement_obj = self.pool.get('account.bank.statement')
statement_line_obj = self.pool['account.bank.statement.line']
values = parser_vals values = parser_vals
values['statement_id'] = statement_id values['statement_id'] = statement_id
date = values.get('date') date = values.get('date')
@@ -117,9 +127,18 @@ class AccountStatementProfil(Model):
context=context) context=context)
values['period_id'] = periods[0] values['period_id'] = periods[0]
period_memoizer[date] = periods[0] period_memoizer[date] = periods[0]
values['type'] = 'general' values = statement_line_obj._add_missing_default_values(cr, uid, values, context)
return values return values
def prepare_statement_vals(self, cr, uid, profile_id, result_row_list, parser, context):
"""
Hook to build the values of the statement from the parser and
the profile.
"""
vals = {'profile_id': profile_id}
vals.update(parser.get_st_vals())
return vals
def statement_import(self, cr, uid, ids, profile_id, file_stream, ftype="csv", context=None): def statement_import(self, cr, uid, ids, profile_id, file_stream, ftype="csv", context=None):
""" """
Create a bank statement with the given profile and parser. It will fullfill the bank statement Create a bank statement with the given profile and parser. It will fullfill the bank statement
@@ -153,9 +172,11 @@ class AccountStatementProfil(Model):
_("Column %s you try to import is not " _("Column %s you try to import is not "
"present in the bank statement line!") % col) "present in the bank statement line!") % col)
statement_vals = self.prepare_statement_vals(cr, uid, prof.id, result_row_list, parser, context)
statement_id = statement_obj.create(cr, uid, statement_id = statement_obj.create(cr, uid,
{'profile_id': prof.id}, statement_vals,
context=context) context=context)
if prof.receivable_account_id: if prof.receivable_account_id:
account_receivable = account_payable = prof.receivable_account_id.id account_receivable = account_payable = prof.receivable_account_id.id
else: else:
@@ -166,7 +187,7 @@ class AccountStatementProfil(Model):
statement_store = [] statement_store = []
for line in result_row_list: for line in result_row_list:
parser_vals = parser.get_st_line_vals(line) parser_vals = parser.get_st_line_vals(line)
values = self.prepare_statetement_lines_vals( values = self.prepare_statement_lines_vals(
cr, uid, parser_vals, account_payable, account_receivable, statement_id, cr, uid, parser_vals, account_payable, account_receivable, statement_id,
context) context)
statement_store.append(values) statement_store.append(values)
@@ -201,10 +222,14 @@ class AccountStatementProfil(Model):
context) context)
except Exception: except Exception:
statement_obj.unlink(cr, uid, [statement_id], context=context)
error_type, error_value, trbk = sys.exc_info() error_type, error_value, trbk = sys.exc_info()
st = "Error: %s\nDescription: %s\nTraceback:" % (error_type.__name__, error_value) st = "Error: %s\nDescription: %s\nTraceback:" % (error_type.__name__, error_value)
st += ''.join(traceback.format_tb(trbk, 30)) st += ''.join(traceback.format_tb(trbk, 30))
#TODO we should catch correctly the exception with a python
#Exception and only re-catch some special exception.
#For now we avoid re-catching error in debug mode
if config['debug_mode']:
raise
raise osv.except_osv(_("Statement import error"), raise osv.except_osv(_("Statement import error"),
_("The statement cannot be created: %s") % st) _("The statement cannot be created: %s") % st)
return statement_id return statement_id

View File

@@ -97,6 +97,7 @@ class CreditPartnerStatementImporter(orm.TransientModel):
req_id = req_id[0] req_id = req_id[0]
importer = self.browse(cr, uid, req_id, context) importer = self.browse(cr, uid, req_id, context)
ftype = self._check_extension(importer.file_name) ftype = self._check_extension(importer.file_name)
context['file_name'] = importer.file_name
sid = self.pool.get( sid = self.pool.get(
'account.statement.profile').statement_import( 'account.statement.profile').statement_import(
cr, cr,

View File

@@ -2,9 +2,11 @@ from openerp.tools.translate import _
import datetime import datetime
from openerp.osv import orm, fields from openerp.osv import orm, fields
def float_or_zero(val): def float_or_zero(val):
return float(val) if val else 0.0 return float(val) if val else 0.0
class AccountStatementProfil(orm.Model): class AccountStatementProfil(orm.Model):
_inherit = "account.statement.profile" _inherit = "account.statement.profile"
@@ -22,7 +24,7 @@ class AccountStatementProfil(orm.Model):
commission_analytic_id = profile.commission_analytic_id and profile.commission_analytic_id.id or False commission_analytic_id = profile.commission_analytic_id and profile.commission_analytic_id.id or False
comm_values = { comm_values = {
'name': 'IN ' + _('Commission line'), 'name': 'IN ' + _('Commission line'),
'date': datetime.datetime.now().date(), 'date': parser.get_st_vals().get('date') or datetime.datetime.now(),
'amount': global_commission_amount, 'amount': global_commission_amount,
'partner_id': partner_id, 'partner_id': partner_id,
'type': 'general', 'type': 'general',
@@ -36,6 +38,7 @@ class AccountStatementProfil(orm.Model):
statement_line_obj = self.pool.get('account.bank.statement.line') statement_line_obj = self.pool.get('account.bank.statement.line')
statement_line_obj.create(cr, uid, comm_values, context=context) statement_line_obj.create(cr, uid, comm_values, context=context)
class AccountStatementLineWithCommission(orm.Model): class AccountStatementLineWithCommission(orm.Model):
_inherit = "account.bank.statement.line" _inherit = "account.bank.statement.line"
_columns = { _columns = {
@@ -45,6 +48,7 @@ class AccountStatementLineWithCommission(orm.Model):
serialization_field='additionnal_bank_fields'), serialization_field='additionnal_bank_fields'),
} }
class CreditPartnerStatementImporter(orm.TransientModel): class CreditPartnerStatementImporter(orm.TransientModel):
_inherit = "credit.statement.import" _inherit = "credit.statement.import"

View File

@@ -0,0 +1,53 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_statement_commission
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 11:58+0000\n"
"PO-Revision-Date: 2014-01-21 11:58+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_statement_commission
#: field:credit.statement.import,commission_account_id:0
msgid "Commission account"
msgstr ""
#. module: account_statement_commission
#: model:ir.model,name:account_statement_commission.model_account_bank_statement_line
msgid "Bank Statement Line"
msgstr ""
#. module: account_statement_commission
#: model:ir.model,name:account_statement_commission.model_credit_statement_import
msgid "credit.statement.import"
msgstr ""
#. module: account_statement_commission
#: field:credit.statement.import,commission_analytic_id:0
msgid "Commission analytic account"
msgstr ""
#. module: account_statement_commission
#: model:ir.model,name:account_statement_commission.model_account_statement_profile
msgid "Statement Profile"
msgstr ""
#. module: account_statement_commission
#: field:account.bank.statement.line,commission_amount:0
msgid "Line Commission Amount"
msgstr ""
#. module: account_statement_commission
#: code:addons/account_statement_commission/commission.py:24
#, python-format
msgid "Commission line"
msgstr ""

View File

@@ -20,7 +20,7 @@
############################################################################## ##############################################################################
{'name': "Bank statement extension and profiles", {'name': "Bank statement extension and profiles",
'version': '1.3.0', 'version': '1.3.5',
'author': 'Camptocamp', 'author': 'Camptocamp',
'maintainer': 'Camptocamp', 'maintainer': 'Camptocamp',
'category': 'Finance', 'category': 'Finance',
@@ -74,12 +74,13 @@
""", """,
'website': 'http://www.camptocamp.com', 'website': 'http://www.camptocamp.com',
'data': ['statement_view.xml', 'data': ['statement_view.xml',
'account_view.xml',
'report/bank_statement_webkit_header.xml', 'report/bank_statement_webkit_header.xml',
'report.xml', 'report.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'security/ir_rule.xml'], 'security/ir_rule.xml'],
'demo_xml': [], 'demo_xml': [],
'test': [], 'test': ['test/test_profile_related_fields.yml'],
'installable': True, 'installable': True,
'images': [], 'images': [],
'auto_install': False, 'auto_install': False,

View File

@@ -31,8 +31,11 @@ class account_move(Model):
Delete the reconciliation when we delete the moves. This Delete the reconciliation when we delete the moves. This
allow an easier way of cancelling the bank statement. allow an easier way of cancelling the bank statement.
""" """
reconcile_to_delete = []
reconcile_obj = self.pool.get('account.move.reconcile')
for move in self.browse(cr, uid, ids, context=context): for move in self.browse(cr, uid, ids, context=context):
for move_line in move.line_id: for move_line in move.line_id:
if move_line.reconcile_id: if move_line.reconcile_id:
move_line.reconcile_id.unlink(context=context) reconcile_to_delete.append(move_line.reconcile_id.id)
reconcile_obj.unlink(cr, uid, reconcile_to_delete, context=context)
return super(account_move, self).unlink(cr, uid, ids, context=context) return super(account_move, self).unlink(cr, uid, ids, context=context)

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_account_move_line_filter_add_statement" model="ir.ui.view">
<field name="name">Journal Items add statement</field>
<field name="model">account.move.line</field>
<field name="inherit_id" ref="account.view_account_move_line_filter"/>
<field name="arch" type="xml">
<xpath expr="/search/group/filter[@string='Period']" position="after">
<filter string="Bank Statement" context="{'group_by': 'statement_id'}" icon="terp-partner"/>
</xpath>
</field>
</record>
</data>
</openerp>

View File

@@ -1,3 +1,4 @@
## -*- coding: utf-8 -*-
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>

View File

@@ -31,9 +31,10 @@ def fixed_write(self, cr, uid, ids, vals, context=None):
I will do it when I have time.""" I will do it when I have time."""
res = super(stat_mod.account_bank_statement, self).write(cr, uid, ids, res = super(stat_mod.account_bank_statement, self).write(cr, uid, ids,
vals, context=context) vals, context=context)
cr.execute("UPDATE account_bank_statement_line" if ids: # will be false for an new empty bank statement
" SET sequence = account_bank_statement_line.id + 1" cr.execute("UPDATE account_bank_statement_line"
" where statement_id in %s", (tuple(ids),)) " SET sequence = account_bank_statement_line.id + 1"
" where statement_id in %s", (tuple(ids),))
return res return res
stat_mod.account_bank_statement.write = fixed_write stat_mod.account_bank_statement.write = fixed_write
@@ -112,8 +113,13 @@ class AccountStatementProfile(Model):
(_check_partner, "You need to put a partner if you tic the 'Force partner on bank move'!", []), (_check_partner, "You need to put a partner if you tic the 'Force partner on bank move'!", []),
] ]
_sql_constraints = [
('name_uniq', 'unique (name, company_id)', 'The name of the bank statement must be unique !')
]
class AccountBankSatement(Model):
class AccountBankStatement(Model):
""" """
We improve the bank statement class mostly for : We improve the bank statement class mostly for :
- Removing the period and compute it from the date of each line. - Removing the period and compute it from the date of each line.
@@ -153,6 +159,23 @@ class AccountBankSatement(Model):
return profile_ids[0] if profile_ids else False return profile_ids[0] if profile_ids else False
def _get_statement_from_profile(self, cr, uid, profile_ids, context=None):
"""Stored function field trigger.
Weirdness warning: we are in the class account.bank.statement, but
when the ORM calls this, self is an account.statement.profile.
Returns a list of account.bank.statement ids to recompute.
"""
triggered = []
for profile in self.browse(cr, uid, profile_ids, context=context):
triggered += [st.id for st in profile.bank_statement_ids]
return triggered
def _us(self, cr, uid, ids, context=None):
return ids
_columns = { _columns = {
'profile_id': fields.many2one( 'profile_id': fields.many2one(
'account.statement.profile', 'account.statement.profile',
@@ -160,28 +183,41 @@ class AccountBankSatement(Model):
required=True, required=True,
states={'draft': [('readonly', False)]}), states={'draft': [('readonly', False)]}),
'credit_partner_id': fields.related( 'credit_partner_id': fields.related(
'profile_id', 'profile_id',
'partner_id', 'partner_id',
type='many2one', type='many2one',
relation='res.partner', relation='res.partner',
string='Financial Partner', string='Financial Partner',
store=True, store={
readonly=True), 'account.bank.statement': (_us, ['profile_id'], 10),
'account.statement.profile': (
_get_statement_from_profile, ['partner_id'], 10),
},
readonly=True),
'balance_check': fields.related( 'balance_check': fields.related(
'profile_id', 'profile_id',
'balance_check', 'balance_check',
type='boolean', type='boolean',
string='Balance check', string='Balance check',
store=True, store={
readonly=True), 'account.bank.statement': (_us, ['profile_id'], 10),
'account.statement.profile': (
_get_statement_from_profile, ['balance_check'], 10),
},
readonly=True
),
'journal_id': fields.related( 'journal_id': fields.related(
'profile_id', 'profile_id',
'journal_id', 'journal_id',
type='many2one', type='many2one',
relation='account.journal', relation='account.journal',
string='Journal', string='Journal',
store=True, store={
readonly=True), 'account.bank.statement': (_us, ['profile_id'], 10),
'account.statement.profile': (
_get_statement_from_profile, ['journal_id'], 10),
},
readonly=True),
'period_id': fields.many2one( 'period_id': fields.many2one(
'account.period', 'account.period',
'Period', 'Period',
@@ -202,14 +238,17 @@ class AccountBankSatement(Model):
profile_obj = self.pool.get('account.statement.profile') profile_obj = self.pool.get('account.statement.profile')
profile = profile_obj.browse(cr, uid, vals['profile_id'], context=context) profile = profile_obj.browse(cr, uid, vals['profile_id'], context=context)
vals['journal_id'] = profile.journal_id.id vals['journal_id'] = profile.journal_id.id
return super(AccountBankSatement, self).create(cr, uid, vals, context=context) return super(AccountBankStatement, self
).create(cr, uid, vals, context=context)
def _get_period(self, cr, uid, date, context=None): def _get_period(self, cr, uid, date, context=None):
""" """Return matching period for a date."""
Find matching period for date, used in the statement line creation. if context is None:
""" context = {}
period_obj = self.pool.get('account.period') period_obj = self.pool.get('account.period')
periods = period_obj.find(cr, uid, dt=date, context=context) local_context = context.copy()
local_context['account_period_prefer_normal'] = True
periods = period_obj.find(cr, uid, dt=date, context=local_context)
return periods and periods[0] or False return periods and periods[0] or False
def _check_company_id(self, cr, uid, ids, context=None): def _check_company_id(self, cr, uid, ids, context=None):
@@ -218,12 +257,17 @@ class AccountBankSatement(Model):
move of period_id to the statement line move of period_id to the statement line
""" """
for statement in self.browse(cr, uid, ids, context=context): for statement in self.browse(cr, uid, ids, context=context):
# statement.company_id is a related store=True that for some
# reason doesn't work in YAML tests. As a workaround, I unwind it
# to statement.journal_id.company_id here.
if (statement.period_id and if (statement.period_id and
statement.company_id.id != statement.period_id.company_id.id): statement.journal_id.company_id.id !=
statement.period_id.company_id.id):
return False return False
for line in statement.line_ids: for line in statement.line_ids:
if (line.period_id and if (line.period_id and
statement.company_id.id != line.period_id.company_id.id): statement.journal_id.company_id.id
!= line.period_id.company_id.id):
return False return False
return True return True
@@ -243,8 +287,9 @@ class AccountBankSatement(Model):
""" """
if context is None: if context is None:
context = {} context = {}
res = super(AccountBankSatement, self)._prepare_move( res = super(AccountBankStatement, self
cr, uid, st_line, st_line_number, context=context) )._prepare_move(cr, uid, st_line, st_line_number,
context=context)
ctx = context.copy() ctx = context.copy()
ctx['company_id'] = st_line.company_id.id ctx['company_id'] = st_line.company_id.id
period_id = self._get_period(cr, uid, st_line.date, context=ctx) period_id = self._get_period(cr, uid, st_line.date, context=ctx)
@@ -273,7 +318,7 @@ class AccountBankSatement(Model):
""" """
if context is None: if context is None:
context = {} context = {}
res = super(AccountBankSatement, self)._prepare_move_line_vals( res = super(AccountBankStatement, self)._prepare_move_line_vals(
cr, uid, st_line, move_id, debit, credit, cr, uid, st_line, move_id, debit, credit,
currency_id=currency_id, currency_id=currency_id,
amount_currency=amount_currency, amount_currency=amount_currency,
@@ -297,10 +342,9 @@ class AccountBankSatement(Model):
create the move from. create the move from.
:return: int/long of the res.partner to use as counterpart :return: int/long of the res.partner to use as counterpart
""" """
bank_partner_id = super(AccountBankSatement, self)._get_counter_part_partner(cr, bank_partner_id = super(AccountBankStatement, self
uid, )._get_counter_part_partner(cr, uid, st_line,
st_line, context=context)
context=context)
# get the right partner according to the chosen profile # get the right partner according to the chosen profile
if st_line.statement_id.profile_id.force_partner_on_bank: if st_line.statement_id.profile_id.force_partner_on_bank:
bank_partner_id = st_line.statement_id.profile_id.partner_id.id bank_partner_id = st_line.statement_id.profile_id.partner_id.id
@@ -530,8 +574,9 @@ class AccountBankSatement(Model):
""" """
st = self.browse(cr, uid, st_id, context=context) st = self.browse(cr, uid, st_id, context=context)
if st.balance_check: if st.balance_check:
return super(AccountBankSatement, self).balance_check( return super(AccountBankStatement, self
cr, uid, st_id, journal_type, context=context) ).balance_check(cr, uid, st_id, journal_type,
context=context)
else: else:
return True return True
@@ -547,15 +592,11 @@ class AccountBankSatement(Model):
import_config = self.pool.get("account.statement.profile").browse( import_config = self.pool.get("account.statement.profile").browse(
cr, uid, profile_id, context=context) cr, uid, profile_id, context=context)
journal_id = import_config.journal_id.id journal_id = import_config.journal_id.id
account_id = import_config.journal_id.default_debit_account_id.id
credit_partner_id = import_config.partner_id and import_config.partner_id.id or False
return {'value': {'journal_id': journal_id, return {'value': {'journal_id': journal_id,
'account_id': account_id, 'balance_check': import_config.balance_check}}
'balance_check': import_config.balance_check,
'credit_partner_id': credit_partner_id}}
class AccountBankSatementLine(Model): class AccountBankStatementLine(Model):
""" """
Override to compute the period from the date of the line, add a method to retrieve Override to compute the period from the date of the line, add a method to retrieve
the values for a line from the profile. Override the on_change method to take care of the values for a line from the profile. Override the on_change method to take care of
@@ -565,14 +606,15 @@ class AccountBankSatementLine(Model):
_inherit = "account.bank.statement.line" _inherit = "account.bank.statement.line"
def _get_period(self, cr, uid, context=None): def _get_period(self, cr, uid, context=None):
""" """Return matching period for a date."""
Return a period from a given date in the context.
"""
if context is None: if context is None:
context = {} context = {}
period_obj = self.pool['account.period']
date = context.get('date') date = context.get('date')
local_context = context.copy()
local_context['account_period_prefer_normal'] = True
try: try:
periods = self.pool.get('account.period').find(cr, uid, dt=date) periods = period_obj.find(cr, uid, dt=date, context=local_context)
except osv.except_osv: except osv.except_osv:
# if no period defined, we are certainly at installation time # if no period defined, we are certainly at installation time
return False return False
@@ -649,6 +691,11 @@ class AccountBankSatementLine(Model):
# This can be quite a performance killer as we read ir.properity fields # This can be quite a performance killer as we read ir.properity fields
if partner_id: if partner_id:
part = obj_partner.browse(cr, uid, partner_id, context=context) part = obj_partner.browse(cr, uid, partner_id, context=context)
part = part.commercial_partner_id
# When the method is called from bank statement completion,
# ensure that the line's partner is a commercial
# (accounting) entity
res['partner_id'] = part.id
pay_account = part.property_account_payable.id pay_account = part.property_account_payable.id
receiv_account = part.property_account_receivable.id receiv_account = part.property_account_receivable.id
# If no value, look on the default company property # If no value, look on the default company property
@@ -684,11 +731,9 @@ class AccountBankSatementLine(Model):
Keep the same features as in standard and call super. If an account is returned, Keep the same features as in standard and call super. If an account is returned,
call the method to compute line values. call the method to compute line values.
""" """
res = super(AccountBankSatementLine, self).onchange_type(cr, uid, res = super(AccountBankStatementLine, self
line_id, ).onchange_type(cr, uid, line_id, partner_id,
partner_id, line_type, context=context)
line_type,
context=context)
if 'account_id' in res['value']: if 'account_id' in res['value']:
result = self.get_values_for_line(cr, uid, result = self.get_values_for_line(cr, uid,
profile_id=profile_id, profile_id=profile_id,

View File

@@ -0,0 +1,78 @@
-
In order to test the related fields in the profile, I first need to create a profile
-
!record {model: account.statement.profile, id: profile_test1}:
name: Bank EUR Profile
journal_id: account.bank_journal
commission_account_id: account.a_expense
company_id: base.main_company
partner_id: base.res_partner_1
journal_id: account.check_journal
balance_check: True
-
I create a second profile
-
!record {model: account.statement.profile, id: profile_test2}:
name: Second profile
journal_id: account.bank_journal
commission_account_id: account.a_expense
company_id: base.main_company
partner_id: base.res_partner_3
journal_id: account.bank_journal
balance_check: True
-
Now I create a statement.
-
!record {model: account.bank.statement, id: statement_test1}:
name: Statement 1
profile_id: profile_test1
company_id: base.main_company
-
Now I check that the related data come from the profile
-
!assert {model: account.bank.statement, id: statement_test1, string: Initial data should come from the profile}:
- balance_check is True
- credit_partner_id.id == _ref('base.res_partner_1')
- journal_id.id == _ref('account.check_journal')
-
Now I set the balance flag to False in the profile
-
!record {model: account.statement.profile, id: profile_test1}:
balance_check: False
-
It should be false in the statement as well.
-
!assert {model: account.bank.statement, id: statement_test1, string: We should not check the balance}:
- balance_check is False
-
Now I change the journal in the profile
-
!record {model: account.statement.profile, id: profile_test1}:
journal_id: account.cash_journal
-
The journal should propagate to the statement
-
!assert {model: account.bank.statement, id: statement_test1, string: The journal should be updated}:
- journal_id.id == _ref('account.cash_journal')
-
Now I change the partner in the profile
-
!record {model: account.statement.profile, id: profile_test1}:
partner_id: base.res_partner_2
-
The partner should propagate to the statement
-
!assert {model: account.bank.statement, id: statement_test1, string: The partner should be updated}:
- credit_partner_id.id == _ref('base.res_partner_2')
-
Now I change the profile associated to the statement.
-
!record {model: account.bank.statement, id: statement_test1}:
profile_id: profile_test2
-
The statement should receive information from the new statement.
-
!assert {model: account.bank.statement, id: statement_test1, string: All information should be probagated from the new profile}:
- balance_check is True
- credit_partner_id.id == _ref('base.res_partner_3')
- journal_id.id == _ref('account.bank_journal')

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Alexandre Fayolle
# Copyright 2013 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import point_of_sale

View File

@@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Nicolas Bessi, Joel Grand-Guillaume
# Copyright 2011-2013 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
{'name': "Bank statement extension and profiles for Point of Sale",
'version': '1.0.0',
'author': 'Camptocamp',
'maintainer': 'Camptocamp',
'category': 'Point Of Sale',
'complexity': 'normal',
'depends': ['point_of_sale',
'account_statement_ext',
],
'description': """
Update the point of sale code to work with improved bank statements.
""",
'website': 'http://www.camptocamp.com',
'data': [],
'demo': [],
'test': [],
'installable': True,
'images': [],
'auto_install': True,
'license': 'AGPL-3',
'active': False,
}

View File

@@ -0,0 +1,123 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Alexandre Fayolle
# Copyright 2013 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.addons.point_of_sale.point_of_sale import pos_session as std_pos_session
from openerp.osv import orm, osv
from openerp.tools.translate import _
if not hasattr(std_pos_session, '_prepare_bank_statement'):
# monkey patch to fix lp:1245375
#
# We replace pos_session.create with the implementation in
# mp_create below which is essentially the same, only with a call
# to self._prepare_bank_statement.
#
# The default implementation has been extracted in
# mp_prepare_bank_statement below, and can be overridden in models
# which _inherit pos.session
#
# This change has been proposed for merging to fix lp:125375
def mp_prepare_bank_statement(self, cr, uid, pos_config, journal, context=None):
bank_values = {
'journal_id' : journal.id,
'user_id' : uid,
'company_id' : pos_config.shop_id.company_id.id
}
return bank_values
def mp_create(self, cr, uid, values, context=None):
context = context or {}
config_id = values.get('config_id', False) or context.get('default_config_id', False)
if not config_id:
raise osv.except_osv( _('Error!'),
_("You should assign a Point of Sale to your session."))
# journal_id is not required on the pos_config because it does not
# exists at the installation. If nothing is configured at the
# installation we do the minimal configuration. Impossible to do in
# the .xml files as the CoA is not yet installed.
jobj = self.pool.get('pos.config')
pos_config = jobj.browse(cr, uid, config_id, context=context)
context.update({'company_id': pos_config.shop_id.company_id.id})
if not pos_config.journal_id:
jid = jobj.default_get(cr, uid, ['journal_id'], context=context)['journal_id']
if jid:
jobj.write(cr, uid, [pos_config.id], {'journal_id': jid}, context=context)
else:
raise osv.except_osv( _('error!'),
_("Unable to open the session. You have to assign a sale journal to your point of sale."))
# define some cash journal if no payment method exists
if not pos_config.journal_ids:
journal_proxy = self.pool.get('account.journal')
cashids = journal_proxy.search(cr, uid, [('journal_user', '=', True), ('type','=','cash')], context=context)
if not cashids:
cashids = journal_proxy.search(cr, uid, [('type', '=', 'cash')], context=context)
if not cashids:
cashids = journal_proxy.search(cr, uid, [('journal_user','=',True)], context=context)
jobj.write(cr, uid, [pos_config.id], {'journal_ids': [(6,0, cashids)]})
pos_config = jobj.browse(cr, uid, config_id, context=context)
bank_statement_ids = []
for journal in pos_config.journal_ids:
bank_values = self._prepare_bank_statement(cr, uid, pos_config, journal, context)
statement_id = self.pool.get('account.bank.statement').create(cr, uid, bank_values, context=context)
bank_statement_ids.append(statement_id)
values.update({
'name' : pos_config.sequence_id._next(),
'statement_ids' : [(6, 0, bank_statement_ids)],
'config_id': config_id
})
return super(std_pos_session, self).create(cr, uid, values, context=context)
std_pos_session._prepare_bank_statement = mp_prepare_bank_statement
std_pos_session.create = mp_create
class pos_session(orm.Model):
_inherit = 'pos.session'
def _prepare_bank_statement(self, cr, uid, pos_config, journal, context=None):
""" Override the function _mp_create. To add the bank profile to the statement
Function That was previously added to pos.session model using monkey patching
"""
bank_values = super(pos_session, self)._prepare_bank_statement(cr, uid,
pos_config,
journal, context)
user_obj = self.pool.get('res.users')
profile_obj = self.pool.get('account.statement.profile')
user = user_obj.browse(cr, uid, uid, context=context)
defaults = self.pool['account.bank.statement'].default_get(cr, uid,
['profile_id', 'period_id'],
context=context)
profile_ids = profile_obj.search(cr, uid,
[('company_id', '=', user.company_id.id),
('journal_id', '=', bank_values['journal_id'])],
context=context)
if profile_ids:
defaults['profile_id'] = profile_ids[0]
bank_values.update(defaults)
return bank_values

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# module for OpenERP
# Copyright (C) 2013-TODAY Akretion <http://www.akretion.com>.
# @author Sébastien BEAU <sebastien.beau@akretion.com>
#
# 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/>.
#
###############################################################################

View File

@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# module for OpenERP
# Copyright (C) 2013-TODAY Akretion <http://www.akretion.com>.
# @author Sébastien BEAU <sebastien.beau@akretion.com>
#
# 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': 'account bank statement no invoice import',
'version': '0.1',
'category': 'Generic Modules/Others',
'license': 'AGPL-3',
'description': """Module that remove the 'Import invoices' button on bank statement""",
'author': 'Akretion',
'website': 'http://www.akretion.com/',
'depends': [
'account_voucher',
],
'data': [
'statement_view.xml',
],
'demo': [],
'installable': True,
'active': False,
}

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- INHERITED VIEW FOR THE OBJECT : account_bank_statement -->
<record id="account_bank_statement_view_form" model="ir.ui.view">
<field name="name">account_bank_statement_simple_view.account_bank_statement.view_form</field>
<field name="model">account.bank.statement</field>
<field name="inherit_id" ref="account_voucher.view_bank_statement_form_invoice" />
<field eval="100" name="priority"/>
<field name="type">form</field>
<field name="arch" type="xml">
<button string="Import Invoices" position="replace">
</button>
</field>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Pedro Manuel Baeza Romero
# Copyright 2013 Servicios Tecnológicos Avanzados
#
# 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/>.
#
##############################################################################
import statement
import parser

View File

@@ -0,0 +1,49 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Pedro Manuel Baeza Romero
# Copyright 2013 Servicios Tecnológicos Avanzados
# Financed by AB Internet (http://www.abinternet.co.uk/)
#
# 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': "Bank statement OFX import",
'version': '1.0',
'author': 'Servicios Tecnológicos Avanzados - Pedro M. Baeza',
'maintainer': 'Pedro M. Baeza',
'category': 'Finance',
'complexity': 'normal',
'depends': [
'account_statement_base_import',
],
'external_dependencies': {
'python': ['ofxparse'],
},
'description': """
Allows to import OFX (Open Financial Exchange) statement files, using
*account_statement_base_import* generic inheritance mechanism to import
statements.
It requires ofxparse library to work.
""",
'website': 'http://www.serviciosbaeza.com',
'data': [],
'test': [],
'installable': True,
'images': [],
'auto_install': False,
'license': 'AGPL-3',
}

View File

@@ -0,0 +1,34 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_statement_ofx_import
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 12:05+0000\n"
"PO-Revision-Date: 2014-01-21 12:05+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_statement_ofx_import
#: code:addons/account_statement_ofx_import/statement.py:34
#, python-format
msgid "OFX - Open Financial Exchange"
msgstr ""
#. module: account_statement_ofx_import
#: code:addons/account_statement_ofx_import/parser/ofx_parser.py:29
#, python-format
msgid "Please install python lib ofxparse"
msgstr ""
#. module: account_statement_ofx_import
#: model:ir.model,name:account_statement_ofx_import.model_account_statement_profile
msgid "Statement Profile"
msgstr ""

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Pedro Manuel Baeza Romero
# Copyright 2013 Servicios Tecnológicos Avanzados
#
# 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 . import ofx_parser

View File

@@ -0,0 +1,118 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Pedro Manuel Baeza Romero
# Copyright 2013 Servicios Tecnológicos Avanzados
#
# 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.tools.translate import _
from account_statement_base_import.parser import BankStatementImportParser
import tempfile
import datetime
try:
import ofxparse
except:
raise Exception(_('Please install python lib ofxparse'))
class OfxParser(BankStatementImportParser):
"""
Class for defining parser for OFX file format.
"""
def __init__(self, parser_name, *args, **kwargs):
"""
"""
super(OfxParser, self).__init__(parser_name, *args, **kwargs)
@classmethod
def parser_for(cls, parser_name):
"""
Used by the new_bank_statement_parser class factory. Return true if
the providen name is 'ofx_so'.
"""
return parser_name == 'ofx_so'
def _custom_format(self, *args, **kwargs):
"""
No other work on data are needed in this parser.
"""
return True
def _pre(self, *args, **kwargs):
"""
No pre-treatment needed for this parser.
"""
return True
def _parse(self, *args, **kwargs):
"""
Launch the parsing itself.
"""
ofx_file = tempfile.NamedTemporaryFile()
ofx_file.seek(0)
ofx_file.write(self.filebuffer)
ofx_file.flush()
ofx = ofxparse.OfxParser.parse(file(ofx_file.name))
ofx_file.close()
res = []
for transaction in ofx.account.statement.transactions:
res.append({
'date': transaction.date,
'amount': transaction.amount,
'ref': transaction.type,
'label': transaction.payee,
})
self.result_row_list = res
return True
def _validate(self, *args, **kwargs):
"""
Nothing to do here. ofxparse trigger possible format errors.
"""
return True
def _post(self, *args, **kwargs):
"""
Nothing is needed to do after parsing.
"""
return True
def _post(self, *args, **kwargs):
"""
Nothing to do.
"""
return True
def get_st_line_vals(self, line, *args, **kwargs):
"""
This method must return a dict of vals that can be passed to create
method of statement line in order to record it. It is the
responsibility of every parser to give this dict of vals, so each one
can implement his own way of recording the lines.
:param: line: a dict of vals that represent a line of
result_row_list
:return: dict of values to give to the create method of statement
line
"""
return {
'name': line.get('label', line.get('ref', '/')),
'date': line.get('date', datetime.datetime.now().date()),
'amount': line.get('amount', 0.0),
'ref': line.get('ref', '/'),
'label': line.get('label', ''),
}

View File

@@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Pedro Manuel Baeza Romero
# Copyright 2013 Servicios Tecnológicos Avanzados
#
# 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.tools.translate import _
from openerp.osv import fields, orm
class AccountStatementProfil(orm.Model):
_inherit = "account.statement.profile"
def get_import_type_selection(self, cr, uid, context=None):
"""
Inherited from parent to add parser.
"""
selection = super(AccountStatementProfil, self
).get_import_type_selection(cr, uid,
context=context)
selection.append(('ofx_so', _('OFX - Open Financial Exchange')))
return selection

View File

@@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# account_statement_one_move for OpenERP
# Copyright (C) 2013-TODAY Akretion <http://www.akretion.com>.
# @author Sébastien BEAU <sebastien.beau@akretion.com>
#
# 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 . import statement

View File

@@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# account_statement_one_move for OpenERP
# Copyright (C) 2013-TODAY Akretion <http://www.akretion.com>.
# @author Sébastien BEAU <sebastien.beau@akretion.com>
#
# 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': 'Bank statement one move',
'version': '0.1',
'category': 'Generic Modules/Others',
'license': 'AGPL-3',
'description': """
This module allows to group all lines of a bank statement in only one move.
This feature is optional and can be activated with a checkbox in the bank
statement's profile. This is very useful for credit card deposit for
example, you won't have a move for each line.
""",
'author': 'Akretion',
'website': 'http://www.akretion.com/',
'depends': ['account_statement_ext'],
'data': [
'statement_view.xml'
],
'demo': [],
'installable': True,
'auto_install': False,
'active': False,
}

View File

@@ -0,0 +1,225 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# account_statement_one_move for OpenERP
# Copyright (C) 2013-TODAY Akretion <http://www.akretion.com>.
# @author Sébastien BEAU <sebastien.beau@akretion.com>
#
# 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.osv import fields, orm, osv
class AccountStatementProfile(orm.Model):
_inherit = "account.statement.profile"
_columns = {
'one_move': fields.boolean(
'Group Journal Items',
help="Only one Journal Entry will be generated on the "
"validation of the bank statement."),
'split_transfer_line': fields.boolean(
'Split Transfer Line',
help="Two transfer lines will be automatically generated : one "
"for the refunds and one for the payments.")
}
class account_bank_statement(orm.Model):
_inherit = "account.bank.statement"
def _prepare_move_line_vals(self, cr, uid, st_line, *args, **kwargs):
res = super(account_bank_statement, self)._prepare_move_line_vals(cr, uid, st_line,
*args, **kwargs)
period_id = self._get_period(cr, uid, st_line.statement_id.date,
context=kwargs.get('context'))
if st_line.statement_id.profile_id.one_move:
res.update({
'period_id': period_id,
'date': st_line.statement_id.date,
'name': st_line.ref,
})
return res
return res
def _prepare_move(self, cr, uid, st_line, st_line_number, context=None):
res = super(account_bank_statement, self).\
_prepare_move(cr, uid, st_line, st_line_number, context=context)
res.update({
'ref': st_line.statement_id.name,
'name': st_line.statement_id.name,
'date': st_line.statement_id.date,
})
return res
def create_move_from_st_line(self, cr, uid, st_line_id, company_currency_id,
st_line_number, context=None):
if context is None:
context = {}
context['from_parent_object'] = True #For compability with module account_constraints
account_move_obj = self.pool.get('account.move')
account_bank_statement_line_obj = self.pool.get('account.bank.statement.line')
st_line = account_bank_statement_line_obj.browse(cr, uid, st_line_id,
context=context)
st = st_line.statement_id
if st.profile_id.one_move:
if not context.get('move_id'):
move_vals = self._prepare_move(cr, uid, st_line, st_line_number, context=context)
context['move_id'] = account_move_obj.create(cr, uid, move_vals, context=context)
self.create_move_line_from_st_line(cr, uid, context['move_id'],
st_line_id, company_currency_id,
context=context)
return context['move_id']
else:
return super(account_bank_statement, self).create_move_from_st_line(cr, uid, st_line_id,
company_currency_id,
st_line_number,
context=context)
def create_move_line_from_st_line(self, cr, uid, move_id, st_line_id,
company_currency_id, context=None):
"""Create the account move line from the statement line.
:param int/long move_id: ID of the account.move
:param int/long st_line_id: ID of the account.bank.statement.line to create the move line from.
:param int/long company_currency_id: ID of the res.currency of the company
:return: ID of the account.move created
"""
if context is None:
context = {}
res_currency_obj = self.pool.get('res.currency')
account_move_line_obj = self.pool.get('account.move.line')
account_bank_statement_line_obj = self.pool.get('account.bank.statement.line')
st_line = account_bank_statement_line_obj.browse(cr, uid, st_line_id, context=context)
st = st_line.statement_id
context.update({'date': st_line.date})
acc_cur = ((st_line.amount<=0) and st.journal_id.default_debit_account_id) or st_line.account_id
context.update({
'res.currency.compute.account': acc_cur,
})
amount = res_currency_obj.compute(cr, uid, st.currency.id,
company_currency_id,
st_line.amount,
context=context)
bank_move_vals = self._prepare_bank_move_line(cr, uid, st_line, move_id, amount,
company_currency_id, context=context)
return account_move_line_obj.create(cr, uid, bank_move_vals, context=context)
def _valid_move(self, cr, uid, move_id, context=None):
move_obj = self.pool.get('account.move')
move = move_obj.browse(cr, uid, move_id, context=context)
move_obj.post(cr, uid, [move_id], context=context)
return True
def _prepare_transfer_move_line_vals(self, cr, uid, st, name, amount, move_id, context=None):
"""
Prepare the dict of values to create the transfer move lines.
"""
account_id = st.profile_id.journal_id.default_debit_account_id.id
partner_id = st.profile_id.partner_id and profile.partner_id.id or False
if amount < 0.0:
debit = 0.0
credit = -amount
else:
debit = amount
credit = 0.0
vals = {
'name': name,
'date': st.date,
'partner_id': partner_id,
'statement_id': st.id,
'account_id': account_id,
'ref': name,
'move_id': move_id,
'credit': credit,
'debit': debit,
'journal_id': st.journal_id.id,
'period_id': st.period_id.id,
}
return vals
def create_move_transfer_lines(self, cr, uid, move, st, context=None):
move_line_obj = self.pool.get('account.move.line')
move_id = move.id
refund = 0.0
payment = 0.0
transfer_lines = []
transfer_line_ids = []
#Calculate the part of the refund amount and the payment amount
for move_line in move.line_id:
refund -= move_line.debit
payment += move_line.credit
#Create 2 Transfer lines or One global tranfer line
if st.profile_id.split_transfer_line:
if refund:
transfer_lines.append(['Refund Transfer', refund])
if payment:
transfer_lines.append(['Payment Transfer', payment])
else:
amount = payment + refund
if amount:
transfer_lines.append(['Transfer', amount])
for transfer_line in transfer_lines:
vals = self._prepare_transfer_move_line_vals(cr, uid, st,
transfer_line[0],
transfer_line[1],
move_id,
context=context)
transfer_line_ids.append(move_line_obj.create(cr, uid, vals, context=context))
return transfer_line_ids
def button_confirm_bank(self, cr, uid, ids, context=None):
st_line_obj = self.pool.get('account.bank.statement.line')
move_obj = self.pool.get('account.move')
if context is None:
context = {}
for st in self.browse(cr, uid, ids, context=context):
super(account_bank_statement, self).button_confirm_bank(cr, uid, ids,
context=context)
if st.profile_id.one_move and context.get('move_id', False):
move_id = context['move_id']
move = move_obj.browse(cr, uid, move_id, context=context)
transfe_line_ids = self.create_move_transfer_lines(cr, uid, move, st, context=context)
self._valid_move(cr, uid, move_id, context=context)
lines_ids = [x.id for x in st.line_ids]
st_line_obj.write(cr, uid, lines_ids,
{'move_ids': [(4, move_id, False)]},
context=context)
return True
def button_cancel(self, cr, uid, ids, context=None):
done = []
for st in self.browse(cr, uid, ids, context=context):
if st.profile_id.one_move and st.line_ids:
for move in st.line_ids[0].move_ids:
if move.state != 'draft':
move.button_cancel(context=context)
move.unlink(context=context)
st.write({'state':'draft'}, context=context)
else:
super(account_bank_statement, self).button_cancel(cr, uid, ids,
context=context)
return True

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
account_statement_one_move for OpenERP
Copyright (C) 2013-TODAY Akretion <http://www.akretion.com>.
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<!-- INHERITED VIEW FOR THE OBJECT : account_statement -->
<record id="account_statement_view_form" model="ir.ui.view">
<field name="name">account_statement_one_move.account_statement.view_form</field>
<field name="model">account.statement.profile</field>
<field name="inherit_id" ref="account_statement_ext.statement_importer_view_form" />
<field name="arch" type="xml">
<field name="balance_check" position="after">
<field name="one_move"/>
<field name="split_transfer_line" attrs="{'invisible': [('one_move', '=', False)]}"/>
</field>
</field>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Laetitia Gangloff
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
# All Rights Reserved
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs.
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly advised to contact a Free Software
# Service Company.
#
# 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 . import statement
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Laetitia Gangloff
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
# All Rights Reserved
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs.
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly advised to contact a Free Software
# Service Company.
#
# 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": "Account Statement Regex Account Completion addon",
"version": "0.1",
"author": "ACSONE SA/NV",
"category": "Other",
"website": "http://www.acsone.eu",
"depends": ["account_statement_base_completion",
],
"description": """
Account Statement Regex Account Completion addon
=========================
- Add a completion method based on a specified regular expression
and update account to use in the bank statement line with the specified account.
""",
"data": ['statement_view.xml',
],
"demo": [],
"test": [],
"active": False,
"license": "AGPL-3",
"installable": True,
"auto_install": False,
"application": False,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@@ -0,0 +1,32 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_statement_regex_account_completion
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-22 10:59+0000\n"
"PO-Revision-Date: 2014-01-22 10:59+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_statement_regex_account_completion
#: field:account.statement.completion.rule,regex:0
msgid "Regular Expression"
msgstr ""
#. module: account_statement_regex_account_completion
#: field:account.statement.completion.rule,account_id:0
msgid "Account to set"
msgstr ""
#. module: account_statement_regex_account_completion
#: model:ir.model,name:account_statement_regex_account_completion.model_account_statement_completion_rule
msgid "account.statement.completion.rule"
msgstr ""

View File

@@ -0,0 +1,32 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_statement_regex_account_completion
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-22 10:59+0000\n"
"PO-Revision-Date: 2014-01-23 17:42+0000\n"
"Last-Translator: Laetitia Gangloff (Acsone) <laetitia.gangloff@acsone.eu>\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-03-14 07:02+0000\n"
"X-Generator: Launchpad (build 16963)\n"
#. module: account_statement_regex_account_completion
#: field:account.statement.completion.rule,regex:0
msgid "Regular Expression"
msgstr "Expression Régulière"
#. module: account_statement_regex_account_completion
#: field:account.statement.completion.rule,account_id:0
msgid "Account to set"
msgstr "Compte à utiliser"
#. module: account_statement_regex_account_completion
#: model:ir.model,name:account_statement_regex_account_completion.model_account_statement_completion_rule
msgid "account.statement.completion.rule"
msgstr "account.statement.completion.rule"

View File

@@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Laetitia Gangloff
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
# All Rights Reserved
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs.
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly advised to contact a Free Software
# Service Company.
#
# 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.osv.orm import Model
from openerp.osv import fields
import re
class AccountStatementCompletionRule(Model):
"""Add a rule to complete account based on a regular expression"""
_inherit = "account.statement.completion.rule"
def _get_functions(self, cr, uid, context=None):
res = super(AccountStatementCompletionRule, self)._get_functions(
cr, uid, context=context)
res.append(('set_account',
'Set account for line labels matching a regular expression'))
return res
_columns = {
'function_to_call': fields.selection(_get_functions, 'Method'),
'regex': fields.char('Regular Expression', size=128),
'account_id': fields.many2one('account.account', string="Account to set"),
}
def set_account(self, cr, uid, id, st_line, context=None):
"""
If line name match regex, update account_id
Then, call the generic st_line method to complete other values.
:param dict st_line: read of the concerned account.bank.statement.line
:return:
A dict of value that can be passed directly to the write method of
the statement line or {}
{'partner_id': value,
'account_id' : value,
...}
"""
name = st_line['name']
res = {}
if name:
rule = self.browse(cr, uid, id, context=context)
if re.match(rule.regex, name):
res['account_id'] = rule.account_id.id
return res
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="statement_st_completion_rule_view_form" model="ir.ui.view">
<field name="name">account.statement.completion.rule.view (account_statement_regex_account_completion)</field>
<field name="model">account.statement.completion.rule</field>
<field name="inherit_id" ref="account_statement_base_completion.statement_st_completion_rule_view_form" />
<field name="type">form</field>
<field name="arch" type="xml">
<field name="function_to_call" position="after">
<group colspan="2">
<field name="regex" attrs="{'invisible':[('function_to_call','!=','set_account')],'required':[('function_to_call','=','set_account')]}"/>
<field name="account_id" attrs="{'invisible':[('function_to_call','!=','set_account')],'required':[('function_to_call','=','set_account')]}"/>
</group>
</field>
</field>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Laetitia Gangloff
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
# All Rights Reserved
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs.
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly advised to contact a Free Software
# Service Company.
#
# 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 . import test_regex_account_completion
checks = [
test_regex_account_completion
]
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@@ -0,0 +1,91 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Laetitia Gangloff
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
# All Rights Reserved
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs.
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly advised to contact a Free Software
# Service Company.
#
# 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.tests import common
import time
ACC_NUMBER = "BE38733040385372"
class test_regex_account_completion(common.TransactionCase):
def prepare(self):
self.account_bank_statement_obj = self.registry("account.bank.statement")
self.account_bank_statement_line_obj = self.registry("account.bank.statement.line")
self.account_id = self.ref('account.a_expense')
# create the completion rule
rule_vals = {'function_to_call': 'set_account',
'regex': '^My statement',
'account_id': self.account_id}
completion_rule_id = self.registry("account.statement.completion.rule").create(self.cr, self.uid, rule_vals)
# Create the profile
journal_id = self.ref("account.bank_journal")
profile_id = self.registry("account.statement.profile").create(self.cr, self.uid, {
"name": "TEST",
"commission_account_id": self.ref("account.a_recv"),
"journal_id": journal_id,
"rule_ids": [(6, 0, [completion_rule_id])]})
# Create a bank statement
self.statement_id = self.account_bank_statement_obj.create(self.cr, self.uid, {
"balance_end_real": 0.0,
"balance_start": 0.0,
"date": time.strftime('%Y-%m-%d'),
"journal_id": journal_id,
"profile_id": profile_id
})
# Create two bank statement lines
self.statement_line1_id = self.account_bank_statement_line_obj.create(self.cr, self.uid, {
'amount': 1000.0,
'name': 'My statement',
'ref': 'My ref',
'statement_id': self.statement_id,
'partner_acc_number': ACC_NUMBER
})
self.statement_line2_id = self.account_bank_statement_line_obj.create(self.cr, self.uid, {
'amount': 2000.0,
'name': 'My second statement',
'ref': 'My second ref',
'statement_id': self.statement_id,
'partner_acc_number': ACC_NUMBER
})
def test_00(self):
"""Test the automatic completion on account
"""
self.prepare()
statement_obj = self.account_bank_statement_obj.browse(self.cr, self.uid, self.statement_id)
statement_obj.button_auto_completion()
statement_line1 = self.account_bank_statement_line_obj.browse(self.cr, self.uid, self.statement_line1_id)
self.assertEquals(self.account_id, statement_line1.account_id.id, "The account should be the account of the completion")
statement_line2 = self.account_bank_statement_line_obj.browse(self.cr, self.uid, self.statement_line2_id)
self.assertNotEqual(self.account_id, statement_line2.account_id.id, "The account should be not the account of the completion")

View File

@@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
###############################################################################
# #
# Author: Joel Grand-Guillaume
# Copyright 2011-2012 Camptocamp SA
# #
# Author: Leonardo Pistone <leonardo.pistone@camptocamp.com> #
# Copyright 2013 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 <http://www.gnu.org/licenses/>. #
# #
###############################################################################
from . import statement

View File

@@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
###############################################################################
# #
# Author: Joel Grand-Guillaume
# Copyright 2011-2012 Camptocamp SA
# #
# Author: Leonardo Pistone <leonardo.pistone@camptocamp.com> #
# Copyright 2013 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 <http://www.gnu.org/licenses/>. #
# #
###############################################################################
{'name': "Bank statement Sale Order completion",
'version': '0.1',
'author': 'Camptocamp',
'maintainer': 'Camptocamp',
'category': 'Finance',
'complexity': 'easy',
'depends': ['account_statement_base_completion', 'sale'],
'description': """
This module improve the module account_statement_base_completion to add
support for completion rules based on Sale Orders. This was initially part of
the module account_statement_base_completion, but is now separate to keep
dependencies separate.
This module provides the following rule:
1) Match from statement line reference (based on SO number)
""",
'website': 'http://www.camptocamp.com',
'data': [
'data.xml',
],
'test': [
'test/completion_so_test.yml'],
'installable': True,
'images': [],
'auto_install': True,
'license': 'AGPL-3',
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="bank_statement_completion_rule_1" model="account.statement.completion.rule">
<field name="name">Match from line reference (based on SO number)</field>
<field name="sequence">50</field>
<field name="function_to_call">get_from_ref_and_so</field>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,28 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_statement_so_completion
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 12:04+0000\n"
"PO-Revision-Date: 2014-01-21 12:04+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_statement_so_completion
#: code:addons/account_statement_so_completion/statement.py:77
#, python-format
msgid "Line named \"%s\" (Ref:%s) was matched by more than one partner while looking on SO by ref."
msgstr ""
#. module: account_statement_so_completion
#: model:ir.model,name:account_statement_so_completion.model_account_statement_completion_rule
msgid "account.statement.completion.rule"
msgstr ""

View File

@@ -0,0 +1,94 @@
# -*- coding: utf-8 -*-
###############################################################################
# #
# Author: Joel Grand-Guillaume #
# Copyright 2011-2012 Camptocamp SA #
# #
# Author: Leonardo Pistone <leonardo.pistone@camptocamp.com> #
# Copyright 2013 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 <http://www.gnu.org/licenses/>. #
# #
###############################################################################
from openerp.osv import fields, orm
from tools.translate import _
from openerp.addons.account_statement_base_completion.statement import ErrorTooManyPartner
class account_statement_completion_rule(orm.Model):
_name = "account.statement.completion.rule"
_inherit = "account.statement.completion.rule"
def _get_functions(self, cr, uid, context=None):
res = super(account_statement_completion_rule, self)._get_functions(
cr, uid, context=context)
res.append(
('get_from_ref_and_so', 'From line reference (based on SO number)')
)
return res
# Should be private but data are initialised with no update XML
def get_from_ref_and_so(self, cr, uid, st_line, context=None):
"""
Match the partner based on the SO number and the reference of the
statement line. Then, call the generic get_values_for_line method to
complete other values. If more than one partner matched, raise the
ErrorTooManyPartner error.
:param int/long st_line: read of the concerned
account.bank.statement.line
:return:
A dict of value that can be passed directly to the write method of
the statement line or {}
{'partner_id': value,
'account_id': value,
...}
"""
st_obj = self.pool.get('account.bank.statement.line')
res = {}
if st_line:
so_obj = self.pool.get('sale.order')
so_id = so_obj.search(cr,
uid,
[('name', '=', st_line['ref'])],
context=context)
if so_id:
if so_id and len(so_id) == 1:
so = so_obj.browse(cr, uid, so_id[0], context=context)
res['partner_id'] = so.partner_id.id
elif so_id and len(so_id) > 1:
raise ErrorTooManyPartner(
_('Line named "%s" (Ref:%s) was matched by more '
'than one partner while looking on SO by ref.') %
(st_line['name'], st_line['ref']))
st_vals = st_obj.get_values_for_line(
cr,
uid,
profile_id=st_line['profile_id'],
master_account_id=st_line['master_account_id'],
partner_id=res.get('partner_id', False),
line_type='customer',
amount=st_line['amount'] if st_line['amount'] else 0.0,
context=context)
res.update(st_vals)
return res
_columns = {
'function_to_call': fields.selection(_get_functions, 'Method'),
}

View File

@@ -0,0 +1,44 @@
-
In order to test the banking framework for Sale Orders, I first need to
create a profile
-
!record {model: account.statement.profile, id: profile_test_so}:
name: Bank EUR Profile for SO
journal_id: account.bank_journal
commission_account_id: account.a_expense
company_id: base.main_company
balance_check: True
rule_ids:
- account_statement_base_completion.bank_statement_completion_rule_4
- account_statement_base_completion.bank_statement_completion_rule_5
- account_statement_base_completion.bank_statement_completion_rule_2
- account_statement_base_completion.bank_statement_completion_rule_3
- bank_statement_completion_rule_1
-
Now I create a statement. I create statment lines separately because I need
to find each one by XML id
-
!record {model: account.bank.statement, id: statement_test_sale1}:
name: Statement for SO
profile_id: profile_test_so
company_id: base.main_company
-
I create a statement line for a SO
-
!record {model: account.bank.statement.line, id: statement_line_so}:
name: Test autocompletion based on Sale Order Number
statement_id: statement_test_sale1
ref: SO007
date: '2013-12-20'
amount: 14981.0
-
I run the auto complete
-
!python {model: account.bank.statement}: |
result = self.button_auto_completion(cr, uid, [ref("statement_test_sale1")])
-
Now I can check that all is nice and shiny, line 1. I expect the Sale Order
Number to be recognised.
-
!assert {model: account.bank.statement.line, id: statement_line_so, string: Check completion by SO number}:
- partner_id.name == u'Luminous Technologies'

View File

@@ -48,7 +48,10 @@
"data.xml", "data.xml",
], ],
'demo_xml': [], 'demo_xml': [],
'test': [], 'test': [
'test/sale.yml',
'test/completion_transactionid_test.yml',
],
'installable': True, 'installable': True,
'images': [], 'images': [],
'auto_install': True, 'auto_install': True,

View File

@@ -0,0 +1,43 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_statement_transactionid_completion
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 12:02+0000\n"
"PO-Revision-Date: 2014-01-21 12:02+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_statement_transactionid_completion
#: code:addons/account_statement_transactionid_completion/statement.py:65
#, python-format
msgid "Line named \"%s\" (Ref:%s) was matched by more than one partner."
msgstr ""
#. module: account_statement_transactionid_completion
#: model:ir.model,name:account_statement_transactionid_completion.model_account_bank_statement_line
msgid "Bank Statement Line"
msgstr ""
#. module: account_statement_transactionid_completion
#: help:account.bank.statement.line,transaction_id:0
msgid "Transaction id from the financial institute"
msgstr ""
#. module: account_statement_transactionid_completion
#: model:ir.model,name:account_statement_transactionid_completion.model_account_statement_completion_rule
msgid "account.statement.completion.rule"
msgstr ""
#. module: account_statement_transactionid_completion
#: field:account.bank.statement.line,transaction_id:0
msgid "Transaction ID"
msgstr ""

View File

@@ -0,0 +1,44 @@
-
In order to test the banking framework, I first need to create a profile
-
!record {model: account.statement.profile, id: statement_profile_transactionid}:
name: Bank EUR Profile (transaction ID)
journal_id: account.bank_journal
commission_account_id: account.a_expense
company_id: base.main_company
balance_check: True
rule_ids:
- bank_statement_completion_rule_4
- account_statement_base_completion.bank_statement_completion_rule_4
- account_statement_base_completion.bank_statement_completion_rule_5
- account_statement_base_completion.bank_statement_completion_rule_2
- account_statement_base_completion.bank_statement_completion_rule_3
-
Now I create a statement. I create statment lines separately because I need
to find each one by XML id
-
!record {model: account.bank.statement, id: statement_transactionid_test1}:
name: Statement with transaction ID
profile_id: statement_profile_transactionid
company_id: base.main_company
-
I create a statement line for a SO with transaction ID
-
!record {model: account.bank.statement.line, id: statement_line_transactionid}:
name: Test autocompletion based on SO with transaction ID
statement_id: statement_transactionid_test1
transaction_id: XXX66Z
ref: 6
date: '2014-01-06'
amount: 118.4
-
I run the auto complete
-
!python {model: account.bank.statement}: |
result = self.button_auto_completion(cr, uid, [ref("statement_profile_transactionid")])
-
Now I can check that all is nice and shiny, line 1. I expect the SO has been
recognised from the transaction ID.
-
!assert {model: account.bank.statement.line, id: statement_line_transactionid, string: Check completion by SO transaction ID}:
- partner_id.name == u'Agrolait'

View File

@@ -0,0 +1,11 @@
-
I create a new Sale Order with transaction ID
-
!record {model: sale.order, id: so_with_transaction_id}:
partner_id: base.res_partner_2
note: Invoice after delivery
payment_term: account.account_payment_term
transaction_id: XXX66Z
order_line:
- product_id: product.product_product_7
product_uom_qty: 8

View File

@@ -0,0 +1,21 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 12:02+0000\n"
"PO-Revision-Date: 2014-01-21 12:02+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_statement_transactionid_import
#: model:ir.model,name:account_statement_transactionid_import.model_account_statement_profile
msgid "Statement Profile"
msgstr ""

View File

@@ -27,16 +27,21 @@ class TransactionIDFileParser(FileParser):
bank statement. bank statement.
""" """
def __init__(self, parse_name, ftype='csv'): def __init__(self, parse_name, ftype='csv', extra_fields=None, header=None, **kwargs):
conversion_dict = {'transaction_id': unicode, """
'label': unicode, Add transaction_id in header keys
'date': datetime.datetime, :param char: parse_name: The name of the parser
'amount': float, :param char: ftype: extension of the file (could be csv or xls)
'commission_amount': float} :param dict: extra_fields: extra fields to add to the conversion dict. In the format
# Order of cols does not matter but first row of the file has to be header {fieldname: fieldtype}
keys_to_validate = ['transaction_id', 'label', 'date', 'amount', 'commission_amount'] :param list: header : specify header fields if the csv file has no header
super(TransactionIDFileParser, self).__init__(parse_name, keys_to_validate=keys_to_validate, """
ftype=ftype, conversion_dict=conversion_dict) extra_fields = {'transaction_id': unicode}
super(TransactionIDFileParser, self).__init__(parse_name, extra_fields=extra_fields,
ftype=ftype, header=header, **kwargs)
# ref is replaced by transaction_id thus we delete it from check
self.keys_to_validate = [k for k in self.keys_to_validate if k != 'ref']
del self.conversion_dict['ref']
@classmethod @classmethod
def parser_for(cls, parser_name): def parser_for(cls, parser_name):
@@ -73,14 +78,3 @@ class TransactionIDFileParser(FileParser):
'label': line.get('label', ''), 'label': line.get('label', ''),
'transaction_id': line.get('transaction_id', '/'), 'transaction_id': line.get('transaction_id', '/'),
'commission_amount': line.get('commission_amount', 0.0)} 'commission_amount': line.get('commission_amount', 0.0)}
def _post(self, *args, **kwargs):
"""
Compute the commission from value of each line
"""
res = super(TransactionIDFileParser, self)._post(*args, **kwargs)
val = 0.0
for row in self.result_row_list:
val += row.get('commission_amount', 0.0)
self.commission_global_amount = val
return res

View File

@@ -0,0 +1,58 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * base_transaction_id
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 12:03+0000\n"
"PO-Revision-Date: 2014-01-21 12:03+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: base_transaction_id
#: field:account.invoice,transaction_id:0
#: field:sale.order,transaction_id:0
msgid "Transaction id"
msgstr ""
#. module: base_transaction_id
#: view:account.invoice:0
msgid "Transactions datas"
msgstr ""
#. module: base_transaction_id
#: help:sale.order,transaction_id:0
msgid "Transaction id from the financial institute"
msgstr ""
#. module: base_transaction_id
#: help:account.invoice,transaction_id:0
msgid "Transction id from the financial institute"
msgstr ""
#. module: base_transaction_id
#: model:ir.actions.act_window,name:base_transaction_id.prm_act
msgid "Packing"
msgstr ""
#. module: base_transaction_id
#: model:ir.model,name:base_transaction_id.model_account_invoice
msgid "Invoice"
msgstr ""
#. module: base_transaction_id
#: model:ir.model,name:base_transaction_id.model_stock_picking
msgid "Picking List"
msgstr ""
#. module: base_transaction_id
#: model:ir.model,name:base_transaction_id.model_sale_order
msgid "Sales Order"
msgstr ""

View File

@@ -0,0 +1,32 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * invoicing_voucher_killer
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 12:00+0000\n"
"PO-Revision-Date: 2014-01-21 12:00+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: invoicing_voucher_killer
#: view:account.invoice:0
msgid "Pay"
msgstr ""
#. module: invoicing_voucher_killer
#: model:res.groups,name:invoicing_voucher_killer.invoice_voucher_user
msgid "Use voucher in Invoices"
msgstr ""
#. module: invoicing_voucher_killer
#: view:account.invoice:0
msgid "Register Payment"
msgstr ""

View File

@@ -39,9 +39,9 @@ line will be take from imported line in this order:
'author': 'Camptocamp', 'author': 'Camptocamp',
'website': 'http://www.camptocamp.com', 'website': 'http://www.camptocamp.com',
'depends': ['account_voucher', 'account_payment'], 'depends': ['account_voucher', 'account_payment'],
'init_xml': [], 'data': [
'update_xml': [], 'statement_view.xml',
'demo_xml': [], ],
'test': [], 'test': [],
'installable': True, 'installable': True,
'active': False, 'active': False,

View File

@@ -0,0 +1,27 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * statement_voucher_killer
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-21 12:00+0000\n"
"PO-Revision-Date: 2014-01-21 12:00+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: statement_voucher_killer
#: model:ir.model,name:statement_voucher_killer.model_account_statement_from_invoice_lines
msgid "Entries by Statement from Invoices"
msgstr ""
#. module: statement_voucher_killer
#: model:ir.model,name:statement_voucher_killer.model_account_payment_populate_statement
msgid "Account Payment Populate Statement"
msgstr ""

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- INHERITED VIEW FOR THE OBJECT : account_bank_statement -->
<record id="account_bank_statement_view_form" model="ir.ui.view">
<field name="model">account.bank.statement</field>
<field name="inherit_id" ref="account.view_bank_statement_form" />
<field eval="100" name="priority"/>
<field name="type">form</field>
<field name="arch" type="xml">
<field name="voucher_id" position="replace">
</field>
</field>
</record>
</data>
</openerp>