[MERGE] account_voucher : Merged my branch to import partially paid invoice in the...
[odoo/odoo.git] / addons / l10n_ch / wizard / bvr_import.py
index 611b572..5fb7bda 100644 (file)
@@ -1,35 +1,23 @@
-# -*- coding: utf-8 -*-
-#
-#  bvr_import.py
-#  l10n_ch
-#
-#  Created by Nicolas Bessi based on Credric Krier contribution
-#
-#  Copyright (c) 2009 CamptoCamp. All rights reserved.
+# -*- encoding: utf-8 -*-
 ##############################################################################
-# WARNING: This program as such is intended to be used by professional
-# programmers who take the whole responsability 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
-# garantees and support are strongly adviced to contract a Free Software
-# Service Company
 #
-# This program is Free Software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
+#    Author: Nicolas Bessi. Copyright Camptocamp SA
+#    Donors: Hasa Sàrl, Open Net Sàrl and Prisme Solutions Informatique 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 General Public License for more details.
+#    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 General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#    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 base64
 import time
 import re
@@ -43,16 +31,16 @@ def _reconstruct_invoice_ref(cursor, user, reference, context=None):
     ###
     id_invoice = False
     # On fait d'abord une recherche sur toutes les factures
-    # we now searhc for company
+    # we now search for an invoice
     user_obj = pooler.get_pool(cursor.dbname).get('res.users')
     user_current=user_obj.browse(cursor, user, user)
 
     ##
     cursor.execute("SELECT inv.id,inv.number from account_invoice AS inv where inv.company_id = %s" ,(user_current.company_id.id,))
     result_invoice = cursor.fetchall()
-
+    REF = re.compile('[^0-9]')
     for inv_id,inv_name in result_invoice:
-        inv_name =  re.sub('[^0-9]', '0', str(inv_name))
+        inv_name =  REF.sub('0', str(inv_name))
         if inv_name == reference:
             id_invoice = inv_id
             break
@@ -69,17 +57,18 @@ def _reconstruct_invoice_ref(cursor, user, reference, context=None):
         return []
     return True
 
-def _import(obj, cursor, user, data, context=None):
+def _import(self, cursor, user, data, context=None):
 
-    pool = pooler.get_pool(cursor.dbname)
-    statement_line_obj = pool.get('account.bank.statement.line')
+    statement_line_obj = self.pool.get('account.bank.statement.line')
 #    statement_reconcile_obj = pool.get('account.bank.statement.reconcile')
     voucher_obj = self.pool.get('account.voucher')
     voucher_line_obj = self.pool.get('account.voucher.line')
-    move_line_obj = pool.get('account.move.line')
-    property_obj = pool.get('ir.property')
-    model_fields_obj = pool.get('ir.model.fields')
-    attachment_obj = pool.get('ir.attachment')
+    move_line_obj = self.pool.get('account.move.line')
+    property_obj = self.pool.get('ir.property')
+    model_fields_obj = self.pool.get('ir.model.fields')
+    attachment_obj = self.pool.get('ir.attachment')
+    statement_obj = self.pool.get('account.bank.statement')
+    property_obj = self.pool.get('ir.property')
     file = data['form']['file']
     statement_id = data['id']
     records = []
@@ -137,22 +126,9 @@ def _import(obj, cursor, user, data, context=None):
                 total_cost += record['cost']
                 records.append(record)
 
-    model_fields_ids = model_fields_obj.search(cursor, user, [
-        ('name', 'in', ['property_account_receivable', 'property_account_payable']),
-        ('model', '=', 'res.partner'),
-        ], context=context)
-    property_ids = property_obj.search(cursor, user, [
-        ('fields_id', 'in', model_fields_ids),
-        ('res_id', '=', False),
-        ], context=context)
-
     account_receivable = False
     account_payable = False
-    for property in property_obj.browse(cursor, user, property_ids, context=context):
-        if property.fields_id.name == 'property_account_receivable':
-            account_receivable = int(property.value.split(',')[1])
-        elif property.fields_id.name == 'property_account_payable':
-            account_payable = int(property.value.split(',')[1])
+    statement = statement_obj.browse(cursor, user, statement_id, context=context)
 
     for record in records:
         # Remove the 11 first char because it can be adherent number
@@ -166,6 +142,7 @@ def _import(obj, cursor, user, data, context=None):
             'type': (record['amount'] >= 0 and 'customer') or 'supplier',
             'statement_id': statement_id,
         }
+
         line_ids = move_line_obj.search(cursor, user, [
             ('ref', 'like', reference),
             ('reconcile_id', '=', False),
@@ -173,62 +150,80 @@ def _import(obj, cursor, user, data, context=None):
             ], order='date desc', context=context)
         if not line_ids:
             line_ids = _reconstruct_invoice_ref(cursor, user, reference, None)
-
-        line2reconcile = False
         partner_id = False
         account_id = False
         for line in move_line_obj.browse(cursor, user, line_ids, context=context):
-            if line.partner_id.id:
-                partner_id = line.partner_id.id
+            account_receivable = line.partner_id.property_account_receivable.id
+            account_payable = line.partner_id.property_account_payable.id
+            partner_id = line.partner_id.id
+            move_id = line.move_id.id
             if record['amount'] >= 0:
                 if round(record['amount'] - line.debit, 2) < 0.01:
-                    line2reconcile = line.id
+#                    line2reconcile = line.id
                     account_id = line.account_id.id
                     break
             else:
                 if round(line.credit + record['amount'], 2) < 0.01:
-                    line2reconcile = line.id
+#                    line2reconcile = line.id
                     account_id = line.account_id.id
                     break
+        result = voucher_obj.onchange_partner_id(cursor, user, [], partner_id, journal_id=statement.journal_id.id, price=abs(record['amount']), currency_id= statement.currency.id, ttype='receipt', date=statement.date ,context=context)
+        voucher_res = { 'type': 'receipt' ,
+
+             'name': values['name'],
+             'partner_id': partner_id,
+             'journal_id': statement.journal_id.id,
+             'account_id': result.get('account_id', statement.journal_id.default_credit_account_id.id),
+             'company_id': statement.company_id.id,
+             'currency_id': statement.currency.id,
+             'date': record['date'] or time.strftime('%Y-%m-%d'),
+             'amount': abs(record['amount']),
+            'period_id': statement.period_id.id
+             }
+        voucher_id = voucher_obj.create(cursor, user, voucher_res, context=context)
+        context.update({'move_line_ids': line_ids})
+        values['voucher_id'] = voucher_id
+        voucher_line_dict =  False
+        if result['value']['line_ids']:
+             for line_dict in result['value']['line_ids']:
+                 move_line = move_line_obj.browse(cursor, user, line_dict['move_line_id'], context)
+                 if move_id == move_line.move_id.id:
+                     voucher_line_dict = line_dict
+        if voucher_line_dict:
+             voucher_line_dict.update({'voucher_id':voucher_id})
+             voucher_line_obj.create(cursor, user, voucher_line_dict, context=context)                
+             
         if not account_id:
             if record['amount'] >= 0:
                 account_id = account_receivable
             else:
                 account_id = account_payable
-        if not account_id :
+        ##If line not linked to an invoice we create a line not linked to a voucher
+        if not account_id and not line_ids:
+            name = "property_account_receivable"
+            if record['amount'] < 0:
+                name = "property_account_payable"
+            prop = property_obj.search(
+                        cursor, 
+                        user,
+                        [
+                            ('name','=','property_account_receivable'),
+                            ('company_id','=',statement.company_id.id),
+                            ('res_id', '=', False)
+                        ]
+            )
+            if prop:
+                value = property_obj.read(cursor, user, prop[0], ['value_reference']).get('value_reference', False)
+                if value :
+                    account_id = int(value.split(',')[1])
+            else :
+                raise osv.except_osv(_('Error'),
+                    _('The properties account payable account receivable are not set'))
+        if not account_id and line_ids:
             raise osv.except_osv(_('Error'),
-                _('The properties account payable account receivable'))
+                _('The properties account payable account receivable are not set'))
         values['account_id'] = account_id
         values['partner_id'] = partner_id
-
-        if line2reconcile:
-            voucher_res = { 'type': 'payment' ,
-                'name': line.name,
-                'partner_id': line.partner_id.id,
-                'journal_id': statement.journal_id.id,
-                'account_id': account,
-                'company_id': statement.company_id.id,
-                'currency_id': statement.currency.id,
-                'date': line.date or time.strftime('%Y-%m-%d'),
-                'amount': abs(amount),
-                'period_id': statement.period_id.id
-                }
-            voucher_id = voucher_obj.create(cr, uid, voucher_res, context=context)
-            result = voucher_obj.onchange_partner_id(cr, uid, [], partner_id=line.partner_id.id, journal_id=statement.journal_id.id, price=abs(amount), currency_id= statement.currency.id, ttype='payment')
-            voucher_line_dict =  False
-            if result['value']['line_ids']:
-                for line_dict in result['value']['line_ids']:
-                    move_line = self.pool.get('account.move.line').browse(cr, uid, line_dict['move_line_id'], context)
-                    if line.move_line_id.move_id.id == move_line.move_id.id:
-                        voucher_line_dict = line_dict
-            if voucher_line_dict:
-                voucher_line_dict.update({'voucher_id':voucher_id})
-                voucher_line_obj.create(cr, uid, voucher_line_dict, context=context)
-            values['voucher_id'] = voucher_id
-#            values['reconcile_id'] = statement_reconcile_obj.create(cursor, user, {
-#                'line_ids': [(6, 0, [line2reconcile])],
-#                }, context=context)
-
         statement_line_obj.create(cursor, user, values, context=context)
     attachment_obj.create(cursor, user, {
         'name': 'BVR',
@@ -264,4 +259,4 @@ class bvr_import_wizard(osv.osv_memory):
 
 bvr_import_wizard()
 
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: